提交 a07d2c88 编写于 作者: N Neal Gafter

A method may have the same name as its type parameter.

Fixes #7506
上级 38ac20ed
......@@ -822,10 +822,7 @@ private ImmutableArray<TypeParameterSymbol> MakeTypeParameters(MethodDeclaration
var location = identifier.GetLocation();
var name = identifier.ValueText;
if (name == this.Name)
{
diagnostics.Add(ErrorCode.ERR_TypeVariableSameAsParent, location, name);
}
// Note: It is not an error to have a type parameter named the same as its enclosing method: void M<M>() {}
for (int i = 0; i < result.Count; i++)
{
......
......@@ -10,7 +10,7 @@
namespace Microsoft.CodeAnalysis.CSharp.Symbols
{
/// <summary>
/// A context for binding type parameter symbols.
/// A context for binding type parameter symbols of named types.
/// </summary>
internal sealed class TypeParameterBuilder
{
......@@ -37,6 +37,7 @@ internal TypeParameterSymbol MakeSymbol(int ordinal, IList<TypeParameterBuilder>
ToLocations(builders),
ToSyntaxRefs(builders));
// SPEC: A type parameter [of a type] cannot have the same name as the type itself.
if (result.Name == result.ContainingSymbol.Name)
{
diagnostics.Add(ErrorCode.ERR_TypeVariableSameAsParent, result.Locations[0], result.Name);
......
......@@ -11961,7 +11961,7 @@ public void CS0694ERR_TypeVariableSameAsParent01()
{
interface IFoo
{
void M<M>(M m);
void M<M>(M m); // OK (constraint applies to types but not methods)
}
class C<C>
......@@ -11972,13 +11972,14 @@ public struct S<T, S>
}
}
";
var comp = DiagnosticsUtils.VerifyErrorsAndGetCompilationWithMscorlib(text,
new ErrorDescription { Code = (int)ErrorCode.ERR_TypeVariableSameAsParent, Line = 5, Column = 16 }, // Dev10 not report this if there next 2 errors
new ErrorDescription { Code = (int)ErrorCode.ERR_TypeVariableSameAsParent, Line = 8, Column = 13 },
new ErrorDescription { Code = (int)ErrorCode.ERR_TypeVariableSameAsParent, Line = 10, Column = 28 });
var ns = comp.SourceModule.GlobalNamespace.GetMembers("NS").Single() as NamespaceSymbol;
// TODO...
CreateCompilationWithMscorlib(text).VerifyDiagnostics(
// (8,13): error CS0694: Type parameter 'C' has the same name as the containing type, or method
// class C<C>
Diagnostic(ErrorCode.ERR_TypeVariableSameAsParent, "C").WithArguments("C").WithLocation(8, 13),
// (10,28): error CS0694: Type parameter 'S' has the same name as the containing type, or method
// public struct S<T, S>
Diagnostic(ErrorCode.ERR_TypeVariableSameAsParent, "S").WithArguments("S").WithLocation(10, 28)
);
}
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册