**** Merged r44326 from MCS ****
authorMartin Baulig <martin@novell.com>
Tue, 10 May 2005 23:14:55 +0000 (23:14 -0000)
committerMartin Baulig <martin@novell.com>
Tue, 10 May 2005 23:14:55 +0000 (23:14 -0000)
svn path=/trunk/mcs/; revision=44367

mcs/gmcs/ChangeLog
mcs/gmcs/class.cs
mcs/gmcs/expression.cs
mcs/gmcs/parameter.cs

index 1b0d00e16eb0cd3191b1646524640d592cd534ba..63d45d21dd310d13dcb49ed63a61685c918ecd86 100644 (file)
 
        * codegen.cs (EmitContext.ResolvingTypeTree): New public field.
 
+2005-05-10  Marek Safar  <marek.safar@seznam.cz>
+
+       * class.cs (Method.Define): Catch attempt for Finalizer declaration.
+       
+       * expression.cs (Argument.GetParameterModifier): Turned to property.
+       (Invocation.Error_InvalidArguments): Add more descriptive errors.
+       
+       * parameter.cs (Parameter.GetModifierSignature): Translates modifier to
+       its C# equivalent.
+       
 2005-05-09  Raja R Harinath  <rharinath@novell.com>
 
        Fix #74852.
index d50968e9556daa81f87861757358519672f34e27..7d43883bd774a75ed94ac2d2bafb2904fa85f28b 100644 (file)
@@ -4191,6 +4191,11 @@ namespace Mono.CSharp {
                        if (!MethodData.Define (Parent))
                                return false;
 
+                       if (ReturnType == TypeManager.void_type && ParameterTypes.Length == 0 && 
+                               Name == "Finalize" && !(this is Destructor)) {
+                               Report.Warning (465, 1, Location, "Introducing a 'Finalize' method can interfere with destructor invocation. Did you intend to declare a destructor?");
+                       }
+
                        //
                        // Setup iterator if we are one
                        //
index c3d411f1d7fcd67df7154aa2418103f4c7fc16b6..63ed43b836f8e2a13564f11816c2c95aae239e5c 100644 (file)
@@ -4210,17 +4210,19 @@ namespace Mono.CSharp {
                        }
                }
 
-               public Parameter.Modifier GetParameterModifier ()
+               public Parameter.Modifier Modifier
                {
-                       switch (ArgType) {
-                       case AType.Out:
-                               return Parameter.Modifier.OUT | Parameter.Modifier.ISBYREF;
+                       get {
+                               switch (ArgType) {
+                                       case AType.Out:
+                                               return Parameter.Modifier.OUT | Parameter.Modifier.ISBYREF;
 
-                       case AType.Ref:
-                               return Parameter.Modifier.REF | Parameter.Modifier.ISBYREF;
+                                       case AType.Ref:
+                                               return Parameter.Modifier.REF | Parameter.Modifier.ISBYREF;
 
-                       default:
-                               return Parameter.Modifier.NONE;
+                                       default:
+                                               return Parameter.Modifier.NONE;
+                               }
                        }
                }
 
@@ -4740,7 +4742,7 @@ namespace Mono.CSharp {
 
                                Argument a = (Argument) arguments [i];
 
-                               Parameter.Modifier a_mod = a.GetParameterModifier () &
+                               Parameter.Modifier a_mod = a.Modifier & 
                                        (unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF)));
                                Parameter.Modifier p_mod = pd.ParameterModifier (i) &
                                        (unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF)));
@@ -4815,7 +4817,7 @@ namespace Mono.CSharp {
 
                                Argument a = (Argument) arguments [i];
 
-                               Parameter.Modifier a_mod = a.GetParameterModifier () &
+                               Parameter.Modifier a_mod = a.Modifier &
                                        unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF));
                                Parameter.Modifier p_mod = pd.ParameterModifier (i) &
                                        unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF));
