X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fdelegate.cs;h=75a0989906ecb32bf4cbb46ae613d1e2cf3faea2;hb=ea15effd923d6ce84e2b3d93641b6144a2c45180;hp=ce1ef17f17b7c3bdc9e2bb152f2899110d465378;hpb=699e59742843044f6efa1726b7cb64f19d909e64;p=mono.git diff --git a/mcs/mcs/delegate.cs b/mcs/mcs/delegate.cs index ce1ef17f17b..75a0989906e 100644 --- a/mcs/mcs/delegate.cs +++ b/mcs/mcs/delegate.cs @@ -79,9 +79,17 @@ namespace Mono.CSharp { if (TypeBuilder != null) return TypeBuilder; + ec = new EmitContext (this, this, Location, null, null, ModFlags, false); + TypeAttributes attr = Modifiers.TypeAttr (ModFlags, IsTopLevel) | TypeAttributes.Class | TypeAttributes.Sealed; + if (TypeManager.multicast_delegate_type == null) + Report.Error (-100, loc, "Internal error: delegate used before " + + "System.MulticastDelegate is resolved. This can only " + + "happen during corlib compilation, when using a delegate " + + "in any of the `core' classes. See bug #72015 for details."); + if (IsTopLevel) { if (TypeManager.NamespaceClash (Name, Location)) return null; @@ -112,8 +120,7 @@ namespace Mono.CSharp { { MethodAttributes mattr; int i; - EmitContext ec = new EmitContext (this, this, Location, null, - null, ModFlags, false); + ec = new EmitContext (this, this, Location, null, null, ModFlags, false); // FIXME: POSSIBLY make this static, as it is always constant // @@ -359,8 +366,6 @@ namespace Mono.CSharp { public override void Emit () { if (OptAttributes != null) { - EmitContext ec = new EmitContext ( - Parent, this, Location, null, null, ModFlags, false); Parameters.LabelParameters (ec, InvokeBuilder, Location); OptAttributes.Emit (ec, this); } @@ -429,18 +434,40 @@ namespace Mono.CSharp { for (int i = pd_count; i > 0; ) { i--; - if (invoke_pd.ParameterType (i) == pd.ParameterType (i) && - invoke_pd.ParameterModifier (i) == pd.ParameterModifier (i)) + Type invoke_pd_type = invoke_pd.ParameterType (i); + Type pd_type = pd.ParameterType (i); + Parameter.Modifier invoke_pd_type_mod = invoke_pd.ParameterModifier (i); + Parameter.Modifier pd_type_mod = pd.ParameterModifier (i); + + if (invoke_pd_type == pd_type && + invoke_pd_type_mod == pd_type_mod) continue; - else { - return null; - } + + if (invoke_pd_type.IsSubclassOf (pd_type) && + invoke_pd_type_mod == pd_type_mod) + if (RootContext.Version == LanguageVersion.ISO_1) { + Report.FeatureIsNotStandardized (loc, "contravariance"); + return null; + } else + continue; + + return null; } - if (((MethodInfo) invoke_mb).ReturnType == ((MethodInfo) mb).ReturnType) + Type invoke_mb_retval = ((MethodInfo) invoke_mb).ReturnType; + Type mb_retval = ((MethodInfo) mb).ReturnType; + if (invoke_mb_retval == mb_retval) return mb; - else - return null; + + if (mb_retval.IsSubclassOf (invoke_mb_retval)) + if (RootContext.Version == LanguageVersion.ISO_1) { + Report.FeatureIsNotStandardized (loc, "covariance"); + return null; + } + else + return mb; + + return null; } // @@ -643,6 +670,13 @@ namespace Mono.CSharp { } } + // + // Represents header string for documentation comment. + // + public override string DocCommentHeader { + get { return "T:"; } + } + protected override void VerifyObsoleteAttribute() { CheckUsageOfObsoleteAttribute (ret_type); @@ -768,7 +802,7 @@ namespace Mono.CSharp { delegate_instance_expression = ec.GetThis (loc); if (delegate_instance_expression != null && delegate_instance_expression.Type.IsValueType) - delegate_instance_expression = new BoxedCast (mg.InstanceExpression); + delegate_instance_expression = new BoxedCast (delegate_instance_expression); method_group = mg; eclass = ExprClass.Value; @@ -836,6 +870,9 @@ namespace Mono.CSharp { Expression e = a.Expr; + if (e is AnonymousMethod && RootContext.Version != LanguageVersion.ISO_1) + return ((AnonymousMethod) e).Compatible (ec, type, false); + MethodGroupExpr mg = e as MethodGroupExpr; if (mg != null) return ResolveMethodGroupExpr (ec, mg); @@ -843,7 +880,7 @@ namespace Mono.CSharp { Type e_type = e.Type; if (!TypeManager.IsDelegateType (e_type)) { - e.Error_UnexpectedKind ("method", loc); + Report.Error (149, loc, "Method name expected"); return null; }