Merge pull request #2630 from ludovic-henry/fix-registeredwaithandle-leak
[mono.git] / mcs / mcs / method.cs
index a78b99c6419bcf212b1a9e67b90586bed3371a7e..e6213c7e43e3228c2bad5d7548640d2ecbd54599 100644 (file)
@@ -165,6 +165,12 @@ namespace Mono.CSharp {
                        return s + parameters.GetSignatureForDocumentation ();
                }
 
+               public override void PrepareEmit ()
+               {
+                       base.PrepareEmit ();
+                       parameters.ResolveDefaultValues (this);
+               }
+
                public MethodSpec Spec {
                        get { return spec; }
                }
@@ -816,8 +822,10 @@ namespace Mono.CSharp {
 
                #endregion
 
-               public virtual void PrepareEmit ()
+               public override void PrepareEmit ()
                {
+                       base.PrepareEmit ();
+
                        var mb = MethodData.DefineMethodBuilder (Parent);
 
                        if (CurrentTypeParameters != null) {
@@ -1083,19 +1091,12 @@ namespace Mono.CSharp {
                                        }
 
                                        if (base_override.IsGeneric) {
-                                               ObsoleteAttribute oa;
                                                foreach (var base_tp in base_tparams) {
-                                                       oa = base_tp.BaseType.GetAttributeObsolete ();
-                                                       if (oa != null) {
-                                                               AttributeTester.Report_ObsoleteMessage (oa, base_tp.BaseType.GetSignatureForError (), Location, Report);
-                                                       }
+                                                       base_tp.BaseType.CheckObsoleteness (this, Location);
 
                                                        if (base_tp.InterfacesDefined != null) {
                                                                foreach (var iface in base_tp.InterfacesDefined) {
-                                                                       oa = iface.GetAttributeObsolete ();
-                                                                       if (oa != null) {
-                                                                               AttributeTester.Report_ObsoleteMessage (oa, iface.GetSignatureForError (), Location, Report);
-                                                                       }
+                                                                       iface.CheckObsoleteness (this, Location);
                                                                }
                                                        }
                                                }
@@ -1404,11 +1405,7 @@ namespace Mono.CSharp {
                                p.Name = md_p.Name;
                                p.DefaultValue = md_p.DefaultValue;
                                if (md_p.OptAttributes != null) {
-                                       if (p.OptAttributes == null) {
-                                               p.OptAttributes = md_p.OptAttributes;
-                                       } else {
-                                               p.OptAttributes.Attrs.AddRange (md_p.OptAttributes.Attrs);
-                                       }
+                                       Attributes.AttachFromPartial (p, md_p);
                                }
                        }
 
@@ -1498,15 +1495,6 @@ namespace Mono.CSharp {
                                                        "`{0}': Struct constructors cannot call base constructors", caller_builder.GetSignatureForError ());
                                                return this;
                                        }
-                               } else {
-                                       //
-                                       // It is legal to have "this" initializers that take no arguments
-                                       // in structs
-                                       //
-                                       // struct D { public D (int a) : this () {}
-                                       //
-                                       if (ec.CurrentType.IsStruct && argument_list == null)
-                                               return this;
                                }
 
                                base_ctor = ConstructorLookup (ec, type, ref argument_list, loc);
@@ -1663,12 +1651,6 @@ namespace Mono.CSharp {
                protected override bool CheckBase ()
                {
                        if ((ModFlags & Modifiers.STATIC) != 0) {
-                               if (!parameters.IsEmpty) {
-                                       Report.Error (132, Location, "`{0}': The static constructor must be parameterless",
-                                               GetSignatureForError ());
-                                       return false;
-                               }
-
                                if ((caching_flags & Flags.MethodOverloadsExist) != 0)
                                        Parent.MemberCache.CheckExistingMembersOverloads (this, parameters);
 
@@ -1683,12 +1665,6 @@ namespace Mono.CSharp {
                        if ((caching_flags & Flags.MethodOverloadsExist) != 0)
                                Parent.MemberCache.CheckExistingMembersOverloads (this, parameters);
 
-                       if (Parent.PartialContainer.Kind == MemberKind.Struct && parameters.IsEmpty) {
-                               Report.Error (568, Location, 
-                                       "Structs cannot contain explicit parameterless constructors");
-                               return false;
-                       }
-
                        CheckProtectedModifier ();
                        
                        return true;
@@ -1719,6 +1695,11 @@ namespace Mono.CSharp {
                                }
                        }
 
+                       if ((ModFlags & Modifiers.EXTERN) != 0 && Initializer != null) {
+                               Report.Error (8091, Location, "`{0}': Contructors cannot be extern and have a constructor initializer",
+                                       GetSignatureForError ());
+                       }
+
                        var ca = ModifiersExtensions.MethodAttr (ModFlags) | MethodAttributes.RTSpecialName | MethodAttributes.SpecialName;
 
                        ConstructorBuilder = Parent.TypeBuilder.DefineConstructor (
@@ -1786,8 +1767,12 @@ namespace Mono.CSharp {
                                // If we use a "this (...)" constructor initializer, then
                                // do not emit field initializers, they are initialized in the other constructor
                                //
-                               if (!(Initializer is ConstructorThisInitializer))
+                               if (!(Initializer is ConstructorThisInitializer)) {
+                                       var errors = Compiler.Report.Errors;
                                        Parent.PartialContainer.ResolveFieldInitializers (bc);
+                                       if (errors != Compiler.Report.Errors)
+                                               return;
+                               }
 
                                if (!IsStatic) {
                                        if (Initializer == null && Parent.PartialContainer.Kind == MemberKind.Class) {
@@ -2667,7 +2652,7 @@ namespace Mono.CSharp {
                        else if (OperatorType == OpType.Implicit)
                                Parent.MemberCache.CheckExistingMembersOverloads (this, GetMetadataName (OpType.Explicit), parameters);
 
-                       TypeSpec declaring_type = Parent.CurrentType;
+                       TypeSpec declaring_type = Parent.PartialContainer.CurrentType;
                        TypeSpec return_type = MemberType;
                        TypeSpec first_arg_type = ParameterTypes [0];