[mcs] Fix obsolete checks on resolved types when type is inflated generic type with...
authorMarek Safar <marek.safar@gmail.com>
Mon, 27 Jul 2015 18:09:26 +0000 (20:09 +0200)
committerMarek Safar <marek.safar@gmail.com>
Mon, 27 Jul 2015 18:10:21 +0000 (20:10 +0200)
mcs/errors/cs0619-41.cs [new file with mode: 0644]
mcs/mcs/attribute.cs
mcs/mcs/class.cs
mcs/mcs/decl.cs
mcs/mcs/ecore.cs
mcs/mcs/expression.cs
mcs/mcs/generic.cs
mcs/mcs/method.cs

diff --git a/mcs/errors/cs0619-41.cs b/mcs/errors/cs0619-41.cs
new file mode 100644 (file)
index 0000000..6836097
--- /dev/null
@@ -0,0 +1,18 @@
+// CS0619: `Y' is obsolete: `ooo'
+// Line: 6
+
+using System;
+
+class X : I<Y>
+{
+}
+
+interface I<T>
+{
+
+}
+
+[Obsolete("ooo", true)]
+class Y
+{
+}
index 2aa793e79658681e2a6a9879ee60a024ea626d69..a145c37211fd58b2441b23dd32ec5b35a6a12a7a 100644 (file)
@@ -482,10 +482,7 @@ namespace Mono.CSharp {
                                return null;
                        }
 
-                       ObsoleteAttribute obsolete_attr = Type.GetAttributeObsolete ();
-                       if (obsolete_attr != null) {
-                               AttributeTester.Report_ObsoleteMessage (obsolete_attr, Type.GetSignatureForError (), Location, Report);
-                       }
+                       Type.CheckObsoleteness (context, expression.StartLocation);
 
                        ResolveContext rc = null;
 
@@ -579,8 +576,6 @@ namespace Mono.CSharp {
                                        return false;
                                }
 
-                               ObsoleteAttribute obsolete_attr;
-
                                if (member is PropertyExpr) {
                                        var pi = ((PropertyExpr) member).PropertyInfo;
 
@@ -596,7 +591,9 @@ namespace Mono.CSharp {
                                                return false;
                                        }
 
-                                       obsolete_attr = pi.GetAttributeObsolete ();
+//                                     if (!context.IsObsolete)
+                                               pi.CheckObsoleteness (ec, member.StartLocation);
+                                       
                                        pi.MemberDefinition.SetIsAssigned ();
                                } else {
                                        var fi = ((FieldExpr) member).Spec;
@@ -612,13 +609,12 @@ namespace Mono.CSharp {
                                                return false;
                                        }
 
-                                       obsolete_attr = fi.GetAttributeObsolete ();
+//                                     if (!context.IsObsolete)
+                                               fi.CheckObsoleteness (ec, member.StartLocation);
+
                                        fi.MemberDefinition.SetIsAssigned ();
                                }
 
-                               if (obsolete_attr != null && !context.IsObsolete)
-                                       AttributeTester.Report_ObsoleteMessage (obsolete_attr, member.GetSignatureForError (), member.Location, Report);
-
                                if (a.Type != member.Type) {
                                        a.Expr = Convert.ImplicitConversionRequired (ec, a.Expr, member.Type, a.Expr.Location);
                                }
index eaa12fa0ebeb5e3ef6cd1632e9d23c532f5446c4..67ee2a9ba097e99ef9ea694803ca8d0e4819e5b3 100644 (file)
@@ -1913,9 +1913,7 @@ namespace Mono.CSharp
                                        if (compiled_iface != null)
                                                compiled_iface.Define ();
 
