Check overloaded method difference for CLS-compliance also with base class
authorMarek Safar <marek.safar@gmail.com>
Thu, 3 Nov 2011 10:31:29 +0000 (10:31 +0000)
committerMarek Safar <marek.safar@gmail.com>
Thu, 3 Nov 2011 12:08:04 +0000 (12:08 +0000)
12 files changed:
mcs/errors/cs0647-14.cs [deleted file]
mcs/errors/cs3006-1.cs
mcs/errors/cs3006-2.cs
mcs/errors/cs3006-3.cs
mcs/errors/cs3006-4.cs
mcs/errors/cs3006-5.cs
mcs/errors/cs3006-6.cs
mcs/errors/cs3006.cs
mcs/errors/cs3007.cs
mcs/errors/known-issues-net_4_5
mcs/mcs/membercache.cs
mcs/mcs/property.cs

diff --git a/mcs/errors/cs0647-14.cs b/mcs/errors/cs0647-14.cs
deleted file mode 100644 (file)
index 22a2d54..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// CS0647: Error during emitting `System.Security.Permissions.FileIOPermissionAttribute' attribute. The reason is `Absolute path information is required
-// Line: 9
-
-using System;
-using System.Security.Permissions;
-
-public class Program {
-
-       [FileIOPermission (SecurityAction.Demand, PathDiscovery="..%%\\")]
-       static public int Main (string[] args)
-       {
-               return 0;
-       }
-}
index 3d20456e7571bc9c992cca9cbf690434d70155e7..9e3740a9ccd6c2410ccda8dd6463bcf234ae6b10 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSClass.Test(int[,,])' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSClass.Test(int[,])' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 12
 // Compiler options: -warnaserror -warn:1
 
index 35245ac61ebe13c3162e3d00c388fc0aca3bc22c..8ff3d1fa3da0f6bc748399a61a9b307170935106 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSClass.Test(bool)' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSClass.Test(out bool)' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 12
 // Compiler options: -warnaserror -warn:1
 
index a442d6f544a3a4842733595a656a1a4f85814e59..65f563d363f047b940ab7b28a4433db89d92678a 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSInterface.Test(int)' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSInterface.Test(ref int)' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 10
 // Compiler options: -warnaserror -warn:1
 
index ceffdf3521381ea17030cabeb9b4424629dbc7a1..71b902f25788240d8cf0f128ca621c89dccaf746 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSInterface.Test(int[,,])' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSInterface.Test(int[,])' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 10
 // Compiler options: -warnaserror -warn:1
 
index ee272b81b00b42031a75fb7be975067154c1683c..1008a1d234f406deaf0ee113065888215ddcc4d6 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSInterface.Test(bool)' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSInterface.Test(out bool)' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 10
 // Compiler options: -warnaserror -warn:1
 
index dc836561797a018c0227539b648574744cf19e1f..6912633fe2d7464c36a69bcdf2c87a22051b83df 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSClass.CLSClass(int[,,])' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSClass.CLSClass(int[,])' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 12
 // Compiler options: -warnaserror -warn:1
 
index 6dedb437a5c9e8fe8753e2866e44662babdc3f5e..d7e7721f2a3e97d1eb1258d3fbac9a1c0cd19463 100644 (file)
@@ -1,4 +1,4 @@
-// CS3006: Overloaded method `CLSClass.Test(int)' differing only in ref or out, or in array rank, is not CLS-compliant
+// CS3006: Overloaded method `CLSClass.Test(ref int)' differing only in ref or out, or in array rank, is not CLS-compliant
 // Line: 12
 // Compiler options: -warnaserror -warn:1
 
index 7694312eb953bf3933e1d2668c7782cac83ae963..a8562047c09e9df5e6203bf5b6c1130f5ce6cbbc 100644 (file)
@@ -1,4 +1,4 @@
-// CS3007: Overloaded method `CLSClass.CLSClass(int[][,,])' differing only by unnamed array types is not CLS-compliant
+// CS3007: Overloaded method `CLSClass.CLSClass(bool[])' differing only by unnamed array types is not CLS-compliant
 // Line: 12
 // Compiler options: -warnaserror -warn:1
 
index fd23ccffac07fa1bb806d8df5619aab19ff02454..1aa065de994d4a18579f26446614cbdecbdc767e 100644 (file)
@@ -19,6 +19,3 @@ cs0457.cs
 
 # all the following are from bug #628673
 cs1979.cs
