/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Emit3/Semantics/PatternMatchingTests_Scope.cs
14 084 строки
566 KB
Cyrus Najmabadi
Update test
05 ноя 2024, 19:53
05 ноя 2024, 19:53
7de7e64
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.Test.Utilities; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests { [CompilerTrait(CompilerFeature.Patterns)] public class PatternMatchingTests_Scope : PatternMatchingTestBase { [Fact] [WorkItem(13029, "https://github.com/dotnet/roslyn/issues/13029")] public void ScopeOfLocalFunction() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) { return true; } void Test14(int val) { switch (val) { case 1 when TakeOutParam(true, out var x14): void x14() {return;}; break; case 2: x14(); break; } switch (val) { case 1 when Dummy(1 is var x14): void x14() {return;}; break; case 2: x14(); break; } } static bool TakeOutParam<T>(T y, out T x) { x = y; return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (14,52): error CS0136: A local or parameter named 'x14' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when TakeOutParam(true, out var x14): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x14").WithArguments("x14").WithLocation(14, 52), // (24,40): error CS0136: A local or parameter named 'x14' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(1 is var x14): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x14").WithArguments("x14").WithLocation(24, 40)); } [Fact] public void ScopeOfPatternVariables_ExpressionStatement_01() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { Dummy(true is var x1, x1); { Dummy(true is var x1, x1); } Dummy(true is var x1, x1); } void Test2() { Dummy(x2, true is var x2); } void Test3(int x3) { Dummy(true is var x3, x3); } void Test4() { var x4 = 11; Dummy(x4); Dummy(true is var x4, x4); } void Test5() { Dummy(true is var x5, x5); var x5 = 11; Dummy(x5); } //void Test6() //{ // let x6 = 11; // Dummy(x6); // Dummy(true is var x6, x6); //} //void Test7() //{ // Dummy(true is var x7, x7); // let x7 = 11; // Dummy(x7); //} void Test8() { Dummy(true is var x8, x8, false is var x8, x8); } void Test9(bool y9) { if (y9) Dummy(true is var x9, x9); } System.Action Test10(bool y10) { return () => { if (y10) Dummy(true is var x10, x10); }; } void Test11() { Dummy(x11); Dummy(true is var x11, x11); } void Test12() { Dummy(true is var x12, x12); Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (14,31): error CS0136: A local or parameter named 'x1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(14, 31), // (16,27): error CS0128: A local variable or function named 'x1' is already defined in this scope // Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(16, 27), // (21,15): error CS0841: Cannot use local variable 'x2' before it is declared // Dummy(x2, true is var x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(21, 15), // (26,27): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x3, x3); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(26, 27), // (33,27): error CS0128: A local variable or function named 'x4' is already defined in this scope // Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(33, 27), // (39,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(39, 13), // (39,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(39, 13), // (59,48): error CS0128: A local variable or function named 'x8' is already defined in this scope // Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(59, 48), // (79,15): error CS0841: Cannot use local variable 'x11' before it is declared // Dummy(x11); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x11").WithArguments("x11").WithLocation(79, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(2, x8Ref.Length); for (int i = 0; i < x8Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref); } [Fact] public void ScopeOfPatternVariables_ExpressionStatement_02() { var text = @" public class Cls { public static void Main() { Test1(2 is var x1); System.Console.WriteLine(x1); } static object Test1(bool x) { return null; } }"; var compilation = CreateCompilation(text, options: TestOptions.ReleaseExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: "2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Decl.Length); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref); } [Fact] public void ScopeOfPatternVariables_ExpressionStatement_03() { var text = @" public class Cls { public static void Main() { Test0(); } static object Test0() { bool test = true; if (test) Test2(1 is var x1, x1); if (test) { Test2(2 is var x1, x1); } return null; } static object Test2(object x, object y) { System.Console.Write(y); return x; } }"; var compilation = CreateCompilation(text, options: TestOptions.ReleaseExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: "12").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Decl.Length); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); } [Fact] public void ScopeOfPatternVariables_ExpressionStatement_04() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { if (true) Dummy(true is var x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (15,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(15, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_ExpressionStatement_05() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (ExpressionStatementSyntax)SyntaxFactory.ParseStatement(@" Dummy(11 is var x1, x1); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact, WorkItem(9258, "https://github.com/dotnet/roslyn/issues/9258")] public void PatternVariableOrder() { var source = @" public class X { public static void Main() { } static void Dummy(params object[] x) {} void Test1(object o1, object o2) { Dummy(o1 is int i && i < 10, o2 is int @i && @i > 10); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,25): error CS0128: A local variable named 'i' is already defined in this scope // o2 is int @i && @i > 10); Diagnostic(ErrorCode.ERR_LocalDuplicate, "@i").WithArguments("i").WithLocation(13, 25), // (13,31): error CS0165: Use of unassigned local variable 'i' // o2 is int @i && @i > 10); Diagnostic(ErrorCode.ERR_UseDefViolation, "@i").WithArguments("i").WithLocation(13, 31) ); } [Fact] public void ScopeOfPatternVariables_ReturnStatement_01() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) { return null; } object Test1() { return Dummy(true is var x1, x1); { return Dummy(true is var x1, x1); } return Dummy(true is var x1, x1); } object Test2() { return Dummy(x2, true is var x2); } object Test3(int x3) { return Dummy(true is var x3, x3); } object Test4() { var x4 = 11; Dummy(x4); return Dummy(true is var x4, x4); } object Test5() { return Dummy(true is var x5, x5); var x5 = 11; Dummy(x5); } //object Test6() //{ // let x6 = 11; // Dummy(x6); // return Dummy(true is var x6, x6); //} //object Test7() //{ // return Dummy(true is var x7, x7); // let x7 = 11; // Dummy(x7); //} object Test8() { return Dummy(true is var x8, x8, false is var x8, x8); } object Test9(bool y9) { if (y9) return Dummy(true is var x9, x9); return null; } System.Func<object> Test10(bool y10) { return () => { if (y10) return Dummy(true is var x10, x10); return null;}; } object Test11() { Dummy(x11); return Dummy(true is var x11, x11); } object Test12() { return Dummy(true is var x12, x12); Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (14,38): error CS0136: A local or parameter named 'x1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // return Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(14, 38), // (16,34): error CS0128: A local variable or function named 'x1' is already defined in this scope // return Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(16, 34), // (14,13): warning CS0162: Unreachable code detected // return Dummy(true is var x1, x1); Diagnostic(ErrorCode.WRN_UnreachableCode, "return").WithLocation(14, 13), // (21,22): error CS0841: Cannot use local variable 'x2' before it is declared // return Dummy(x2, true is var x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(21, 22), // (26,34): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // return Dummy(true is var x3, x3); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(26, 34), // (33,34): error CS0128: A local variable or function named 'x4' is already defined in this scope // return Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(33, 34), // (39,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(39, 13), // (39,9): warning CS0162: Unreachable code detected // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreachableCode, "var").WithLocation(39, 9), // (39,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(39, 13), // (59,55): error CS0128: A local variable or function named 'x8' is already defined in this scope // return Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(59, 55), // (79,15): error CS0841: Cannot use local variable 'x11' before it is declared // Dummy(x11); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x11").WithArguments("x11").WithLocation(79, 15), // (86,9): warning CS0162: Unreachable code detected // Dummy(x12); Diagnostic(ErrorCode.WRN_UnreachableCode, "Dummy").WithLocation(86, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref); } [Fact] public void ScopeOfPatternVariables_ReturnStatement_02() { var source = @" public class X { public static void Main() { } int Dummy(params object[] x) {return 0;} int Test1(bool val) { if (val) return Dummy(true is var x1); x1++; return 0; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (15,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(15, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_ReturnStatement_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (ReturnStatementSyntax)SyntaxFactory.ParseStatement(@" return Dummy(11 is var x1, x1); "); bool success = model.TryGetSpeculativeSemanticModel( tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_ThrowStatement_01() { var source = @" public class X { public static void Main() { } System.Exception Dummy(params object[] x) { return null;} void Test1() { throw Dummy(true is var x1, x1); { throw Dummy(true is var x1, x1); } throw Dummy(true is var x1, x1); } void Test2() { throw Dummy(x2, true is var x2); } void Test3(int x3) { throw Dummy(true is var x3, x3); } void Test4() { var x4 = 11; Dummy(x4); throw Dummy(true is var x4, x4); } void Test5() { throw Dummy(true is var x5, x5); var x5 = 11; Dummy(x5); } //void Test6() //{ // let x6 = 11; // Dummy(x6); // throw Dummy(true is var x6, x6); //} //void Test7() //{ // throw Dummy(true is var x7, x7); // let x7 = 11; // Dummy(x7); //} void Test8() { throw Dummy(true is var x8, x8, false is var x8, x8); } void Test9(bool y9) { if (y9) throw Dummy(true is var x9, x9); } System.Action Test10(bool y10) { return () => { if (y10) throw Dummy(true is var x10, x10); }; } void Test11() { Dummy(x11); throw Dummy(true is var x11, x11); } void Test12() { throw Dummy(true is var x12, x12); Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (14,37): error CS0136: A local or parameter named 'x1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // throw Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(14, 37), // (16,33): error CS0128: A local variable or function named 'x1' is already defined in this scope // throw Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(16, 33), // (21,21): error CS0841: Cannot use local variable 'x2' before it is declared // throw Dummy(x2, true is var x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(21, 21), // (26,33): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // throw Dummy(true is var x3, x3); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(26, 33), // (33,33): error CS0128: A local variable or function named 'x4' is already defined in this scope // throw Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(33, 33), // (39,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(39, 13), // (39,9): warning CS0162: Unreachable code detected // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreachableCode, "var").WithLocation(39, 9), // (39,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(39, 13), // (59,54): error CS0128: A local variable or function named 'x8' is already defined in this scope // throw Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(59, 54), // (79,15): error CS0841: Cannot use local variable 'x11' before it is declared // Dummy(x11); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x11").WithArguments("x11").WithLocation(79, 15), // (86,9): warning CS0162: Unreachable code detected // Dummy(x12); Diagnostic(ErrorCode.WRN_UnreachableCode, "Dummy").WithLocation(86, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref); } [Fact] public void ScopeOfPatternVariables_ThrowStatement_02() { var source = @" public class X { public static void Main() { } System.Exception Dummy(params object[] x) { return null;} void Test1(bool val) { if (val) throw Dummy(true is var x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (15,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(15, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_TrowStatement_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (ThrowStatementSyntax)SyntaxFactory.ParseStatement(@" throw Dummy(11 is var x1, x1); "); bool success = model.TryGetSpeculativeSemanticModel( tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact, WorkItem(9121, "https://github.com/dotnet/roslyn/issues/9121")] public void ScopeOfPatternVariables_If_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { if (true is var x1) { Dummy(x1); } else { System.Console.WriteLine(x1); } } void Test2() { if (true is var x2) Dummy(x2); else System.Console.WriteLine(x2); } void Test3() { if (true is var x3) Dummy(x3); else { var x3 = 12; System.Console.WriteLine(x3); } } void Test4() { var x4 = 11; Dummy(x4); if (true is var x4) Dummy(x4); } void Test5(int x5) { if (true is var x5) Dummy(x5); } void Test6() { if (x6 && true is var x6) Dummy(x6); } void Test7() { if (true is var x7 && x7) { var x7 = 12; Dummy(x7); } } void Test8() { if (true is var x8) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { if (true is var x9) { Dummy(x9); if (true is var x9) // 2 Dummy(x9); } } void Test10() { if (y10 is var x10) { var y10 = 12; Dummy(y10); } } void Test12() { if (y12 is var x12) var y12 = 12; } //void Test13() //{ // if (y13 is var x13) // let y13 = 12; //} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (110,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(110, 13), // (36,17): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x3 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(36, 17), // (46,25): error CS0128: A local variable named 'x4' is already defined in this scope // if (true is var x4) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(46, 25), // (52,25): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // if (true is var x5) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(52, 25), // (58,13): error CS0841: Cannot use local variable 'x6' before it is declared // if (x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(58, 13), // (66,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(66, 17), // (83,19): error CS0841: Cannot use local variable 'x9' before it is declared // Dummy(x9); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(83, 19), // (84,29): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // if (true is var x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(84, 29), // (91,13): error CS0103: The name 'y10' does not exist in the current context // if (y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(91, 13), // (109,13): error CS0103: The name 'y12' does not exist in the current context // if (y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(109, 13), // (110,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(110, 17) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref[0]); VerifyNotAPatternLocal(model, x3Ref[1]); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(2, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); } [Fact] public void ScopeOfPatternVariables_If_02() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { if (true) if (true is var x1) { } x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (17,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(17, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_If_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (IfStatementSyntax)SyntaxFactory.ParseStatement(@" if (Dummy(11 is var x1, x1)); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_Lambda_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} System.Action<object> Test1() { return (o) => let x1 = o; } System.Action<object> Test2() { return (o) => let var x2 = o; } void Test3() { Dummy((System.Func<object, bool>) (o => o is int x3 && x3 > 0)); } void Test4() { Dummy((System.Func<object, bool>) (o => x4 && o is int x4)); } void Test5() { Dummy((System.Func<object, object, bool>) ((o1, o2) => o1 is int x5 && o2 is int x5 && x5 > 0)); } void Test6() { Dummy((System.Func<object, bool>) (o => o is int x6 && x6 > 0), (System.Func<object, bool>) (o => o is int x6 && x6 > 0)); } void Test7() { Dummy(x7, 1); Dummy(x7, (System.Func<object, bool>) (o => o is int x7 && x7 > 0), x7); Dummy(x7, 2); } void Test8() { Dummy(true is var x8 && x8, (System.Func<object, bool>) (o => o is int y8 && x8)); } void Test9() { Dummy(true is var x9, (System.Func<object, bool>) (o => o is int x9 && x9 > 0), x9); } void Test10() { Dummy((System.Func<object, bool>) (o => o is int x10 && x10 > 0), true is var x10, x10); } void Test11() { var x11 = 11; Dummy(x11); Dummy((System.Func<object, bool>) (o => o is int x11 && x11 > 0), x11); } void Test12() { Dummy((System.Func<object, bool>) (o => o is int x12 && x12 > 0), x12); var x12 = 11; Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (12,27): error CS1002: ; expected // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(12, 27), // (17,27): error CS1002: ; expected // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(17, 27), // (12,23): error CS0103: The name 'let' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(12, 23), // (12,23): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(12, 23), // (12,27): error CS0103: The name 'x1' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(12, 27), // (12,32): error CS0103: The name 'o' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(12, 32), // (12,27): warning CS0162: Unreachable code detected // return (o) => let x1 = o; Diagnostic(ErrorCode.WRN_UnreachableCode, "x1").WithLocation(12, 27), // (17,23): error CS0103: The name 'let' does not exist in the current context // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(17, 23), // (17,23): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(17, 23), // (17,36): error CS0103: The name 'o' does not exist in the current context // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(17, 36), // (17,27): warning CS0162: Unreachable code detected // return (o) => let var x2 = o; Diagnostic(ErrorCode.WRN_UnreachableCode, "var").WithLocation(17, 27), // (27,49): error CS0841: Cannot use local variable 'x4' before it is declared // Dummy((System.Func<object, bool>) (o => x4 && o is int x4)); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(27, 49), // (33,74): error CS0128: A local variable or function named 'x5' is already defined in this scope // o2 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(33, 74), // (44,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(44, 15), // (45,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(45, 15), // (47,15): error CS0103: The name 'x7' does not exist in the current context // x7); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(47, 15), // (48,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(48, 15), // (82,15): error CS0841: Cannot use local variable 'x12' before it is declared // x12); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x12").WithArguments("x12").WithLocation(82, 15) ); compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular7_3); compilation.VerifyDiagnostics( // (12,27): error CS1002: ; expected // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(12, 27), // (17,27): error CS1002: ; expected // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(17, 27), // (12,23): error CS0103: The name 'let' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(12, 23), // (12,23): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(12, 23), // (12,27): error CS0103: The name 'x1' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(12, 27), // (12,32): error CS0103: The name 'o' does not exist in the current context // return (o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(12, 32), // (12,27): warning CS0162: Unreachable code detected // return (o) => let x1 = o; Diagnostic(ErrorCode.WRN_UnreachableCode, "x1").WithLocation(12, 27), // (17,23): error CS0103: The name 'let' does not exist in the current context // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(17, 23), // (17,23): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(17, 23), // (17,36): error CS0103: The name 'o' does not exist in the current context // return (o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(17, 36), // (17,27): warning CS0162: Unreachable code detected // return (o) => let var x2 = o; Diagnostic(ErrorCode.WRN_UnreachableCode, "var").WithLocation(17, 27), // (27,49): error CS0841: Cannot use local variable 'x4' before it is declared // Dummy((System.Func<object, bool>) (o => x4 && o is int x4)); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(27, 49), // (33,74): error CS0128: A local variable or function named 'x5' is already defined in this scope // o2 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(33, 74), // (44,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(44, 15), // (45,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(45, 15), // (47,15): error CS0103: The name 'x7' does not exist in the current context // x7); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(47, 15), // (48,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(48, 15), // (59,58): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // (System.Func<object, bool>) (o => o is int x9 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(59, 58), // (65,58): error CS0136: A local or parameter named 'x10' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy((System.Func<object, bool>) (o => o is int x10 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x10").WithArguments("x10").WithLocation(65, 58), // (74,58): error CS0136: A local or parameter named 'x11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy((System.Func<object, bool>) (o => o is int x11 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x11").WithArguments("x11").WithLocation(74, 58), // (80,58): error CS0136: A local or parameter named 'x12' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy((System.Func<object, bool>) (o => o is int x12 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x12").WithArguments("x12").WithLocation(80, 58), // (82,15): error CS0841: Cannot use local variable 'x12' before it is declared // x12); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x12").WithArguments("x12").WithLocation(82, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(5, x7Ref.Length); VerifyNotInScope(model, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[2]); VerifyNotInScope(model, x7Ref[3]); VerifyNotInScope(model, x7Ref[4]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(2, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[0]); var x10Decl = GetPatternDeclarations(tree, "x10").ToArray(); var x10Ref = GetReferences(tree, "x10").ToArray(); Assert.Equal(2, x10Decl.Length); Assert.Equal(2, x10Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl[0], x10Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl[1], x10Ref[1]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(3, x11Ref.Length); VerifyNotAPatternLocal(model, x11Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[1]); VerifyNotAPatternLocal(model, x11Ref[2]); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(3, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref[0]); VerifyNotAPatternLocal(model, x12Ref[1]); VerifyNotAPatternLocal(model, x12Ref[2]); } [Fact] public void ScopeOfPatternVariables_Query_01() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { var res = from x in new[] { 1 is var y1 ? y1 : 0, y1} select x + y1; Dummy(y1); } void Test2() { var res = from x1 in new[] { 1 is var y2 ? y2 : 0} from x2 in new[] { x1 is var z2 ? z2 : 0, z2, y2} select x1 + x2 + y2 + z2; Dummy(z2); } void Test3() { var res = from x1 in new[] { 1 is var y3 ? y3 : 0} let x2 = x1 is var z3 && z3 > 0 && y3 < 0 select new { x1, x2, y3, z3}; Dummy(z3); } void Test4() { var res = from x1 in new[] { 1 is var y4 ? y4 : 0} join x2 in new[] { 2 is var z4 ? z4 : 0, z4, y4} on x1 + y4 + z4 + 3 is var u4 ? u4 : 0 + v4 equals x2 + y4 + z4 + 4 is var v4 ? v4 : 0 + u4 select new { x1, x2, y4, z4, u4, v4 }; Dummy(z4); Dummy(u4); Dummy(v4); } void Test5() { var res = from x1 in new[] { 1 is var y5 ? y5 : 0} join x2 in new[] { 2 is var z5 ? z5 : 0, z5, y5} on x1 + y5 + z5 + 3 is var u5 ? u5 : 0 + v5 equals x2 + y5 + z5 + 4 is var v5 ? v5 : 0 + u5 into g select new { x1, y5, z5, g, u5, v5 }; Dummy(z5); Dummy(u5); Dummy(v5); } void Test6() { var res = from x in new[] { 1 is var y6 ? y6 : 0} where x > y6 && 1 is var z6 && z6 == 1 select x + y6 + z6; Dummy(z6); } void Test7() { var res = from x in new[] { 1 is var y7 ? y7 : 0} orderby x > y7 && 1 is var z7 && z7 == u7, x > y7 && 1 is var u7 && u7 == z7 select x + y7 + z7 + u7; Dummy(z7); Dummy(u7); } void Test8() { var res = from x in new[] { 1 is var y8 ? y8 : 0} select x > y8 && 1 is var z8 && z8 == 1; Dummy(z8); } void Test9() { var res = from x in new[] { 1 is var y9 ? y9 : 0} group x > y9 && 1 is var z9 && z9 == u9 by x > y9 && 1 is var u9 && u9 == z9; Dummy(z9); Dummy(u9); } void Test10() { var res = from x1 in new[] { 1 is var y10 ? y10 : 0} from y10 in new[] { 1 } select x1 + y10; } void Test11() { var res = from x1 in new[] { 1 is var y11 ? y11 : 0} let y11 = x1 + 1 select x1 + y11; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (25,26): error CS0103: The name 'z2' does not exist in the current context // z2; Diagnostic(ErrorCode.ERR_NameNotInContext, "z2").WithArguments("z2").WithLocation(25, 26), // (27,15): error CS0103: The name 'z2' does not exist in the current context // Dummy(z2); Diagnostic(ErrorCode.ERR_NameNotInContext, "z2").WithArguments("z2").WithLocation(27, 15), // (35,32): error CS0103: The name 'z3' does not exist in the current context // z3}; Diagnostic(ErrorCode.ERR_NameNotInContext, "z3").WithArguments("z3").WithLocation(35, 32), // (37,15): error CS0103: The name 'z3' does not exist in the current context // Dummy(z3); Diagnostic(ErrorCode.ERR_NameNotInContext, "z3").WithArguments("z3").WithLocation(37, 15), // (45,35): error CS0103: The name 'v4' does not exist in the current context // v4 Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(45, 35), // (47,35): error CS1938: The name 'u4' is not in scope on the right side of 'equals'. Consider swapping the expressions on either side of 'equals'. // u4 Diagnostic(ErrorCode.ERR_QueryInnerKey, "u4").WithArguments("u4").WithLocation(47, 35), // (49,32): error CS0103: The name 'u4' does not exist in the current context // u4, v4 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "u4").WithArguments("u4").WithLocation(49, 32), // (49,36): error CS0103: The name 'v4' does not exist in the current context // u4, v4 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(49, 36), // (52,15): error CS0103: The name 'u4' does not exist in the current context // Dummy(u4); Diagnostic(ErrorCode.ERR_NameNotInContext, "u4").WithArguments("u4").WithLocation(52, 15), // (53,15): error CS0103: The name 'v4' does not exist in the current context // Dummy(v4); Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(53, 15), // (61,35): error CS0103: The name 'v5' does not exist in the current context // v5 Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(61, 35), // (63,35): error CS1938: The name 'u5' is not in scope on the right side of 'equals'. Consider swapping the expressions on either side of 'equals'. // u5 Diagnostic(ErrorCode.ERR_QueryInnerKey, "u5").WithArguments("u5").WithLocation(63, 35), // (66,32): error CS0103: The name 'u5' does not exist in the current context // u5, v5 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "u5").WithArguments("u5").WithLocation(66, 32), // (66,36): error CS0103: The name 'v5' does not exist in the current context // u5, v5 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(66, 36), // (69,15): error CS0103: The name 'u5' does not exist in the current context // Dummy(u5); Diagnostic(ErrorCode.ERR_NameNotInContext, "u5").WithArguments("u5").WithLocation(69, 15), // (70,15): error CS0103: The name 'v5' does not exist in the current context // Dummy(v5); Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(70, 15), // (78,26): error CS0103: The name 'z6' does not exist in the current context // z6; Diagnostic(ErrorCode.ERR_NameNotInContext, "z6").WithArguments("z6").WithLocation(78, 26), // (80,15): error CS0103: The name 'z6' does not exist in the current context // Dummy(z6); Diagnostic(ErrorCode.ERR_NameNotInContext, "z6").WithArguments("z6").WithLocation(80, 15), // (87,27): error CS0103: The name 'u7' does not exist in the current context // u7, Diagnostic(ErrorCode.ERR_NameNotInContext, "u7").WithArguments("u7").WithLocation(87, 27), // (89,27): error CS0103: The name 'z7' does not exist in the current context // z7 Diagnostic(ErrorCode.ERR_NameNotInContext, "z7").WithArguments("z7").WithLocation(89, 27), // (91,26): error CS0103: The name 'z7' does not exist in the current context // z7 + u7; Diagnostic(ErrorCode.ERR_NameNotInContext, "z7").WithArguments("z7").WithLocation(91, 26), // (91,31): error CS0103: The name 'u7' does not exist in the current context // z7 + u7; Diagnostic(ErrorCode.ERR_NameNotInContext, "u7").WithArguments("u7").WithLocation(91, 31), // (93,15): error CS0103: The name 'z7' does not exist in the current context // Dummy(z7); Diagnostic(ErrorCode.ERR_NameNotInContext, "z7").WithArguments("z7").WithLocation(93, 15), // (94,15): error CS0103: The name 'u7' does not exist in the current context // Dummy(u7); Diagnostic(ErrorCode.ERR_NameNotInContext, "u7").WithArguments("u7").WithLocation(94, 15), // (102,15): error CS0103: The name 'z8' does not exist in the current context // Dummy(z8); Diagnostic(ErrorCode.ERR_NameNotInContext, "z8").WithArguments("z8").WithLocation(102, 15), // (112,25): error CS0103: The name 'z9' does not exist in the current context // z9; Diagnostic(ErrorCode.ERR_NameNotInContext, "z9").WithArguments("z9").WithLocation(112, 25), // (109,25): error CS0103: The name 'u9' does not exist in the current context // u9 Diagnostic(ErrorCode.ERR_NameNotInContext, "u9").WithArguments("u9").WithLocation(109, 25), // (114,15): error CS0103: The name 'z9' does not exist in the current context // Dummy(z9); Diagnostic(ErrorCode.ERR_NameNotInContext, "z9").WithArguments("z9").WithLocation(114, 15), // (115,15): error CS0103: The name 'u9' does not exist in the current context // Dummy(u9); Diagnostic(ErrorCode.ERR_NameNotInContext, "u9").WithArguments("u9").WithLocation(115, 15), // (121,24): error CS1931: The range variable 'y10' conflicts with a previous declaration of 'y10' // from y10 in new[] { 1 } Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y10").WithArguments("y10").WithLocation(121, 24), // (128,23): error CS1931: The range variable 'y11' conflicts with a previous declaration of 'y11' // let y11 = x1 + 1 Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y11").WithArguments("y11").WithLocation(128, 23) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var y1Decl = GetPatternDeclarations(tree, "y1").Single(); var y1Ref = GetReferences(tree, "y1").ToArray(); Assert.Equal(4, y1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y1Decl, y1Ref); var y2Decl = GetPatternDeclarations(tree, "y2").Single(); var y2Ref = GetReferences(tree, "y2").ToArray(); Assert.Equal(3, y2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y2Decl, y2Ref); var z2Decl = GetPatternDeclarations(tree, "z2").Single(); var z2Ref = GetReferences(tree, "z2").ToArray(); Assert.Equal(4, z2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z2Decl, z2Ref[0], z2Ref[1]); VerifyNotInScope(model, z2Ref[2]); VerifyNotInScope(model, z2Ref[3]); var y3Decl = GetPatternDeclarations(tree, "y3").Single(); var y3Ref = GetReferences(tree, "y3").ToArray(); Assert.Equal(3, y3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y3Decl, y3Ref); var z3Decl = GetPatternDeclarations(tree, "z3").Single(); var z3Ref = GetReferences(tree, "z3").ToArray(); Assert.Equal(3, z3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z3Decl, z3Ref[0]); VerifyNotInScope(model, z3Ref[1]); VerifyNotInScope(model, z3Ref[2]); var y4Decl = GetPatternDeclarations(tree, "y4").Single(); var y4Ref = GetReferences(tree, "y4").ToArray(); Assert.Equal(5, y4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y4Decl, y4Ref); var z4Decl = GetPatternDeclarations(tree, "z4").Single(); var z4Ref = GetReferences(tree, "z4").ToArray(); Assert.Equal(6, z4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z4Decl, z4Ref); var u4Decl = GetPatternDeclarations(tree, "u4").Single(); var u4Ref = GetReferences(tree, "u4").ToArray(); Assert.Equal(4, u4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, u4Decl, u4Ref[0]); VerifyNotInScope(model, u4Ref[1]); VerifyNotInScope(model, u4Ref[2]); VerifyNotInScope(model, u4Ref[3]); var v4Decl = GetPatternDeclarations(tree, "v4").Single(); var v4Ref = GetReferences(tree, "v4").ToArray(); Assert.Equal(4, v4Ref.Length); VerifyNotInScope(model, v4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, v4Decl, v4Ref[1]); VerifyNotInScope(model, v4Ref[2]); VerifyNotInScope(model, v4Ref[3]); var y5Decl = GetPatternDeclarations(tree, "y5").Single(); var y5Ref = GetReferences(tree, "y5").ToArray(); Assert.Equal(5, y5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y5Decl, y5Ref); var z5Decl = GetPatternDeclarations(tree, "z5").Single(); var z5Ref = GetReferences(tree, "z5").ToArray(); Assert.Equal(6, z5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z5Decl, z5Ref); var u5Decl = GetPatternDeclarations(tree, "u5").Single(); var u5Ref = GetReferences(tree, "u5").ToArray(); Assert.Equal(4, u5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, u5Decl, u5Ref[0]); VerifyNotInScope(model, u5Ref[1]); VerifyNotInScope(model, u5Ref[2]); VerifyNotInScope(model, u5Ref[3]); var v5Decl = GetPatternDeclarations(tree, "v5").Single(); var v5Ref = GetReferences(tree, "v5").ToArray(); Assert.Equal(4, v5Ref.Length); VerifyNotInScope(model, v5Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, v5Decl, v5Ref[1]); VerifyNotInScope(model, v5Ref[2]); VerifyNotInScope(model, v5Ref[3]); var y6Decl = GetPatternDeclarations(tree, "y6").Single(); var y6Ref = GetReferences(tree, "y6").ToArray(); Assert.Equal(3, y6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y6Decl, y6Ref); var z6Decl = GetPatternDeclarations(tree, "z6").Single(); var z6Ref = GetReferences(tree, "z6").ToArray(); Assert.Equal(3, z6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z6Decl, z6Ref[0]); VerifyNotInScope(model, z6Ref[1]); VerifyNotInScope(model, z6Ref[2]); var y7Decl = GetPatternDeclarations(tree, "y7").Single(); var y7Ref = GetReferences(tree, "y7").ToArray(); Assert.Equal(4, y7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y7Decl, y7Ref); var z7Decl = GetPatternDeclarations(tree, "z7").Single(); var z7Ref = GetReferences(tree, "z7").ToArray(); Assert.Equal(4, z7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z7Decl, z7Ref[0]); VerifyNotInScope(model, z7Ref[1]); VerifyNotInScope(model, z7Ref[2]); VerifyNotInScope(model, z7Ref[3]); var u7Decl = GetPatternDeclarations(tree, "u7").Single(); var u7Ref = GetReferences(tree, "u7").ToArray(); Assert.Equal(4, u7Ref.Length); VerifyNotInScope(model, u7Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, u7Decl, u7Ref[1]); VerifyNotInScope(model, u7Ref[2]); VerifyNotInScope(model, u7Ref[3]); var y8Decl = GetPatternDeclarations(tree, "y8").Single(); var y8Ref = GetReferences(tree, "y8").ToArray(); Assert.Equal(2, y8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y8Decl, y8Ref); var z8Decl = GetPatternDeclarations(tree, "z8").Single(); var z8Ref = GetReferences(tree, "z8").ToArray(); Assert.Equal(2, z8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z8Decl, z8Ref[0]); VerifyNotInScope(model, z8Ref[1]); var y9Decl = GetPatternDeclarations(tree, "y9").Single(); var y9Ref = GetReferences(tree, "y9").ToArray(); Assert.Equal(3, y9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y9Decl, y9Ref); var z9Decl = GetPatternDeclarations(tree, "z9").Single(); var z9Ref = GetReferences(tree, "z9").ToArray(); Assert.Equal(3, z9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z9Decl, z9Ref[0]); VerifyNotInScope(model, z9Ref[1]); VerifyNotInScope(model, z9Ref[2]); var u9Decl = GetPatternDeclarations(tree, "u9").Single(); var u9Ref = GetReferences(tree, "u9").ToArray(); Assert.Equal(3, u9Ref.Length); VerifyNotInScope(model, u9Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, u9Decl, u9Ref[1]); VerifyNotInScope(model, u9Ref[2]); var y10Decl = GetPatternDeclarations(tree, "y10").Single(); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y10Decl, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y11Decl = GetPatternDeclarations(tree, "y11").Single(); var y11Ref = GetReferences(tree, "y11").ToArray(); Assert.Equal(2, y11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y11Decl, y11Ref[0]); VerifyNotAPatternLocal(model, y11Ref[1]); } [Fact] public void ScopeOfPatternVariables_Query_03() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test4() { var res = from x1 in new[] { 1 is var y4 ? y4 : 0} select x1 into x1 join x2 in new[] { 2 is var z4 ? z4 : 0, z4, y4} on x1 + y4 + z4 + 3 is var u4 ? u4 : 0 + v4 equals x2 + y4 + z4 + 4 is var v4 ? v4 : 0 + u4 select new { x1, x2, y4, z4, u4, v4 }; Dummy(z4); Dummy(u4); Dummy(v4); } void Test5() { var res = from x1 in new[] { 1 is var y5 ? y5 : 0} select x1 into x1 join x2 in new[] { 2 is var z5 ? z5 : 0, z5, y5} on x1 + y5 + z5 + 3 is var u5 ? u5 : 0 + v5 equals x2 + y5 + z5 + 4 is var v5 ? v5 : 0 + u5 into g select new { x1, y5, z5, g, u5, v5 }; Dummy(z5); Dummy(u5); Dummy(v5); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (18,35): error CS0103: The name 'v4' does not exist in the current context // v4 Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(18, 35), // (20,35): error CS1938: The name 'u4' is not in scope on the right side of 'equals'. Consider swapping the expressions on either side of 'equals'. // u4 Diagnostic(ErrorCode.ERR_QueryInnerKey, "u4").WithArguments("u4").WithLocation(20, 35), // (22,32): error CS0103: The name 'u4' does not exist in the current context // u4, v4 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "u4").WithArguments("u4").WithLocation(22, 32), // (22,36): error CS0103: The name 'v4' does not exist in the current context // u4, v4 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(22, 36), // (25,15): error CS0103: The name 'u4' does not exist in the current context // Dummy(u4); Diagnostic(ErrorCode.ERR_NameNotInContext, "u4").WithArguments("u4").WithLocation(25, 15), // (26,15): error CS0103: The name 'v4' does not exist in the current context // Dummy(v4); Diagnostic(ErrorCode.ERR_NameNotInContext, "v4").WithArguments("v4").WithLocation(26, 15), // (35,35): error CS0103: The name 'v5' does not exist in the current context // v5 Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(35, 35), // (37,35): error CS1938: The name 'u5' is not in scope on the right side of 'equals'. Consider swapping the expressions on either side of 'equals'. // u5 Diagnostic(ErrorCode.ERR_QueryInnerKey, "u5").WithArguments("u5").WithLocation(37, 35), // (40,32): error CS0103: The name 'u5' does not exist in the current context // u5, v5 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "u5").WithArguments("u5").WithLocation(40, 32), // (40,36): error CS0103: The name 'v5' does not exist in the current context // u5, v5 }; Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(40, 36), // (43,15): error CS0103: The name 'u5' does not exist in the current context // Dummy(u5); Diagnostic(ErrorCode.ERR_NameNotInContext, "u5").WithArguments("u5").WithLocation(43, 15), // (44,15): error CS0103: The name 'v5' does not exist in the current context // Dummy(v5); Diagnostic(ErrorCode.ERR_NameNotInContext, "v5").WithArguments("v5").WithLocation(44, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var y4Decl = GetPatternDeclarations(tree, "y4").Single(); var y4Ref = GetReferences(tree, "y4").ToArray(); Assert.Equal(5, y4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y4Decl, y4Ref); var z4Decl = GetPatternDeclarations(tree, "z4").Single(); var z4Ref = GetReferences(tree, "z4").ToArray(); Assert.Equal(6, z4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z4Decl, z4Ref); var u4Decl = GetPatternDeclarations(tree, "u4").Single(); var u4Ref = GetReferences(tree, "u4").ToArray(); Assert.Equal(4, u4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, u4Decl, u4Ref[0]); VerifyNotInScope(model, u4Ref[1]); VerifyNotInScope(model, u4Ref[2]); VerifyNotInScope(model, u4Ref[3]); var v4Decl = GetPatternDeclarations(tree, "v4").Single(); var v4Ref = GetReferences(tree, "v4").ToArray(); Assert.Equal(4, v4Ref.Length); VerifyNotInScope(model, v4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, v4Decl, v4Ref[1]); VerifyNotInScope(model, v4Ref[2]); VerifyNotInScope(model, v4Ref[3]); var y5Decl = GetPatternDeclarations(tree, "y5").Single(); var y5Ref = GetReferences(tree, "y5").ToArray(); Assert.Equal(5, y5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y5Decl, y5Ref); var z5Decl = GetPatternDeclarations(tree, "z5").Single(); var z5Ref = GetReferences(tree, "z5").ToArray(); Assert.Equal(6, z5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, z5Decl, z5Ref); var u5Decl = GetPatternDeclarations(tree, "u5").Single(); var u5Ref = GetReferences(tree, "u5").ToArray(); Assert.Equal(4, u5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, u5Decl, u5Ref[0]); VerifyNotInScope(model, u5Ref[1]); VerifyNotInScope(model, u5Ref[2]); VerifyNotInScope(model, u5Ref[3]); var v5Decl = GetPatternDeclarations(tree, "v5").Single(); var v5Ref = GetReferences(tree, "v5").ToArray(); Assert.Equal(4, v5Ref.Length); VerifyNotInScope(model, v5Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, v5Decl, v5Ref[1]); VerifyNotInScope(model, v5Ref[2]); VerifyNotInScope(model, v5Ref[3]); } [Fact] [WorkItem(10466, "https://github.com/dotnet/roslyn/issues/10466")] public void ScopeOfPatternVariables_Query_05() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { int y1 = 0, y2 = 0, y3 = 0, y4 = 0, y5 = 0, y6 = 0, y7 = 0, y8 = 0, y9 = 0, y10 = 0, y11 = 0, y12 = 0; var res = from x1 in new[] { 1 is var y1 ? y1 : 0} from x2 in new[] { 2 is var y2 ? y2 : 0} join x3 in new[] { 3 is var y3 ? y3 : 0} on 4 is var y4 ? y4 : 0 equals 5 is var y5 ? y5 : 0 where 6 is var y6 && y6 == 1 orderby 7 is var y7 && y7 > 0, 8 is var y8 && y8 > 0 group 9 is var y9 && y9 > 0 by 10 is var y10 && y10 > 0 into g let x11 = 11 is var y11 && y11 > 0 select 12 is var y12 && y12 > 0 into s select y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10 + y11 + y12; Dummy(y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (16,47): error CS0128: A local variable or function named 'y1' is already defined in this scope // var res = from x1 in new[] { 1 is var y1 ? y1 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y1").WithArguments("y1").WithLocation(16, 47), // (18,47): error CS0128: A local variable or function named 'y3' is already defined in this scope // join x3 in new[] { 3 is var y3 ? y3 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y3").WithArguments("y3").WithLocation(18, 47) ); compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular7_3); compilation.VerifyDiagnostics( // (16,47): error CS0128: A local variable or function named 'y1' is already defined in this scope // var res = from x1 in new[] { 1 is var y1 ? y1 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y1").WithArguments("y1").WithLocation(16, 47), // (17,47): error CS0136: A local or parameter named 'y2' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // from x2 in new[] { 2 is var y2 ? y2 : 0} Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y2").WithArguments("y2").WithLocation(17, 47), // (18,47): error CS0128: A local variable or function named 'y3' is already defined in this scope // join x3 in new[] { 3 is var y3 ? y3 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y3").WithArguments("y3").WithLocation(18, 47), // (19,36): error CS0136: A local or parameter named 'y4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // on 4 is var y4 ? y4 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y4").WithArguments("y4").WithLocation(19, 36), // (20,43): error CS0136: A local or parameter named 'y5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // equals 5 is var y5 ? y5 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y5").WithArguments("y5").WithLocation(20, 43), // (21,34): error CS0136: A local or parameter named 'y6' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // where 6 is var y6 && y6 == 1 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y6").WithArguments("y6").WithLocation(21, 34), // (22,36): error CS0136: A local or parameter named 'y7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // orderby 7 is var y7 && y7 > 0, Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y7").WithArguments("y7").WithLocation(22, 36), // (23,36): error CS0136: A local or parameter named 'y8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // 8 is var y8 && y8 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y8").WithArguments("y8").WithLocation(23, 36), // (25,32): error CS0136: A local or parameter named 'y10' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // by 10 is var y10 && y10 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y10").WithArguments("y10").WithLocation(25, 32), // (24,34): error CS0136: A local or parameter named 'y9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // group 9 is var y9 && y9 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y9").WithArguments("y9").WithLocation(24, 34), // (27,39): error CS0136: A local or parameter named 'y11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // let x11 = 11 is var y11 && y11 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y11").WithArguments("y11").WithLocation(27, 39), // (28,36): error CS0136: A local or parameter named 'y12' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // select 12 is var y12 && y12 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y12").WithArguments("y12").WithLocation(28, 36) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); for (int i = 1; i < 13; i++) { var id = "y" + i; var yDecl = GetPatternDeclarations(tree, id).Single(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).ToArray(); Assert.Equal(3, yRef.Length); switch (i) { case 1: case 3: VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, yDecl); VerifyNotAPatternLocal(model, yRef[0]); break; default: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl, yRef[0]); break; } VerifyNotAPatternLocal(model, yRef[2]); switch (i) { case 1: case 3: case 12: VerifyNotAPatternLocal(model, yRef[1]); break; default: VerifyNotAPatternLocal(model, yRef[1]); break; } } } [Fact] [WorkItem(10466, "https://github.com/dotnet/roslyn/issues/10466")] public void ScopeOfPatternVariables_Query_06() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { Dummy(1 is int y1, 2 is int y2, 3 is int y3, 4 is int y4, 5 is int y5, 6 is int y6, 7 is int y7, 8 is int y8, 9 is int y9, 10 is int y10, 11 is int y11, 12 is int y12, from x1 in new[] { 1 is var y1 ? y1 : 0} from x2 in new[] { 2 is var y2 ? y2 : 0} join x3 in new[] { 3 is var y3 ? y3 : 0} on 4 is var y4 ? y4 : 0 equals 5 is var y5 ? y5 : 0 where 6 is var y6 && y6 == 1 orderby 7 is var y7 && y7 > 0, 8 is var y8 && y8 > 0 group 9 is var y9 && y9 > 0 by 10 is var y10 && y10 > 0 into g let x11 = 11 is var y11 && y11 > 0 select 12 is var y12 && y12 > 0 into s select y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8 + y9 + y10 + y11 + y12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (26,47): error CS0128: A local variable or function named 'y1' is already defined in this scope // from x1 in new[] { 1 is var y1 ? y1 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y1").WithArguments("y1").WithLocation(26, 47), // (28,47): error CS0128: A local variable or function named 'y3' is already defined in this scope // join x3 in new[] { 3 is var y3 ? y3 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y3").WithArguments("y3").WithLocation(28, 47) ); compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular7_3); compilation.VerifyDiagnostics( // (26,47): error CS0128: A local variable or function named 'y1' is already defined in this scope // from x1 in new[] { 1 is var y1 ? y1 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y1").WithArguments("y1").WithLocation(26, 47), // (27,47): error CS0136: A local or parameter named 'y2' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // from x2 in new[] { 2 is var y2 ? y2 : 0} Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y2").WithArguments("y2").WithLocation(27, 47), // (28,47): error CS0128: A local variable or function named 'y3' is already defined in this scope // join x3 in new[] { 3 is var y3 ? y3 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y3").WithArguments("y3").WithLocation(28, 47), // (29,36): error CS0136: A local or parameter named 'y4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // on 4 is var y4 ? y4 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y4").WithArguments("y4").WithLocation(29, 36), // (30,43): error CS0136: A local or parameter named 'y5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // equals 5 is var y5 ? y5 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y5").WithArguments("y5").WithLocation(30, 43), // (31,34): error CS0136: A local or parameter named 'y6' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // where 6 is var y6 && y6 == 1 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y6").WithArguments("y6").WithLocation(31, 34), // (32,36): error CS0136: A local or parameter named 'y7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // orderby 7 is var y7 && y7 > 0, Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y7").WithArguments("y7").WithLocation(32, 36), // (33,36): error CS0136: A local or parameter named 'y8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // 8 is var y8 && y8 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y8").WithArguments("y8").WithLocation(33, 36), // (35,32): error CS0136: A local or parameter named 'y10' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // by 10 is var y10 && y10 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y10").WithArguments("y10").WithLocation(35, 32), // (34,34): error CS0136: A local or parameter named 'y9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // group 9 is var y9 && y9 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y9").WithArguments("y9").WithLocation(34, 34), // (37,39): error CS0136: A local or parameter named 'y11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // let x11 = 11 is var y11 && y11 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y11").WithArguments("y11").WithLocation(37, 39), // (38,36): error CS0136: A local or parameter named 'y12' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // select 12 is var y12 && y12 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y12").WithArguments("y12").WithLocation(38, 36) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); for (int i = 1; i < 13; i++) { var id = "y" + i; var yDecl = GetPatternDeclarations(tree, id).ToArray(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).ToArray(); Assert.Equal(2, yDecl.Length); Assert.Equal(2, yRef.Length); switch (i) { case 1: case 3: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[0], yRef); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, yDecl[1]); break; case 12: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[0], yRef[1]); VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[1], yRef[0]); break; default: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[0], yRef[1]); VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[1], yRef[0]); break; } } } [Fact] public void ScopeOfPatternVariables_Query_07() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { Dummy(7 is int y3, from x1 in new[] { 0 } select x1 into x1 join x3 in new[] { 3 is var y3 ? y3 : 0} on x1 equals x3 select y3); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (18,47): error CS0128: A local variable named 'y3' is already defined in this scope // join x3 in new[] { 3 is var y3 ? y3 : 0} Diagnostic(ErrorCode.ERR_LocalDuplicate, "y3").WithArguments("y3").WithLocation(18, 47) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); const string id = "y3"; var yDecl = GetPatternDeclarations(tree, id).ToArray(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).ToArray(); Assert.Equal(2, yDecl.Length); Assert.Equal(2, yRef.Length); // Since the name is declared twice in the same scope, // both references are to the same declaration. VerifyModelForDeclarationOrVarSimplePattern(model, yDecl[0], yRef); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, yDecl[1]); } [Fact] public void ScopeOfPatternVariables_Query_08() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { var res = from x1 in new[] { Dummy(1 is var y1, 2 is var y2, 3 is var y3, 4 is var y4 ) ? 1 : 0} from y1 in new[] { 1 } join y2 in new[] { 0 } on y1 equals y2 let y3 = 0 group y3 by x1 into y4 select y4; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (19,24): error CS1931: The range variable 'y1' conflicts with a previous declaration of 'y1' // from y1 in new[] { 1 } Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y1").WithArguments("y1").WithLocation(19, 24), // (20,24): error CS1931: The range variable 'y2' conflicts with a previous declaration of 'y2' // join y2 in new[] { 0 } Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y2").WithArguments("y2").WithLocation(20, 24), // (22,23): error CS1931: The range variable 'y3' conflicts with a previous declaration of 'y3' // let y3 = 0 Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y3").WithArguments("y3").WithLocation(22, 23), // (25,24): error CS1931: The range variable 'y4' conflicts with a previous declaration of 'y4' // into y4 Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y4").WithArguments("y4").WithLocation(25, 24) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); for (int i = 1; i < 5; i++) { var id = "y" + i; var yDecl = GetPatternDeclarations(tree, id).Single(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).Single(); VerifyModelForDeclarationOrVarSimplePattern(model, yDecl); VerifyNotAPatternLocal(model, yRef); } } [Fact] [WorkItem(10466, "https://github.com/dotnet/roslyn/issues/10466")] public void ScopeOfPatternVariables_Query_09() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { var res = from y1 in new[] { 0 } join y2 in new[] { 0 } on y1 equals y2 let y3 = 0 group y3 by 1 into y4 select y4 == null ? 1 : 0 into x2 join y5 in new[] { Dummy(1 is var y1, 2 is var y2, 3 is var y3, 4 is var y4, 5 is var y5 ) ? 1 : 0 } on x2 equals y5 select x2; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (14,24): error CS1931: The range variable 'y1' conflicts with a previous declaration of 'y1' // var res = from y1 in new[] { 0 } Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y1").WithArguments("y1").WithLocation(14, 24), // (15,24): error CS1931: The range variable 'y2' conflicts with a previous declaration of 'y2' // join y2 in new[] { 0 } Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y2").WithArguments("y2").WithLocation(15, 24), // (17,23): error CS1931: The range variable 'y3' conflicts with a previous declaration of 'y3' // let y3 = 0 Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y3").WithArguments("y3").WithLocation(17, 23), // (20,24): error CS1931: The range variable 'y4' conflicts with a previous declaration of 'y4' // into y4 Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y4").WithArguments("y4").WithLocation(20, 24), // (23,24): error CS1931: The range variable 'y5' conflicts with a previous declaration of 'y5' // join y5 in new[] { Dummy(1 is var y1, Diagnostic(ErrorCode.ERR_QueryRangeVariableOverrides, "y5").WithArguments("y5").WithLocation(23, 24) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); for (int i = 1; i < 6; i++) { var id = "y" + i; var yDecl = GetPatternDeclarations(tree, id).Single(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).Single(); switch (i) { case 4: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl); VerifyNotAPatternLocal(model, yRef); break; case 5: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl); VerifyNotAPatternLocal(model, yRef); break; default: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl); VerifyNotAPatternLocal(model, yRef); break; } } } [Fact] [WorkItem(10466, "https://github.com/dotnet/roslyn/issues/10466")] [WorkItem(12052, "https://github.com/dotnet/roslyn/issues/12052")] public void ScopeOfPatternVariables_Query_10() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { var res = from y1 in new[] { 0 } from x2 in new[] { 1 is var y1 ? y1 : 1 } select y1; } void Test2() { var res = from y2 in new[] { 0 } join x3 in new[] { 1 } on 2 is var y2 ? y2 : 0 equals x3 select y2; } void Test3() { var res = from x3 in new[] { 0 } join y3 in new[] { 1 } on x3 equals 3 is var y3 ? y3 : 0 select y3; } void Test4() { var res = from y4 in new[] { 0 } where 4 is var y4 && y4 == 1 select y4; } void Test5() { var res = from y5 in new[] { 0 } orderby 5 is var y5 && y5 > 1, 1 select y5; } void Test6() { var res = from y6 in new[] { 0 } orderby 1, 6 is var y6 && y6 > 1 select y6; } void Test7() { var res = from y7 in new[] { 0 } group 7 is var y7 && y7 == 3 by y7; } void Test8() { var res = from y8 in new[] { 0 } group y8 by 8 is var y8 && y8 == 3; } void Test9() { var res = from y9 in new[] { 0 } let x4 = 9 is var y9 && y9 > 0 select y9; } void Test10() { var res = from y10 in new[] { 0 } select 10 is var y10 && y10 > 0; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); // error CS0412 is misleading and reported due to preexisting bug https://github.com/dotnet/roslyn/issues/12052 compilation.VerifyDiagnostics( // (15,47): error CS0136: A local or parameter named 'y1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // from x2 in new[] { 1 is var y1 ? y1 : 1 } Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y1").WithArguments("y1").WithLocation(15, 47), // (23,36): error CS0136: A local or parameter named 'y2' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // on 2 is var y2 ? y2 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y2").WithArguments("y2").WithLocation(23, 36), // (33,40): error CS0136: A local or parameter named 'y3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // equals 3 is var y3 ? y3 : 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y3").WithArguments("y3").WithLocation(33, 40), // (40,34): error CS0136: A local or parameter named 'y4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // where 4 is var y4 && y4 == 1 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y4").WithArguments("y4").WithLocation(40, 34), // (47,36): error CS0136: A local or parameter named 'y5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // orderby 5 is var y5 && y5 > 1, Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y5").WithArguments("y5").WithLocation(47, 36), // (56,36): error CS0136: A local or parameter named 'y6' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // 6 is var y6 && y6 > 1 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y6").WithArguments("y6").WithLocation(56, 36), // (63,34): error CS0136: A local or parameter named 'y7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // group 7 is var y7 && y7 == 3 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y7").WithArguments("y7").WithLocation(63, 34), // (71,31): error CS0136: A local or parameter named 'y8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // by 8 is var y8 && y8 == 3; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y8").WithArguments("y8").WithLocation(71, 31), // (77,37): error CS0136: A local or parameter named 'y9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // let x4 = 9 is var y9 && y9 > 0 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y9").WithArguments("y9").WithLocation(77, 37), // (84,36): error CS0136: A local or parameter named 'y10' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // select 10 is var y10 && y10 > 0; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y10").WithArguments("y10").WithLocation(84, 36) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); for (int i = 1; i < 11; i++) { var id = "y" + i; var yDecl = GetPatternDeclarations(tree, id).Single(); var yRef = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(name => name.Identifier.ValueText == id).ToArray(); Assert.Equal(i == 10 ? 1 : 2, yRef.Length); switch (i) { case 4: case 6: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl, yRef[0]); VerifyNotAPatternLocal(model, yRef[1]); break; case 8: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl, yRef[1]); VerifyNotAPatternLocal(model, yRef[0]); break; case 10: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl, yRef[0]); break; default: VerifyModelForDeclarationOrVarSimplePattern(model, yDecl, yRef[0]); VerifyNotAPatternLocal(model, yRef[1]); break; } } } [Fact] public void ScopeOfPatternVariables_Query_11() { var source = @" using System.Linq; public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { var res = from x1 in new [] { 1 } where Dummy(x1 is var y1, from x2 in new [] { 1 } where x1 is var y1 select x2) select x1; } void Test2() { var res = from x1 in new [] { 1 } where Dummy(x1 is var y2, x1 + 1 is var y2) select x1; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (26,45): error CS0128: A local variable or function named 'y2' is already defined in this scope // x1 + 1 is var y2) Diagnostic(ErrorCode.ERR_LocalDuplicate, "y2").WithArguments("y2").WithLocation(26, 45) ); compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular7_3); compilation.VerifyDiagnostics( // (17,47): error CS0136: A local or parameter named 'y1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // where x1 is var y1 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "y1").WithArguments("y1").WithLocation(17, 47), // (26,45): error CS0128: A local variable or function named 'y2' is already defined in this scope // x1 + 1 is var y2) Diagnostic(ErrorCode.ERR_LocalDuplicate, "y2").WithArguments("y2").WithLocation(26, 45) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var y1Decl = GetPatternDeclarations(tree, "y1").ToArray(); Assert.Equal(2, y1Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y1Decl[0]); VerifyModelForDeclarationOrVarSimplePattern(model, y1Decl[1]); var y2Decl = GetPatternDeclarations(tree, "y2").ToArray(); Assert.Equal(2, y2Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, y2Decl[0]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, y2Decl[1]); } [Fact] public void ScopeOfPatternVariables_ExpressionBodiedLocalFunctions_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { void f(object o) => let x1 = o; f(null); } void Test2() { void f(object o) => let var x2 = o; f(null); } void Test3() { bool f (object o) => o is int x3 && x3 > 0; f(null); } void Test4() { bool f (object o) => x4 && o is int x4; f(null); } void Test5() { bool f (object o1, object o2) => o1 is int x5 && o2 is int x5 && x5 > 0; f(null, null); } void Test6() { bool f1 (object o) => o is int x6 && x6 > 0; bool f2 (object o) => o is int x6 && x6 > 0; f1(null); f2(null); } void Test7() { Dummy(x7, 1); bool f (object o) => o is int x7 && x7 > 0; Dummy(x7, 2); f(null); } void Test11() { var x11 = 11; Dummy(x11); bool f (object o) => o is int x11 && x11 > 0; f(null); } void Test12() { bool f (object o) => o is int x12 && x12 > 0; var x12 = 11; Dummy(x12); f(null); } System.Action Test13() { return () => { bool f (object o) => o is int x13 && x13 > 0; f(null); }; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (12,33): error CS1002: ; expected // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(12, 33), // (18,33): error CS1002: ; expected // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(18, 33), // (12,29): error CS0103: The name 'let' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(12, 29), // (12,29): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(12, 29), // (12,33): error CS0103: The name 'x1' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(12, 33), // (12,38): error CS0103: The name 'o' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(12, 38), // (18,29): error CS0103: The name 'let' does not exist in the current context // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(18, 29), // (18,29): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(18, 29), // (18,42): error CS0103: The name 'o' does not exist in the current context // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(18, 42), // (30,30): error CS0841: Cannot use local variable 'x4' before it is declared // bool f (object o) => x4 && o is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(30, 30), // (37,52): error CS0128: A local variable or function named 'x5' is already defined in this scope // o2 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(37, 52), // (51,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(51, 15), // (55,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(55, 15) ); compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular7_3); compilation.VerifyDiagnostics( // (12,29): error CS0103: The name 'let' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(12, 29), // (12,29): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(12, 29), // (12,33): error CS1002: ; expected // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(12, 33), // (12,33): error CS0103: The name 'x1' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(12, 33), // (12,38): error CS0103: The name 'o' does not exist in the current context // void f(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(12, 38), // (18,29): error CS0103: The name 'let' does not exist in the current context // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(18, 29), // (18,29): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(18, 29), // (18,33): error CS1002: ; expected // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(18, 33), // (18,42): error CS0103: The name 'o' does not exist in the current context // void f(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(18, 42), // (30,30): error CS0841: Cannot use local variable 'x4' before it is declared // bool f (object o) => x4 && o is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(30, 30), // (37,52): error CS0128: A local variable or function named 'x5' is already defined in this scope // o2 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(37, 52), // (51,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(51, 15), // (55,15): error CS0103: The name 'x7' does not exist in the current context // Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(55, 15), // (63,39): error CS0136: A local or parameter named 'x11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // bool f (object o) => o is int x11 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x11").WithArguments("x11").WithLocation(63, 39), // (70,39): error CS0136: A local or parameter named 'x12' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // bool f (object o) => o is int x12 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x12").WithArguments("x12").WithLocation(70, 39) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyNotInScope(model, x7Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyNotAPatternLocal(model, x11Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[1]); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref[0]); VerifyNotAPatternLocal(model, x12Ref[1]); var x13Decl = GetPatternDeclarations(tree, "x13").Single(); var x13Ref = GetReferences(tree, "x13").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl, x13Ref); } [Fact] public void ExpressionBodiedLocalFunctions_01() { var source = @" public class X { public static void Main() { System.Console.WriteLine(Test1()); } static bool Test1() { bool f() => 1 is int x1 && Dummy(x1); return f(); } static bool Dummy(int x) { System.Console.WriteLine(x); return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); CompileAndVerify(compilation, expectedOutput: @"1 True"); } [Fact] public void ScopeOfPatternVariables_ExpressionBodiedFunctions_01() { var source = @" public class X { public static void Main() { } void Test1(object o) => let x1 = o; void Test2(object o) => let var x2 = o; bool Test3(object o) => o is int x3 && x3 > 0; bool Test4(object o) => x4 && o is int x4; bool Test5(object o1, object o2) => o1 is int x5 && o2 is int x5 && x5 > 0; bool Test61 (object o) => o is int x6 && x6 > 0; bool Test62 (object o) => o is int x6 && x6 > 0; bool Test71(object o) => o is int x7 && x7 > 0; void Test72() => Dummy(x7, 2); void Test73() { Dummy(x7, 3); } bool Test11(object x11) => 1 is int x11 && x11 > 0; bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (9,33): error CS1002: ; expected // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(9, 33), // (9,36): error CS1519: Invalid token '=' in class, record, struct, or interface member declaration // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, "=").WithArguments("=").WithLocation(9, 36), // (9,36): error CS1519: Invalid token '=' in class, record, struct, or interface member declaration // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, "=").WithArguments("=").WithLocation(9, 36), // (9,39): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, ";").WithArguments(";").WithLocation(9, 39), // (9,39): error CS1519: Invalid token ';' in class, record, struct, or interface member declaration // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, ";").WithArguments(";").WithLocation(9, 39), // (11,33): error CS1002: ; expected // void Test2(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(11, 33), // (11,33): error CS0825: The contextual keyword 'var' may only appear within a local variable declaration or in script code // void Test2(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_TypeVarNotFound, "var").WithLocation(11, 33), // (11,42): error CS0103: The name 'o' does not exist in the current context // void Test2(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(11, 42), // (9,29): error CS0103: The name 'let' does not exist in the current context // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(9, 29), // (9,29): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement // void Test1(object o) => let x1 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(9, 29), // (11,29): error CS0103: The name 'let' does not exist in the current context // void Test2(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(11, 29), // (11,29): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement // void Test2(object o) => let var x2 = o; Diagnostic(ErrorCode.ERR_IllegalStatement, "let").WithLocation(11, 29), // (15,29): error CS0841: Cannot use local variable 'x4' before it is declared // bool Test4(object o) => x4 && o is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(15, 29), // (18,52): error CS0128: A local variable or function named 'x5' is already defined in this scope // o2 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(18, 52), // (24,28): error CS0103: The name 'x7' does not exist in the current context // void Test72() => Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(24, 28), // (25,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(25, 27), // (27,41): error CS0136: A local or parameter named 'x11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // bool Test11(object x11) => 1 is int x11 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x11").WithArguments("x11").WithLocation(27, 41) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); } [Fact] public void ScopeOfPatternVariables_ExpressionBodiedProperties_01() { var source = @" public class X { public static void Main() { } bool Test1 => let x1 = 11; bool this[int o] => let var x2 = o; bool Test3 => 3 is int x3 && x3 > 0; bool Test4 => x4 && 4 is int x4; bool Test5 => 51 is int x5 && 52 is int x5 && x5 > 0; bool Test61 => 6 is int x6 && x6 > 0; bool Test62 => 6 is int x6 && x6 > 0; bool Test71 => 7 is int x7 && x7 > 0; bool Test72 => Dummy(x7, 2); void Test73() { Dummy(x7, 3); } bool this[object x11] => 1 is int x11 && x11 > 0; bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (9,23): error CS1002: ; expected // bool Test1 => let x1 = 11; Diagnostic(ErrorCode.ERR_SemicolonExpected, "x1").WithLocation(9, 23), // (9,26): error CS1519: Invalid token '=' in class, record, struct, or interface member declaration // bool Test1 => let x1 = 11; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, "=").WithArguments("=").WithLocation(9, 26), // (9,26): error CS1519: Invalid token '=' in class, record, struct, or interface member declaration // bool Test1 => let x1 = 11; Diagnostic(ErrorCode.ERR_InvalidMemberDecl, "=").WithArguments("=").WithLocation(9, 26), // (11,29): error CS1002: ; expected // bool this[int o] => let var x2 = o; Diagnostic(ErrorCode.ERR_SemicolonExpected, "var").WithLocation(11, 29), // (11,29): error CS0825: The contextual keyword 'var' may only appear within a local variable declaration or in script code // bool this[int o] => let var x2 = o; Diagnostic(ErrorCode.ERR_TypeVarNotFound, "var").WithLocation(11, 29), // (11,38): error CS0103: The name 'o' does not exist in the current context // bool this[int o] => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "o").WithArguments("o").WithLocation(11, 38), // (9,19): error CS0103: The name 'let' does not exist in the current context // bool Test1 => let x1 = 11; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(9, 19), // (11,25): error CS0103: The name 'let' does not exist in the current context // bool this[int o] => let var x2 = o; Diagnostic(ErrorCode.ERR_NameNotInContext, "let").WithArguments("let").WithLocation(11, 25), // (15,19): error CS0841: Cannot use local variable 'x4' before it is declared // bool Test4 => x4 && 4 is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(15, 19), // (18,29): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(18, 29), // (24,26): error CS0103: The name 'x7' does not exist in the current context // bool Test72 => Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(24, 26), // (25,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(25, 27), // (27,39): error CS0136: A local or parameter named 'x11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // bool this[object x11] => 1 is int x11 && Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x11").WithArguments("x11").WithLocation(27, 39) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); } [Fact] public void ScopeOfPatternVariables_FieldInitializers_01() { var source = @" public class X { public static void Main() { } bool Test3 = 3 is int x3 && x3 > 0; bool Test4 = x4 && 4 is int x4; bool Test5 = 51 is int x5 && 52 is int x5 && x5 > 0; bool Test61 = 6 is int x6 && x6 > 0, Test62 = 6 is int x6 && x6 > 0; bool Test71 = 7 is int x7 && x7 > 0; bool Test72 = Dummy(x7, 2); void Test73() { Dummy(x7, 3); } bool Test81 = 8 is int x8, Test82 = x8 > 0; bool Test91 = x9 > 0, Test92 = 9 is int x9; bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (10,18): error CS0841: Cannot use local variable 'x4' before it is declared // bool Test4 = x4 && 4 is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(10, 18), // (13,28): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(13, 28), // (19,25): error CS0103: The name 'x7' does not exist in the current context // bool Test72 = Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(19, 25), // (20,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(20, 27), // (22,41): error CS0103: The name 'x8' does not exist in the current context // bool Test81 = 8 is int x8, Test82 = x8 > 0; Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(22, 41), // (23,19): error CS0103: The name 'x9' does not exist in the current context // bool Test91 = x9 > 0, Test92 = 9 is int x9; Diagnostic(ErrorCode.ERR_NameNotInContext, "x9").WithArguments("x9").WithLocation(23, 19) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReference(tree, "x8"); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl); VerifyNotInScope(model, x8Ref); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReference(tree, "x9"); VerifyNotInScope(model, x9Ref); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl); } [Fact] public void ScopeOfPatternVariables_FieldInitializers_02() { var source = @" public enum X { Test3 = 3 is int x3 ? x3 : 0, Test4 = x4 && 4 is int x4 ? 1 : 0, Test5 = 51 is int x5 && 52 is int x5 && x5 > 0 ? 1 : 0, Test61 = 6 is int x6 && x6 > 0 ? 1 : 0, Test62 = 6 is int x6 && x6 > 0 ? 1 : 0, Test71 = 7 is int x7 && x7 > 0 ? 1 : 0, Test72 = x7, } "; var compilation = CreateCompilation(source, options: TestOptions.DebugDll); compilation.VerifyDiagnostics( // (6,13): error CS0841: Cannot use local variable 'x4' before it is declared // Test4 = x4 && 4 is int x4 ? 1 : 0, Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(6, 13), // (9,23): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(9, 23), // (12,14): error CS0133: The expression being assigned to 'X.Test61' must be constant // Test61 = 6 is int x6 && x6 > 0 ? 1 : 0, Test62 = 6 is int x6 && x6 > 0 ? 1 : 0, Diagnostic(ErrorCode.ERR_NotConstantExpression, "6 is int x6 && x6 > 0 ? 1 : 0").WithArguments("X.Test61").WithLocation(12, 14), // (12,54): error CS0133: The expression being assigned to 'X.Test62' must be constant // Test61 = 6 is int x6 && x6 > 0 ? 1 : 0, Test62 = 6 is int x6 && x6 > 0 ? 1 : 0, Diagnostic(ErrorCode.ERR_NotConstantExpression, "6 is int x6 && x6 > 0 ? 1 : 0").WithArguments("X.Test62").WithLocation(12, 54), // (14,14): error CS0133: The expression being assigned to 'X.Test71' must be constant // Test71 = 7 is int x7 && x7 > 0 ? 1 : 0, Diagnostic(ErrorCode.ERR_NotConstantExpression, "7 is int x7 && x7 > 0 ? 1 : 0").WithArguments("X.Test71").WithLocation(14, 14), // (15,14): error CS0103: The name 'x7' does not exist in the current context // Test72 = x7, Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(15, 14), // (4,13): error CS0133: The expression being assigned to 'X.Test3' must be constant // Test3 = 3 is int x3 ? x3 : 0, Diagnostic(ErrorCode.ERR_NotConstantExpression, "3 is int x3 ? x3 : 0").WithArguments("X.Test3").WithLocation(4, 13) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); } [Fact] public void ScopeOfPatternVariables_FieldInitializers_03() { var source = @" public class X { public static void Main() { } const bool Test3 = 3 is int x3 && x3 > 0; const bool Test4 = x4 && 4 is int x4; const bool Test5 = 51 is int x5 && 52 is int x5 && x5 > 0; const bool Test61 = 6 is int x6 && x6 > 0, Test62 = 6 is int x6 && x6 > 0; const bool Test71 = 7 is int x7 && x7 > 0; const bool Test72 = x7 > 2; void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (8,24): error CS0133: The expression being assigned to 'X.Test3' must be constant // const bool Test3 = 3 is int x3 && x3 > 0; Diagnostic(ErrorCode.ERR_NotConstantExpression, "3 is int x3 && x3 > 0").WithArguments("X.Test3").WithLocation(8, 24), // (10,24): error CS0841: Cannot use local variable 'x4' before it is declared // const bool Test4 = x4 && 4 is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(10, 24), // (13,34): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(13, 34), // (16,25): error CS0133: The expression being assigned to 'X.Test61' must be constant // const bool Test61 = 6 is int x6 && x6 > 0, Test62 = 6 is int x6 && x6 > 0; Diagnostic(ErrorCode.ERR_NotConstantExpression, "6 is int x6 && x6 > 0").WithArguments("X.Test61").WithLocation(16, 25), // (16,57): error CS0133: The expression being assigned to 'X.Test62' must be constant // const bool Test61 = 6 is int x6 && x6 > 0, Test62 = 6 is int x6 && x6 > 0; Diagnostic(ErrorCode.ERR_NotConstantExpression, "6 is int x6 && x6 > 0").WithArguments("X.Test62").WithLocation(16, 57), // (18,25): error CS0133: The expression being assigned to 'X.Test71' must be constant // const bool Test71 = 7 is int x7 && x7 > 0; Diagnostic(ErrorCode.ERR_NotConstantExpression, "7 is int x7 && x7 > 0").WithArguments("X.Test71").WithLocation(18, 25), // (19,25): error CS0103: The name 'x7' does not exist in the current context // const bool Test72 = x7 > 2; Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(19, 25), // (20,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(20, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_PropertyInitializers_01() { var source = @" public class X { public static void Main() { } bool Test3 {get;} = 3 is int x3 && x3 > 0; bool Test4 {get;} = x4 && 4 is int x4; bool Test5 {get;} = 51 is int x5 && 52 is int x5 && x5 > 0; bool Test61 {get;} = 6 is int x6 && x6 > 0; bool Test62 {get;} = 6 is int x6 && x6 > 0; bool Test71 {get;} = 7 is int x7 && x7 > 0; bool Test72 {get;} = Dummy(x7, 2); void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (10,25): error CS0841: Cannot use local variable 'x4' before it is declared // bool Test4 {get;} = x4 && 4 is int x4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(10, 25), // (13,28): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(13, 28), // (19,32): error CS0103: The name 'x7' does not exist in the current context // bool Test72 {get;} = Dummy(x7, 2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(19, 32), // (20,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(20, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_ParameterDefault_01() { var source = @" public class X { public static void Main() { } void Test3(bool p = 3 is int x3 && x3 > 0) {} void Test4(bool p = x4 && 4 is int x4) {} void Test5(bool p = 51 is int x5 && 52 is int x5 && x5 > 0) {} void Test61(bool p1 = 6 is int x6 && x6 > 0, bool p2 = 6 is int x6 && x6 > 0) {} void Test71(bool p = 7 is int x7 && x7 > 0) { } void Test72(bool p = x7 > 2) {} void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (8,25): error CS1736: Default parameter value for 'p' must be a compile-time constant // void Test3(bool p = 3 is int x3 && x3 > 0) Diagnostic(ErrorCode.ERR_DefaultValueMustBeConstant, "3 is int x3 && x3 > 0").WithArguments("p").WithLocation(8, 25), // (11,25): error CS0841: Cannot use local variable 'x4' before it is declared // void Test4(bool p = x4 && 4 is int x4) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(11, 25), // (15,35): error CS0128: A local variable or function named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(15, 35), // (19,27): error CS1736: Default parameter value for 'p1' must be a compile-time constant // void Test61(bool p1 = 6 is int x6 && x6 > 0, bool p2 = 6 is int x6 && x6 > 0) Diagnostic(ErrorCode.ERR_DefaultValueMustBeConstant, "6 is int x6 && x6 > 0").WithArguments("p1").WithLocation(19, 27), // (19,60): error CS1736: Default parameter value for 'p2' must be a compile-time constant // void Test61(bool p1 = 6 is int x6 && x6 > 0, bool p2 = 6 is int x6 && x6 > 0) Diagnostic(ErrorCode.ERR_DefaultValueMustBeConstant, "6 is int x6 && x6 > 0").WithArguments("p2").WithLocation(19, 60), // (22,26): error CS1736: Default parameter value for 'p' must be a compile-time constant // void Test71(bool p = 7 is int x7 && x7 > 0) Diagnostic(ErrorCode.ERR_DefaultValueMustBeConstant, "7 is int x7 && x7 > 0").WithArguments("p").WithLocation(22, 26), // (26,26): error CS0103: The name 'x7' does not exist in the current context // void Test72(bool p = x7 > 2) Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(26, 26), // (29,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(29, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_Attribute_01() { var source = @" public class X { public static void Main() { } [Test(p = 3 is int x3 && x3 > 0)] [Test(p = x4 && 4 is int x4)] [Test(p = 51 is int x5 && 52 is int x5 && x5 > 0)] [Test(p1 = 6 is int x6 && x6 > 0, p2 = 6 is int x6 && x6 > 0)] [Test(p = 7 is int x7 && x7 > 0)] [Test(p = x7 > 2)] void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } class Test : System.Attribute { public bool p {get; set;} public bool p1 {get; set;} public bool p2 {get; set;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (8,15): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(p = 3 is int x3 && x3 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "3 is int x3 && x3 > 0").WithLocation(8, 15), // (9,15): error CS0841: Cannot use local variable 'x4' before it is declared // [Test(p = x4 && 4 is int x4)] Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(9, 15), // (11,25): error CS0128: A local variable or function named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(11, 25), // (13,53): error CS0128: A local variable or function named 'x6' is already defined in this scope // [Test(p1 = 6 is int x6 && x6 > 0, p2 = 6 is int x6 && x6 > 0)] Diagnostic(ErrorCode.ERR_LocalDuplicate, "x6").WithArguments("x6").WithLocation(13, 53), // (13,16): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(p1 = 6 is int x6 && x6 > 0, p2 = 6 is int x6 && x6 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "6 is int x6 && x6 > 0").WithLocation(13, 16), // (14,15): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(p = 7 is int x7 && x7 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "7 is int x7 && x7 > 0").WithLocation(14, 15), // (15,15): error CS0103: The name 'x7' does not exist in the current context // [Test(p = x7 > 2)] Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(15, 15), // (16,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(16, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x6Decl[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_Attribute_02() { var source = @" public class X { public static void Main() { } [Test(3 is int x3 && x3 > 0)] [Test(x4 && 4 is int x4)] [Test(51 is int x5 && 52 is int x5 && x5 > 0)] [Test(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0)] [Test(7 is int x7 && x7 > 0)] [Test(x7 > 2)] void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } class Test : System.Attribute { public Test(bool p) {} public Test(bool p1, bool p2) {} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (8,11): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(3 is int x3 && x3 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "3 is int x3 && x3 > 0").WithLocation(8, 11), // (9,11): error CS0841: Cannot use local variable 'x4' before it is declared // [Test(x4 && 4 is int x4)] Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(9, 11), // (11,21): error CS0128: A local variable or function named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(11, 21), // (13,43): error CS0128: A local variable or function named 'x6' is already defined in this scope // [Test(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0)] Diagnostic(ErrorCode.ERR_LocalDuplicate, "x6").WithArguments("x6").WithLocation(13, 43), // (13,11): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "6 is int x6 && x6 > 0").WithLocation(13, 11), // (14,11): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type // [Test(7 is int x7 && x7 > 0)] Diagnostic(ErrorCode.ERR_BadAttributeArgument, "7 is int x7 && x7 > 0").WithLocation(14, 11), // (15,11): error CS0103: The name 'x7' does not exist in the current context // [Test(x7 > 2)] Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(15, 11), // (16,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(16, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x6Decl[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_ConstructorInitializers_01() { var source = @" public class X { public static void Main() { } X(byte x) : this(3 is int x3 && x3 > 0) {} X(sbyte x) : this(x4 && 4 is int x4) {} X(short x) : this(51 is int x5 && 52 is int x5 && x5 > 0) {} X(ushort x) : this(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0) {} X(int x) : this(7 is int x7 && x7 > 0) {} X(uint x) : this(x7, 2) {} void Test73() { Dummy(x7, 3); } X(params object[] x) {} bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,16): error CS0841: Cannot use local variable 'x4' before it is declared // : this(x4 && 4 is int x4) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(13, 16), // (18,26): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(18, 26), // (23,48): error CS0128: A local variable named 'x6' is already defined in this scope // : this(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x6").WithArguments("x6").WithLocation(23, 48), // (30,16): error CS0103: The name 'x7' does not exist in the current context // : this(x7, 2) Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(30, 16), // (32,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(32, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x6Decl[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_ConstructorInitializers_02() { var source = @" public class X : Y { public static void Main() { } X(byte x) : base(3 is int x3 && x3 > 0) {} X(sbyte x) : base(x4 && 4 is int x4) {} X(short x) : base(51 is int x5 && 52 is int x5 && x5 > 0) {} X(ushort x) : base(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0) {} X(int x) : base(7 is int x7 && x7 > 0) {} X(uint x) : base(x7, 2) {} void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } public class Y { public Y(params object[] x) {} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,16): error CS0841: Cannot use local variable 'x4' before it is declared // : base(x4 && 4 is int x4) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(13, 16), // (18,26): error CS0128: A local variable named 'x5' is already defined in this scope // 52 is int x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(18, 26), // (23,48): error CS0128: A local variable named 'x6' is already defined in this scope // : base(6 is int x6 && x6 > 0, 6 is int x6 && x6 > 0) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x6").WithArguments("x6").WithLocation(23, 48), // (30,16): error CS0103: The name 'x7' does not exist in the current context // : base(x7, 2) Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(30, 16), // (32,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(32, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0], x5Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x6Decl[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void ScopeOfPatternVariables_ConstructorInitializers_03() { var source = @"using System; public class X { public static void Main() { new D(1); new D(10); new D(1.2); } } class D { public D(object o) : this(o is int x && x >= 5) { Console.WriteLine(x); } public D(bool b) { Console.WriteLine(b); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (15,27): error CS0165: Use of unassigned local variable 'x' // Console.WriteLine(x); Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(15, 27) ); } [Fact] public void ScopeOfPatternVariables_ConstructorInitializers_04() { var source = @"using System; public class X { public static void Main() { new D(1); new D(10); new D(1.2); } } class D : C { public D(object o) : base(o is int x && x >= 5) { Console.WriteLine(x); } } class C { public C(bool b) { Console.WriteLine(b); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (15,27): error CS0165: Use of unassigned local variable 'x' // Console.WriteLine(x); Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(15, 27) ); } [Fact] public void ScopeOfPatternVariables_ConstructorInitializers_07() { var source = @" public class X : Y { public static void Main() { } X(byte x3) : base(3 is int x3) {} X(sbyte x) : base(4 is int x4) { int x4 = 1; System.Console.WriteLine(x4); } X(ushort x) : base(51 is int x5) => Dummy(52 is int x5, x5); bool Dummy(params object[] x) {return true;} } public class Y { public Y(params object[] x) {} } "; var compilation = CreateCompilationWithMscorlib461(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (9,25): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // : base(3 is int x3) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(9, 25), // (15,13): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // int x4 = 1; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(15, 13), // (21,24): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // => Dummy(52 is int x5, x5); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(21, 24) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl); VerifyNotAPatternLocal(model, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl[1], x5Ref); } [Fact] public void ScopeOfPatternVariables_SwitchLabelGuard_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) { return true; } void Test1(int val) { switch (val) { case 0 when Dummy(true is var x1, x1): Dummy(x1); break; case 1 when Dummy(true is var x1, x1): Dummy(x1); break; case 2 when Dummy(true is var x1, x1): Dummy(x1); break; } } void Test2(int val) { switch (val) { case 0 when Dummy(x2, true is var x2): Dummy(x2); break; } } void Test3(int x3, int val) { switch (val) { case 0 when Dummy(true is var x3, x3): Dummy(x3); break; } } void Test4(int val) { var x4 = 11; switch (val) { case 0 when Dummy(true is var x4, x4): Dummy(x4); break; case 1 when Dummy(x4): Dummy(x4); break; } } void Test5(int val) { switch (val) { case 0 when Dummy(true is var x5, x5): Dummy(x5); break; } var x5 = 11; Dummy(x5); } //void Test6(int val) //{ // let x6 = 11; // switch (val) // { // case 0 when Dummy(x6): // Dummy(x6); // break; // case 1 when Dummy(true is var x6, x6): // Dummy(x6); // break; // } //} //void Test7(int val) //{ // switch (val) // { // case 0 when Dummy(true is var x7, x7): // Dummy(x7); // break; // } // let x7 = 11; // Dummy(x7); //} void Test8(int val) { switch (val) { case 0 when Dummy(true is var x8, x8, false is var x8, x8): Dummy(x8); break; } } void Test9(int val) { switch (val) { case 0 when Dummy(x9): int x9 = 9; Dummy(x9); break; case 2 when Dummy(x9 = 9): Dummy(x9); break; case 1 when Dummy(true is var x9, x9): Dummy(x9); break; } } //void Test10(int val) //{ // switch (val) // { // case 1 when Dummy(true is var x10, x10): // Dummy(x10); // break; // case 0 when Dummy(x10): // let x10 = 10; // Dummy(x10); // break; // case 2 when Dummy(x10 = 10, x10): // Dummy(x10); // break; // } //} void Test11(int val) { switch (x11 ? val : 0) { case 0 when Dummy(x11): Dummy(x11, 0); break; case 1 when Dummy(true is var x11, x11): Dummy(x11, 1); break; } } void Test12(int val) { switch (x12 ? val : 0) { case 0 when Dummy(true is var x12, x12): Dummy(x12, 0); break; case 1 when Dummy(x12): Dummy(x12, 1); break; } } void Test13() { switch (1 is var x13 ? x13 : 0) { case 0 when Dummy(x13): Dummy(x13); break; case 1 when Dummy(true is var x13, x13): Dummy(x13); break; } } void Test14(int val) { switch (val) { case 1 when Dummy(true is var x14, x14): Dummy(x14); Dummy(true is var x14, x14); Dummy(x14); break; } } void Test15(int val) { switch (val) { case 0 when Dummy(true is var x15, x15): case 1 when Dummy(true is var x15, x15): Dummy(x15); break; } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (30,31): error CS0841: Cannot use local variable 'x2' before it is declared // case 0 when Dummy(x2, true is var x2): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(30, 31), // (40,43): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(true is var x3, x3): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(40, 43), // (51,43): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(true is var x4, x4): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(51, 43), // (62,43): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(true is var x5, x5): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(62, 43), // (102,64): error CS0128: A local variable named 'x8' is already defined in this scope // case 0 when Dummy(true is var x8, x8, false is var x8, x8): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(102, 64), // (112,31): error CS0841: Cannot use local variable 'x9' before it is declared // case 0 when Dummy(x9): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(112, 31), // (119,43): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(true is var x9, x9): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(119, 43), // (144,17): error CS0103: The name 'x11' does not exist in the current context // switch (x11 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(144, 17), // (146,31): error CS0103: The name 'x11' does not exist in the current context // case 0 when Dummy(x11): Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(146, 31), // (147,23): error CS0103: The name 'x11' does not exist in the current context // Dummy(x11, 0); Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(147, 23), // (157,17): error CS0103: The name 'x12' does not exist in the current context // switch (x12 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(157, 17), // (162,31): error CS0103: The name 'x12' does not exist in the current context // case 1 when Dummy(x12): Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(162, 31), // (163,23): error CS0103: The name 'x12' does not exist in the current context // Dummy(x12, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(163, 23), // (175,43): error CS0136: A local or parameter named 'x13' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(true is var x13, x13): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x13").WithArguments("x13").WithLocation(175, 43), // (185,43): error CS0136: A local or parameter named 'x14' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(true is var x14, x14): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x14").WithArguments("x14").WithLocation(185, 43), // (198,43): error CS0128: A local variable named 'x15' is already defined in this scope // case 1 when Dummy(true is var x15, x15): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x15").WithArguments("x15").WithLocation(198, 43), // (198,48): error CS0165: Use of unassigned local variable 'x15' // case 1 when Dummy(true is var x15, x15): Diagnostic(ErrorCode.ERR_UseDefViolation, "x15").WithArguments("x15").WithLocation(198, 48) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(6, x1Ref.Length); for (int i = 0; i < x1Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[i], x1Ref[i * 2], x1Ref[i * 2 + 1]); } var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(4, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[0], x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); VerifyNotAPatternLocal(model, x4Ref[3]); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(3, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref[0], x5Ref[1]); VerifyNotAPatternLocal(model, x5Ref[2]); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(3, x8Ref.Length); for (int i = 0; i < x8Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(6, x9Ref.Length); VerifyNotAPatternLocal(model, x9Ref[0]); VerifyNotAPatternLocal(model, x9Ref[1]); VerifyNotAPatternLocal(model, x9Ref[2]); VerifyNotAPatternLocal(model, x9Ref[3]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref[4], x9Ref[5]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(5, x11Ref.Length); VerifyNotInScope(model, x11Ref[0]); VerifyNotInScope(model, x11Ref[1]); VerifyNotInScope(model, x11Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[3], x11Ref[4]); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(5, x12Ref.Length); VerifyNotInScope(model, x12Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref[1], x12Ref[2]); VerifyNotInScope(model, x12Ref[3]); VerifyNotInScope(model, x12Ref[4]); var x13Decl = GetPatternDeclarations(tree, "x13").ToArray(); var x13Ref = GetReferences(tree, "x13").ToArray(); Assert.Equal(2, x13Decl.Length); Assert.Equal(5, x13Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[0], x13Ref[0], x13Ref[1], x13Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[1], x13Ref[3], x13Ref[4]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(4, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[1], true); var x15Decl = GetPatternDeclarations(tree, "x15").ToArray(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(2, x15Decl.Length); Assert.Equal(3, x15Ref.Length); for (int i = 0; i < x15Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x15Decl[0], x15Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x15Decl[1]); } [Fact] public void ScopeOfPatternVariables_SwitchLabelPattern_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) { return true; } void Test1(object val) { switch (val) { case byte x1 when Dummy(x1): Dummy(x1); break; case int x1 when Dummy(x1): Dummy(x1); break; case long x1 when Dummy(x1): Dummy(x1); break; } } void Test2(object val) { switch (val) { case 0 when Dummy(x2): case int x2: Dummy(x2); break; } } void Test3(int x3, object val) { switch (val) { case int x3 when Dummy(x3): Dummy(x3); break; } } void Test4(object val) { var x4 = 11; switch (val) { case int x4 when Dummy(x4): Dummy(x4); break; case 1 when Dummy(x4): Dummy(x4); break; } } void Test5(object val) { switch (val) { case int x5 when Dummy(x5): Dummy(x5); break; } var x5 = 11; Dummy(x5); } //void Test6(object val) //{ // let x6 = 11; // switch (val) // { // case 0 when Dummy(x6): // Dummy(x6); // break; // case int x6 when Dummy(x6): // Dummy(x6); // break; // } //} //void Test7(object val) //{ // switch (val) // { // case int x7 when Dummy(x7): // Dummy(x7); // break; // } // let x7 = 11; // Dummy(x7); //} void Test8(object val) { switch (val) { case int x8 when Dummy(x8, false is var x8, x8): Dummy(x8); break; } } void Test9(object val) { switch (val) { case 0 when Dummy(x9): int x9 = 9; Dummy(x9); break; case 2 when Dummy(x9 = 9): Dummy(x9); break; case int x9 when Dummy(x9): Dummy(x9); break; } } //void Test10(object val) //{ // switch (val) // { // case int x10 when Dummy(x10): // Dummy(x10); // break; // case 0 when Dummy(x10): // let x10 = 10; // Dummy(x10); // break; // case 2 when Dummy(x10 = 10, x10): // Dummy(x10); // break; // } //} void Test11(object val) { switch (x11 ? val : 0) { case 0 when Dummy(x11): Dummy(x11, 0); break; case int x11 when Dummy(x11): Dummy(x11, 1); break; } } void Test12(object val) { switch (x12 ? val : 0) { case int x12 when Dummy(x12): Dummy(x12, 0); break; case 1 when Dummy(x12): Dummy(x12, 1); break; } } void Test13() { switch (1 is var x13 ? x13 : 0) { case 0 when Dummy(x13): Dummy(x13); break; case int x13 when Dummy(x13): Dummy(x13); break; } } void Test14(object val) { switch (val) { case int x14 when Dummy(x14): Dummy(x14); Dummy(true is var x14, x14); Dummy(x14); break; } } void Test15(object val) { switch (val) { case int x15 when Dummy(x15): case long x15 when Dummy(x15): Dummy(x15); break; } } void Test16(object val) { switch (val) { case int x16 when Dummy(x16): case 1 when Dummy(true is var x16, x16): Dummy(x16); break; } } void Test17(object val) { switch (val) { case 0 when Dummy(true is var x17, x17): case int x17 when Dummy(x17): Dummy(x17); break; } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (30,31): error CS0841: Cannot use local variable 'x2' before it is declared // case 0 when Dummy(x2): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(30, 31), // (32,23): error CS0165: Use of unassigned local variable 'x2' // Dummy(x2); Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(32, 23), // (41,22): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x3 when Dummy(x3): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(41, 22), // (52,22): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x4 when Dummy(x4): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(52, 22), // (65,22): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x5 when Dummy(x5): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(65, 22), // (106,49): error CS0128: A local variable named 'x8' is already defined in this scope // when Dummy(x8, false is var x8, x8): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(106, 49), // (116,31): error CS0841: Cannot use local variable 'x9' before it is declared // case 0 when Dummy(x9): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(116, 31), // (123,22): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x9 when Dummy(x9): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(123, 22), // (148,17): error CS0103: The name 'x11' does not exist in the current context // switch (x11 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(148, 17), // (150,31): error CS0103: The name 'x11' does not exist in the current context // case 0 when Dummy(x11): Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(150, 31), // (151,23): error CS0103: The name 'x11' does not exist in the current context // Dummy(x11, 0); Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(151, 23), // (161,17): error CS0103: The name 'x12' does not exist in the current context // switch (x12 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(161, 17), // (166,31): error CS0103: The name 'x12' does not exist in the current context // case 1 when Dummy(x12): Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(166, 31), // (167,23): error CS0103: The name 'x12' does not exist in the current context // Dummy(x12, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(167, 23), // (179,22): error CS0136: A local or parameter named 'x13' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x13 when Dummy(x13): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x13").WithArguments("x13").WithLocation(179, 22), // (189,22): error CS0136: A local or parameter named 'x14' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case int x14 when Dummy(x14): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x14").WithArguments("x14").WithLocation(189, 22), // (202,23): error CS0128: A local variable named 'x15' is already defined in this scope // case long x15 when Dummy(x15): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x15").WithArguments("x15").WithLocation(202, 23), // (202,38): error CS0165: Use of unassigned local variable 'x15' // case long x15 when Dummy(x15): Diagnostic(ErrorCode.ERR_UseDefViolation, "x15").WithArguments("x15").WithLocation(202, 38), // (213,43): error CS0128: A local variable named 'x16' is already defined in this scope // case 1 when Dummy(true is var x16, x16): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x16").WithArguments("x16").WithLocation(213, 43), // (213,48): error CS0165: Use of unassigned local variable 'x16' // case 1 when Dummy(true is var x16, x16): Diagnostic(ErrorCode.ERR_UseDefViolation, "x16").WithArguments("x16").WithLocation(213, 48), // (224,22): error CS0128: A local variable named 'x17' is already defined in this scope // case int x17 when Dummy(x17): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x17").WithArguments("x17").WithLocation(224, 22), // (224,37): error CS0165: Use of unassigned local variable 'x17' // case int x17 when Dummy(x17): Diagnostic(ErrorCode.ERR_UseDefViolation, "x17").WithArguments("x17").WithLocation(224, 37) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(6, x1Ref.Length); for (int i = 0; i < x1Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[i], x1Ref[i * 2], x1Ref[i * 2 + 1]); } var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(4, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[0], x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); VerifyNotAPatternLocal(model, x4Ref[3]); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(3, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref[0], x5Ref[1]); VerifyNotAPatternLocal(model, x5Ref[2]); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(3, x8Ref.Length); for (int i = 0; i < x8Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(6, x9Ref.Length); VerifyNotAPatternLocal(model, x9Ref[0]); VerifyNotAPatternLocal(model, x9Ref[1]); VerifyNotAPatternLocal(model, x9Ref[2]); VerifyNotAPatternLocal(model, x9Ref[3]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref[4], x9Ref[5]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(5, x11Ref.Length); VerifyNotInScope(model, x11Ref[0]); VerifyNotInScope(model, x11Ref[1]); VerifyNotInScope(model, x11Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[3], x11Ref[4]); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(5, x12Ref.Length); VerifyNotInScope(model, x12Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref[1], x12Ref[2]); VerifyNotInScope(model, x12Ref[3]); VerifyNotInScope(model, x12Ref[4]); var x13Decl = GetPatternDeclarations(tree, "x13").ToArray(); var x13Ref = GetReferences(tree, "x13").ToArray(); Assert.Equal(2, x13Decl.Length); Assert.Equal(5, x13Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[0], x13Ref[0], x13Ref[1], x13Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[1], x13Ref[3], x13Ref[4]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(4, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[1], true); var x15Decl = GetPatternDeclarations(tree, "x15").ToArray(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(2, x15Decl.Length); Assert.Equal(3, x15Ref.Length); for (int i = 0; i < x15Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x15Decl[0], x15Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x15Decl[1]); var x16Decl = GetPatternDeclarations(tree, "x16").ToArray(); var x16Ref = GetReferences(tree, "x16").ToArray(); Assert.Equal(2, x16Decl.Length); Assert.Equal(3, x16Ref.Length); for (int i = 0; i < x16Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x16Decl[0], x16Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x16Decl[1]); var x17Decl = GetPatternDeclarations(tree, "x17").ToArray(); var x17Ref = GetReferences(tree, "x17").ToArray(); Assert.Equal(2, x17Decl.Length); Assert.Equal(3, x17Ref.Length); for (int i = 0; i < x17Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x17Decl[0], x17Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x17Decl[1]); } [Fact] public void ScopeOfPatternVariables_Switch_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { switch (1 is var x1 ? x1 : 0) { case 0: Dummy(x1, 0); break; } Dummy(x1, 1); } void Test4() { var x4 = 11; Dummy(x4); switch (4 is var x4 ? x4 : 0) { case 4: Dummy(x4); break; } } void Test5(int x5) { switch (5 is var x5 ? x5 : 0) { case 5: Dummy(x5); break; } } void Test6() { switch (x6 + 6 is var x6 ? x6 : 0) { case 6: Dummy(x6); break; } } void Test7() { switch (7 is var x7 ? x7 : 0) { case 7: var x7 = 12; Dummy(x7); break; } } void Test9() { switch (9 is var x9 ? x9 : 0) { case 9: Dummy(x9, 0); switch (9 is var x9 ? x9 : 0) { case 9: Dummy(x9, 1); break; } break; } } void Test10() { switch (y10 + 10 is var x10 ? x10 : 0) { case 0 when y10: break; case y10: var y10 = 12; Dummy(y10); break; } } //void Test11() //{ // switch (y11 + 11 is var x11 ? x11 : 0) // { // case 0 when y11 > 0: // break; // case y11: // let y11 = 12; // Dummy(y11); // break; // } //} void Test14() { switch (Dummy(1 is var x14, 2 is var x14, x14) ? 1 : 0) { case 0: Dummy(x14); break; } } void Test15(int val) { switch (val) { case 0 when y15 > 0: break; case y15: var y15 = 15; Dummy(y15); break; } } //void Test16(int val) //{ // switch (val) // { // case 0 when y16 > 0: // break; // case y16: // let y16 = 16; // Dummy(y16); // break; // } //} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (27,26): error CS0128: A local variable or function named 'x4' is already defined in this scope // switch (4 is var x4 ? x4 : 0) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(27, 26), // (37,26): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // switch (5 is var x5 ? x5 : 0) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(37, 26), // (47,17): error CS0841: Cannot use local variable 'x6' before it is declared // switch (x6 + 6 is var x6 ? x6 : 0) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(47, 17), // (60,21): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(60, 21), // (71,23): error CS0841: Cannot use local variable 'x9' before it is declared // Dummy(x9, 0); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(71, 23), // (72,34): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // switch (9 is var x9 ? x9 : 0) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(72, 34), // (85,17): error CS0103: The name 'y10' does not exist in the current context // switch (y10 + 10 is var x10 ? x10 : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 17), // (87,25): error CS0841: Cannot use local variable 'y10' before it is declared // case 0 when y10: Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "y10").WithArguments("y10").WithLocation(87, 25), // (89,18): error CS0841: Cannot use local variable 'y10' before it is declared // case y10: Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "y10").WithArguments("y10").WithLocation(89, 18), // (89,18): error CS0150: A constant value is expected // case y10: Diagnostic(ErrorCode.ERR_ConstantExpected, "y10").WithLocation(89, 18), // (112,28): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(112, 28), // (125,25): error CS0841: Cannot use local variable 'y15' before it is declared // case 0 when y15 > 0: Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "y15").WithArguments("y15").WithLocation(125, 25), // (127,18): error CS0841: Cannot use local variable 'y15' before it is declared // case y15: Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "y15").WithArguments("y15").WithLocation(127, 18) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(3, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(4, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); VerifyNotAPatternLocal(model, y10Ref[2]); VerifyNotAPatternLocal(model, y10Ref[3]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); var y15Ref = GetReferences(tree, "y15").ToArray(); Assert.Equal(3, y15Ref.Length); VerifyNotAPatternLocal(model, y15Ref[0]); VerifyNotAPatternLocal(model, y15Ref[1]); VerifyNotAPatternLocal(model, y15Ref[2]); } [Fact] public void ScopeOfPatternVariables_Switch_02() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { if (true) switch (1 is var x1 ? 1 : 0) { case 0: break; } Dummy(x1, 1); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (19,15): error CS0103: The name 'x1' does not exist in the current context // Dummy(x1, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(19, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_Switch_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (SwitchStatementSyntax)SyntaxFactory.ParseStatement(@" switch (Dummy(11 is var x1, x1)) {} "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_Using_01() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (Dummy(true is var x1, x1)) { Dummy(x1); } } void Test2() { using (Dummy(true is var x2, x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); using (Dummy(true is var x4, x4)) Dummy(x4); } void Test6() { using (Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { using (Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { using (Dummy(true is var x8, x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { using (Dummy(true is var x9, x9)) { Dummy(x9); using (Dummy(true is var x9, x9)) // 2 Dummy(x9); } } void Test10() { using (Dummy(y10 is var x10, x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // using (Dummy(y11 is var x11, x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { using (Dummy(y12 is var x12, x12)) var y12 = 12; } //void Test13() //{ // using (Dummy(y13 is var x13, x13)) // let y13 = 12; //} void Test14() { using (Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,34): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (Dummy(true is var x4, x4)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 34), // (35,22): error CS0841: Cannot use local variable 'x6' before it is declared // using (Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 22), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,38): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (Dummy(true is var x9, x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 38), // (68,22): error CS0103: The name 'y10' does not exist in the current context // using (Dummy(y10 is var x10, x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 22), // (86,22): error CS0103: The name 'y12' does not exist in the current context // using (Dummy(y12 is var x12, x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 22), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,31): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 31) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Using_02() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (var d = Dummy(true is var x1, x1)) { Dummy(x1); } } void Test2() { using (var d = Dummy(true is var x2, x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); using (var d = Dummy(true is var x4, x4)) Dummy(x4); } void Test6() { using (var d = Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { using (var d = Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { using (var d = Dummy(true is var x8, x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { using (var d = Dummy(true is var x9, x9)) { Dummy(x9); using (var e = Dummy(true is var x9, x9)) // 2 Dummy(x9); } } void Test10() { using (var d = Dummy(y10 is var x10, x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // using (var d = Dummy(y11 is var x11, x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { using (var d = Dummy(y12 is var x12, x12)) var y12 = 12; } //void Test13() //{ // using (var d = Dummy(y13 is var x13, x13)) // let y13 = 12; //} void Test14() { using (var d = Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,42): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (var d = Dummy(true is var x4, x4)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 42), // (35,30): error CS0841: Cannot use local variable 'x6' before it is declared // using (var d = Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 30), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,46): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (var e = Dummy(true is var x9, x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 46), // (68,30): error CS0103: The name 'y10' does not exist in the current context // using (var d = Dummy(y10 is var x10, x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 30), // (86,30): error CS0103: The name 'y12' does not exist in the current context // using (var d = Dummy(y12 is var x12, x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 30), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,39): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 39) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Using_03() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (System.IDisposable d = Dummy(true is var x1, x1)) { Dummy(x1); } } void Test2() { using (System.IDisposable d = Dummy(true is var x2, x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); using (System.IDisposable d = Dummy(true is var x4, x4)) Dummy(x4); } void Test6() { using (System.IDisposable d = Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { using (System.IDisposable d = Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { using (System.IDisposable d = Dummy(true is var x8, x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { using (System.IDisposable d = Dummy(true is var x9, x9)) { Dummy(x9); using (System.IDisposable c = Dummy(true is var x9, x9)) // 2 Dummy(x9); } } void Test10() { using (System.IDisposable d = Dummy(y10 is var x10, x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // using (System.IDisposable d = Dummy(y11 is var x11, x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { using (System.IDisposable d = Dummy(y12 is var x12, x12)) var y12 = 12; } //void Test13() //{ // using (System.IDisposable d = Dummy(y13 is var x13, x13)) // let y13 = 12; //} void Test14() { using (System.IDisposable d = Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,57): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (System.IDisposable d = Dummy(true is var x4, x4)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 57), // (35,45): error CS0841: Cannot use local variable 'x6' before it is declared // using (System.IDisposable d = Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 45), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,61): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (System.IDisposable c = Dummy(true is var x9, x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 61), // (68,45): error CS0103: The name 'y10' does not exist in the current context // using (System.IDisposable d = Dummy(y10 is var x10, x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 45), // (86,45): error CS0103: The name 'y12' does not exist in the current context // using (System.IDisposable d = Dummy(y12 is var x12, x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 45), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,54): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 54) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Using_04() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (var x1 = Dummy(true is var x1, x1)) { Dummy(x1); } } void Test2() { using (System.IDisposable x2 = Dummy(true is var x2, x2)) { Dummy(x2); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (12,43): error CS0128: A local variable named 'x1' is already defined in this scope // using (var x1 = Dummy(true is var x1, x1)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(12, 43), // (12,47): error CS0841: Cannot use local variable 'x1' before it is declared // using (var x1 = Dummy(true is var x1, x1)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(12, 47), // (20,58): error CS0128: A local variable named 'x2' is already defined in this scope // using (System.IDisposable x2 = Dummy(true is var x2, x2)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 58), // (20,62): error CS0165: Use of unassigned local variable 'x2' // using (System.IDisposable x2 = Dummy(true is var x2, x2)) Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(20, 62) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl); VerifyNotAPatternLocal(model, x2Ref[0]); VerifyNotAPatternLocal(model, x2Ref[1]); } [Fact] public void ScopeOfPatternVariables_Using_05() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (System.IDisposable d = Dummy(true is var x1, x1), x1 = Dummy(x1)) { Dummy(x1); } } void Test2() { using (System.IDisposable d1 = Dummy(true is var x2, x2), d2 = Dummy(true is var x2, x2)) { Dummy(x2); } } void Test3() { using (System.IDisposable d1 = Dummy(true is var x3, x3), d2 = Dummy(x3)) { Dummy(x3); } } void Test4() { using (System.IDisposable d1 = Dummy(x4), d2 = Dummy(true is var x4, x4)) { Dummy(x4); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,35): error CS0128: A local variable named 'x1' is already defined in this scope // x1 = Dummy(x1)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 35), // (22,58): error CS0128: A local variable named 'x2' is already defined in this scope // d2 = Dummy(true is var x2, x2)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(22, 58), // (39,46): error CS0841: Cannot use local variable 'x4' before it is declared // using (System.IDisposable d1 = Dummy(x4), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(39, 46) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(3, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(3, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_01() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { var d = Dummy(true is var x1, x1); } void Test4() { var x4 = 11; Dummy(x4); var d = Dummy(true is var x4, x4); } void Test6() { var d = Dummy(x6 && true is var x6); } void Test8() { var d = Dummy(true is var x8, x8); System.Console.WriteLine(x8); } void Test14() { var d = Dummy(1 is var x14, 2 is var x14, x14); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (19,35): error CS0128: A local variable named 'x4' is already defined in this scope // var d = Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(19, 35), // (24,23): error CS0841: Cannot use local variable 'x6' before it is declared // var d = Dummy(x6 && true is var x6); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(24, 23), // (36,32): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(36, 32) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").Single(); Assert.Equal(2, x14Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_02() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { object d = Dummy(true is var x1, x1); } void Test4() { var x4 = 11; Dummy(x4); object d = Dummy(true is var x4, x4); } void Test6() { object d = Dummy(x6 && true is var x6); } void Test8() { object d = Dummy(true is var x8, x8); System.Console.WriteLine(x8); } void Test14() { object d = Dummy(1 is var x14, 2 is var x14, x14); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (19,38): error CS0128: A local variable named 'x4' is already defined in this scope // object d = Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(19, 38), // (24,26): error CS0841: Cannot use local variable 'x6' before it is declared // object d = Dummy(x6 && true is var x6); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(24, 26), // (36,35): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(36, 35) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").Single(); Assert.Equal(2, x14Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_03() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { var x1 = Dummy(true is var x1, x1); Dummy(x1); } void Test2() { object x2 = Dummy(true is var x2, x2); Dummy(x2); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,36): error CS0128: A local variable named 'x1' is already defined in this scope // Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 36), // (13,40): error CS0841: Cannot use local variable 'x1' before it is declared // Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(13, 40), // (20,39): error CS0128: A local variable named 'x2' is already defined in this scope // Dummy(true is var x2, x2); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 39), // (20,43): error CS0165: Use of unassigned local variable 'x2' // Dummy(true is var x2, x2); Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(20, 43) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyNotAPatternLocal(model, x2Ref[0]); VerifyNotAPatternLocal(model, x2Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_04() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { object d = Dummy(true is var x1, x1), x1 = Dummy(x1); Dummy(x1); } void Test2() { object d1 = Dummy(true is var x2, x2), d2 = Dummy(true is var x2, x2); } void Test3() { object d1 = Dummy(true is var x3, x3), d2 = Dummy(x3); } void Test4() { object d1 = Dummy(x4), d2 = Dummy(true is var x4, x4); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,16): error CS0128: A local variable named 'x1' is already defined in this scope // x1 = Dummy(x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 16), // (20,39): error CS0128: A local variable named 'x2' is already defined in this scope // d2 = Dummy(true is var x2, x2); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 39), // (31,27): error CS0841: Cannot use local variable 'x4' before it is declared // object d1 = Dummy(x4), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(31, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_05() { var source = @" public class X { public static void Main() { } long Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (LocalDeclarationStatementSyntax)SyntaxFactory.ParseStatement(@" var y1 = Dummy(11 is var x1, x1); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); Assert.Equal("System.Int64 y1", model.LookupSymbols(x1Ref[0].SpanStart, name: "y1").Single().ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_LocalDeclarationStmt_06() { var source = @" public class X { public static void Main() { } void Test1() { if (true) var d = true is var x1; x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (11,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var d = true is var x1; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var d = true is var x1;").WithLocation(11, 13), // (13,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(13, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); var d = tree.GetRoot().DescendantNodes().OfType<VariableDeclaratorSyntax>().Where(id => id.Identifier.ValueText == "d").Single(); Assert.Equal("System.Boolean d", model.GetDeclaredSymbol(d).ToTestDisplayString()); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_01() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { var (d, dd) = ((true is var x1), x1); } void Test4() { var x4 = 11; Dummy(x4); var (d, dd) = ((true is var x4), x4); } void Test6() { var (d, dd) = (x6 && (true is var x6), 1); } void Test8() { var (d, dd) = ((true is var x8), x8); System.Console.WriteLine(x8); } void Test14() { var (d, dd, ddd) = ((1 is var x14), (2 is var x14), x14); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (19,37): error CS0128: A local variable named 'x4' is already defined in this scope // var (d, dd) = ((true is var x4), x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(19, 37), // (24,24): error CS0841: Cannot use local variable 'x6' before it is declared // var (d, dd) = (x6 && (true is var x6), 1); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(24, 24), // (36,33): error CS0128: A local variable named 'x14' is already defined in this scope // (2 is var x14), Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(36, 33) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x4").Single(); var x4Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x6").Single(); var x6Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x6").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x8Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x8").Single(); var x8Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x14Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x14").ToArray(); var x14Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x14").Single(); Assert.Equal(2, x14Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_02() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { (object d, object dd) = ((true is var x1), x1); } void Test4() { var x4 = 11; Dummy(x4); (object d, object dd) = ((true is var x4), x4); } void Test6() { (object d, object dd) = (x6 && (true is var x6), 1); } void Test8() { (object d, object dd) = ((true is var x8), x8); System.Console.WriteLine(x8); } void Test14() { (object d, object dd, object ddd) = ((1 is var x14), (2 is var x14), x14); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (19,47): error CS0128: A local variable named 'x4' is already defined in this scope // (object d, object dd) = ((true is var x4), x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(19, 47), // (24,34): error CS0841: Cannot use local variable 'x6' before it is declared // (object d, object dd) = (x6 && (true is var x6), 1); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(24, 34), // (36,33): error CS0128: A local variable named 'x14' is already defined in this scope // (2 is var x14), Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(36, 33) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x4").Single(); var x4Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x6").Single(); var x6Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x6").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x8Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x8").Single(); var x8Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x8").ToArray(); Assert.Equal(2, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x14Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x14").ToArray(); var x14Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x14").Single(); Assert.Equal(2, x14Decl.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_03() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { var (x1, dd) = ((true is var x1), x1); Dummy(x1); } void Test2() { (object x2, object dd) = ((true is var x2), x2); Dummy(x2); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (13,37): error CS0128: A local variable named 'x1' is already defined in this scope // ((true is var x1), x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 37), // (13,42): error CS0841: Cannot use local variable 'x1' before it is declared // ((true is var x1), x1); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(13, 42), // (20,40): error CS0128: A local variable named 'x2' is already defined in this scope // ((true is var x2), x2); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 40), // (20,45): error CS0165: Use of unassigned local variable 'x2' // ((true is var x2), x2); Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(20, 45) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclaration(tree, "x1"); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); var x2Decl = GetPatternDeclaration(tree, "x2"); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyNotAPatternLocal(model, x2Ref[0]); VerifyNotAPatternLocal(model, x2Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_04() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { (object d, object x1) = (Dummy((true is var x1), x1), Dummy(x1)); Dummy(x1); } void Test2() { (object d1, object d2) = (Dummy((true is var x2), x2), Dummy((true is var x2), x2)); } void Test3() { (object d1, object d2) = (Dummy((true is var x3), x3), Dummy(x3)); } void Test4() { (object d1, object d2) = (Dummy(x4), Dummy((true is var x4), x4)); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (12,53): error CS0128: A local variable named 'x1' is already defined in this scope // (object d, object x1) = (Dummy((true is var x1), x1), Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(12, 53), // (12,58): error CS0165: Use of unassigned local variable 'x1' // (object d, object x1) = (Dummy((true is var x1), x1), Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(12, 58), // (20,40): error CS0128: A local variable named 'x2' is already defined in this scope // Dummy((true is var x2), x2)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 40), // (31,41): error CS0841: Cannot use local variable 'x4' before it is declared // (object d1, object d2) = (Dummy(x4), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(31, 41) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclaration(tree, "x1"); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); VerifyNotAPatternLocal(model, x1Ref[2]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); var x2Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x2").ToArray(); var x2Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x3").Single(); var x3Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x4").Single(); var x4Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_05() { var source = @" public class X { public static void Main() { } void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (ExpressionStatementSyntax)SyntaxFactory.ParseStatement(@" var (y1, dd) = ((123 is var x1), x1); "); bool success = model.TryGetSpeculativeSemanticModel(tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); Assert.Equal("System.Boolean y1", model.LookupSymbols(x1Ref[0].SpanStart, name: "y1").Single().ToTestDisplayString()); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void ScopeOfPatternVariables_DeconstructionDeclarationStmt_06() { var source = @" public class X { public static void Main() { } void Test1() { if (true) var (d, dd) = ((true is var x1), x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (13,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(13, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref[0]); VerifyNotInScope(model, x1Ref[1]); var d = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(id => id.Identifier.ValueText == "d").Single(); Assert.Equal("System.Boolean d", model.GetDeclaredSymbol(d).ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_While_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { while (true is var x1 && x1) { Dummy(x1); } } void Test2() { while (true is var x2 && x2) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); while (true is var x4 && x4) Dummy(x4); } void Test6() { while (x6 && true is var x6) Dummy(x6); } void Test7() { while (true is var x7 && x7) { var x7 = 12; Dummy(x7); } } void Test8() { while (true is var x8 && x8) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { while (true is var x9 && x9) { Dummy(x9); while (true is var x9 && x9) // 2 Dummy(x9); } } void Test10() { while (y10 is var x10) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // while (y11 is var x11) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { while (y12 is var x12) var y12 = 12; } //void Test13() //{ // while (y13 is var x13) // let y13 = 12; //} void Test14() { while (Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,28): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // while (true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 28), // (35,16): error CS0841: Cannot use local variable 'x6' before it is declared // while (x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 16), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,32): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // while (true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 32), // (68,16): error CS0103: The name 'y10' does not exist in the current context // while (y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 16), // (86,16): error CS0103: The name 'y12' does not exist in the current context // while (y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 16), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,31): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 31) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_While_02() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { if (true) while (true is var x1) { } x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (17,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(17, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_While_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (WhileStatementSyntax)SyntaxFactory.ParseStatement(@" while (Dummy(11 is var x1, x1)) ; "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_Do_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { do { Dummy(x1); } while (true is var x1 && x1); } void Test2() { do Dummy(x2); while (true is var x2 && x2); } void Test4() { var x4 = 11; Dummy(x4); do Dummy(x4); while (true is var x4 && x4); } void Test6() { do Dummy(x6); while (x6 && true is var x6); } void Test7() { do { var x7 = 12; Dummy(x7); } while (true is var x7 && x7); } void Test8() { do Dummy(x8); while (true is var x8 && x8); System.Console.WriteLine(x8); } void Test9() { do { Dummy(x9); do Dummy(x9); while (true is var x9 && x9); // 2 } while (true is var x9 && x9); } void Test10() { do { var y10 = 12; Dummy(y10); } while (y10 is var x10); } //void Test11() //{ // do // { // let y11 = 12; // Dummy(y11); // } // while (y11 is var x11); //} void Test12() { do var y12 = 12; while (y12 is var x12); } //void Test13() //{ // do // let y13 = 12; // while (y13 is var x13); //} void Test14() { do { Dummy(x14); } while (Dummy(1 is var x14, 2 is var x14, x14)); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (97,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(97, 13), // (14,19): error CS0841: Cannot use local variable 'x1' before it is declared // Dummy(x1); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(14, 19), // (22,19): error CS0841: Cannot use local variable 'x2' before it is declared // Dummy(x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(22, 19), // (33,28): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // while (true is var x4 && x4); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(33, 28), // (32,19): error CS0841: Cannot use local variable 'x4' before it is declared // Dummy(x4); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(32, 19), // (40,16): error CS0841: Cannot use local variable 'x6' before it is declared // while (x6 && true is var x6); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(40, 16), // (39,19): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(39, 19), // (47,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(47, 17), // (56,19): error CS0841: Cannot use local variable 'x8' before it is declared // Dummy(x8); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x8").WithArguments("x8").WithLocation(56, 19), // (59,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(59, 34), // (66,19): error CS0841: Cannot use local variable 'x9' before it is declared // Dummy(x9); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(66, 19), // (69,32): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // while (true is var x9 && x9); // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(69, 32), // (68,23): error CS0841: Cannot use local variable 'x9' before it is declared // Dummy(x9); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(68, 23), // (81,16): error CS0103: The name 'y10' does not exist in the current context // while (y10 is var x10); Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(81, 16), // (98,16): error CS0103: The name 'y12' does not exist in the current context // while (y12 is var x12); Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(98, 16), // (97,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(97, 17), // (115,31): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(115, 31), // (112,19): error CS0841: Cannot use local variable 'x14' before it is declared // Dummy(x14); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x14").WithArguments("x14").WithLocation(112, 19) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[1]); VerifyNotAPatternLocal(model, x7Ref[0]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[1], x9Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[0], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[1]); VerifyNotAPatternLocal(model, y10Ref[0]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Do_02() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { if (true) do { } while (true is var x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (18,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(18, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_Do_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (DoStatementSyntax)SyntaxFactory.ParseStatement(@" do {} while (Dummy(11 is var x1, x1)); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_For_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for ( Dummy(true is var x1 && x1) ;;) { Dummy(x1); } } void Test2() { for ( Dummy(true is var x2 && x2) ;;) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for ( Dummy(true is var x4 && x4) ;;) Dummy(x4); } void Test6() { for ( Dummy(x6 && true is var x6) ;;) Dummy(x6); } void Test7() { for ( Dummy(true is var x7 && x7) ;;) { var x7 = 12; Dummy(x7); } } void Test8() { for ( Dummy(true is var x8 && x8) ;;) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for ( Dummy(true is var x9 && x9) ;;) { Dummy(x9); for ( Dummy(true is var x9 && x9) // 2 ;;) Dummy(x9); } } void Test10() { for ( Dummy(y10 is var x10) ;;) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for ( // Dummy(y11 is var x11) // ;;) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for ( Dummy(y12 is var x12) ;;) var y12 = 12; } //void Test13() //{ // for ( // Dummy(y13 is var x13) // ;;) // let y13 = 12; //} void Test14() { for ( Dummy(1 is var x14, 2 is var x14, x14) ;;) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (53,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(53, 17), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (65,9): warning CS0162: Unreachable code detected // System.Console.WriteLine(x8); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(65, 9), // (76,36): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(76, 36), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (124,29): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_For_02() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (; Dummy(true is var x1 && x1) ;) { Dummy(x1); } } void Test2() { for (; Dummy(true is var x2 && x2) ;) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for (; Dummy(true is var x4 && x4) ;) Dummy(x4); } void Test6() { for (; Dummy(x6 && true is var x6) ;) Dummy(x6); } void Test7() { for (; Dummy(true is var x7 && x7) ;) { var x7 = 12; Dummy(x7); } } void Test8() { for (; Dummy(true is var x8 && x8) ;) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for (; Dummy(true is var x9 && x9) ;) { Dummy(x9); for (; Dummy(true is var x9 && x9) // 2 ;) Dummy(x9); } } void Test10() { for (; Dummy(y10 is var x10) ;) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for (; // Dummy(y11 is var x11) // ;) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for (; Dummy(y12 is var x12) ;) var y12 = 12; } //void Test13() //{ // for (; // Dummy(y13 is var x13) // ;) // let y13 = 12; //} void Test14() { for (; Dummy(1 is var x14, 2 is var x14, x14) ;) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (53,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(53, 17), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (76,36): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(76, 36), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (124,29): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_For_03() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (;; Dummy(true is var x1 && x1) ) { Dummy(x1); } } void Test2() { for (;; Dummy(true is var x2 && x2) ) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for (;; Dummy(true is var x4 && x4) ) Dummy(x4); } void Test6() { for (;; Dummy(x6 && true is var x6) ) Dummy(x6); } void Test7() { for (;; Dummy(true is var x7 && x7) ) { var x7 = 12; Dummy(x7); } } void Test8() { for (;; Dummy(true is var x8 && x8) ) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for (;; Dummy(true is var x9 && x9) ) { Dummy(x9); for (;; Dummy(true is var x9 && x9) // 2 ) Dummy(x9); } } void Test10() { for (;; Dummy(y10 is var x10) ) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for (;; // Dummy(y11 is var x11) // ) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for (;; Dummy(y12 is var x12) ) var y12 = 12; } //void Test13() //{ // for (;; // Dummy(y13 is var x13) // ) // let y13 = 12; //} void Test14() { for (;; Dummy(1 is var x14, 2 is var x14, x14) ) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (16,19): error CS0103: The name 'x1' does not exist in the current context // Dummy(x1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(16, 19), // (25,19): error CS0103: The name 'x2' does not exist in the current context // Dummy(x2); Diagnostic(ErrorCode.ERR_NameNotInContext, "x2").WithArguments("x2").WithLocation(25, 19), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (44,19): error CS0103: The name 'x6' does not exist in the current context // Dummy(x6); Diagnostic(ErrorCode.ERR_NameNotInContext, "x6").WithArguments("x6").WithLocation(44, 19), // (63,19): error CS0103: The name 'x8' does not exist in the current context // Dummy(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(63, 19), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (65,9): warning CS0162: Unreachable code detected // System.Console.WriteLine(x8); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(65, 9), // (74,19): error CS0103: The name 'x9' does not exist in the current context // Dummy(x9); Diagnostic(ErrorCode.ERR_NameNotInContext, "x9").WithArguments("x9").WithLocation(74, 19), // (78,23): error CS0103: The name 'x9' does not exist in the current context // Dummy(x9); Diagnostic(ErrorCode.ERR_NameNotInContext, "x9").WithArguments("x9").WithLocation(78, 23), // (71,14): warning CS0162: Unreachable code detected // Dummy(true is var x9 && x9) Diagnostic(ErrorCode.WRN_UnreachableCode, "Dummy").WithLocation(71, 14), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (124,29): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29), // (128,19): error CS0103: The name 'x14' does not exist in the current context // Dummy(x14); Diagnostic(ErrorCode.ERR_NameNotInContext, "x14").WithArguments("x14").WithLocation(128, 19) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref[0]); VerifyNotInScope(model, x1Ref[1]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref[0]); VerifyNotInScope(model, x2Ref[1]); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref[0]); VerifyNotInScope(model, x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0]); VerifyNotInScope(model, x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0]); VerifyNotInScope(model, x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2]); VerifyNotInScope(model, x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref[0]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); VerifyNotInScope(model, x14Ref[1]); } [Fact] public void ScopeOfPatternVariables_For_04() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (var b = Dummy(true is var x1 && x1) ;;) { Dummy(x1); } } void Test2() { for (var b = Dummy(true is var x2 && x2) ;;) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for (var b = Dummy(true is var x4 && x4) ;;) Dummy(x4); } void Test6() { for (var b = Dummy(x6 && true is var x6) ;;) Dummy(x6); } void Test7() { for (var b = Dummy(true is var x7 && x7) ;;) { var x7 = 12; Dummy(x7); } } void Test8() { for (var b = Dummy(true is var x8 && x8) ;;) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for (var b1 = Dummy(true is var x9 && x9) ;;) { Dummy(x9); for (var b2 = Dummy(true is var x9 && x9) // 2 ;;) Dummy(x9); } } void Test10() { for (var b = Dummy(y10 is var x10) ;;) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for (var b = // Dummy(y11 is var x11) // ;;) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for (var b = Dummy(y12 is var x12) ;;) var y12 = 12; } //void Test13() //{ // for (var b = // Dummy(y13 is var x13) // ;;) // let y13 = 12; //} void Test14() { for (var b = Dummy(1 is var x14, 2 is var x14, x14) ;;) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (53,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(53, 17), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (65,9): warning CS0162: Unreachable code detected // System.Console.WriteLine(x8); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(65, 9), // (76,36): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(76, 36), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (124,29): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_For_05() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (bool b = Dummy(true is var x1 && x1) ;;) { Dummy(x1); } } void Test2() { for (bool b = Dummy(true is var x2 && x2) ;;) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for (bool b = Dummy(true is var x4 && x4) ;;) Dummy(x4); } void Test6() { for (bool b = Dummy(x6 && true is var x6) ;;) Dummy(x6); } void Test7() { for (bool b = Dummy(true is var x7 && x7) ;;) { var x7 = 12; Dummy(x7); } } void Test8() { for (bool b = Dummy(true is var x8 && x8) ;;) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for (bool b1 = Dummy(true is var x9 && x9) ;;) { Dummy(x9); for (bool b2 = Dummy(true is var x9 && x9) // 2 ;;) Dummy(x9); } } void Test10() { for (bool b = Dummy(y10 is var x10) ;;) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for (bool b = // Dummy(y11 is var x11) // ;;) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for (bool b = Dummy(y12 is var x12) ;;) var y12 = 12; } //void Test13() //{ // for (bool b = // Dummy(y13 is var x13) // ;;) // let y13 = 12; //} void Test14() { for (bool b = Dummy(1 is var x14, 2 is var x14, x14) ;;) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (53,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(53, 17), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (65,9): warning CS0162: Unreachable code detected // System.Console.WriteLine(x8); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(65, 9), // (76,36): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(76, 36), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (124,29): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_For_06() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (var x1 = Dummy(true is var x1 && x1) ;;) {} } void Test2() { for (var x2 = true; Dummy(true is var x2 && x2) ;) {} } void Test3() { for (var x3 = true;; Dummy(true is var x3 && x3) ) {} } void Test4() { for (bool x4 = Dummy(true is var x4 && x4) ;;) {} } void Test5() { for (bool x5 = true; Dummy(true is var x5 && x5) ;) {} } void Test6() { for (bool x6 = true;; Dummy(true is var x6 && x6) ) {} } void Test7() { for (bool x7 = true, b = Dummy(true is var x7 && x7) ;;) {} } void Test8() { for (bool b1 = Dummy(true is var x8 && x8), b2 = Dummy(true is var x8 && x8); Dummy(true is var x8 && x8); Dummy(true is var x8 && x8)) {} } void Test9() { for (bool b = x9, b2 = Dummy(true is var x9 && x9); Dummy(true is var x9 && x9); Dummy(true is var x9 && x9)) {} } void Test10() { for (var b = x10; Dummy(true is var x10 && x10) && Dummy(true is var x10 && x10); Dummy(true is var x10 && x10)) {} } void Test11() { for (bool b = x11; Dummy(true is var x11 && x11) && Dummy(true is var x11 && x11); Dummy(true is var x11 && x11)) {} } void Test12() { for (Dummy(x12); Dummy(x12) && Dummy(true is var x12 && x12); Dummy(true is var x12 && x12)) {} } void Test13() { for (var b = x13; Dummy(x13); Dummy(true is var x13 && x13), Dummy(true is var x13 && x13)) {} } void Test14() { for (bool b = x14; Dummy(x14); Dummy(true is var x14 && x14), Dummy(true is var x14 && x14)) {} } void Test15() { for (Dummy(x15); Dummy(x15); Dummy(x15), Dummy(true is var x15 && x15)) {} } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,32): error CS0128: A local variable or function named 'x1' is already defined in this scope // Dummy(true is var x1 && x1) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 32), // (13,38): error CS0841: Cannot use local variable 'x1' before it is declared // Dummy(true is var x1 && x1) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(13, 38), // (21,32): error CS0136: A local or parameter named 'x2' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x2 && x2) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x2").WithArguments("x2").WithLocation(21, 32), // (20,18): warning CS0219: The variable 'x2' is assigned but its value is never used // for (var x2 = true; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x2").WithArguments("x2").WithLocation(20, 18), // (29,32): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x3 && x3) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(29, 32), // (28,18): warning CS0219: The variable 'x3' is assigned but its value is never used // for (var x3 = true;; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x3").WithArguments("x3").WithLocation(28, 18), // (37,32): error CS0128: A local variable or function named 'x4' is already defined in this scope // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(37, 32), // (37,38): error CS0165: Use of unassigned local variable 'x4' // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_UseDefViolation, "x4").WithArguments("x4").WithLocation(37, 38), // (45,32): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x5 && x5) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(45, 32), // (44,19): warning CS0219: The variable 'x5' is assigned but its value is never used // for (bool x5 = true; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(44, 19), // (53,32): error CS0136: A local or parameter named 'x6' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x6 && x6) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x6").WithArguments("x6").WithLocation(53, 32), // (52,19): warning CS0219: The variable 'x6' is assigned but its value is never used // for (bool x6 = true;; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x6").WithArguments("x6").WithLocation(52, 19), // (61,32): error CS0128: A local variable or function named 'x7' is already defined in this scope // Dummy(true is var x7 && x7) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x7").WithArguments("x7").WithLocation(61, 32), // (69,37): error CS0128: A local variable or function named 'x8' is already defined in this scope // b2 = Dummy(true is var x8 && x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(69, 37), // (70,32): error CS0136: A local or parameter named 'x8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x8 && x8); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x8").WithArguments("x8").WithLocation(70, 32), // (71,32): error CS0136: A local or parameter named 'x8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x8 && x8)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x8").WithArguments("x8").WithLocation(71, 32), // (77,23): error CS0841: Cannot use local variable 'x9' before it is declared // for (bool b = x9, Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(77, 23), // (79,32): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(79, 32), // (80,32): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(80, 32), // (86,22): error CS0103: The name 'x10' does not exist in the current context // for (var b = x10; Diagnostic(ErrorCode.ERR_NameNotInContext, "x10").WithArguments("x10").WithLocation(86, 22), // (88,32): error CS0128: A local variable or function named 'x10' is already defined in this scope // Dummy(true is var x10 && x10); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x10").WithArguments("x10").WithLocation(88, 32), // (89,32): error CS0136: A local or parameter named 'x10' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x10 && x10)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x10").WithArguments("x10").WithLocation(89, 32), // (95,23): error CS0103: The name 'x11' does not exist in the current context // for (bool b = x11; Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(95, 23), // (97,32): error CS0128: A local variable or function named 'x11' is already defined in this scope // Dummy(true is var x11 && x11); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x11").WithArguments("x11").WithLocation(97, 32), // (98,32): error CS0136: A local or parameter named 'x11' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x11 && x11)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x11").WithArguments("x11").WithLocation(98, 32), // (104,20): error CS0103: The name 'x12' does not exist in the current context // for (Dummy(x12); Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(104, 20), // (105,20): error CS0841: Cannot use local variable 'x12' before it is declared // Dummy(x12) && Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x12").WithArguments("x12").WithLocation(105, 20), // (107,32): error CS0136: A local or parameter named 'x12' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x12 && x12)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x12").WithArguments("x12").WithLocation(107, 32), // (113,22): error CS0103: The name 'x13' does not exist in the current context // for (var b = x13; Diagnostic(ErrorCode.ERR_NameNotInContext, "x13").WithArguments("x13").WithLocation(113, 22), // (114,20): error CS0103: The name 'x13' does not exist in the current context // Dummy(x13); Diagnostic(ErrorCode.ERR_NameNotInContext, "x13").WithArguments("x13").WithLocation(114, 20), // (116,32): error CS0128: A local variable or function named 'x13' is already defined in this scope // Dummy(true is var x13 && x13)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x13").WithArguments("x13").WithLocation(116, 32), // (122,23): error CS0103: The name 'x14' does not exist in the current context // for (bool b = x14; Diagnostic(ErrorCode.ERR_NameNotInContext, "x14").WithArguments("x14").WithLocation(122, 23), // (123,20): error CS0103: The name 'x14' does not exist in the current context // Dummy(x14); Diagnostic(ErrorCode.ERR_NameNotInContext, "x14").WithArguments("x14").WithLocation(123, 20), // (125,32): error CS0128: A local variable or function named 'x14' is already defined in this scope // Dummy(true is var x14 && x14)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(125, 32), // (131,20): error CS0103: The name 'x15' does not exist in the current context // for (Dummy(x15); Diagnostic(ErrorCode.ERR_NameNotInContext, "x15").WithArguments("x15").WithLocation(131, 20), // (132,20): error CS0103: The name 'x15' does not exist in the current context // Dummy(x15); Diagnostic(ErrorCode.ERR_NameNotInContext, "x15").WithArguments("x15").WithLocation(132, 20), // (133,20): error CS0841: Cannot use local variable 'x15' before it is declared // Dummy(x15), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x15").WithArguments("x15").WithLocation(133, 20) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); VerifyNotAPatternLocal(model, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); VerifyNotAPatternLocal(model, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").Single(); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x7Decl); VerifyNotAPatternLocal(model, x7Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(4, x8Decl.Length); Assert.Equal(4, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[0], x8Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[2], x8Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[3], x8Ref[3]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(3, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[2], x9Ref[3]); var x10Decl = GetPatternDeclarations(tree, "x10").ToArray(); var x10Ref = GetReferences(tree, "x10").ToArray(); Assert.Equal(3, x10Decl.Length); Assert.Equal(4, x10Ref.Length); VerifyNotInScope(model, x10Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl[0], x10Ref[1], x10Ref[2]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x10Decl[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl[2], x10Ref[3]); var x11Decl = GetPatternDeclarations(tree, "x11").ToArray(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(3, x11Decl.Length); Assert.Equal(4, x11Ref.Length); VerifyNotInScope(model, x11Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl[0], x11Ref[1], x11Ref[2]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x11Decl[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl[2], x11Ref[3]); var x12Decl = GetPatternDeclarations(tree, "x12").ToArray(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Decl.Length); Assert.Equal(4, x12Ref.Length); VerifyNotInScope(model, x12Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl[0], x12Ref[1], x12Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl[1], x12Ref[3]); var x13Decl = GetPatternDeclarations(tree, "x13").ToArray(); var x13Ref = GetReferences(tree, "x13").ToArray(); Assert.Equal(2, x13Decl.Length); Assert.Equal(4, x13Ref.Length); VerifyNotInScope(model, x13Ref[0]); VerifyNotInScope(model, x13Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[0], x13Ref[2], x13Ref[3]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x13Decl[1]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(4, x14Ref.Length); VerifyNotInScope(model, x14Ref[0]); VerifyNotInScope(model, x14Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref[2], x14Ref[3]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); var x15Decl = GetPatternDeclarations(tree, "x15").Single(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(4, x15Ref.Length); VerifyNotInScope(model, x15Ref[0]); VerifyNotInScope(model, x15Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x15Decl, x15Ref[2], x15Ref[3]); } [Fact] public void ScopeOfPatternVariables_For_07() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (;; Dummy(x1), Dummy(true is var x1 && x1)) {} } void Test2() { for (;; Dummy(true is var x2 && x2), Dummy(true is var x2 && x2)) {} } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (13,20): error CS0841: Cannot use local variable 'x1' before it is declared // Dummy(x1), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x1").WithArguments("x1").WithLocation(13, 20), // (22,32): error CS0128: A local variable or function named 'x2' is already defined in this scope // Dummy(true is var x2 && x2)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(22, 32) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); } [Fact] public void ScopeOfPatternVariables_Foreach_01() { var source = @" public class X { public static void Main() { } System.Collections.IEnumerable Dummy(params object[] x) {return null;} void Test1() { foreach (var i in Dummy(true is var x1 && x1)) { Dummy(x1); } } void Test2() { foreach (var i in Dummy(true is var x2 && x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); foreach (var i in Dummy(true is var x4 && x4)) Dummy(x4); } void Test6() { foreach (var i in Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { foreach (var i in Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { foreach (var i in Dummy(true is var x8 && x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { foreach (var i1 in Dummy(true is var x9 && x9)) { Dummy(x9); foreach (var i2 in Dummy(true is var x9 && x9)) // 2 Dummy(x9); } } void Test10() { foreach (var i in Dummy(y10 is var x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // foreach (var i in Dummy(y11 is var x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { foreach (var i in Dummy(y12 is var x12)) var y12 = 12; } //void Test13() //{ // foreach (var i in Dummy(y13 is var x13)) // let y13 = 12; //} void Test14() { foreach (var i in Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } void Test15() { foreach (var x15 in Dummy(1 is var x15, x15)) { Dummy(x15); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,45): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // foreach (var i in Dummy(true is var x4 && x4)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 45), // (35,33): error CS0841: Cannot use local variable 'x6' before it is declared // foreach (var i in Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 33), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,50): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // foreach (var i2 in Dummy(true is var x9 && x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 50), // (68,33): error CS0103: The name 'y10' does not exist in the current context // foreach (var i in Dummy(y10 is var x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 33), // (86,33): error CS0103: The name 'y12' does not exist in the current context // foreach (var i in Dummy(y12 is var x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 33), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,42): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 42), // (108,22): error CS0136: A local or parameter named 'x15' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // foreach (var x15 in Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x15").WithArguments("x15").WithLocation(108, 22) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); var x15Decl = GetPatternDeclarations(tree, "x15").Single(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(2, x15Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x15Decl, x15Ref[0]); VerifyNotAPatternLocal(model, x15Ref[1]); } [Fact] public void ScopeOfPatternVariables_Lock_01() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { lock (Dummy(true is var x1 && x1)) { Dummy(x1); } } void Test2() { lock (Dummy(true is var x2 && x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); lock (Dummy(true is var x4 && x4)) Dummy(x4); } void Test6() { lock (Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { lock (Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { lock (Dummy(true is var x8 && x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { lock (Dummy(true is var x9 && x9)) { Dummy(x9); lock (Dummy(true is var x9 && x9)) // 2 Dummy(x9); } } void Test10() { lock (Dummy(y10 is var x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // lock (Dummy(y11 is var x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { lock (Dummy(y12 is var x12)) var y12 = 12; } //void Test13() //{ // lock (Dummy(y13 is var x13)) // let y13 = 12; //} void Test14() { lock (Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,33): error CS0128: A local variable named 'x4' is already defined in this scope // lock (Dummy(true is var x4 && x4)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(29, 33), // (35,21): error CS0841: Cannot use local variable 'x6' before it is declared // lock (Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 21), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (60,19): error CS0841: Cannot use local variable 'x9' before it is declared // Dummy(x9); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(60, 19), // (61,37): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // lock (Dummy(true is var x9 && x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 37), // (68,21): error CS0103: The name 'y10' does not exist in the current context // lock (Dummy(y10 is var x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 21), // (86,21): error CS0103: The name 'y12' does not exist in the current context // lock (Dummy(y12 is var x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 21), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,30): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 30) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Lock_02() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { if (true) lock (Dummy(true is var x1)) { } x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (17,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(17, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_Lock_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (LockStatementSyntax)SyntaxFactory.ParseStatement(@" lock (Dummy(11 is var x1, x1)); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_Fixed_01() { var source = @" public unsafe class X { public static void Main() { } int[] Dummy(params object[] x) {return null;} void Test1() { fixed (int* p = Dummy(true is var x1 && x1)) { Dummy(x1); } } void Test2() { fixed (int* p = Dummy(true is var x2 && x2)) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); fixed (int* p = Dummy(true is var x4 && x4)) Dummy(x4); } void Test6() { fixed (int* p = Dummy(x6 && true is var x6)) Dummy(x6); } void Test7() { fixed (int* p = Dummy(true is var x7 && x7)) { var x7 = 12; Dummy(x7); } } void Test8() { fixed (int* p = Dummy(true is var x8 && x8)) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { fixed (int* p1 = Dummy(true is var x9 && x9)) { Dummy(x9); fixed (int* p2 = Dummy(true is var x9 && x9)) // 2 Dummy(x9); } } void Test10() { fixed (int* p = Dummy(y10 is var x10)) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // fixed (int* p = Dummy(y11 is var x11)) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { fixed (int* p = Dummy(y12 is var x12)) var y12 = 12; } //void Test13() //{ // fixed (int* p = Dummy(y13 is var x13)) // let y13 = 12; //} void Test14() { fixed (int* p = Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true)); compilation.VerifyDiagnostics( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,43): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // fixed (int* p = Dummy(true is var x4 && x4)) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 43), // (35,31): error CS0841: Cannot use local variable 'x6' before it is declared // fixed (int* p = Dummy(x6 && true is var x6)) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 31), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,48): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // fixed (int* p2 = Dummy(true is var x9 && x9)) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 48), // (68,31): error CS0103: The name 'y10' does not exist in the current context // fixed (int* p = Dummy(y10 is var x10)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 31), // (86,31): error CS0103: The name 'y12' does not exist in the current context // fixed (int* p = Dummy(y12 is var x12)) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 31), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,40): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 40) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void ScopeOfPatternVariables_Fixed_02() { var source = @" public unsafe class X { public static void Main() { } int[] Dummy(params object[] x) {return null;} int[] Dummy(int* x) {return null;} void Test1() { fixed (int* x1 = Dummy(true is var x1 && x1)) { Dummy(x1); } } void Test2() { fixed (int* p = Dummy(true is var x2 && x2), x2 = Dummy()) { Dummy(x2); } } void Test3() { fixed (int* x3 = Dummy(), p = Dummy(true is var x3 && x3)) { Dummy(x3); } } void Test4() { fixed (int* p1 = Dummy(true is var x4 && x4), p2 = Dummy(true is var x4 && x4)) { Dummy(x4); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true)); compilation.VerifyDiagnostics( // (14,44): error CS0128: A local variable named 'x1' is already defined in this scope // Dummy(true is var x1 && x1)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(14, 44), // (14,50): error CS0165: Use of unassigned local variable 'x1' // Dummy(true is var x1 && x1)) Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(14, 50), // (23,21): error CS0128: A local variable named 'x2' is already defined in this scope // x2 = Dummy()) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(23, 21), // (32,43): error CS0128: A local variable named 'x3' is already defined in this scope // p = Dummy(true is var x3 && x3)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x3").WithArguments("x3").WithLocation(32, 43), // (41,44): error CS0128: A local variable named 'x4' is already defined in this scope // p2 = Dummy(true is var x4 && x4)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(41, 44) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x3Decl); VerifyNotAPatternLocal(model, x3Ref[0]); VerifyNotAPatternLocal(model, x3Ref[1]); var x4Decl = GetPatternDeclarations(tree, "x4").ToArray(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Decl.Length); Assert.Equal(3, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl[0], x4Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl[1]); } [Fact] public void ScopeOfPatternVariables_Yield_01() { var source = @" using System.Collections; public class X { public static void Main() { } object Dummy(params object[] x) { return null;} IEnumerable Test1() { yield return Dummy(true is var x1, x1); { yield return Dummy(true is var x1, x1); } yield return Dummy(true is var x1, x1); } IEnumerable Test2() { yield return Dummy(x2, true is var x2); } IEnumerable Test3(int x3) { yield return Dummy(true is var x3, x3); } IEnumerable Test4() { var x4 = 11; Dummy(x4); yield return Dummy(true is var x4, x4); } IEnumerable Test5() { yield return Dummy(true is var x5, x5); var x5 = 11; Dummy(x5); } //IEnumerable Test6() //{ // let x6 = 11; // Dummy(x6); // yield return Dummy(true is var x6, x6); //} //IEnumerable Test7() //{ // yield return Dummy(true is var x7, x7); // let x7 = 11; // Dummy(x7); //} IEnumerable Test8() { yield return Dummy(true is var x8, x8, false is var x8, x8); } IEnumerable Test9(bool y9) { if (y9) yield return Dummy(true is var x9, x9); } IEnumerable Test11() { Dummy(x11); yield return Dummy(true is var x11, x11); } IEnumerable Test12() { yield return Dummy(true is var x12, x12); Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (16,44): error CS0136: A local or parameter named 'x1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // yield return Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(16, 44), // (18,40): error CS0128: A local variable or function named 'x1' is already defined in this scope // yield return Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(18, 40), // (23,28): error CS0841: Cannot use local variable 'x2' before it is declared // yield return Dummy(x2, true is var x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(23, 28), // (28,40): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // yield return Dummy(true is var x3, x3); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(28, 40), // (35,40): error CS0128: A local variable or function named 'x4' is already defined in this scope // yield return Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(35, 40), // (41,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(41, 13), // (41,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(41, 13), // (61,61): error CS0128: A local variable or function named 'x8' is already defined in this scope // yield return Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(61, 61), // (72,15): error CS0841: Cannot use local variable 'x11' before it is declared // Dummy(x11); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x11").WithArguments("x11").WithLocation(72, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(2, x8Ref.Length); for (int i = 0; i < x8Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref); } [Fact] public void ScopeOfPatternVariables_Yield_02() { var source = @" using System.Collections; public class X { public static void Main() { } object Dummy(params object[] x) { return null;} IEnumerable Test1() { if (true) yield return Dummy(true is var x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (17,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(17, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_Yield_03() { var source = @" using System.Collections; public class X { public static void Main() { } object Dummy(params object[] x) { return null;} IEnumerable Test1() { SpeculateHere(); yield 0; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (YieldStatementSyntax)SyntaxFactory.ParseStatement(@" yield return (Dummy(11 is var x1, x1)); "); bool success = model.TryGetSpeculativeSemanticModel( GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_Catch_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { try {} catch when (true is var x1 && x1) { Dummy(x1); } } void Test4() { var x4 = 11; Dummy(x4); try {} catch when (true is var x4 && x4) { Dummy(x4); } } void Test6() { try {} catch when (x6 && true is var x6) { Dummy(x6); } } void Test7() { try {} catch when (true is var x7 && x7) { var x7 = 12; Dummy(x7); } } void Test8() { try {} catch when (true is var x8 && x8) { Dummy(x8); } System.Console.WriteLine(x8); } void Test9() { try {} catch when (true is var x9 && x9) { Dummy(x9); try {} catch when (true is var x9 && x9) // 2 { Dummy(x9); } } } void Test10() { try {} catch when (y10 is var x10) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // try {} // catch when (y11 is var x11) // { // let y11 = 12; // Dummy(y11); // } //} void Test14() { try {} catch when (Dummy(1 is var x14, 2 is var x14, x14)) { Dummy(x14); } } void Test15() { try {} catch (System.Exception x15) when (Dummy(1 is var x15, x15)) { Dummy(x15); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (25,33): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // catch when (true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(25, 33), // (34,21): error CS0841: Cannot use local variable 'x6' before it is declared // catch when (x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(34, 21), // (45,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(45, 17), // (58,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(58, 34), // (68,37): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // catch when (true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(68, 37), // (78,21): error CS0103: The name 'y10' does not exist in the current context // catch when (y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(78, 21), // (99,36): error CS0128: A local variable named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 36), // (110,36): error CS0128: A local variable named 'x15' is already defined in this scope // when (Dummy(1 is var x15, x15)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x15").WithArguments("x15").WithLocation(110, 36) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); var x15Decl = GetPatternDeclarations(tree, "x15").Single(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(2, x15Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x15Decl); VerifyNotAPatternLocal(model, x15Ref[0]); VerifyNotAPatternLocal(model, x15Ref[1]); } [Fact] public void ScopeOfPatternVariables_LabeledStatement_01() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { a: Dummy(true is var x1, x1); { b: Dummy(true is var x1, x1); } c: Dummy(true is var x1, x1); } void Test2() { Dummy(x2, true is var x2); } void Test3(int x3) { a: Dummy(true is var x3, x3); } void Test4() { var x4 = 11; Dummy(x4); a: Dummy(true is var x4, x4); } void Test5() { a: Dummy(true is var x5, x5); var x5 = 11; Dummy(x5); } //void Test6() //{ // let x6 = 11; // Dummy(x6); //a: Dummy(true is var x6, x6); //} //void Test7() //{ //a: Dummy(true is var x7, x7); // let x7 = 11; // Dummy(x7); //} void Test8() { a: Dummy(true is var x8, x8, false is var x8, x8); } void Test9(bool y9) { if (y9) a: Dummy(true is var x9, x9); } System.Action Test10(bool y10) { return () => { if (y10) a: Dummy(true is var x10, x10); }; } void Test11() { Dummy(x11); a: Dummy(true is var x11, x11); } void Test12() { a: Dummy(true is var x12, x12); Dummy(x12); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // b: Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(14, 31), // (16,27): error CS0128: A local variable or function named 'x1' is already defined in this scope // c: Dummy(true is var x1, x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(16, 27), // (12,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x1, x1); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(12, 1), // (14,1): warning CS0164: This label has not been referenced // b: Dummy(true is var x1, x1); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "b").WithLocation(14, 1), // (16,1): warning CS0164: This label has not been referenced // c: Dummy(true is var x1, x1); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "c").WithLocation(16, 1), // (21,15): error CS0841: Cannot use local variable 'x2' before it is declared // Dummy(x2, true is var x2); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(21, 15), // (26,27): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // a: Dummy(true is var x3, x3); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(26, 27), // (26,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x3, x3); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(26, 1), // (33,27): error CS0128: A local variable or function named 'x4' is already defined in this scope // a: Dummy(true is var x4, x4); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(33, 27), // (33,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x4, x4); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(33, 1), // (39,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(39, 13), // (38,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x5, x5); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(38, 1), // (39,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(39, 13), // (59,48): error CS0128: A local variable or function named 'x8' is already defined in this scope // a: Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(59, 48), // (59,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x8, x8, false is var x8, x8); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(59, 1), // (65,1): error CS1023: Embedded statement cannot be a declaration or labeled statement // a: Dummy(true is var x9, x9); Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "a: Dummy(true is var x9, x9);").WithLocation(65, 1), // (65,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x9, x9); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(65, 1), // (73,1): error CS1023: Embedded statement cannot be a declaration or labeled statement // a: Dummy(true is var x10, x10); Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "a: Dummy(true is var x10, x10);").WithLocation(73, 1), // (73,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x10, x10); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(73, 1), // (79,15): error CS0841: Cannot use local variable 'x11' before it is declared // Dummy(x11); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x11").WithArguments("x11").WithLocation(79, 15), // (80,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x11, x11); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(80, 1), // (85,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x12, x12); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(85, 1) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").ToArray(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x2").Single(); var x2Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x3").Single(); var x3Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x4").Single(); var x4Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x5").Single(); var x5Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x8Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x8").ToArray(); var x8Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(2, x8Ref.Length); for (int i = 0; i < x8Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x9").Single(); var x9Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x9").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x10Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x10").Single(); var x10Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x10").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var x11Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x11").Single(); var x11Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x11").ToArray(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref); var x12Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x12").Single(); var x12Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x12").ToArray(); Assert.Equal(2, x12Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref); } [Fact] public void ScopeOfPatternVariables_LabeledStatement_02() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { if (true) a: Dummy(true is var x1); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); compilation.VerifyDiagnostics( // (13,1): error CS1023: Embedded statement cannot be a declaration or labeled statement // a: Dummy(true is var x1); Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "a: Dummy(true is var x1);").WithLocation(13, 1), // (15,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(15, 9), // (13,1): warning CS0164: This label has not been referenced // a: Dummy(true is var x1); Diagnostic(ErrorCode.WRN_UnreferencedLabel, "a").WithLocation(13, 1) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl); VerifyNotInScope(model, x1Ref); } [Fact] public void ScopeOfPatternVariables_LabeledStatement_03() { var source = @" public class X { public static void Main() { } void Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (LabeledStatementSyntax)SyntaxFactory.ParseStatement(@" a: b: c:Dummy(11 is var x1, x1); "); bool success = model.TryGetSpeculativeSemanticModel( tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = tree.GetRoot().DescendantNodes().OfType<SingleVariableDesignationSyntax>().Where(p => p.Identifier.ValueText == "x1").Single(); var x1Ref = tree.GetRoot().DescendantNodes().OfType<IdentifierNameSyntax>().Where(id => id.Identifier.ValueText == "x1").ToArray(); Assert.Equal(1, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_01() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) { return true; } public static int Data = 2; void Test1(int val) { switch (val) { case 0 when Dummy(Dummy(Data is var x1), x1): Dummy(x1); break; case 1 when Dummy(Dummy(Data is var x1), x1): Dummy(x1); break; case 2 when Dummy(Dummy(Data is var x1), x1): Dummy(x1); break; } } void Test2(int val) { switch (val) { case 0 when Dummy(x2, Dummy(Data is var x2)): Dummy(x2); break; } } void Test3(int x3, int val) { switch (val) { case 0 when Dummy(Dummy(Data is var x3), x3): Dummy(x3); break; } } void Test4(int val) { var x4 = 11; switch (val) { case 0 when Dummy(Dummy(Data is var x4), x4): Dummy(x4); break; case 1 when Dummy(x4): Dummy(x4); break; } } void Test5(int val) { switch (val) { case 0 when Dummy(Dummy(Data is var x5), x5): Dummy(x5); break; } var x5 = 11; Dummy(x5); } //void Test6(int val) //{ // let x6 = 11; // switch (val) // { // case 0 when Dummy(x6): // Dummy(x6); // break; // case 1 when Dummy(Dummy(Data is var x6), x6): // Dummy(x6); // break; // } //} //void Test7(int val) //{ // switch (val) // { // case 0 when Dummy(Dummy(Data is var x7), x7): // Dummy(x7); // break; // } // let x7 = 11; // Dummy(x7); //} void Test8(int val) { switch (val) { case 0 when Dummy(Dummy(Data is var x8), x8, Dummy(Data is var x8), x8): Dummy(x8); break; } } void Test9(int val) { switch (val) { case 0 when Dummy(x9): int x9 = 9; Dummy(x9); break; case 2 when Dummy(x9 = 9): Dummy(x9); break; case 1 when Dummy(Dummy(Data is var x9), x9): Dummy(x9); break; } } //void Test10(int val) //{ // switch (val) // { // case 1 when Dummy(Dummy(Data is var x10), x10): // Dummy(x10); // break; // case 0 when Dummy(x10): // let x10 = 10; // Dummy(x10); // break; // case 2 when Dummy(x10 = 10, x10): // Dummy(x10); // break; // } //} void Test11(int val) { switch (x11 ? val : 0) { case 0 when Dummy(x11): Dummy(x11, 0); break; case 1 when Dummy(Dummy(Data is var x11), x11): Dummy(x11, 1); break; } } void Test12(int val) { switch (x12 ? val : 0) { case 0 when Dummy(Dummy(Data is var x12), x12): Dummy(x12, 0); break; case 1 when Dummy(x12): Dummy(x12, 1); break; } } void Test13() { switch (Dummy(1, Data is var x13) ? x13 : 0) { case 0 when Dummy(x13): Dummy(x13); break; case 1 when Dummy(Dummy(Data is var x13), x13): Dummy(x13); break; } } void Test14(int val) { switch (val) { case 1 when Dummy(Dummy(Data is var x14), x14): Dummy(x14); Dummy(Dummy(Data is var x14), x14); Dummy(x14); break; } } void Test15(int val) { switch (val) { case 0 when Dummy(Dummy(Data is var x15), x15): case 1 when Dummy(Dummy(Data is var x15), x15): Dummy(x15); break; } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (32,31): error CS0841: Cannot use local variable 'x2' before it is declared // case 0 when Dummy(x2, Dummy(Data is var x2)): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(32, 31), // (42,49): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(Dummy(Data is var x3), x3): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(42, 49), // (53,49): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(Dummy(Data is var x4), x4): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(53, 49), // (64,49): error CS0136: A local or parameter named 'x5' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 0 when Dummy(Dummy(Data is var x5), x5): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x5").WithArguments("x5").WithLocation(64, 49), // (104,76): error CS0128: A local variable named 'x8' is already defined in this scope // case 0 when Dummy(Dummy(Data is var x8), x8, Dummy(Data is var x8), x8): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(104, 76), // (114,31): error CS0841: Cannot use local variable 'x9' before it is declared // case 0 when Dummy(x9): Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(114, 31), // (121,49): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(Dummy(Data is var x9), x9): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(121, 49), // (146,17): error CS0103: The name 'x11' does not exist in the current context // switch (x11 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(146, 17), // (148,31): error CS0103: The name 'x11' does not exist in the current context // case 0 when Dummy(x11): Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(148, 31), // (149,23): error CS0103: The name 'x11' does not exist in the current context // Dummy(x11, 0); Diagnostic(ErrorCode.ERR_NameNotInContext, "x11").WithArguments("x11").WithLocation(149, 23), // (159,17): error CS0103: The name 'x12' does not exist in the current context // switch (x12 ? val : 0) Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(159, 17), // (164,31): error CS0103: The name 'x12' does not exist in the current context // case 1 when Dummy(x12): Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(164, 31), // (165,23): error CS0103: The name 'x12' does not exist in the current context // Dummy(x12, 1); Diagnostic(ErrorCode.ERR_NameNotInContext, "x12").WithArguments("x12").WithLocation(165, 23), // (177,49): error CS0136: A local or parameter named 'x13' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(Dummy(Data is var x13), x13): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x13").WithArguments("x13").WithLocation(177, 49), // (187,49): error CS0136: A local or parameter named 'x14' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // case 1 when Dummy(Dummy(Data is var x14), x14): Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x14").WithArguments("x14").WithLocation(187, 49), // (200,49): error CS0128: A local variable named 'x15' is already defined in this scope // case 1 when Dummy(Dummy(Data is var x15), x15): Diagnostic(ErrorCode.ERR_LocalDuplicate, "x15").WithArguments("x15").WithLocation(200, 49), // (200,55): error CS0165: Use of unassigned local variable 'x15' // case 1 when Dummy(Dummy(Data is var x15), x15): Diagnostic(ErrorCode.ERR_UseDefViolation, "x15").WithArguments("x15").WithLocation(200, 55) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(6, x1Ref.Length); for (int i = 0; i < x1Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[i], x1Ref[i * 2], x1Ref[i * 2 + 1]); } var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(4, x4Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x4Decl, x4Ref[0], x4Ref[1]); VerifyNotAPatternLocal(model, x4Ref[2]); VerifyNotAPatternLocal(model, x4Ref[3]); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(3, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref[0], x5Ref[1]); VerifyNotAPatternLocal(model, x5Ref[2]); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Decl.Length); Assert.Equal(3, x8Ref.Length); for (int i = 0; i < x8Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[0], x8Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x8Decl[1]); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(6, x9Ref.Length); VerifyNotAPatternLocal(model, x9Ref[0]); VerifyNotAPatternLocal(model, x9Ref[1]); VerifyNotAPatternLocal(model, x9Ref[2]); VerifyNotAPatternLocal(model, x9Ref[3]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref[4], x9Ref[5]); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); Assert.Equal(5, x11Ref.Length); VerifyNotInScope(model, x11Ref[0]); VerifyNotInScope(model, x11Ref[1]); VerifyNotInScope(model, x11Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[3], x11Ref[4]); var x12Decl = GetPatternDeclarations(tree, "x12").Single(); var x12Ref = GetReferences(tree, "x12").ToArray(); Assert.Equal(5, x12Ref.Length); VerifyNotInScope(model, x12Ref[0]); VerifyModelForDeclarationOrVarSimplePattern(model, x12Decl, x12Ref[1], x12Ref[2]); VerifyNotInScope(model, x12Ref[3]); VerifyNotInScope(model, x12Ref[4]); var x13Decl = GetPatternDeclarations(tree, "x13").ToArray(); var x13Ref = GetReferences(tree, "x13").ToArray(); Assert.Equal(2, x13Decl.Length); Assert.Equal(5, x13Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[0], x13Ref[0], x13Ref[1], x13Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x13Decl[1], x13Ref[3], x13Ref[4]); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(4, x14Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarSimplePattern(model, x14Decl[1], true); var x15Decl = GetPatternDeclarations(tree, "x15").ToArray(); var x15Ref = GetReferences(tree, "x15").ToArray(); Assert.Equal(2, x15Decl.Length); Assert.Equal(3, x15Ref.Length); for (int i = 0; i < x15Ref.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x15Decl[0], x15Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x15Decl[1]); } [Fact] public void Scope_SwitchLabelGuard_02() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): Dummy(x1 is var y1); System.Console.WriteLine(y1); break; } } static bool Dummy(params object[] trash) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_03() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): while (Dummy(x1 is var y1) && Print(y1)) break; break; } } static bool Print(int x) { System.Console.WriteLine(x); return true; } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_04() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): do val = 0; while (Dummy(x1 is var y1) && Print(y1)); break; } } static bool Print(int x) { System.Console.WriteLine(x); return false; } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_05() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): lock ((object)Dummy(x1 is var y1)) {} System.Console.WriteLine(y1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_06() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): if (Dummy(x1 is var y1)) {} System.Console.WriteLine(y1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_07() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): switch (Dummy(x1 is var y1)) { default: break; } System.Console.WriteLine(y1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_08() { var source = @" public class X { public static int Data = 2; public static void Main() { foreach (var x in Test(1)) {} } static System.Collections.IEnumerable Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): yield return Dummy(x1 is var y1); System.Console.WriteLine(y1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_09() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): var z1 = x1 > 0 & Dummy(x1 is var y1); System.Console.WriteLine(y1); System.Console.WriteLine(z1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2 True").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(yRef).Type.ToTestDisplayString()); var zRef = GetReferences(tree, "z1").Single(); Assert.Equal("System.Boolean", compilation.GetSemanticModel(tree).GetTypeInfo(zRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_10() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): var z1 = Dummy(123, x1 is var y1); System.Console.WriteLine(y1); System.Console.WriteLine(z1); break; } } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2 True").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var xRef = GetReferences(tree, "x1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(xRef).Type.ToTestDisplayString()); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(yRef).Type.ToTestDisplayString()); var zRef = GetReferences(tree, "z1").Single(); Assert.Equal("System.Boolean", compilation.GetSemanticModel(tree).GetTypeInfo(zRef).Type.ToTestDisplayString()); } [Fact] public void Scope_SwitchLabelGuard_11() { var source = @" public class X { public static int Data = 2; public static void Main() { System.Console.WriteLine(Test(1)); } static bool Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): return Dummy(123, x1 is var y1) && Dummy(y1); System.Console.WriteLine(y1); break; } return false; } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: "True").VerifyDiagnostics( // (17,17): warning CS0162: Unreachable code detected // System.Console.WriteLine(y1); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(17, 17)); var tree = compilation.SyntaxTrees.Single(); var xRef = GetReferences(tree, "x1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(xRef).Type.ToTestDisplayString()); var yRefs = GetReferences(tree, "y1"); Assert.Equal(2, yRefs.Count()); foreach (var yRef in yRefs) { Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(yRef).Type.ToTestDisplayString()); } } [Fact] public void Scope_SwitchLabelGuard_12() { var source = @" public class X { public static int Data = 2; public static void Main() { Test(1); } static bool Test(int val) { try { switch (val) { case 1 when Data is var x1: throw Dummy(123, x1 is var y1); System.Console.WriteLine(y1); break; } } catch { } return false; } static System.Exception Dummy(params object[] data) { foreach(var obj in data) { System.Console.WriteLine(obj); } return new System.Exception(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"123 True").VerifyDiagnostics( // (19,21): warning CS0162: Unreachable code detected // System.Console.WriteLine(y1); Diagnostic(ErrorCode.WRN_UnreachableCode, "System").WithLocation(19, 21)); var tree = compilation.SyntaxTrees.Single(); var xRef = GetReferences(tree, "x1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(xRef).Type.ToTestDisplayString()); var yRef = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(yRef).Type.ToTestDisplayString()); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void Scope_SwitchLabelGuard_13() { var source = @" public class X { public static int Data = 2; public static void Main() { System.Console.WriteLine(Test(1)); } static bool Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): var (z0, z1) = (x1, Dummy(x1, x1 is var y1)); System.Console.WriteLine(y1); System.Console.WriteLine(z0); System.Console.WriteLine(z1 ? 1 : 0); break; } return false; } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation( source: source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2 2 1 False").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var y1Ref = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(y1Ref).Type.ToTestDisplayString()); var z0Ref = GetReferences(tree, "z0").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(z0Ref).Type.ToTestDisplayString()); var z1Ref = GetReferences(tree, "z1").Single(); Assert.Equal("System.Boolean", compilation.GetSemanticModel(tree).GetTypeInfo(z1Ref).Type.ToTestDisplayString()); } [Fact] [CompilerTrait(CompilerFeature.Tuples)] public void Scope_SwitchLabelGuard_14() { var source = @" public class X { public static int Data = 2; public static void Main() { System.Console.WriteLine(Test(1)); } static bool Test(int val) { switch (val) { case 1 when Dummy(123, Data is var x1): var (z0, (z1, z2)) = (x1, (Data, Dummy(x1, x1 is var y1))); System.Console.WriteLine(y1); System.Console.WriteLine(z0); System.Console.WriteLine(z1); System.Console.WriteLine(z2); break; } return false; } static bool Dummy(params object[] data) { return true; } } "; var compilation = CreateCompilation( source: source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); CompileAndVerify(compilation, expectedOutput: @"2 2 2 True False").VerifyDiagnostics(); var tree = compilation.SyntaxTrees.Single(); var y1Ref = GetReferences(tree, "y1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(y1Ref).Type.ToTestDisplayString()); var z0Ref = GetReferences(tree, "z0").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(z0Ref).Type.ToTestDisplayString()); var z1Ref = GetReferences(tree, "z1").Single(); Assert.Equal("System.Int32", compilation.GetSemanticModel(tree).GetTypeInfo(z1Ref).Type.ToTestDisplayString()); var z2Ref = GetReferences(tree, "z2").Single(); Assert.Equal("System.Boolean", compilation.GetSemanticModel(tree).GetTypeInfo(z2Ref).Type.ToTestDisplayString()); } [Fact] public void Scope_DeclaratorArguments_01() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { int d,e(Dummy(true is var x1, x1)); } void Test4() { var x4 = 11; Dummy(x4); int d,e(Dummy(true is var x4, x4)); } void Test6() { int d,e(Dummy(x6 && true is var x6)); } void Test8() { int d,e(Dummy(true is var x8, x8)); System.Console.WriteLine(x8); } void Test14() { int d,e(Dummy(1 is var x14, 2 is var x14, x14)); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.WRN_UnreferencedVar }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (19,35): error CS0128: A local variable or function named 'x4' is already defined in this scope // int d,e(Dummy(true is var x4, x4)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(19, 35), // (24,23): error CS0841: Cannot use local variable 'x6' before it is declared // int d,e(Dummy(x6 && true is var x6)); Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(24, 23), // (30,34): error CS0165: Use of unassigned local variable 'x8' // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_UseDefViolation, "x8").WithArguments("x8").WithLocation(30, 34), // (36,32): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(36, 32) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").Single(); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").Single(); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x6Decl, x6Ref); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(2, x8Ref.Length); AssertContainedInDeclaratorArguments(x8Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl, x8Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").Single(); Assert.Equal(2, x14Decl.Length); AssertContainedInDeclaratorArguments(x14Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void Scope_DeclaratorArguments_02() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { var d, x1( Dummy(true is var x1, x1)); Dummy(x1); } void Test2() { object d, x2( Dummy(true is var x2, x2)); Dummy(x2); } void Test3() { object x3, d( Dummy(true is var x3, x3)); Dummy(x3); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.WRN_UnreferencedVar }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (12,13): error CS0818: Implicitly-typed variables must be initialized // var d, x1( Diagnostic(ErrorCode.ERR_ImplicitlyTypedVariableWithNoInitializer, "d").WithLocation(12, 13), // (13,36): error CS0128: A local variable or function named 'x1' is already defined in this scope // Dummy(true is var x1, x1)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 36), // (20,39): error CS0128: A local variable or function named 'x2' is already defined in this scope // Dummy(true is var x2, x2)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 39), // (21,15): error CS0165: Use of unassigned local variable 'x2' // Dummy(x2); Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(21, 15), // (27,39): error CS0128: A local variable or function named 'x3' is already defined in this scope // Dummy(true is var x3, x3)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x3").WithArguments("x3").WithLocation(27, 39), // (28,15): error CS0165: Use of unassigned local variable 'x3' // Dummy(x3); Diagnostic(ErrorCode.ERR_UseDefViolation, "x3").WithArguments("x3").WithLocation(28, 15) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyNotAPatternLocal(model, x2Ref[0]); VerifyNotAPatternLocal(model, x2Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x3Decl); VerifyNotAPatternLocal(model, x3Ref[0]); VerifyNotAPatternLocal(model, x3Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x3Decl); } [Fact] public void Scope_DeclaratorArguments_03() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { object d,e(Dummy(true is var x1, x1)], x1( Dummy(x1)); Dummy(x1); } void Test2() { object d1,e(Dummy(true is var x2, x2)], d2(Dummy(true is var x2, x2)); } void Test3() { object d1,e(Dummy(true is var x3, x3)], d2(Dummy(x3)); } void Test4() { object d1,e(Dummy(x4)], d2(Dummy(true is var x4, x4)); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_CloseParenExpected }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (13,16): error CS0128: A local variable or function named 'x1' is already defined in this scope // x1( Dummy(x1)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 16), // (14,15): error CS0165: Use of unassigned local variable 'x1' // Dummy(x1); Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(14, 15), // (20,39): error CS0128: A local variable or function named 'x2' is already defined in this scope // d2(Dummy(true is var x2, x2)); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 39), // (31,27): error CS0841: Cannot use local variable 'x4' before it is declared // object d1,e(Dummy(x4)], Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(31, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref); } [Fact] public void Scope_DeclaratorArguments_04() { var source = @" public class X { public static void Main() { } object Dummy(params object[] x) {return null;} void Test1() { object d,e(Dummy(true is var x1, x1)], x1 = Dummy(x1); Dummy(x1); } void Test2() { object d1,e(Dummy(true is var x2, x2)], d2 = Dummy(true is var x2, x2); } void Test3() { object d1,e(Dummy(true is var x3, x3)], d2 = Dummy(x3); } void Test4() { object d1 = Dummy(x4), d2 (Dummy(true is var x4, x4)); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_CloseParenExpected }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (13,16): error CS0128: A local variable or function named 'x1' is already defined in this scope // x1 = Dummy(x1); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 16), // (13,27): error CS0165: Use of unassigned local variable 'x1' // x1 = Dummy(x1); Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(13, 27), // (20,39): error CS0128: A local variable or function named 'x2' is already defined in this scope // d2 = Dummy(true is var x2, x2); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 39), // (20,43): error CS0165: Use of unassigned local variable 'x2' // d2 = Dummy(true is var x2, x2); Diagnostic(ErrorCode.ERR_UseDefViolation, "x2").WithArguments("x2").WithLocation(20, 43), // (26,27): error CS0165: Use of unassigned local variable 'x3' // d2 = Dummy(x3); Diagnostic(ErrorCode.ERR_UseDefViolation, "x3").WithArguments("x3").WithLocation(26, 27), // (31,27): error CS0841: Cannot use local variable 'x4' before it is declared // object d1 = Dummy(x4), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(31, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref); } [Fact] public void Scope_DeclaratorArguments_05() { var source = @" public class X { public static void Main() { } long Dummy(params object[] x) {} void Test1() { SpeculateHere(); } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var statement = (LocalDeclarationStatementSyntax)SyntaxFactory.ParseStatement(@" var y, y1(Dummy(3 is var x1, x1)); "); bool success = model.TryGetSpeculativeSemanticModel(GetReferences(tree, "SpeculateHere").Single().SpanStart, statement, out model); Assert.True(success); Assert.NotNull(model); tree = statement.SyntaxTree; var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(1, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); Assert.Equal("System.Int32", model.GetTypeInfo(x1Ref[0]).Type.ToTestDisplayString()); var y1 = model.LookupSymbols(x1Ref[0].SpanStart, name: "y1").Single(); Assert.Equal("var y1", y1.ToTestDisplayString()); Assert.True(((ILocalSymbol)y1).Type.IsErrorType()); } [Fact] public void Scope_DeclaratorArguments_06() { var source = @" public class X { public static void Main() { } void Test1() { if (true) var d,e(string.Empty is var x1 && x1 != null); x1++; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.WRN_UnreferencedVar }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (11,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var d,e(string.Empty is var x1 && x1 != null); Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var d,e(string.Empty is var x1 && x1 != null);").WithLocation(11, 13), // (11,17): error CS0818: Implicitly-typed variables must be initialized // var d,e(string.Empty is var x1 && x1 != null); Diagnostic(ErrorCode.ERR_ImplicitlyTypedVariableWithNoInitializer, "d").WithLocation(11, 17), // (13,9): error CS0103: The name 'x1' does not exist in the current context // x1++; Diagnostic(ErrorCode.ERR_NameNotInContext, "x1").WithArguments("x1").WithLocation(13, 9) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref[0]); VerifyNotInScope(model, x1Ref[1]); var e = tree.GetRoot().DescendantNodes().OfType<VariableDeclaratorSyntax>().Where(id => id.Identifier.ValueText == "e").Single(); var symbol = (ILocalSymbol)model.GetDeclaredSymbol(e); Assert.Equal("var e", symbol.ToTestDisplayString()); Assert.True(symbol.Type.IsErrorType()); } [Fact] [WorkItem(13460, "https://github.com/dotnet/roslyn/issues/13460")] public void Scope_DeclaratorArguments_07() { var source = @" public class X { public static void Main() { Test(1); } static void Test(int val) { switch (val) { case 1 when 123 is var x1: var z, z1(x1, out var u1, x1 > 0 & x1 is var y1]; System.Console.WriteLine(y1); System.Console.WriteLine(z1 ? 1 : 0); break; } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var y1Decl = GetPatternDeclarations(tree, "y1").Single(); AssertContainedInDeclaratorArguments(y1Decl); var yRef = GetReference(tree, "y1"); Assert.Equal("System.Int32", model.GetTypeInfo(yRef).Type.ToTestDisplayString()); model = compilation.GetSemanticModel(tree); var zRef = GetReference(tree, "z1"); Assert.True(model.GetTypeInfo(zRef).Type.IsErrorType()); } [Fact] [WorkItem(13459, "https://github.com/dotnet/roslyn/issues/13459")] public void Scope_DeclaratorArguments_08() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test1() { for (bool a, b( Dummy(true is var x1 && x1) );;) { Dummy(x1); } } void Test2() { for (bool a, b( Dummy(true is var x2 && x2) );;) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); for (bool a, b( Dummy(true is var x4 && x4) );;) Dummy(x4); } void Test6() { for (bool a, b( Dummy(x6 && true is var x6) );;) Dummy(x6); } void Test7() { for (bool a, b( Dummy(true is var x7 && x7) );;) { var x7 = 12; Dummy(x7); } } void Test8() { for (bool a, b( Dummy(true is var x8 && x8) );;) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { for (bool a1, b1( Dummy(true is var x9 && x9) );;) { Dummy(x9); for (bool a2, b2( Dummy(true is var x9 && x9) // 2 );;) Dummy(x9); } } void Test10() { for (bool a, b( Dummy(y10 is var x10) );;) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // for (bool a, b( // Dummy(y11 is var x11) // );;) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { for (bool a, b( Dummy(y12 is var x12) );;) var y12 = 12; } //void Test13() //{ // for (bool a, b( // Dummy(y13 is var x13) // );;) // let y13 = 12; //} void Test14() { for (bool a, b( Dummy(1 is var x14, 2 is var x14, x14) );;) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = [ (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_UseDefViolation, (int)ErrorCode.ERR_AbstractAndExtern, (int)ErrorCode.ERR_SemicolonExpected, (int)ErrorCode.ERR_CloseParenExpected, (int)ErrorCode.ERR_InvalidExprTerm, ]; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (12,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(12, 22), // (22,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(22, 22), // (33,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(33, 22), // (34,32): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x4 && x4) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(34, 32), // (41,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(41, 22), // (42,20): error CS0841: Cannot use local variable 'x6' before it is declared // Dummy(x6 && true is var x6) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(42, 20), // (49,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(49, 22), // (53,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(53, 17), // (60,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(60, 22), // (65,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(65, 34), // (70,23): error CS0103: The name 'b1' does not exist in the current context // for (bool a1, b1( Diagnostic(ErrorCode.ERR_NameNotInContext, "b1").WithArguments("b1").WithLocation(70, 23), // (75,27): error CS0103: The name 'b2' does not exist in the current context // for (bool a2, b2( Diagnostic(ErrorCode.ERR_NameNotInContext, "b2").WithArguments("b2").WithLocation(75, 27), // (76,36): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(76, 36), // (84,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(84, 22), // (85,20): error CS0103: The name 'y10' does not exist in the current context // Dummy(y10 is var x10) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(85, 20), // (106,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(106, 22), // (107,20): error CS0103: The name 'y12' does not exist in the current context // Dummy(y12 is var x12) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(107, 20), // (109,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(109, 13), // (109,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(109, 17), // (122,22): error CS0103: The name 'b' does not exist in the current context // for (bool a, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(122, 22), // (124,29): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(124, 29)); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertNotContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); AssertNotContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); AssertNotContainedInDeclaratorArguments(x4Decl); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); AssertNotContainedInDeclaratorArguments(x6Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); AssertNotContainedInDeclaratorArguments(x7Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); AssertNotContainedInDeclaratorArguments(x8Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); AssertNotContainedInDeclaratorArguments(x9Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); AssertNotContainedInDeclaratorArguments(x14Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void Scope_DeclaratorArguments_09() { var source = @" public class X { public static void Main() { } bool Dummy(params object[] x) {return true;} void Test4() { for (bool d, x4( Dummy(true is var x4 && x4) );;) {} } void Test7() { for (bool x7 = true, b( Dummy(true is var x7 && x7) );;) {} } void Test8() { for (bool d,b1(Dummy(true is var x8 && x8)], b2(Dummy(true is var x8 && x8)); Dummy(true is var x8 && x8); Dummy(true is var x8 && x8)) {} } void Test9() { for (bool b = x9, b2(Dummy(true is var x9 && x9)); Dummy(true is var x9 && x9); Dummy(true is var x9 && x9)) {} } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = [ (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_CloseParenExpected, (int)ErrorCode.ERR_SemicolonExpected, (int)ErrorCode.ERR_InvalidExprTerm, ]; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (12,22): error CS0841: Cannot use local variable 'x4' before it is declared // for (bool d, x4( Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(12, 22), // (20,30): error CS0103: The name 'b' does not exist in the current context // for (bool x7 = true, b( Diagnostic(ErrorCode.ERR_NameNotInContext, "b").WithArguments("b").WithLocation(20, 30), // (21,32): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x7 && x7) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(21, 32), // (20,19): warning CS0219: The variable 'x7' is assigned but its value is never used // for (bool x7 = true, b( Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x7").WithArguments("x7").WithLocation(20, 19), // (28,21): error CS0103: The name 'b1' does not exist in the current context // for (bool d,b1(Dummy(true is var x8 && x8)], Diagnostic(ErrorCode.ERR_NameNotInContext, "b1").WithArguments("b1").WithLocation(28, 21), // (29,16): error CS0103: The name 'b2' does not exist in the current context // b2(Dummy(true is var x8 && x8)); Diagnostic(ErrorCode.ERR_NameNotInContext, "b2").WithArguments("b2").WithLocation(29, 16), // (29,37): error CS0136: A local or parameter named 'x8' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // b2(Dummy(true is var x8 && x8)); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x8").WithArguments("x8").WithLocation(29, 37), // (30,32): error CS0128: A local variable or function named 'x8' is already defined in this scope // Dummy(true is var x8 && x8); Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(30, 32), // (31,32): error CS0128: A local variable or function named 'x8' is already defined in this scope // Dummy(true is var x8 && x8)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x8").WithArguments("x8").WithLocation(31, 32), // (37,23): error CS0103: The name 'x9' does not exist in the current context // for (bool b = x9, Diagnostic(ErrorCode.ERR_NameNotInContext, "x9").WithArguments("x9").WithLocation(37, 23), // (38,16): error CS0103: The name 'b2' does not exist in the current context // b2(Dummy(true is var x9 && x9)); Diagnostic(ErrorCode.ERR_NameNotInContext, "b2").WithArguments("b2").WithLocation(38, 16), // (39,32): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // Dummy(true is var x9 && x9); Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(39, 32), // (40,32): error CS0128: A local variable or function named 'x9' is already defined in this scope // Dummy(true is var x9 && x9)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x9").WithArguments("x9").WithLocation(40, 32)); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); AssertNotContainedInDeclaratorArguments(x4Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").Single(); AssertNotContainedInDeclaratorArguments(x7Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x7Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x7Decl, x7Ref); var x8Decl = GetPatternDeclarations(tree, "x8").ToArray(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(4, x8Decl.Length); Assert.Equal(4, x8Ref.Length); AssertNotContainedInDeclaratorArguments(x8Decl[0]); AssertNotContainedInDeclaratorArguments(x8Decl[1]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl[0], x8Ref[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl[1], x8Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[2], isShadowed: true); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl[3], isShadowed: true); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(3, x9Decl.Length); Assert.Equal(4, x9Ref.Length); AssertNotContainedInDeclaratorArguments(x9Decl[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[1], x9Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl[2], isShadowed: true); } [Fact] public void Scope_DeclaratorArguments_10() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (var d,e(Dummy(true is var x1, x1))) { Dummy(x1); } } void Test2() { using (var d,e(Dummy(true is var x2, x2))) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); using (var d,e(Dummy(true is var x4, x4))) Dummy(x4); } void Test6() { using (var d,e(Dummy(x6 && true is var x6))) Dummy(x6); } void Test7() { using (var d,e(Dummy(true is var x7 && x7))) { var x7 = 12; Dummy(x7); } } void Test8() { using (var d,e(Dummy(true is var x8, x8))) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { using (var d,a(Dummy(true is var x9, x9))) { Dummy(x9); using (var e,b(Dummy(true is var x9, x9))) // 2 Dummy(x9); } } void Test10() { using (var d,e(Dummy(y10 is var x10, x10))) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // using (var d,e(Dummy(y11 is var x11, x11))) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { using (var d,e(Dummy(y12 is var x12, x12))) var y12 = 12; } //void Test13() //{ // using (var d,e(Dummy(y13 is var x13, x13))) // let y13 = 12; //} void Test14() { using (var d,e(Dummy(1 is var x14, 2 is var x14, x14))) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_ImplicitlyTypedVariableMultipleDeclarator, (int)ErrorCode.ERR_FixedMustInit, (int)ErrorCode.ERR_ImplicitlyTypedVariableWithNoInitializer, (int)ErrorCode.ERR_UseDefViolation }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,42): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (var d,e(Dummy(true is var x4, x4))) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 42), // (35,30): error CS0841: Cannot use local variable 'x6' before it is declared // using (var d,e(Dummy(x6 && true is var x6))) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 30), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,46): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // using (var e,b(Dummy(true is var x9, x9))) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 46), // (68,30): error CS0103: The name 'y10' does not exist in the current context // using (var d,e(Dummy(y10 is var x10, x10))) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 30), // (86,30): error CS0103: The name 'y12' does not exist in the current context // using (var d,e(Dummy(y12 is var x12, x12))) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 30), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,39): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 39) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); AssertContainedInDeclaratorArguments(x8Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); AssertContainedInDeclaratorArguments(x9Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[1], x9Ref[2], x9Ref[3]); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").Single(); AssertContainedInDeclaratorArguments(x10Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x10Decl, x10Ref); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); AssertContainedInDeclaratorArguments(x14Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void Scope_DeclaratorArguments_11() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (var d,x1(Dummy(true is var x1, x1))) { Dummy(x1); } } void Test2() { using (System.IDisposable d,x2(Dummy(true is var x2, x2))) { Dummy(x2); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_ImplicitlyTypedVariableMultipleDeclarator, (int)ErrorCode.ERR_FixedMustInit, (int)ErrorCode.ERR_ImplicitlyTypedVariableWithNoInitializer, (int)ErrorCode.ERR_UseDefViolation }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (12,43): error CS0128: A local variable or function named 'x1' is already defined in this scope // using (var d,x1(Dummy(true is var x1, x1))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(12, 43), // (20,58): error CS0128: A local variable or function named 'x2' is already defined in this scope // using (System.IDisposable d,x2(Dummy(true is var x2, x2))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(20, 58) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); AssertContainedInDeclaratorArguments(x2Decl); Assert.Equal(2, x2Ref.Length); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl); VerifyNotAPatternLocal(model, x2Ref[0]); VerifyNotAPatternLocal(model, x2Ref[1]); } [Fact] public void Scope_DeclaratorArguments_12() { var source = @" public class X { public static void Main() { } System.IDisposable Dummy(params object[] x) {return null;} void Test1() { using (System.IDisposable d,e(Dummy(true is var x1, x1)], x1 = Dummy(x1)) { Dummy(x1); } } void Test2() { using (System.IDisposable d1,e(Dummy(true is var x2, x2)], d2(Dummy(true is var x2, x2))) { Dummy(x2); } } void Test3() { using (System.IDisposable d1,e(Dummy(true is var x3, x3)], d2 = Dummy(x3)) { Dummy(x3); } } void Test4() { using (System.IDisposable d1 = Dummy(x4), d2(Dummy(true is var x4, x4))) { Dummy(x4); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_FixedMustInit, (int)ErrorCode.ERR_UseDefViolation, (int)ErrorCode.ERR_CloseParenExpected }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (13,35): error CS0128: A local variable or function named 'x1' is already defined in this scope // x1 = Dummy(x1)) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(13, 35), // (22,58): error CS0128: A local variable or function named 'x2' is already defined in this scope // d2(Dummy(true is var x2, x2))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(22, 58), // (39,46): error CS0841: Cannot use local variable 'x4' before it is declared // using (System.IDisposable d1 = Dummy(x4), Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(39, 46) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").ToArray(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Decl.Length); Assert.Equal(3, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl[0], x2Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x2Decl[1]); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(3, x3Ref.Length); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref); } [Fact] public void Scope_DeclaratorArguments_13() { var source = @" public unsafe class X { public static void Main() { } int[] Dummy(params object[] x) {return null;} void Test1() { fixed (int* p,e(Dummy(true is var x1 && x1))) { Dummy(x1); } } void Test2() { fixed (int* p,e(Dummy(true is var x2 && x2))) Dummy(x2); } void Test4() { var x4 = 11; Dummy(x4); fixed (int* p,e(Dummy(true is var x4 && x4))) Dummy(x4); } void Test6() { fixed (int* p,e(Dummy(x6 && true is var x6))) Dummy(x6); } void Test7() { fixed (int* p,e(Dummy(true is var x7 && x7))) { var x7 = 12; Dummy(x7); } } void Test8() { fixed (int* p,e(Dummy(true is var x8 && x8))) Dummy(x8); System.Console.WriteLine(x8); } void Test9() { fixed (int* p1,a(Dummy(true is var x9 && x9))) { Dummy(x9); fixed (int* p2,b(Dummy(true is var x9 && x9))) // 2 Dummy(x9); } } void Test10() { fixed (int* p,e(Dummy(y10 is var x10))) { var y10 = 12; Dummy(y10); } } //void Test11() //{ // fixed (int* p,e(Dummy(y11 is var x11))) // { // let y11 = 12; // Dummy(y11); // } //} void Test12() { fixed (int* p,e(Dummy(y12 is var x12))) var y12 = 12; } //void Test13() //{ // fixed (int* p,e(Dummy(y13 is var x13))) // let y13 = 12; //} void Test14() { fixed (int* p,e(Dummy(1 is var x14, 2 is var x14, x14))) { Dummy(x14); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true), parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_FixedMustInit, (int)ErrorCode.ERR_UseDefViolation }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (87,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // var y12 = 12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "var y12 = 12;").WithLocation(87, 13), // (29,43): error CS0136: A local or parameter named 'x4' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // fixed (int* p,e(Dummy(true is var x4 && x4))) Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x4").WithArguments("x4").WithLocation(29, 43), // (35,31): error CS0841: Cannot use local variable 'x6' before it is declared // fixed (int* p,e(Dummy(x6 && true is var x6))) Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x6").WithArguments("x6").WithLocation(35, 31), // (43,17): error CS0136: A local or parameter named 'x7' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // var x7 = 12; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x7").WithArguments("x7").WithLocation(43, 17), // (53,34): error CS0103: The name 'x8' does not exist in the current context // System.Console.WriteLine(x8); Diagnostic(ErrorCode.ERR_NameNotInContext, "x8").WithArguments("x8").WithLocation(53, 34), // (61,48): error CS0136: A local or parameter named 'x9' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // fixed (int* p2,b(Dummy(true is var x9 && x9))) // 2 Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x9").WithArguments("x9").WithLocation(61, 48), // (68,31): error CS0103: The name 'y10' does not exist in the current context // fixed (int* p,e(Dummy(y10 is var x10))) Diagnostic(ErrorCode.ERR_NameNotInContext, "y10").WithArguments("y10").WithLocation(68, 31), // (86,31): error CS0103: The name 'y12' does not exist in the current context // fixed (int* p,e(Dummy(y12 is var x12))) Diagnostic(ErrorCode.ERR_NameNotInContext, "y12").WithArguments("y12").WithLocation(86, 31), // (87,17): warning CS0219: The variable 'y12' is assigned but its value is never used // var y12 = 12; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "y12").WithArguments("y12").WithLocation(87, 17), // (99,40): error CS0128: A local variable or function named 'x14' is already defined in this scope // 2 is var x14, Diagnostic(ErrorCode.ERR_LocalDuplicate, "x14").WithArguments("x14").WithLocation(99, 40) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x1Decl, x1Ref); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl, x2Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(3, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl, x4Ref[1], x4Ref[2]); var x6Decl = GetPatternDeclarations(tree, "x6").Single(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x6Decl, x6Ref); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(2, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x7Decl, x7Ref[0]); VerifyNotAPatternLocal(model, x7Ref[1]); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").ToArray(); Assert.Equal(3, x8Ref.Length); AssertContainedInDeclaratorArguments(x8Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x8Decl, x8Ref[0], x8Ref[1]); VerifyNotInScope(model, x8Ref[2]); var x9Decl = GetPatternDeclarations(tree, "x9").ToArray(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Decl.Length); Assert.Equal(4, x9Ref.Length); AssertContainedInDeclaratorArguments(x9Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[0], x9Ref[0], x9Ref[1]); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x9Decl[1], x9Ref[2], x9Ref[3]); var y10Ref = GetReferences(tree, "y10").ToArray(); Assert.Equal(2, y10Ref.Length); VerifyNotInScope(model, y10Ref[0]); VerifyNotAPatternLocal(model, y10Ref[1]); var y12Ref = GetReferences(tree, "y12").Single(); VerifyNotInScope(model, y12Ref); var x14Decl = GetPatternDeclarations(tree, "x14").ToArray(); var x14Ref = GetReferences(tree, "x14").ToArray(); Assert.Equal(2, x14Decl.Length); Assert.Equal(2, x14Ref.Length); AssertContainedInDeclaratorArguments(x14Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x14Decl[0], x14Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x14Decl[1]); } [Fact] public void Scope_DeclaratorArguments_14() { var source = @" public unsafe class X { public static void Main() { } int[] Dummy(params object[] x) {return null;} int[] Dummy(int* x) {return null;} void Test1() { fixed (int* d,x1( Dummy(true is var x1 && x1))) { Dummy(x1); } } void Test2() { fixed (int* d,p(Dummy(true is var x2 && x2)], x2 = Dummy()) { Dummy(x2); } } void Test3() { fixed (int* x3 = Dummy(), p(Dummy(true is var x3 && x3))) { Dummy(x3); } } void Test4() { fixed (int* d,p1(Dummy(true is var x4 && x4)], p2(Dummy(true is var x4 && x4))) { Dummy(x4); } } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true), parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, (int)ErrorCode.ERR_SyntaxError, (int)ErrorCode.ERR_UnexpectedToken, (int)ErrorCode.WRN_UnreferencedVar, (int)ErrorCode.ERR_FixedMustInit, (int)ErrorCode.ERR_UseDefViolation, (int)ErrorCode.ERR_CloseParenExpected }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (14,44): error CS0128: A local variable or function named 'x1' is already defined in this scope // Dummy(true is var x1 && x1))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(14, 44), // (23,21): error CS0128: A local variable or function named 'x2' is already defined in this scope // x2 = Dummy()) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x2").WithArguments("x2").WithLocation(23, 21), // (32,43): error CS0128: A local variable or function named 'x3' is already defined in this scope // p(Dummy(true is var x3 && x3))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x3").WithArguments("x3").WithLocation(32, 43), // (41,44): error CS0128: A local variable or function named 'x4' is already defined in this scope // p2(Dummy(true is var x4 && x4))) Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(41, 44) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").Single(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(2, x1Ref.Length); AssertContainedInDeclaratorArguments(x1Decl); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl); VerifyNotAPatternLocal(model, x1Ref[0]); VerifyNotAPatternLocal(model, x1Ref[1]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").ToArray(); Assert.Equal(2, x2Ref.Length); AssertContainedInDeclaratorArguments(x2Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").ToArray(); Assert.Equal(2, x3Ref.Length); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x3Decl); VerifyNotAPatternLocal(model, x3Ref[0]); VerifyNotAPatternLocal(model, x3Ref[1]); var x4Decl = GetPatternDeclarations(tree, "x4").ToArray(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Decl.Length); Assert.Equal(3, x4Ref.Length); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelForDeclarationOrVarSimplePatternWithoutDataFlow(model, x4Decl[0], x4Ref); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl[1]); } [Fact] public void Scope_DeclaratorArguments_15() { var source = @" public class X { public static void Main() { } bool Test3 [3 is var x3 && x3 > 0]; bool Test4 [x4 && 4 is var x4]; bool Test5 [51 is var x5 && 52 is var x5 && x5 > 0]; bool Test61 [6 is var x6 && x6 > 0], Test62 [6 is var x6 && x6 > 0]; bool Test71 [7 is var x7 && x7 > 0]; bool Test72 [Dummy(x7, 2)]; void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_CStyleArray, (int)ErrorCode.ERR_ArraySizeInDeclaration, (int)ErrorCode.WRN_UnreferencedField }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (20,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(20, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelNotSupported(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); AssertContainedInDeclaratorArguments(x5Decl); VerifyModelNotSupported(model, x5Decl[0], x5Ref); VerifyModelNotSupported(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelNotSupported(model, x6Decl[0], x6Ref[0]); VerifyModelNotSupported(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelNotSupported(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void Scope_DeclaratorArguments_16() { var source = @" public unsafe struct X { public static void Main() { } fixed bool Test3 [3 is var x3 && x3 > 0]; fixed bool Test4 [x4 && 4 is var x4]; fixed bool Test5 [51 is var x5 && 52 is var x5 && x5 > 0]; fixed bool Test61 [6 is var x6 && x6 > 0], Test62 [6 is var x6 && x6 > 0]; fixed bool Test71 [7 is var x7 && x7 > 0]; fixed bool Test72 [Dummy(x7, 2)]; void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true), parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_CStyleArray, (int)ErrorCode.ERR_ArraySizeInDeclaration, (int)ErrorCode.WRN_UnreferencedField, (int)ErrorCode.ERR_NoImplicitConv }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (10,18): error CS0841: Cannot use local variable 'x4' before it is declared // bool Test4 [x4 && 4 is var x4]; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x4").WithArguments("x4").WithLocation(10, 18), // (13,28): error CS0128: A local variable or function named 'x5' is already defined in this scope // 52 is var x5 && Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(13, 28), // (20,25): error CS0103: The name 'x7' does not exist in the current context // bool Test72 [Dummy(x7, 2)]; Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(20, 25), // (21,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(21, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelNotSupported(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); AssertContainedInDeclaratorArguments(x5Decl); VerifyModelNotSupported(model, x5Decl[0], x5Ref); VerifyModelNotSupported(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelNotSupported(model, x6Decl[0], x6Ref[0]); VerifyModelNotSupported(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelNotSupported(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void Scope_DeclaratorArguments_17() { var source = @" public class X { public static void Main() { } const bool Test3 [3 is var x3 && x3 > 0]; const bool Test4 [x4 && 4 is var x4]; const bool Test5 [51 is var x5 && 52 is var x5 && x5 > 0]; const bool Test61 [6 is var x6 && x6 > 0], Test62 [6 is var x6 && x6 > 0]; const bool Test71 [7 is var x7 && x7 > 0]; const bool Test72 [Dummy(x7, 2)]; void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_CStyleArray, (int)ErrorCode.ERR_ArraySizeInDeclaration }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (21,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(21, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelNotSupported(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); AssertContainedInDeclaratorArguments(x5Decl); VerifyModelNotSupported(model, x5Decl[0], x5Ref); VerifyModelNotSupported(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelNotSupported(model, x6Decl[0], x6Ref[0]); VerifyModelNotSupported(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelNotSupported(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void Scope_DeclaratorArguments_18() { var source = @" public class X { public static void Main() { } event bool Test3 [3 is var x3 && x3 > 0]; event bool Test4 [x4 && 4 is var x4]; event bool Test5 [51 is var x5 && 52 is var x5 && x5 > 0]; event bool Test61 [6 is var x6 && x6 > 0], Test62 [6 is var x6 && x6 > 0]; event bool Test71 [7 is var x7 && x7 > 0]; event bool Test72 [Dummy(x7, 2)]; void Test73() { Dummy(x7, 3); } bool Dummy(params object[] x) {return true;} } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe, parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_CStyleArray, (int)ErrorCode.ERR_ArraySizeInDeclaration, (int)ErrorCode.ERR_EventNotDelegate, (int)ErrorCode.WRN_UnreferencedEvent }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (21,27): error CS0103: The name 'x7' does not exist in the current context // void Test73() { Dummy(x7, 3); } Diagnostic(ErrorCode.ERR_NameNotInContext, "x7").WithArguments("x7").WithLocation(21, 27) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").Single(); AssertContainedInDeclaratorArguments(x4Decl); VerifyModelNotSupported(model, x4Decl, x4Ref); var x5Decl = GetPatternDeclarations(tree, "x5").ToArray(); var x5Ref = GetReferences(tree, "x5").Single(); Assert.Equal(2, x5Decl.Length); AssertContainedInDeclaratorArguments(x5Decl); VerifyModelNotSupported(model, x5Decl[0], x5Ref); VerifyModelNotSupported(model, x5Decl[1]); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); AssertContainedInDeclaratorArguments(x6Decl); VerifyModelNotSupported(model, x6Decl[0], x6Ref[0]); VerifyModelNotSupported(model, x6Decl[1], x6Ref[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").ToArray(); Assert.Equal(3, x7Ref.Length); AssertContainedInDeclaratorArguments(x7Decl); VerifyModelNotSupported(model, x7Decl, x7Ref[0]); VerifyNotInScope(model, x7Ref[1]); VerifyNotInScope(model, x7Ref[2]); } [Fact] public void Scope_DeclaratorArguments_19() { var source = @" public unsafe struct X { public static void Main() { } fixed bool d[2], Test3 (string.Empty is var x3); } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true), parseOptions: TestOptions.Regular); int[] exclude = new int[] { (int)ErrorCode.ERR_BadVarDecl, }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (8,28): error CS1003: Syntax error, '[' expected // fixed bool d[2], Test3 (string.Empty is var x3); Diagnostic(ErrorCode.ERR_SyntaxError, "(").WithArguments("[").WithLocation(8, 28), // (8,51): error CS1003: Syntax error, ']' expected // fixed bool d[2], Test3 (string.Empty is var x3); Diagnostic(ErrorCode.ERR_SyntaxError, ")").WithArguments("]").WithLocation(8, 51), // (8,29): error CS0029: Cannot implicitly convert type 'bool' to 'int' // fixed bool d[2], Test3 (string.Empty is var x3); Diagnostic(ErrorCode.ERR_NoImplicitConv, "string.Empty is var x3").WithArguments("bool", "int").WithLocation(8, 29) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl); } [Fact] public void Scope_DeclaratorArguments_20() { var source = @" public unsafe struct X { public static void Main() { } fixed bool Test3[string.Empty is var x3]; } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe.WithAllowUnsafe(true), parseOptions: TestOptions.Regular); compilation.VerifyDiagnostics( // (8,22): error CS0029: Cannot implicitly convert type 'bool' to 'int' // fixed bool Test3[string.Empty is var x3]; Diagnostic(ErrorCode.ERR_NoImplicitConv, "string.Empty is var x3").WithArguments("bool", "int").WithLocation(8, 22) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); AssertContainedInDeclaratorArguments(x3Decl); VerifyModelNotSupported(model, x3Decl); } [Fact] public void DeclarationInsideNameof() { string source = @" class Program { static void Main(int i) { string s = nameof(M(i is var x1, x1)).ToString(); string s1 = x1; } static void M(bool b, int i) {} } "; var comp = CreateCompilation(source); comp.VerifyDiagnostics( // (6,27): error CS8081: Expression does not have a name. // string s = nameof(M(i is var x1, x1)).ToString(); Diagnostic(ErrorCode.ERR_ExpressionHasNoName, "M(i is var x1, x1)").WithLocation(6, 27), // (7,21): error CS0029: Cannot implicitly convert type 'int' to 'string' // string s1 = x1; Diagnostic(ErrorCode.ERR_NoImplicitConv, "x1").WithArguments("int", "string").WithLocation(7, 21), // (7,21): error CS0165: Use of unassigned local variable 'x1' // string s1 = x1; Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(7, 21) ); var tree = comp.SyntaxTrees.First(); var model = comp.GetSemanticModel(tree); var designation = GetPatternDeclarations(tree).Single(); var refs = GetReferences(tree, "x1").ToArray(); VerifyModelForDeclarationOrVarSimplePattern(model, designation, refs); var x1 = (ILocalSymbol)model.GetDeclaredSymbol(designation); Assert.Equal("System.Int32", x1.Type.ToTestDisplayString()); } [Fact] public void ScopeOfPatternVariables_ArrayDeclarationInvalidDimensions() { var source = @" public class X { public static void Main() { } void Test1() { int[true is var x1, x1] _1; { int[true is var x1, x1] _2; } int[true is var x1, x1] _3; } void Test2() { int[x2, true is var x2] _4; } void Test3(int x3) { int[true is var x3, x3] _5; } void Test4() { var x4 = 11; int[x4] _6; int[true is var x4, x4] _7; } void Test5() { int[true is var x5, x5] _8; var x5 = 11; int[x5] _9; } void Test6() { int[true is var x6, x6, false is var x6, x6] _10; } void Test7(bool y7) { if (y7) int[true is var x7, x7] _11; } System.Action Test8(bool y8) { return () => { if (y8) int[true is var x8, x8] _12; }; } void Test9() { int[x9] _13; int[true is var x9, x9] _13; } void Test10() { int[true is var x10, x10] _14; int[x10] _15; } void Test11() { int[true is var x11, x11] x11; int[x11] _16; } } "; var compilation = CreateCompilation(source, options: TestOptions.DebugExe); int[] exclude = new int[] { (int)ErrorCode.ERR_NoImplicitConv, (int)ErrorCode.WRN_UnreferencedVar }; compilation.GetDiagnostics().Where(d => !exclude.Contains(d.Code)).Verify( // (10,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x1, x1] _1; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x1, x1]").WithLocation(10, 12), // (12,16): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x1, x1] _2; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x1, x1]").WithLocation(12, 16), // (12,29): error CS0136: A local or parameter named 'x1' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // int[true is var x1, x1] _2; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x1").WithArguments("x1").WithLocation(12, 29), // (14,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x1, x1] _3; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x1, x1]").WithLocation(14, 12), // (14,25): error CS0128: A local variable or function named 'x1' is already defined in this scope // int[true is var x1, x1] _3; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x1").WithArguments("x1").WithLocation(14, 25), // (19,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x2, true is var x2] _4; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x2, true is var x2]").WithLocation(19, 12), // (19,13): error CS0841: Cannot use local variable 'x2' before it is declared // int[x2, true is var x2] _4; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x2").WithArguments("x2").WithLocation(19, 13), // (24,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x3, x3] _5; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x3, x3]").WithLocation(24, 12), // (24,25): error CS0136: A local or parameter named 'x3' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter // int[true is var x3, x3] _5; Diagnostic(ErrorCode.ERR_LocalIllegallyOverrides, "x3").WithArguments("x3").WithLocation(24, 25), // (29,13): warning CS0219: The variable 'x4' is assigned but its value is never used // var x4 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x4").WithArguments("x4").WithLocation(29, 13), // (30,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x4] _6; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x4]").WithLocation(30, 12), // (31,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x4, x4] _7; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x4, x4]").WithLocation(31, 12), // (31,25): error CS0128: A local variable or function named 'x4' is already defined in this scope // int[true is var x4, x4] _7; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x4").WithArguments("x4").WithLocation(31, 25), // (36,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x5, x5] _8; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x5, x5]").WithLocation(36, 12), // (37,13): error CS0128: A local variable or function named 'x5' is already defined in this scope // var x5 = 11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x5").WithArguments("x5").WithLocation(37, 13), // (37,13): warning CS0219: The variable 'x5' is assigned but its value is never used // var x5 = 11; Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "x5").WithArguments("x5").WithLocation(37, 13), // (38,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x5] _9; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x5]").WithLocation(38, 12), // (43,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x6, x6, false is var x6, x6] _10; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x6, x6, false is var x6, x6]").WithLocation(43, 12), // (43,46): error CS0128: A local variable or function named 'x6' is already defined in this scope // int[true is var x6, x6, false is var x6, x6] _10; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x6").WithArguments("x6").WithLocation(43, 46), // (49,13): error CS1023: Embedded statement cannot be a declaration or labeled statement // int[true is var x7, x7] _11; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "int[true is var x7, x7] _11;").WithLocation(49, 13), // (49,16): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x7, x7] _11; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x7, x7]").WithLocation(49, 16), // (57,25): error CS1023: Embedded statement cannot be a declaration or labeled statement // int[true is var x8, x8] _12; Diagnostic(ErrorCode.ERR_BadEmbeddedStmt, "int[true is var x8, x8] _12;").WithLocation(57, 25), // (57,28): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x8, x8] _12; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x8, x8]").WithLocation(57, 28), // (63,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x9] _13; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x9]").WithLocation(63, 12), // (63,13): error CS0841: Cannot use local variable 'x9' before it is declared // int[x9] _13; Diagnostic(ErrorCode.ERR_VariableUsedBeforeDeclaration, "x9").WithArguments("x9").WithLocation(63, 13), // (64,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x9, x9] _13; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x9, x9]").WithLocation(64, 12), // (64,33): error CS0128: A local variable or function named '_13' is already defined in this scope // int[true is var x9, x9] _13; Diagnostic(ErrorCode.ERR_LocalDuplicate, "_13").WithArguments("_13").WithLocation(64, 33), // (69,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x10, x10] _14; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x10, x10]").WithLocation(69, 12), // (70,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x10] _15; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x10]").WithLocation(70, 12), // (75,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[true is var x11, x11] x11; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[true is var x11, x11]").WithLocation(75, 12), // (75,35): error CS0128: A local variable or function named 'x11' is already defined in this scope // int[true is var x11, x11] x11; Diagnostic(ErrorCode.ERR_LocalDuplicate, "x11").WithArguments("x11").WithLocation(75, 35), // (76,12): error CS0270: Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) // int[x11] _16; Diagnostic(ErrorCode.ERR_ArraySizeInDeclaration, "[x11]").WithLocation(76, 12) ); var tree = compilation.SyntaxTrees.Single(); var model = compilation.GetSemanticModel(tree); var x1Decl = GetPatternDeclarations(tree, "x1").ToArray(); var x1Ref = GetReferences(tree, "x1").ToArray(); Assert.Equal(3, x1Decl.Length); Assert.Equal(3, x1Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[0], x1Ref[0], x1Ref[2]); VerifyModelForDeclarationOrVarSimplePattern(model, x1Decl[1], x1Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x1Decl[2]); var x2Decl = GetPatternDeclarations(tree, "x2").Single(); var x2Ref = GetReferences(tree, "x2").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x2Decl, x2Ref); var x3Decl = GetPatternDeclarations(tree, "x3").Single(); var x3Ref = GetReferences(tree, "x3").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x3Decl, x3Ref); var x4Decl = GetPatternDeclarations(tree, "x4").Single(); var x4Ref = GetReferences(tree, "x4").ToArray(); Assert.Equal(2, x4Ref.Length); VerifyNotAPatternLocal(model, x4Ref[0]); VerifyNotAPatternLocal(model, x4Ref[1]); VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x4Decl); var x5Decl = GetPatternDeclarations(tree, "x5").Single(); var x5Ref = GetReferences(tree, "x5").ToArray(); Assert.Equal(2, x5Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x5Decl, x5Ref); var x6Decl = GetPatternDeclarations(tree, "x6").ToArray(); var x6Ref = GetReferences(tree, "x6").ToArray(); Assert.Equal(2, x6Decl.Length); Assert.Equal(2, x6Ref.Length); for (int i = 0; i < x6Decl.Length; i++) { VerifyModelForDeclarationOrVarSimplePattern(model, x6Decl[0], x6Ref[i]); } VerifyModelForDeclarationOrVarPatternDuplicateInSameScope(model, x6Decl[1]); var x7Decl = GetPatternDeclarations(tree, "x7").Single(); var x7Ref = GetReferences(tree, "x7").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x7Decl, x7Ref); var x8Decl = GetPatternDeclarations(tree, "x8").Single(); var x8Ref = GetReferences(tree, "x8").Single(); VerifyModelForDeclarationOrVarSimplePattern(model, x8Decl, x8Ref); var x9Decl = GetPatternDeclarations(tree, "x9").Single(); var x9Ref = GetReferences(tree, "x9").ToArray(); Assert.Equal(2, x9Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x9Decl, x9Ref); var x10Decl = GetPatternDeclarations(tree, "x10").Single(); var x10Ref = GetReferences(tree, "x10").ToArray(); Assert.Equal(2, x10Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x10Decl, x10Ref); var x11Decl = GetPatternDeclarations(tree, "x11").Single(); var x11Ref = GetReferences(tree, "x11").ToArray(); var x11Decl2 = GetVariableDeclarations(tree, "x11").Single(); Assert.Equal(2, x11Ref.Length); VerifyModelForDeclarationOrVarSimplePattern(model, x11Decl, x11Ref[0], x11Ref[1]); VerifyModelForDuplicateVariableDeclarationInSameScope(model, x11Decl2); } } }