提交 003f19a2 编写于 作者: J Julien Couvreur 提交者: GitHub

Underscore should report an error if used as discard with langver < 7 (#15962)

上级 f97d2ab9
......@@ -1240,7 +1240,13 @@ private static bool FallBackOnDiscard(IdentifierNameSyntax node, DiagnosticBag d
}
CSharpSyntaxNode containingDeconstruction = node.GetContainingDeconstruction();
return containingDeconstruction != null || IsOutVarDiscardIdentifier(node);
bool isDiscard = containingDeconstruction != null || IsOutVarDiscardIdentifier(node);
if (isDiscard)
{
CheckFeatureAvailability(node.Location, MessageID.IDS_FeatureTuples, diagnostics);
}
return isDiscard;
}
private static bool IsOutVarDiscardIdentifier(SimpleNameSyntax node)
......
......@@ -5125,6 +5125,106 @@ static void Main()
Assert.Equal("System.Int32", model.GetTypeInfo(discard1).Type.ToTestDisplayString());
}
[Fact]
public void SingleDiscardInAssignmentInCSharp6()
{
var source =
@"
class C
{
static void Error()
{
_ = 1;
}
static void Ok()
{
int _;
_ = 1;
System.Console.Write(_);
}
}
";
var comp = CreateCompilationWithMscorlib(source, parseOptions: TestOptions.Regular6);
comp.VerifyDiagnostics(
// (6,9): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// _ = M();
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "_").WithArguments("tuples", "7").WithLocation(6, 9)
);
}
[Fact]
public void VariousDiscardsInCSharp6()
{
var source =
@"
class C
{
static void M(out int x)
{
(_, var _, int _) = (1, 2, 3);
var (_, _) = (1, 2);
bool b = 3 is int _;
switch (3)
{
case _: // not a discard
break;
}
switch (3)
{
case int _:
break;
}
M(out var _);
M(out int _);
M(out _);
x = 2;
}
}
";
var comp = CreateCompilationWithMscorlib(source, parseOptions: TestOptions.Regular6, references: s_valueTupleRefs);
comp.VerifyDiagnostics(
// (6,9): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// (_, var _, int _) = (1, 2, 3);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "(_, var _, int _)").WithArguments("tuples", "7").WithLocation(6, 9),
// (6,29): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// (_, var _, int _) = (1, 2, 3);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "(1, 2, 3)").WithArguments("tuples", "7").WithLocation(6, 29),
// (7,13): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// var (_, _) = (1, 2);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "(_, _)").WithArguments("tuples", "7").WithLocation(7, 13),
// (7,22): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// var (_, _) = (1, 2);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "(1, 2)").WithArguments("tuples", "7").WithLocation(7, 22),
// (8,18): error CS8059: Feature 'pattern matching' is not available in C# 6. Please use language version 7 or greater.
// bool b = 3 is int _;
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "3 is int _").WithArguments("pattern matching", "7").WithLocation(8, 18),
// (16,13): error CS8059: Feature 'pattern matching' is not available in C# 6. Please use language version 7 or greater.
// case int _:
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "case int _:").WithArguments("pattern matching", "7").WithLocation(16, 13),
// (19,19): error CS8059: Feature 'out variable declaration' is not available in C# 6. Please use language version 7 or greater.
// M(out var _);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "_").WithArguments("out variable declaration", "7").WithLocation(19, 19),
// (20,19): error CS8059: Feature 'out variable declaration' is not available in C# 6. Please use language version 7 or greater.
// M(out int _);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "_").WithArguments("out variable declaration", "7").WithLocation(20, 19),
// (6,10): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// (_, var _, int _) = (1, 2, 3);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "_").WithArguments("tuples", "7").WithLocation(6, 10),
// (11,18): error CS0103: The name '_' does not exist in the current context
// case _: // not a discard
Diagnostic(ErrorCode.ERR_NameNotInContext, "_").WithArguments("_").WithLocation(11, 18),
// (21,15): error CS8059: Feature 'tuples' is not available in C# 6. Please use language version 7 or greater.
// M(out _);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion6, "_").WithArguments("tuples", "7").WithLocation(21, 15),
// (12,17): warning CS0162: Unreachable code detected
// break;
Diagnostic(ErrorCode.WRN_UnreachableCode, "break").WithLocation(12, 17),
// (17,17): warning CS0162: Unreachable code detected
// break;
Diagnostic(ErrorCode.WRN_UnreachableCode, "break").WithLocation(17, 17)
);
}
[Fact]
public void SingleDiscardInAsyncAssignment()
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册