-cs0168-2.cs
-cs0647-14.cs NO ERROR
-cs3006-7.cs NO ERROR
index 61b51dd7ef04569153e41da2fe773fdafb083a66..f414a9821258b9de847a6cea51d76bc04a642109 100644 (file)
@@ -1177,10 +1177,14 @@ namespace Mono.CSharp {
                                        if (name_entry.MemberDefinition.CLSAttributeValue == false)
                                            continue;
 
-                                       IParametersMember p_a = name_entry as IParametersMember;
-                                       if (p_a != null && !name_entry.IsAccessor) {
-                                               if (!is_imported_type) {
+                                       IParametersMember p_a = null;
+                                       if (!is_imported_type) {
+                                               p_a = name_entry as IParametersMember;
+                                               if (p_a != null && !name_entry.IsAccessor) {
                                                        var p_a_pd = p_a.Parameters;
+                                                       //
+                                                       // Check differing overloads in @container
+                                                       //
                                                        for (int ii = i + 1; ii < entry.Value.Count; ++ii) {
                                                                var checked_entry = entry.Value[ii];
                                                                IParametersMember p_b = checked_entry as IParametersMember;
@@ -1195,24 +1199,7 @@ namespace Mono.CSharp {
 
                                                                var res = ParametersCompiled.IsSameClsSignature (p_a.Parameters, p_b.Parameters);
                                                                if (res != 0) {
-                                                                       var last = GetLaterDefinedMember (checked_entry, name_entry);
-                                                                       if (last == checked_entry.MemberDefinition) {
-                                                                               report.SymbolRelatedToPreviousError (name_entry);
-                                                                       } else {
-                                                                               report.SymbolRelatedToPreviousError (checked_entry);
-                                                                       }
-
-                                                                       if ((res & 1) != 0) {
-                                                                               report.Warning (3006, 1, last.Location,
-                                                                                               "Overloaded method `{0}' differing only in ref or out, or in array rank, is not CLS-compliant",
-                                                                                               name_entry.GetSignatureForError ());
-                                                                       }
-
-                                                                       if ((res & 2) != 0) {
-                                                                               report.Warning (3007, 1, last.Location,
-                                                                                       "Overloaded method `{0}' differing only by unnamed array types is not CLS-compliant",
-                                                                                       name_entry.GetSignatureForError ());
-                                                                       }
+                                                                       ReportOverloadedMethodClsDifference (name_entry, checked_entry, res, report);
                                                                }
                                                        }
                                                }
@@ -1230,11 +1217,26 @@ namespace Mono.CSharp {
                                        } else {
                                                bool same_names_only = true;
                                                foreach (var f in found) {
-                                                       if (f.Name == name_entry.Name)
-                                                               continue;
+                                                       if (f.Name == name_entry.Name) {
+                                                               if (p_a != null) {
+                                                                       IParametersMember p_b = f as IParametersMember;
+                                                                       if (p_b == null)
+                                                                               continue;
+
+                                                                       if (p_a.Parameters.Count != p_b.Parameters.Count)
+                                                                               continue;
+
+                                                                       if (f.IsAccessor)
+                                                                               continue;
+
+                                                                       var res = ParametersCompiled.IsSameClsSignature (p_a.Parameters, p_b.Parameters);
+                                                                       if (res != 0) {
+                                                                               ReportOverloadedMethodClsDifference (f, name_entry, res, report);
+                                                                       }
+                                                               }
 
-//                                                     if (f.IsAccessor && name_entry.IsAccessor)
-//                                                             continue;
+                                                               continue;
+                                                       }
 
                                                        same_names_only = false;
                                                        if (!is_imported_type) {
@@ -1273,12 +1275,37 @@ namespace Mono.CSharp {
                        if (mc_b == null)
                                return mc_a;
 
+                       if (a.DeclaringType.MemberDefinition != b.DeclaringType.MemberDefinition)
+                               return mc_b;
+
                        if (mc_a.Location.File != mc_a.Location.File)
                                return mc_b;
 
                        return mc_b.Location.Row > mc_a.Location.Row ? mc_b : mc_a;
                }
 
+               static void ReportOverloadedMethodClsDifference (MemberSpec a, MemberSpec b, int res, Report report)
+               {
+                       var last = GetLaterDefinedMember (a, b);
+                       if (last == a.MemberDefinition) {
+                               report.SymbolRelatedToPreviousError (b);
+                       } else {
+                               report.SymbolRelatedToPreviousError (a);
+                       }
+
+                       if ((res & 1) != 0) {
+                               report.Warning (3006, 1, last.Location,
+                                               "Overloaded method `{0}' differing only in ref or out, or in array rank, is not CLS-compliant",
+                                               last.GetSignatureForError ());
+                       }
+
+                       if ((res & 2) != 0) {
+                               report.Warning (3007, 1, last.Location,
+                                       "Overloaded method `{0}' differing only by unnamed array types is not CLS-compliant",
+                                       last.GetSignatureForError ());
+                       }
+               }
+
                public bool CheckExistingMembersOverloads (MemberCore member, AParametersCollection parameters)
                {
                        var name = GetLookupName (member);
index 8493266bd37d99fbe0a990eb5190d0afeb26aef8..b357985b71547c2f850026d66e7bb3e525b018d3 100644 (file)
@@ -875,7 +875,7 @@ namespace Mono.CSharp
                abstract class EventFieldAccessor : AEventAccessor
                {
                        protected EventFieldAccessor (EventField method, string prefix)
-                               : base (method, prefix, null, Location.Null)
+                               : base (method, prefix, null, method.Location)
                        {
                        }