@@ -5166,20 +5168,31 @@ namespace Mono.CSharp {
                 }
                         
                static void Error_InvalidArguments (Location loc, int idx, MethodBase method,
-                                                    Type delegate_type, string arg_sig, string par_desc)
+                                                    Type delegate_type, Argument a, ParameterData expected_par)
                {
                        if (delegate_type == null) 
-                               Report.Error (1502, loc,
-                                             "The best overloaded match for method '" +
-                                             FullMethodDesc (method) +
-                                             "' has some invalid arguments");
+                               Report.Error (1502, loc, "The best overloaded match for method '{0}' has some invalid arguments",
+                                             TypeManager.CSharpSignature (method));
                        else
                                Report.Error (1594, loc,
                                              "Delegate '" + delegate_type.ToString () +
                                              "' has some invalid arguments.");
+
+                       string par_desc = expected_par.ParameterDesc (idx);
+
+                       if (a.Modifier != expected_par.ParameterModifier (idx)) {
+                               if ((expected_par.ParameterModifier (idx) & (Parameter.Modifier.REF | Parameter.Modifier.OUT)) == 0)
+                                       Report.Error (1615, loc, "Argument '{0}' should not be passed with the '{1}' keyword",
+                                               idx + 1, Parameter.GetModifierSignature (a.Modifier));
+                               else
+                                       Report.Error (1620, loc, "Argument '{0}' must be passed with the '{1}' keyword",
+                                               idx + 1, Parameter.GetModifierSignature (expected_par.ParameterModifier (idx)));
+                               return;
+                       }
+
                        Report.Error (1503, loc,
                                      String.Format ("Argument {0}: Cannot convert from '{1}' to '{2}'",
-                                                    idx, arg_sig, par_desc));
+                                                    idx + 1, Argument.FullDesc (a), par_desc));
                }
                
                public static bool VerifyArgumentsCompat (EmitContext ec, ArrayList Arguments,
@@ -5198,11 +5211,11 @@ namespace Mono.CSharp {
                                Parameter.Modifier pm = pd.ParameterModifier (j);
                                
                                if (pm == Parameter.Modifier.PARAMS){
-                                       if ((pm & ~Parameter.Modifier.PARAMS) != a.GetParameterModifier ()) {
+                                       if ((pm & ~Parameter.Modifier.PARAMS) != a.Modifier) {
                                                if (!may_fail)
                                                        Error_InvalidArguments (
                                                                loc, j, method, delegate_type,
-                                                               Argument.FullDesc (a), pd.ParameterDesc (j));
+                                                               a, pd);
                                                return false;
                                        }
 
@@ -5214,11 +5227,11 @@ namespace Mono.CSharp {
                                        //
                                        // Check modifiers
                                        //
-                                       if (pd.ParameterModifier (j) != a.GetParameterModifier ()){
+                                       if (pd.ParameterModifier (j) != a.Modifier){
                                                if (!may_fail)
                                                        Error_InvalidArguments (
                                                                loc, j, method, delegate_type,
-                                                               Argument.FullDesc (a), pd.ParameterDesc (j));
+                                                               a, pd);
                                                return false;
                                        }
                                }
@@ -5233,9 +5246,7 @@ namespace Mono.CSharp {
 
                                        if (conv == null) {
                                                if (!may_fail)
-                                                       Error_InvalidArguments (
-                                                               loc, j, method, delegate_type,
-                                                               Argument.FullDesc (a), pd.ParameterDesc (j));
+                                                       Error_InvalidArguments (loc, j, method, delegate_type, a, pd);
                                                return false;
                                        }
                                        
@@ -5253,7 +5264,7 @@ namespace Mono.CSharp {
                                        }
                                }
                                
-                               Parameter.Modifier a_mod = a.GetParameterModifier () &
+                               Parameter.Modifier a_mod = a.Modifier &
                                        unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF));
                                Parameter.Modifier p_mod = pd.ParameterModifier (j) &
                                        unchecked (~(Parameter.Modifier.OUT | Parameter.Modifier.REF));
index 55c303b5460b278a5e5617201cd67a953c6145d4..192ee028560da610227d27f11235262a937d86dc 100644 (file)
@@ -309,15 +309,27 @@ namespace Mono.CSharp {
                        else
                                type_name = TypeName.ToString ();
 
-                       switch (ModFlags & unchecked (~Modifier.ISBYREF)) {
+                       string mod = GetModifierSignature (ModFlags);
+                       if (mod.Length > 0)
+                               return String.Concat (mod, " ", type_name);
+
+                       return type_name;
+               }
+
+               public static string GetModifierSignature (Modifier mod)
+               {
+                       switch (mod & unchecked (~Modifier.ISBYREF)) {
                                case Modifier.OUT:
-                                       return "out " + type_name;
+                                       return "out";
                                case Modifier.PARAMS:
-                                       return "params " + type_name;
+                                       return "params";
                                case Modifier.REF:
-                                       return "ref " + type_name;
+                                       return "ref";
+                               case Modifier.ARGLIST:
+                                       return "__arglist";
+                               default:
+                                       return "";
                        }
-                       return type_name;
                }
 
                public void DefineParameter (EmitContext ec, MethodBuilder mb, ConstructorBuilder cb, int index, Location loc)