From: Marek Safar Date: Fri, 16 Sep 2016 08:55:41 +0000 (+0200) Subject: [mcs] Report more errors for nameof expressions. Fixes #44168 X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=9ed7e83881fba4bcec202be14765a4c6210f0044;p=mono.git [mcs] Report more errors for nameof expressions. Fixes #44168 --- diff --git a/mcs/errors/cs0122-39.cs b/mcs/errors/cs0122-39.cs new file mode 100644 index 00000000000..f7da1f94bfb --- /dev/null +++ b/mcs/errors/cs0122-39.cs @@ -0,0 +1,15 @@ +// CS0122: `A.Y' is inaccessible due to its protection level +// Line: 8 + +public class Test +{ + public static void Main () + { + var x = nameof (A.Y); + } +} + +public class A +{ + private int Y { get; set; } +} \ No newline at end of file diff --git a/mcs/errors/cs0619-59.cs b/mcs/errors/cs0619-59.cs new file mode 100644 index 00000000000..b703b0e44b4 --- /dev/null +++ b/mcs/errors/cs0619-59.cs @@ -0,0 +1,18 @@ +// CS0619: `A.X' is obsolete: `' +// Line: 10 + +using System; + +public class Test +{ + public static void Main() + { + var m = nameof (A.X); + } +} + +public class A +{ + [Obsolete ("", true)] + public int X; +} diff --git a/mcs/mcs/constant.cs b/mcs/mcs/constant.cs index a0ae78cdf51..acec3be3588 100644 --- a/mcs/mcs/constant.cs +++ b/mcs/mcs/constant.cs @@ -2149,11 +2149,6 @@ namespace Mono.CSharp { this.name = name; } - static void Error_MethodGroupWithTypeArguments (ResolveContext rc, Location loc) - { - rc.Report.Error (8084, loc, "An argument to nameof operator cannot be method group with type arguments"); - } - protected override Expression DoResolve (ResolveContext rc) { throw new NotSupportedException (); @@ -2169,9 +2164,9 @@ namespace Mono.CSharp { rc.Report.FeatureIsNotAvailable (rc.Module.Compiler, Location, "nameof operator"); var res = sn.LookupNameExpression (rc, MemberLookupRestrictions.IgnoreAmbiguity | MemberLookupRestrictions.NameOfExcluded); - if (sn.HasTypeArguments && res is MethodGroupExpr) { - Error_MethodGroupWithTypeArguments (rc, expr.Location); - } + var me = res as MemberExpr; + if (me != null) + me.ResolveNameOf (rc, sn); return true; } @@ -2197,20 +2192,9 @@ namespace Mono.CSharp { return false; } - var mg = res as MethodGroupExpr; - if (mg != null) { - var emg = res as ExtensionMethodGroupExpr; - if (emg != null && !emg.ResolveNameOf (rc, ma)) { - return true; - } - - if (!mg.HasAccessibleCandidate (rc)) { - ErrorIsInaccesible (rc, ma.GetSignatureForError (), loc); - } - - if (ma.HasTypeArguments) { - Error_MethodGroupWithTypeArguments (rc, ma.Location); - } + var me = res as MemberExpr; + if (me != null) { + me.ResolveNameOf (rc, ma); } // diff --git a/mcs/mcs/ecore.cs b/mcs/mcs/ecore.cs index 0937671675d..edc860eca83 100644 --- a/mcs/mcs/ecore.cs +++ b/mcs/mcs/ecore.cs @@ -3648,6 +3648,11 @@ namespace Mono.CSharp { return this; } + public virtual void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + + } + protected void EmitInstance (EmitContext ec, bool prepare_for_load) { var inst = new InstanceEmitter (InstanceExpression, TypeSpec.IsValueType (InstanceExpression.Type)); @@ -3752,27 +3757,9 @@ namespace Mono.CSharp { Convert.ImplicitBoxingConversion (null, argType, extensionType) != null; } - public bool ResolveNameOf (ResolveContext rc, MemberAccess ma) + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) { - rc.Report.Error (8093, ma.Location, "An argument to nameof operator cannot be extension method group"); - - // Not included in C#6 - /* - ExtensionExpression = ExtensionExpression.Resolve (rc); - if (ExtensionExpression == null) - return false; - - var argType = ExtensionExpression.Type; - foreach (MethodSpec candidate in Candidates) { - if (ExtensionMethodGroupExpr.IsExtensionTypeCompatible (argType, candidate.Parameters.ExtensionMethodType)) - return true; - } - - // TODO: Scan full hierarchy - - ma.Error_TypeDoesNotContainDefinition (rc, argType, ma.Name); - */ - return false; + rc.Report.Error (8093, expr.Location, "An argument to nameof operator cannot be extension method group"); } public override MethodGroupExpr LookupExtensionMethod (ResolveContext rc) @@ -4173,6 +4160,17 @@ namespace Mono.CSharp { return base.ResolveMemberAccess (ec, left, original); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + if (!HasAccessibleCandidate (rc)) { + ErrorIsInaccesible (rc, expr.GetSignatureForError (), loc); + } + + if (expr.HasTypeArguments) { + rc.Report.Error (8084, expr.Location, "An argument to nameof operator cannot be method group with type arguments"); + } + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { type_arguments = ta; @@ -6153,6 +6151,11 @@ namespace Mono.CSharp { return constant.GetSignatureForError (); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + constant.CheckObsoleteness (rc, expr.Location); + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { Error_TypeArgumentsCannotBeUsed (ec, "constant", GetSignatureForError (), loc); @@ -6382,6 +6385,11 @@ namespace Mono.CSharp { return this; } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + spec.CheckObsoleteness (rc, expr.Location); + } + public void SetFieldAssigned (FlowAnalysisContext fc) { if (!IsInstance) @@ -7152,6 +7160,14 @@ namespace Mono.CSharp { return true; } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + if (!best_candidate.IsAccessible (rc)) + ErrorIsInaccesible (rc, best_candidate.GetSignatureForError (), expr.Location); + + best_candidate.CheckObsoleteness (rc, expr.Location); + } + public void SetBackingFieldAssigned (FlowAnalysisContext fc) { if (backing_field != null) { @@ -7573,6 +7589,11 @@ namespace Mono.CSharp { return TypeManager.CSharpSignature (spec); } + public override void ResolveNameOf (ResolveContext rc, ATypeNameExpression expr) + { + spec.CheckObsoleteness (rc, expr.Location); + } + public override void SetTypeArguments (ResolveContext ec, TypeArguments ta) { Error_TypeArgumentsCannotBeUsed (ec, "event", GetSignatureForError (), loc);