}
}
- 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;
+ }
}
}
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)));
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));
}
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,
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;
}
//
// 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;
}
}
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;
}
}
}
- 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));