-                                       ObsoleteAttribute oa = iface_type.GetAttributeObsolete ();
-                                       if (oa != null && !IsObsolete)
-                                               AttributeTester.Report_ObsoleteMessage (oa, iface_type.GetSignatureForError (), Location, Report);
+                                       iface_type.CheckObsoleteness (this, Location);
 
                                        if (iface_type.Arity > 0) {
                                                // TODO: passing `this' is wrong, should be base type iface instead
@@ -1956,9 +1954,7 @@ namespace Mono.CSharp
                                // Run checks skipped during DefineType (e.g FullNamedExpression::ResolveAsType)
                                //
                                if (base_type_expr != null) {
-                                       ObsoleteAttribute obsolete_attr = base_type.GetAttributeObsolete ();
-                                       if (obsolete_attr != null && !IsObsolete)
-                                               AttributeTester.Report_ObsoleteMessage (obsolete_attr, base_type.GetSignatureForError (), base_type_expr.Location, Report);
+                                       base_type.CheckObsoleteness (this, base_type_expr.Location);
 
                                        if (IsGenericOrParentIsGeneric && base_type.IsAttribute) {
                                                Report.Error (698, base_type_expr.Location,
index d60e6ca0aece20e9b2e085ff78ab2c8146817449..a386ab18b3bab8e955d5d175fc99d843ff495d43 100644 (file)
@@ -508,16 +508,6 @@ namespace Mono.CSharp {
                        return obsolete;
                }
 
-               /// <summary>
-               /// Checks for ObsoleteAttribute presence. It's used for testing of all non-types elements
-               /// </summary>
-               public virtual void CheckObsoleteness (Location loc)
-               {
-                       ObsoleteAttribute oa = GetAttributeObsolete ();
-                       if (oa != null)
-                               AttributeTester.Report_ObsoleteMessage (oa, GetSignatureForError (), loc, Report);
-               }
-
                //
                // Checks whether the type P is as accessible as this member
                //
@@ -1071,6 +1061,16 @@ namespace Mono.CSharp {
 
                #endregion
 
+               public virtual void CheckObsoleteness (IMemberContext mc, Location loc)
+               {
+                       var oa = GetAttributeObsolete ();
+                       if (oa == null)
+                               return;
+
+                       if (!mc.IsObsolete)
+                               AttributeTester.Report_ObsoleteMessage (oa, GetSignatureForError (), loc, mc.Module.Compiler.Report);
+               }
+
                public virtual ObsoleteAttribute GetAttributeObsolete ()
                {
                        if ((state & (StateFlags.Obsolete | StateFlags.Obsolete_Undetected)) == 0)
index 7b8c67d915e192c4029f4550f164088ed002aabd..83a56ae71cd3064c45002865680176712979b8e9 100644 (file)
@@ -3079,10 +3079,7 @@ namespace Mono.CSharp {
                        // require type dependencies to be set but we are in process of resolving them
                        //
                        if (!(mc is TypeDefinition.BaseContext) && !(mc is UsingAliasNamespace.AliasContext)) {
-                               ObsoleteAttribute obsolete_attr = type.GetAttributeObsolete ();
-                               if (obsolete_attr != null && !mc.IsObsolete) {
-                                       AttributeTester.Report_ObsoleteMessage (obsolete_attr, te.GetSignatureForError (), Location, mc.Module.Compiler.Report);
-                               }
+                               type.CheckObsoleteness (mc, fne.StartLocation);
                        }
 
                        return type;
@@ -3480,11 +3477,7 @@ namespace Mono.CSharp {
                                ImportedTypeDefinition.Error_MissingDependency (rc, dep, loc);
                        }
 
-                       if (!rc.IsObsolete) {
-                               ObsoleteAttribute oa = member.GetAttributeObsolete ();
-                               if (oa != null)
-                                       AttributeTester.Report_ObsoleteMessage (oa, member.GetSignatureForError (), loc, rc.Report);
-                       }
+                       member.CheckObsoleteness (rc, loc);
 
                        if (!(member is FieldSpec))
                                member.MemberDefinition.SetIsUsed ();
@@ -3583,10 +3576,7 @@ namespace Mono.CSharp {
                                        if (InstanceExpression is TypeExpr) {
                                                var t = InstanceExpression.Type;
                                                do {
-                                                       ObsoleteAttribute oa = t.GetAttributeObsolete ();
-                                                       if (oa != null && !rc.IsObsolete) {
-                                                               AttributeTester.Report_ObsoleteMessage (oa, t.GetSignatureForError (), loc, rc.Report);
-                                                       }
+                                                       t.CheckObsoleteness (rc, loc);
 
                                                        t = t.DeclaringType;
                                                } while (t != null);
@@ -5623,9 +5613,7 @@ namespace Mono.CSharp {
                                //
                                // Check ObsoleteAttribute on the best method
                                //
-                               ObsoleteAttribute oa = best_candidate.GetAttributeObsolete ();
-                               if (oa != null && !rc.IsObsolete)
-                                       AttributeTester.Report_ObsoleteMessage (oa, best_candidate.GetSignatureForError (), loc, rc.Report);
+                               best_candidate.CheckObsoleteness (rc, loc);
 
                                best_candidate.MemberDefinition.SetIsUsed ();
                        }
@@ -7360,11 +7348,7 @@ namespace Mono.CSharp {
 
                                        spec.MemberDefinition.SetIsUsed ();
 
-                                       if (!ec.IsObsolete) {
-                                               ObsoleteAttribute oa = spec.GetAttributeObsolete ();
-                                               if (oa != null)
-                                                       AttributeTester.Report_ObsoleteMessage (oa, spec.GetSignatureForError (), loc, ec.Report);
-                                       }
+                                       spec.CheckObsoleteness (ec, loc);
 
                                        if ((spec.Modifiers & (Modifiers.ABSTRACT | Modifiers.EXTERN)) != 0)
                                                Error_AssignmentEventOnly (ec);
index 36b70ad47b254199193ec0ca033054fb3426f8ab..09d5b8add989fed087217f1d288a45b87448a69a 100644 (file)
@@ -6911,12 +6911,7 @@ namespace Mono.CSharp
 
                        protected override MethodGroupExpr DoResolveOverload (ResolveContext rc)
                        {
-                               if (!rc.IsObsolete) {
-                                       var member = mg.BestCandidate;
-                                       ObsoleteAttribute oa = member.GetAttributeObsolete ();
-                                       if (oa != null)
-                                               AttributeTester.Report_ObsoleteMessage (oa, member.GetSignatureForError (), loc, rc.Report);
-                               }
+                               mg.BestCandidate.CheckObsoleteness (rc, loc);
 
                                return mg;
                        }
@@ -11198,9 +11193,7 @@ namespace Mono.CSharp
                        
                protected override Expression DoResolve (ResolveContext ec)
                {
-                       ObsoleteAttribute oa = method.GetAttributeObsolete ();
-                       if (oa != null)
-                               AttributeTester.Report_ObsoleteMessage (oa, GetSignatureForError (), loc, ec.Report);
+                       method.CheckObsoleteness (ec, source.Location);
 
                        eclass = ExprClass.Value;
                        return this;
index 369ee5db92e12ba9d6a7406e0ae4d7601db40a00..b4b98f067a8cc355606514cb2d042c2e99baf954 100644 (file)
@@ -195,9 +195,7 @@ namespace Mono.CSharp {
                                        continue;
 
                                if (obsoleteCheck) {
-                                       ObsoleteAttribute obsolete_attr = t.GetAttributeObsolete ();
-                                       if (obsolete_attr != null)
-                                               AttributeTester.Report_ObsoleteMessage (obsolete_attr, t.GetSignatureForError (), c.Location, context.Module.Compiler.Report);
+                                       t.CheckObsoleteness (context, c.Location);
                                }
 
                                ConstraintChecker.Check (context, t, c.Location);
@@ -1940,6 +1938,14 @@ namespace Mono.CSharp {
                        return definition.GetMetaInfo ().MakeGenericType (all.ToArray ());
                }
 
+               public override void CheckObsoleteness (IMemberContext mc, Location loc)
+               {
+                       base.CheckObsoleteness (mc, loc);
+
+                       foreach (var ta in TypeArguments)
+                               ta.CheckObsoleteness (mc, loc);
+               }
+
                public override ObsoleteAttribute GetAttributeObsolete ()
                {
                        return open_type.GetAttributeObsolete ();
index 6033cf47de3f0cf54054dc676c1f8f3c63629d36..8ac79aeec605dc83ea4637349600bc419193fa4f 100644 (file)
@@ -1090,19 +1090,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);
                                                                }
                                                        }
                                                }