|
// 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.Collections.Immutable;
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
{
// NOTE: Skipped some expression tests.
public class FlowTests : CSharpTestBase
{
private const string prefix = @"
using System;
// Need a base class with indexers.
public class DATestBase {
public int this[int a] { get { return 0; } }
public int this[int a, int b] { get { return 0; } }
}
// Need a struct with a couple fields.
public struct A {
public int x;
public int y;
}
// Need a struct with non-lifted short-circuiting operators.
public struct NLS
{
public static NLS operator&(NLS a, NLS b) { return new NLS { value = a.value & b.value }; }
public static NLS operator|(NLS a, NLS b) { return new NLS { value = a.value | b.value }; }
public static bool operator true(NLS a) { return a.value; }
public static bool operator false(NLS a) { return !a.value; }
public bool value;
}
// Need a struct with lifted short-circuiting operators.
public struct LS
{
public static LS operator&(LS a, LS b) { return new LS { value = a.value & b.value }; }
public static LS operator|(LS a, LS b) { return new LS { value = a.value | b.value }; }
public static bool operator true(LS? a) { return a.HasValue && a.Value.value; }
public static bool operator false(LS? a) { return a.HasValue && !a.Value.value; }
public bool value;
}
public delegate void D(); public delegate int DI();
public delegate void DefP(int a, ref int b, out int c);
public class DATest : DATestBase {
public static volatile bool f;
public static volatile int val;
public static volatile byte b;
public const bool fTrue = true;
public const bool fFalse = false;
public static int[] arr = { 1, 2, 3 };
public static bool No() { return f; } // No-op
public static bool F(int x) { return f; }
public static bool G(out int x) { x = 0; return f; }
public static bool Q(bool x) { return f; }
public static bool S(A x) { return f; }
public static int NNo() { return val; } // No-op
public static int NF(int x) { return val; }
public static int NG(out int x) { x = 0; return val; }
public static int[] AF(int x) { return arr; }
public static int[] AG(out int x) { x = 0; return arr; }
public static int FA(int[] x) { return val; }
public static int GA(out int[] x) { x = arr; return val; }
public static IDisposable Res(bool x) { return null; }
public static bool FP(params int[] x) { return f; }
public static bool GP(out int x, params int[] y) { x = 0; return f; }
public static NLS GetNLS() { return new NLS { value = f }; }
public static NLS GetNLS(out int x) { x = 0; return new NLS { value = f }; }
public static LS GetLS() { return new LS { value = f }; }
public static LS? GetLS(out int x) { x = 0; return new LS { value = f }; }
public class C {
public C(params int[] x) { }
public C(out int x, params int[] y) { x = 0; }
}
";
private const string suffix = @"
}";
[Fact]
[WorkItem(35011, "https://github.com/dotnet/roslyn/issues/35011")]
public void SwitchConstantUnreachable()
{
var src = @"
class C
{
const string S = ""abc"";
public static string M1()
{
switch (S)
{
case ""abc"":
return S;
}
}
public static string M2()
{
const string S2 = S + """";
switch (S)
{
case S2:
return S;
}
}
public static string M3()
{
const int I = 11;
switch (I)
{
case 11:
return S;
}
}
public static string M4()
{
switch (S)
{
case ""def"":
return S; // 1
default:
return S;
}
}
public static string M5()
{
switch (S)
{
case ""def"":
return S; // 2
}
// error
}
}";
var comp = CreateCompilation(src);
comp.VerifyDiagnostics(
// (40,17): warning CS0162: Unreachable code detected
// return S; // 1
Diagnostic(ErrorCode.WRN_UnreachableCode, "return").WithLocation(40, 17),
// (46,26): error CS0161: 'C.M5()': not all code paths return a value
// public static string M5()
Diagnostic(ErrorCode.ERR_ReturnExpected, "M5").WithArguments("C.M5()").WithLocation(46, 26),
// (51,17): warning CS0162: Unreachable code detected
// return S; // 2
Diagnostic(ErrorCode.WRN_UnreachableCode, "return").WithLocation(51, 17));
comp = CreateCompilation(src, parseOptions: TestOptions.Regular7_3);
comp.VerifyDiagnostics(
// (40,17): warning CS0162: Unreachable code detected
// return S; // 1
Diagnostic(ErrorCode.WRN_UnreachableCode, "return").WithLocation(40, 17),
// (46,26): error CS0161: 'C.M5()': not all code paths return a value
// public static string M5()
Diagnostic(ErrorCode.ERR_ReturnExpected, "M5").WithArguments("C.M5()").WithLocation(46, 26),
// (51,17): warning CS0162: Unreachable code detected
// return S; // 2
Diagnostic(ErrorCode.WRN_UnreachableCode, "return").WithLocation(51, 17));
}
[Fact]
public void General()
{
var source = prefix + @"
// Value params and ref params are definitely assigned. Out params are not.
public void T000(int a) { F(a); }
public void T001(ref int a) { F(a); }
public void T002(out int a) { F(a); G(out a); } // Error
// Out params must be definitely assigned before leaving.
public void T010(out int a) { } // Error
public void T011(out int a) { G(out a); }
public void T012(out int a) { if (f) G(out a); } // Error
public void T013(out int a) { if (fTrue) G(out a); }
public void T014(out int a) { if (f) G(out a); else throw new Exception(); }
// General.
public void T020() {
{ int a; F(a); } // Error
{ int a; if (fTrue) F(a); } // Error
{ int a; if (fFalse) F(a); } // Unreachable
{ int a; if (fFalse) F(a); else F(a); } // Error + Unreachable
{ int a; if (fFalse) F(a); else G(out a); F(a); } // Unreachable
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (52,37): error CS0269: Use of unassigned out parameter 'a'
// public void T002(out int a) { F(a); G(out a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolationOut, "a").WithArguments("a"),
// (55,17): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// public void T010(out int a) { } // Error
Diagnostic(ErrorCode.ERR_ParamUnassigned, "T010").WithArguments("a"),
// (57,17): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// public void T012(out int a) { if (f) G(out a); } // Error
Diagnostic(ErrorCode.ERR_ParamUnassigned, "T012").WithArguments("a"),
// (65,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (66,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) F(a); else F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (67,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) F(a); else G(out a); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (63,20): error CS0165: Use of unassigned local variable 'a'
// { int a; F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (64,31): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (66,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse) F(a); else F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[Fact]
public void IfStatement()
{
var source = prefix + @"
// If statement.
public void T100() {
{ int a; if (F(a)) No(); } // Error
{ int a; if (F(a)) No(); else No(); } // Error
{ int a; if (f) F(a); } // Error
{ int a; if (f) F(a); else No(); } // Error
{ int a; if (f) No(); else F(a); } // Error
{ int a; if (fFalse) F(a); } // Unreachable
{ int a; if (fFalse) F(a); else No(); } // Unreachable
{ int a; if (fFalse) No(); else F(a); } // Error + Unreachable
{ int a; if (fTrue) F(a); } // Error
{ int a; if (fTrue) F(a); else No(); } // Error + Unreachable
{ int a; if (fTrue) No(); else F(a); } // Unreachable
{ int a; if (G(out a)) F(a); }
{ int a; if (G(out a)) F(a); else No(); }
{ int a; if (G(out a)) No(); else F(a); }
{ int a; if (G(out a)) No(); F(a); }
{ int a; if (G(out a)) No(); else No(); F(a); }
// Assigned after true.
{ int a; if (f && G(out a)) F(a); }
{ int a; if (f && G(out a)) F(a); else No(); }
{ int a; if (f && G(out a)) No(); else F(a); } // Error
{ int a; if (f && G(out a)) No(); F(a); } // Error
{ int a; if (f && G(out a)) No(); else No(); F(a); } // Error
{ int a; if (f && G(out a)) No(); else G(out a); F(a); }
// Unassigned due to user-defined operators.
{ int a; if (GetNLS() && GetNLS(out a)) F(a); } // error
{ int a; if (GetLS() && GetLS(out a)) F(a); } // error
{ int a; if (f && G(out a)) F(a); else No(); } // error
{ int a; if (f && G(out a)) F(a); else No(); } // error
{ int a; if (GetNLS() && GetNLS(out a)) No(); else F(a); } // Error
{ int a; if (GetLS() && GetLS(out a)) No(); else F(a); } // Error
{ int a; if (GetNLS() && GetNLS(out a)) No(); F(a); } // Error
{ int a; if (GetLS() && GetLS(out a)) No(); F(a); } // Error
{ int a; if (GetNLS() && GetNLS(out a)) No(); else No(); F(a); } // Error
{ int a; if (GetLS() && GetLS(out a)) No(); else No(); F(a); } // Error
{ int a; if (GetNLS() && GetNLS(out a)) No(); else G(out a); F(a); } // Error
{ int a; if (GetLS() && GetLS(out a)) No(); else G(out a); F(a); } // Error
// Assigned.
{ int a; if (fTrue && G(out a)) F(a); }
{ int a; if (fTrue && G(out a)) F(a); else No(); }
{ int a; if (fTrue && G(out a)) No(); else F(a); }
{ int a; if (fTrue && G(out a)) No(); F(a); }
{ int a; if (fTrue && G(out a)) No(); else No(); F(a); }
// Unassigned, consequence and alternative are reachable
{ int a; if (fFalse && G(out a)) F(a); } // Error
{ int a; if (fFalse && G(out a)) F(a); else No(); } // Error
{ int a; if (fFalse && G(out a)) No(); else F(a); } // Error
{ int a; if (fFalse && G(out a)) No(); F(a); } // Error
{ int a; if (fFalse && G(out a)) No(); else No(); F(a); } // Error
// Unassigned. Unreachable expr considered assigned.
{ int a; if (fFalse && F(a)) F(a); } // Error
{ int a; if (fFalse && F(a)) F(a); else No(); } // Error
{ int a; if (fFalse && F(a)) No(); else F(a); } // Error
{ int a; if (fFalse && F(a)) No(); F(a); } // Error
{ int a; if (fFalse && F(a)) No(); else No(); F(a); } // Error
// Assigned after false.
{ int a; if (f || G(out a)) F(a); } // Error
{ int a; if (f || G(out a)) F(a); else No(); } // Error
{ int a; if (f || G(out a)) No(); else F(a); }
{ int a; if (f || G(out a)) No(); F(a); } // Error
{ int a; if (f || G(out a)) No(); else No(); F(a); } // Error
{ int a; if (f || G(out a)) G(out a); else No(); F(a); }
// Unassigned due to user-defined operators.
{ int a; if (GetNLS() || GetNLS(out a)) F(a); } // Error
{ int a; if (GetLS() || GetLS(out a)) F(a); } // Error
{ int a; if (GetNLS() || GetNLS(out a)) F(a); else No(); } // Error
{ int a; if (GetLS() || GetLS(out a)) F(a); else No(); } // Error
{ int a; if (GetNLS() || GetNLS(out a)) No(); else F(a); } // Error
{ int a; if (GetLS() || GetLS(out a)) No(); else F(a); } // Error
{ int a; if (GetNLS() || GetNLS(out a)) No(); F(a); } // Error
{ int a; if (GetLS() || GetLS(out a)) No(); F(a); } // Error
{ int a; if (GetNLS() || GetNLS(out a)) No(); else No(); F(a); } // Error
{ int a; if (GetLS() || GetLS(out a)) No(); else No(); F(a); } // Error
{ int a; if (GetNLS() || GetNLS(out a)) G(out a); else No(); F(a); } // Error
{ int a; if (GetLS() || GetLS(out a)) G(out a); else No(); F(a); } // Error
// Unassigned. G(out a) is unreachable expr.
{ int a; if (fTrue || G(out a)) F(a); } // Error
{ int a; if (fTrue || G(out a)) F(a); else No(); } // Error
{ int a; if (fTrue || G(out a)) No(); else F(a); } // Error
{ int a; if (fTrue || G(out a)) No(); F(a); } // Error
{ int a; if (fTrue || G(out a)) No(); else No(); F(a); } // Error
{ int a; if (fTrue || G(out a)) G(out a); else No(); F(a); } // Error
// Assigned.
{ int a; if (fFalse || G(out a)) F(a); }
{ int a; if (fFalse || G(out a)) F(a); else No(); }
{ int a; if (fFalse || G(out a)) No(); else F(a); }
{ int a; if (fFalse || G(out a)) No(); F(a); }
{ int a; if (fFalse || G(out a)) No(); else No(); F(a); }
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (83,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (84,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) F(a); else No(); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (85,30): warning CS0162: Unreachable code detected
// { int a; if (fFalse) No(); else F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "No"),
// (88,40): warning CS0162: Unreachable code detected
// { int a; if (fTrue) F(a); else No(); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "No"),
// (89,40): warning CS0162: Unreachable code detected
// { int a; if (fTrue) No(); else F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (76,24): error CS0165: Use of unassigned local variable 'a'
// { int a; if (F(a)) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (77,24): error CS0165: Use of unassigned local variable 'a'
// { int a; if (F(a)) No(); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (79,27): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (80,27): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f) F(a); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (81,38): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (85,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse) No(); else F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (87,31): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (88,31): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue) F(a); else No(); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (100,50): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && G(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (101,45): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (102,56): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && G(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (106,51): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() && GetNLS(out a)) F(a); } // error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(106, 51),
// (107,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() && GetLS(out a)) F(a); } // error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(107, 49),
// (110,62): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() && GetNLS(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(110, 62),
// (111,60): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() && GetLS(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(111, 60),
// (112,57): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() && GetNLS(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(112, 57),
// (113,55): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() && GetLS(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(113, 55),
// (114,68): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() && GetNLS(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(114, 68),
// (115,66): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() && GetLS(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(115, 66),
// (116,72): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() && GetNLS(out a)) No(); else G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(116, 72),
// (117,70): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() && GetLS(out a)) No(); else G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(117, 70),
// Note: Dev10 spuriously reports (127,46,127,47): error CS0165: Use of unassigned local variable 'a'
// Note: Dev10 spuriously reports (128,46,128,47): error CS0165: Use of unassigned local variable 'a'
// (129,55): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && G(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(129, 55),
// (130,50): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(130, 50),
// (131,61): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && G(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(131, 61),
// Note: Dev10 spuriously reports (134,42,134,43): error CS0165: Use of unassigned local variable 'a'
// Note: Dev10 spuriously reports (135,42,135,43): error CS0165: Use of unassigned local variable 'a'
// (136,51): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && F(a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(136, 51),
// (137,46): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && F(a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(137, 46),
// (138,57): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fFalse && F(a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(138, 57),
// (141,39): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || G(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(141, 39),
// (142,39): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || G(out a)) F(a); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(142, 39),
// (144,45): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(144, 45),
// (145,56): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || G(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(145, 56),
// (149,51): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(149, 51),
// (150,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(150, 49),
// (151,51): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) F(a); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(151, 51),
// (152,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) F(a); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(152, 49),
// (153,62): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(153, 62),
// (154,60): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(154, 60),
// (155,57): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(155, 57),
// (156,55): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(156, 55),
// (157,68): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(157, 68),
// (158,66): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(158, 66),
// (159,72): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetNLS() || GetNLS(out a)) G(out a); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(159, 72),
// (160,70): error CS0165: Use of unassigned local variable 'a'
// { int a; if (GetLS() || GetLS(out a)) G(out a); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(160, 70),
// (163,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue || G(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(163, 43),
// (164,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue || G(out a)) F(a); else No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(164, 43),
// Note: Dev10 spuriously reports (165,56,165,57): error CS0165: Use of unassigned local variable 'a'
// (166,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue || G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(166, 49),
// (167,60): error CS0165: Use of unassigned local variable 'a'
// { int a; if (fTrue || G(out a)) No(); else No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(167, 60)
// Note: Dev10 spuriously reports (168,66,168,67): error CS0165: Use of unassigned local variable 'a'
);
}
[Fact]
public void SwitchStatement()
{
var source = prefix + @"
// Switch statement.
public void T110() {
if (f) { int a; switch (a) { case 0: No(); break; } } // Error
if (f) { int a; switch (val) { case 0: F(a); break; } } // Error
if (f) { int a; switch (val) { case 0: G(out a); break; case 1: F(a); break; } } // Error
if (f) { int a; switch (G(out a)) { case false: F(a); break; case true: No(); break; } }
if (f) { int a; switch (G(out a)) { case false: No(); break; case true: F(a); break; } }
// Assigned after false has no affect.
if (f) { int a; switch (f || G(out a)) { case false: F(a); break; case true: No(); break; } } // Error
// Assigned after true has no affect.
if (f) { int a; switch (f && G(out a)) { case false: No(); break; case true: F(a); break; } } // Error
// Exhaust cases
if (f) { int a; switch (f) { case false: G(out a); break; case true: G(out a); break; } F(a); }
if (f) { int a; switch (val) { case 0: goto default; default: G(out a); break; } F(a); }
if (f) { int a; switch (val) { case 0: G(out a); break; default: goto case 0; } F(a); }
if (f) { int a; switch (val) { case 0: G(out a); break; default: goto LSkip; } F(a); LSkip: No(); }
if (f) { int a; switch (val) { case 0: G(out a); goto LHave; default: break; } No(); goto LSkip; LHave: F(a); LSkip: No(); }
if (f) { int a;
switch (b) {
case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F:
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F:
case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F:
case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3E: case 0x3F:
case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F:
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5A: case 0x5B: case 0x5C: case 0x5D: case 0x5E: case 0x5F:
case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F:
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E: case 0x7F:
G(out a);
break;
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E: case 0x8F:
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D: case 0x9E: case 0x9F:
case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC: case 0xAD: case 0xAE: case 0xAF:
case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: case 0xB8: case 0xB9: case 0xBA: case 0xBB: case 0xBC: case 0xBD: case 0xBE: case 0xBF:
case 0xC0: case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: case 0xC6: case 0xC7: case 0xC8: case 0xC9: case 0xCA: case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF:
case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF:
case 0xE0: case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: case 0xE6: case 0xE7: case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF:
case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7: case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC: case 0xFD: case 0xFE: case 0xFF:
G(out a);
break;
}
F(a); // OK - we consider enumerating values for integral types to be exhaustive
}
if (f) { int a; switch (val) { default: goto case 0; case 0: goto default; } F(a); } // Unreachable
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (121,86): warning CS0162: Unreachable code detected
// if (f) { int a; switch (val) { default: goto case 0; case 0: goto default; } F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F").WithLocation(121, 86),
// (76,33): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; switch (a) { case 0: No(); break; } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(76, 33),
// (77,50): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; switch (val) { case 0: F(a); break; } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(77, 50),
// (78,75): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; switch (val) { case 0: G(out a); break; case 1: F(a); break; } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(78, 75),
// (83,64): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; switch (f || G(out a)) { case false: F(a); break; case true: No(); break; } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(83, 64),
// (86,88): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; switch (f && G(out a)) { case false: No(); break; case true: F(a); break; } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(86, 88)
);
}
[Fact]
public void WhileStatement()
{
var source = prefix + @"
// While statement.
public void T120() {
// Unassigned.
if (f) { int a; while (F(a)) No(); } // Error
if (f) { int a; while (f) F(a); } // Error
if (f) { int a; while (f) No(); F(a); } // Error
if (f) { int a; while (f) G(out a); F(a); } // Error
if (f) { int a; while (fFalse) F(a); } // Unreachable
if (f) { int a; while (fTrue) No(); F(a); } // Unreachable
// Assigned.
if (f) { int a; while (G(out a)) F(a); }
if (f) { int a; while (G(out a)) No(); F(a); }
// Assigned after true.
if (f) { int a; while (f && G(out a)) F(a); }
if (f) { int a; while (f && G(out a)) No(); F(a); } // Error
// Assigned
if (f) { int a; while (fTrue && G(out a)) F(a); }
if (f) { int a; while (fTrue && G(out a)) No(); F(a); }
// Unassigned.
if (f) { int a; while (fFalse && G(out a)) F(a); } // Error. Unreachable expression, not unreachable statement
if (f) { int a; while (fFalse && G(out a)) No(); F(a); } // Error. Unreachable expression, not statement
// Assigned after false.
if (f) { int a; while (f || G(out a)) F(a); } // Error
if (f) { int a; while (f || G(out a)) No(); F(a); }
// Unassigned.
if (f) { int a; while (fTrue || G(out a)) F(a); } // Error, unreachable expression
if (f) { int a; while (fTrue || G(out a)) No(); F(a); } // Error, unreachable expression, not statement
// Assigned
if (f) { int a; while (fFalse || G(out a)) F(a); }
if (f) { int a; while (fFalse || G(out a)) No(); F(a); }
}
// While statement with break and continue.
public void T121() {
if (f) { int a; while (f) { break; F(a); } } // Unreachable
if (f) { int a; while (fTrue) { } F(a); } // Unreachable
if (f) { int a; while (fTrue) { break; } F(a); } // Error
if (f) { int a; while (f) { G(out a); break; } F(a); } // Error
if (f) { int a; while (fTrue) { G(out a); break; } F(a); }
if (f) { int a; while (f) { break; G(out a); } F(a); } // Error + Unreachable
if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
if (f) { int a; while (fTrue || G(out a)) break; F(a); } // Error
if (f) { int a; while (f) { if (f) G(out a); else break; F(a); } }
if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
if (f) { int a; while (fTrue) { if (f) break; G(out a); } F(a); } // Error
if (f) { int a; while (fTrue) { if (fFalse) break; G(out a); break; } F(a); } // Unreachable (break)
if (f) { int a; while (f) { continue; F(a); } } // Unreachable
if (f) { int a; while (fTrue) { continue; } F(a); } // Unreachable
if (f) { int a; while (fTrue) { if (f) continue; G(out a); break; } F(a); }
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (56,40): warning CS0162: Unreachable code detected
// if (f) { int a; while (fFalse) F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (57,45): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) No(); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (52,34): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (F(a)) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (53,37): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (54,43): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (55,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f) G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (65,55): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f && G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Note: Dev10 spuriously reports (72,56,72,57): error CS0165: Use of unassigned local variable 'a'
// (73,60): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fFalse && G(out a)) No(); F(a); } // Error. Unreachable expression, not statement
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (76,49): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f || G(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (80,53): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue || G(out a)) F(a); } // Error, unreachable expression
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Note: Dev10 spuriously reports (81,61,81,62): error CS0165: Use of unassigned local variable 'a'
// (90,44): warning CS0162: Unreachable code detected
// if (f) { int a; while (f) { break; F(a); } } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (91,43): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) { } F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (95,44): warning CS0162: Unreachable code detected
// if (f) { int a; while (f) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "G"),
// (96,48): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "G"),
// (99,48): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "G"),
// (101,53): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) { if (fFalse) break; G(out a); break; } F(a); } // Unreachable (break)
Diagnostic(ErrorCode.WRN_UnreachableCode, "break"),
// (103,47): warning CS0162: Unreachable code detected
// if (f) { int a; while (f) { continue; F(a); } } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (104,53): warning CS0162: Unreachable code detected
// if (f) { int a; while (fTrue) { continue; } F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (92,52): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue) { break; } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (93,58): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f) { G(out a); break; } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (95,58): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (f) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (96,62): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (97,60): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue || G(out a)) break; F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (99,62): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue) { break; G(out a); } F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (100,69): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; while (fTrue) { if (f) break; G(out a); } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[WorkItem(529602, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529602")]
[Fact]
public void DoWhileStatement()
{
var source = prefix + @"
// Do statement.
public void T130() {
if (f) { int a; do F(a); while (f); } // Error
if (f) { int a; do No(); while (F(a)); } // Error
if (f) { int a; do No(); while (f); F(a); } // Error
if (f) { int a; do G(out a); while (F(a)); }
if (f) { int a; do G(out a); while (f); F(a); }
if (f) { int a; do No(); while (G(out a)); F(a); }
if (f) { int a; do No(); while (fTrue); F(a); } // Unreachable
// Assigned after true - nothing special
if (f) { int a; do No(); while (f && G(out a)); F(a); } // Error
// Assigned
if (f) { int a; do No(); while (fTrue && G(out a)); F(a); }
// Unassigned.
if (f) { int a; do No(); while (fFalse && G(out a)); F(a); } // Error
//
if (f) { int a; do No(); while (f || G(out a)); F(a); } // Assigned after false
if (f) { int a; do No(); while (fTrue || G(out a)); F(a); } // unreachable expr, unassigned
if (f) { int a; do No(); while (fFalse || G(out a)); F(a); } // Assigned
}
// Do statement with break and continue.
public void T131() {
if (f) { int a; do { break; F(a); } while (f); } // Unreachable
if (f) { int a; do break; while (F(a)); } // Unreachable
if (f) { int a; do { if (f) break; G(out a); } while (F(a)); }
if (f) { int a; do { if (f) break; G(out a); } while (f); F(a); } // Error
if (f) { int a; do { if (f) break; No(); } while (G(out a)); F(a); } // Error
if (f) { int a; do { if (f) break; } while (fTrue); F(a); } // Error
if (f) { int a; do { if (f) continue; G(out a); } while (F(a)); } // Error
if (f) { int a; do { if (f) continue; G(out a); } while (f); F(a); } // Error
if (f) { int a; do { if (f) continue; No(); } while (G(out a)); F(a); }
if (f) { int a; do { if (f) continue; } while (fTrue); F(a); } // Unreachable
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (57,49): warning CS0162: Unreachable code detected
// if (f) { int a; do No(); while (fTrue); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (51,30): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do F(a); while (f); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (52,43): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do No(); while (F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (53,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do No(); while (f); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (60,59): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do No(); while (f && G(out a)); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (66,64): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do No(); while (fFalse && G(out a)); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Note: Dev10 spuriously reports (70,65,70,66): error CS0165: Use of unassigned local variable 'a'
// (76,37): warning CS0162: Unreachable code detected
// if (f) { int a; do { break; F(a); } while (f); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// NOTE: By design, we will not match dev10's report of
// (77,44,77,48): warning CS0162: Unreachable code detected
// See DevDiv #13696.
// (86,64): warning CS0162: Unreachable code detected
// if (f) { int a; do { if (f) continue; } while (fTrue); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (79,69): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do { if (f) break; G(out a); } while (f); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (80,72): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do { if (f) break; No(); } while (G(out a)); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (81,63): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do { if (f) break; } while (fTrue); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (83,68): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do { if (f) continue; G(out a); } while (F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (84,72): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; do { if (f) continue; G(out a); } while (f); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[WorkItem(529602, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529602")]
[Fact]
public void UnreachableDoWhileCondition()
{
var source = @"
class C
{
bool F()
{
do { break; } while (F());
return true;
}
}
";
// NOTE: By design, we will not match dev10's report of
// warning CS0162: Unreachable code detected
// See DevDiv #13696.
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void ForStatement()
{
var source = prefix + @"
// For statement.
public void T140() {
if (f) { int a; for (F(a);;) No(); } // Error
if (f) { int a; for (;F(a);) No(); } // Error
if (f) { int a; for (;;F(a)) No(); } // Error
if (f) { int a; for (;;) F(a); } // Error
if (f) { int a; for (;;) No(); F(a); } // Unreachable
if (f) { int a; for (;f;) No(); F(a); } // Error
if (f) { int a; for (;f;) G(out a); F(a); } // Error
if (f) { int a; for (;fFalse;) G(out a); F(a); } // Error + Unreachable
if (f) { int a; for (;fFalse;) F(a); } // Unreachable
if (f) { int a; for (;;) No(); F(a); } // Unreachable
// Assigned.
if (f) { int a; for (G(out a);f;) F(a); }
if (f) { int a; for (G(out a);f;) No(); F(a); }
if (f) { int a; for (;G(out a);) F(a); }
if (f) { int a; for (;G(out a);) No(); F(a); }
if (f) { int a; for (;f;G(out a)) F(a); } // Error
if (f) { int a; for (;f;G(out a)) No(); F(a); } // Error
if (f) { int a; for (;f;F(a)) G(out a); }
if (f) { int a; for (;f;) G(out a); F(a); } // Error
// Assigned after true.
if (f) { int a; for (;f && G(out a);) F(a); }
if (f) { int a; for (;f && G(out a);) No(); F(a); } // Error
// Assigned.
if (f) { int a; for (;fTrue && G(out a);) F(a); }
if (f) { int a; for (;fTrue && G(out a);) No(); F(a); }
// Unassigned.
if (f) { int a; for (;fFalse && G(out a);) F(a); } // Error, unreachable expr, no unreachable stmt
if (f) { int a; for (;fFalse && G(out a);) No(); F(a); } // Error, unreachable expr
// Assigned after false.
if (f) { int a; for (;f || G(out a);) F(a); } // Error
if (f) { int a; for (;f || G(out a);) No(); F(a); }
// Unassigned.
if (f) { int a; for (;fTrue || G(out a);) F(a); } // Error, unreachable expr
if (f) { int a; for (;fTrue || G(out a);) No(); F(a); } // Unreachable expr, not unreachable code
// Assigned.
if (f) { int a; for (;fFalse || G(out a);) F(a); }
if (f) { int a; for (;fFalse || G(out a);) No(); F(a); }
}
// For statement with break and continue.
public void T141() {
if (f) { int a; for (;;F(a)) G(out a); }
if (f) { int a; for (;;F(a)) break; } // Unreachable
if (f) { int a; for (;;F(a)) { G(out a); if (f) continue; } }
if (f) { int a; for (;;F(a)) { G(out a); if (f) break; } }
if (f) { int a; for (;;F(a)) { if (f) continue; G(out a); } } // Error
if (f) { int a; for (;;) break; F(a); } // Error
if (f) { int a; for (;;) { if (f) break; No(); } F(a); } // Error
if (f) { int a; for (;;) { G(out a); if (f) break; } F(a); }
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (55,40): warning CS0162: Unreachable code detected
// if (f) { int a; for (;;) No(); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (58,40): warning CS0162: Unreachable code detected
// if (f) { int a; for (;fFalse;) G(out a); F(a); } // Error + Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "G"),
// (59,40): warning CS0162: Unreachable code detected
// if (f) { int a; for (;fFalse;) F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (60,40): warning CS0162: Unreachable code detected
// if (f) { int a; for (;;) No(); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (51,32): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (F(a);;) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (52,33): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;F(a);) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (53,34): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;;F(a)) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (54,36): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;;) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (56,43): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f;) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (57,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f;) G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (58,52): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;fFalse;) G(out a); F(a); } // Error + Unreachable
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (67,45): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f;G(out a)) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (68,51): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f;G(out a)) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (70,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f;) G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (74,55): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f && G(out a);) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Spurious Dev10: (81,56,81,57): error CS0165: Use of unassigned local variable 'a'
// (82,60): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;fFalse && G(out a);) No(); F(a); } // Error, unreachable expr
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (85,49): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;f || G(out a);) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (89,53): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;fTrue || G(out a);) F(a); } // Error, unreachable expr
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Spurious Dev10: (90,61,90,62): error CS0165: Use of unassigned local variable 'a'
// (100,32): warning CS0162: Unreachable code detected
// if (f) { int a; for (;;F(a)) break; } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (103,34): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;;F(a)) { if (f) continue; G(out a); } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (104,43): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;;) break; F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (105,60): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; for (;;) { if (f) break; No(); } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[Fact]
public void ThrowStatement()
{
var source = prefix + @"
// Throw statement.
public void T150() {
if (f) { int a; throw new Exception(F(a).ToString()); }
if (f) { int a; throw new Exception(""x""); F(a); } // Unreachable
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (52,51): warning CS0162: Unreachable code detected
// if (f) { int a; throw new Exception("x"); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (51,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; throw new Exception(F(a).ToString()); }
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[Fact]
public void ReturnStatement()
{
var source = prefix + @"
// Return statement.
public bool T160() { int a; return F(a); } // Error
public bool T161() { int a; return No(); F(a); } // Unreachable
public bool T162(out int a) { return F(a); } // Error
public bool T163(out int a) { return No(); } // Error
public bool T164(out int a) { try { return No(); } finally { G(out a); } }
public bool T165(out int a) { return G(out a); }
public bool T166(out int a) { try { return G(out a); } finally { F(a); } } // Error
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (50,42): error CS0165: Use of unassigned local variable 'a'
// public bool T160() { int a; return F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (51,46): warning CS0162: Unreachable code detected
// public bool T161() { int a; return No(); F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (52,44): error CS0269: Use of unassigned out parameter 'a'
// public bool T162(out int a) { return F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolationOut, "a").WithArguments("a"),
// (52,35): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// public bool T162(out int a) { return F(a); } // Error
Diagnostic(ErrorCode.ERR_ParamUnassigned, "return F(a);").WithArguments("a"),
// (53,35): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// public bool T163(out int a) { return No(); } // Error
Diagnostic(ErrorCode.ERR_ParamUnassigned, "return No();").WithArguments("a"),
// (56,72): error CS0269: Use of unassigned out parameter 'a'
// public bool T166(out int a) { try { return G(out a); } finally { F(a); } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolationOut, "a").WithArguments("a"));
}
[Fact]
public void TryCatchStatement()
{
var source = prefix + @"
// Try-catch statement.
public void T170() {
if (f) { int a; try { F(a); } catch (Exception e) { } finally { } } // Error
if (f) { int a; try { } catch (Exception e) { F(a); } finally { } } // Error
if (f) { int a; try { } catch (Exception e) { } finally { F(a); } } // Error
if (f) { int a; try { } catch (Exception e) { } finally { } F(a); } // Error
if (f) { int a; try { G(out a); } catch (Exception e) { } F(a); } // Error
if (f) { int a; try { G(out a); } finally { } F(a); }
if (f) { int a; try { G(out a); } catch (Exception e) { } finally { } F(a); } // Error
if (f) { int a; try { G(out a); } catch (Exception e) { G(out a); } F(a); }
if (f) { int a; try { G(out a); } catch (Exception e) { G(out a); } finally { } F(a); }
if (f) { int a; try { } finally { G(out a); } F(a); }
if (f) { int a; try { } catch (Exception e) { } finally { G(out a); } F(a); }
if (f) { int a; try { G(out a); goto L; } catch (Exception e) { } return; L: F(a); }
if (f) { int a; try { G(out a); goto L; } finally { } return; L: F(a); }
if (f) { int a; try { G(out a); goto L; } catch (Exception e) { } finally { } return; L: F(a); }
if (f) { int a; try { goto L; } finally { G(out a); } return; L: F(a); }
if (f) { int a; try { goto L; } catch (Exception e) { } finally { G(out a); } return; L: F(a); }
// Unreachable end of finally.
if (f) { int a; try { G(out a); } catch (Exception e) { } finally { for (;;) No(); } F(a); } // Unreachable
if (f) { int a; try { goto L; } catch (Exception e) { } finally { for(;;) No(); } return; L: F(a); } // Unreachable
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (67,63): warning CS0162: Unreachable code detected
// if (f) { int a; try { G(out a); goto L; } finally { } return; L: F(a); }
Diagnostic(ErrorCode.WRN_UnreachableCode, "return"),
// (70,63): warning CS0162: Unreachable code detected
// if (f) { int a; try { goto L; } finally { G(out a); } return; L: F(a); }
Diagnostic(ErrorCode.WRN_UnreachableCode, "return"),
// (74,94): warning CS0162: Unreachable code detected
// if (f) { int a; try { G(out a); } catch (Exception e) { } finally { for (;;) No(); } F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "F"),
// (75,91): warning CS0162: Unreachable code detected
// if (f) { int a; try { goto L; } catch (Exception e) { } finally { for(;;) No(); } return; L: F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "return"),
// (75,99): warning CS0162: Unreachable code detected
// if (f) { int a; try { goto L; } catch (Exception e) { } finally { for(;;) No(); } return; L: F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreachableCode, "L"),
// (51,33): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { F(a); } catch (Exception e) { } finally { } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (51,56): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { F(a); } catch (Exception e) { } finally { } } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (52,57): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { } catch (Exception e) { F(a); } finally { } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (52,50): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { } catch (Exception e) { F(a); } finally { } } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (53,50): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { } catch (Exception e) { } finally { F(a); } } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (53,69): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { } catch (Exception e) { } finally { F(a); } } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (54,50): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { } catch (Exception e) { } finally { } F(a); } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (54,71): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { } catch (Exception e) { } finally { } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (56,60): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); } catch (Exception e) { } F(a); } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (56,69): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { G(out a); } catch (Exception e) { } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (58,60): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); } catch (Exception e) { } finally { } F(a); } // Error
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (58,81): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; try { G(out a); } catch (Exception e) { } finally { } F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (60,60): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); } catch (Exception e) { G(out a); } F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (61,60): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); } catch (Exception e) { G(out a); } finally { } F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (64,50): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { } catch (Exception e) { } finally { G(out a); } F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (66,68): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); goto L; } catch (Exception e) { } return; L: F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (68,68): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); goto L; } catch (Exception e) { } finally { } return; L: F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (71,58): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { goto L; } catch (Exception e) { } finally { G(out a); } return; L: F(a); }
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (74,60): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { G(out a); } catch (Exception e) { } finally { for (;;) No(); } F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"),
// (75,58): warning CS0168: The variable 'e' is declared but never used
// if (f) { int a; try { goto L; } catch (Exception e) { } finally { for(;;) No(); } return; L: F(a); } // Unreachable
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e"));
}
[Fact]
public void ForEachStatement()
{
var source = prefix + @"
// Foreach statement.
public void T180() {
if (f) { int a; foreach (char ch in F(a).ToString()) No(); } // Error
if (f) { int a; foreach (char ch in ""abc"") F(a); } // Error // BUG?: Error in wrong order.
if (f) { int a; foreach (char ch in G(out a).ToString()) F(a); }
if (f) { int a; foreach (char ch in ""abc"") No(); F(a); } // Error
if (f) { int a; foreach (char ch in ""abc"") G(out a); F(a); } // Error
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (51,47): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; foreach (char ch in F(a).ToString()) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (52,54): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; foreach (char ch in "abc") F(a); } // Error // BUG?: Error in wrong order.
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (54,60): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; foreach (char ch in "abc") No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (55,64): error CS0165: Use of unassigned local variable 'a'
// if (f) { int a; foreach (char ch in "abc") G(out a); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[Fact]
public void UsingAndLockStatements()
{
var source = prefix + @"
// Using and Lock statements.
public void T190() {
{ int a; using (Res(F(a))) No(); } // Error
{ int a; using (Res(No())) F(a); } // Error
{ int a; using (Res(No())) No(); F(a); } // Error
{ int a; using (Res(G(out a))) F(a); }
{ int a; using (Res(G(out a))) No(); F(a); }
{ int a; using (Res(No())) G(out a); F(a); }
{ int a; lock (Res(F(a))) No(); } // Error
{ int a; lock (Res(No())) F(a); } // Error
{ int a; lock (Res(No())) No(); F(a); } // Error
{ int a; lock (Res(G(out a))) F(a); }
{ int a; lock (Res(G(out a))) No(); F(a); }
{ int a; lock (Res(No())) G(out a); F(a); }
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (51,31): error CS0165: Use of unassigned local variable 'a'
// { int a; using (Res(F(a))) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (52,38): error CS0165: Use of unassigned local variable 'a'
// { int a; using (Res(No())) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (53,44): error CS0165: Use of unassigned local variable 'a'
// { int a; using (Res(No())) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (58,30): error CS0165: Use of unassigned local variable 'a'
// { int a; lock (Res(F(a))) No(); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (59,37): error CS0165: Use of unassigned local variable 'a'
// { int a; lock (Res(No())) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (60,43): error CS0165: Use of unassigned local variable 'a'
// { int a; lock (Res(No())) No(); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"));
}
[Fact]
public void LogicalExpression()
{
var source = prefix + @"
// Logical and: E -> S && T
public void T340() {
// S -> DA then DA -> T and E -> DA
{ int a; Q(G(out a) && F(a)); } // DA -> T
{ int a; Q(G(out a) && No()); F(a); } // E -> DA
// S -> DAT then DA -> T and E -> DAT
{ int a; Q((f && G(out a)) && F(a)); } // DA -> T
{ int a; Q((f && G(out a)) && No()); F(a); } // Error
{ int a; if ((f && G(out a)) && No()) F(a); } // E -> DAT
// S -> DAF then DU -> T
{ int a; Q((f || G(out a)) && F(a)); } // Error
// if T -> DU then E -> DU
{ int a; Q((f || G(out a)) && No()); F(a); } // Error
{ int a; if ((f || G(out a)) && No()) F(a); } // Error
{ int a; if ((f || G(out a)) && No()) No(); else F(a); } // Error
// if T -> DA then E -> DA
{ int a; Q((f || G(out a)) && G(out a)); F(a); }
// if T -> DAT then E -> DAT
{ int a; Q((f || G(out a)) && (f && G(out a))); F(a); } // Error
{ int a; if ((f || G(out a)) && (f && G(out a))) F(a); }
// if T -> DAF then E -> DAF
{ int a; Q((f || G(out a)) && (f || G(out a))); F(a); } // Error
{ int a; if ((f || G(out a)) && (f || G(out a))) No(); else F(a); }
// S -> DU then DU -> T
{ int a; Q(f && F(a)); } // Error
// if T -> DA then E -> DAT
{ int a; Q(f && G(out a)); F(a); } // Error
{ int a; if (f && G(out a)) F(a); }
// if T -> DAT then E -> DAT
{ int a; Q(f && (f && G(out a))); F(a); } // Error
{ int a; if (f && (f && G(out a))) F(a); }
// if T -> DAF then E -> DU
{ int a; Q(f && (f || G(out a))); F(a); } // Error
{ int a; if (f && (f || G(out a))) F(a); } // Error
{ int a; if (f && (f || G(out a))) No(); else F(a); } // Error
// if T -> DU then E -> DU
{ int a; Q(f && f); F(a); } // Error
{ int a; if (f && f) F(a); } // Error
{ int a; if (f && f) No(); else F(a); } // Error
}
// Logical or: E -> S || T
public void T350() {
// S -> DA then DA -> T and E -> DA
{ int a; Q(G(out a) || F(a)); } // DA -> T
{ int a; Q(G(out a) || No()); F(a); } // E -> DA
// S -> DAF then DA -> T and E -> DAF
{ int a; Q((f || G(out a)) || F(a)); } // DA -> T
{ int a; Q((f || G(out a)) || No()); F(a); } // Error
{ int a; if ((f || G(out a)) || No()) No(); else F(a); } // E -> DAF
// S -> DAT then DU -> T
{ int a; Q((f && G(out a)) || F(a)); } // Error
// if T -> DU then E -> DU
{ int a; Q((f && G(out a)) || No()); F(a); } // Error
{ int a; if ((f && G(out a)) || No()) F(a); } // Error
{ int a; if ((f && G(out a)) || No()) No(); else F(a); } // Error
// if T -> DA then E -> DA
{ int a; Q((f && G(out a)) || G(out a)); F(a); }
// if T -> DAF then E -> DAF
{ int a; Q((f && G(out a)) || (f || G(out a))); F(a); } // Error
{ int a; if ((f && G(out a)) || (f || G(out a))) No(); else F(a); }
// if T -> DAT then E -> DAT
{ int a; Q((f && G(out a)) || (f && G(out a))); F(a); } // Error
{ int a; if ((f && G(out a)) || (f && G(out a))) F(a); }
// S -> DU then DU -> T
{ int a; Q(f || F(a)); } // Error
// if T -> DA then E -> DAF
{ int a; Q(f || G(out a)); F(a); } // Error
{ int a; if (f || G(out a)) No(); else F(a); }
// if T -> DAF then E -> DAF
{ int a; Q(f || (f || G(out a))); F(a); } // Error
{ int a; if (f || (f || G(out a))) No(); else F(a); }
// if T -> DAT then E -> DU
{ int a; Q(f || (f && G(out a))); F(a); } // Error
{ int a; if (f || (f && G(out a))) F(a); } // Error
{ int a; if (f || (f && G(out a))) No(); else F(a); } // Error
// if T -> DU then E -> DU
{ int a; Q(f || f); F(a); } // Error
{ int a; if (f || f) F(a); } // Error
{ int a; if (f || f) No(); else F(a); } // Error
}
// Logical not: E -> !S
public void T360() {
{ bool a; Q(!a); } // Error
{ int a; Q(!G(out a)); F(a); }
{ int a; Q(!No()); F(a); } // Error
// S -> DAF : E -> DAT
{ int a; Q(!(f || G(out a))); F(a); } // Error
{ int a; if (!(f || G(out a))) F(a); }
// S -> DAT : E -> DAF
{ int a; Q(!(f && G(out a))); F(a); } // Error
{ int a; if (!(f && G(out a))) No(); else F(a); }
}
// Ternary operator: E -> S ? T : U;
// For definite assignment purposes, this behaves the same as ""if (S) T; else U;""
public void T370() {
{ bool a; F(a ? 1 : 2); } // Error
// S -> DU
{ int a; F(f ? a : 2); } // Error
{ int a; F(f ? 1 : a); } // Error
{ int a; F(f ? 1 : 2); F(a); } // Error
{ int a; F(fFalse ? a : 2); } // no DA error; expr is not reachable
{ int a; F(fFalse ? 1 : a); } //
{ int a; F(fTrue ? a : 2); } // Error - should it also be unreachable?
{ int a; F(fTrue ? 1 : a); } // BUG: Spec says error. Should this be unreachable?
// S -> DA then DA -> T, DA -> U, E -> DA
{ int a; F(G(out a) ? a : 2); }
{ int a; F(G(out a) ? 1 : a); }
{ int a; F(G(out a) ? 1 : 2); F(a); }
// S -> DAT then DA -> T, DU -> U
// Assigned after true.
{ int a; F(f && G(out a) ? a : 2); }
{ int a; F(f && G(out a) ? 1 : a); } // Error
{ int a; F(f && G(out a) ? 1 : 2); F(a); } // Error
{ int a; F(f && G(out a) ? 1 : NG(out a)); F(a); }
// Assigned.
{ int a; F(fTrue && G(out a) ? a : 2); }
{ int a; F(fTrue && G(out a) ? 1 : a); }
{ int a; F(fTrue && G(out a) ? 1 : 2); F(a); }
// Unassigned.
{ int a; F(fFalse && G(out a) ? a : 2); } // Error
{ int a; F(fFalse && G(out a) ? 1 : a); } // Error
{ int a; F(fFalse && G(out a) ? 1 : 2); F(a); } // Error
{ int a; F(fFalse && G(out a) ? 1 : NG(out a)); F(a); } // Error
// Unassigned.
{ int a; F(fFalse && F(a) ? a : 2); } // Error on a
{ int a; F(fFalse && F(a) ? 1 : a); } // Error on a
{ int a; F(fFalse && F(a) ? 1 : 2); F(a); } // Error on second F(a)
{ int a; F(fFalse && F(a) ? 1 : NG(out a)); F(a); } // Error on second F(a)
// Assigned after false.
{ int a; F(f || G(out a) ? a : 2); } // Error
{ int a; F(f || G(out a) ? 1 : a); }
{ int a; F(f || G(out a) ? 1 : 2); F(a); } // Error
{ int a; F(f || G(out a) ? NG(out a) : 2); F(a); }
// Unassigned, unreachable expression.
{ int a; F(fTrue || G(out a) ? a : 2); } // Error
{ int a; F(fTrue || G(out a) ? 1 : a); } // Error
{ int a; F(fTrue || G(out a) ? 1 : 2); F(a); } // Error
{ int a; F(fTrue || G(out a) ? NG(out a) : 2); F(a); } // Error
// Assigned.
{ int a; F(fFalse || G(out a) ? a : 2); }
{ int a; F(fFalse || G(out a) ? 1 : a); }
{ int a; F(fFalse || G(out a) ? 1 : 2); F(a); }
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (57,48): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f && G(out a)) && No()); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (61,41): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f || G(out a)) && F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (63,48): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f || G(out a)) && No()); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (64,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if ((f || G(out a)) && No()) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (65,60): error CS0165: Use of unassigned local variable 'a'
// { int a; if ((f || G(out a)) && No()) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (69,59): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f || G(out a)) && (f && G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (72,59): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f || G(out a)) && (f || G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (76,27): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f && F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (78,38): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f && G(out a)); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (81,45): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f && (f && G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (84,45): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f && (f || G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (85,46): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && (f || G(out a))) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (86,57): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && (f || G(out a))) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (88,31): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f && f); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (89,32): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && f) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (90,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f && f) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (101,48): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f || G(out a)) || No()); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (105,41): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f && G(out a)) || F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (107,48): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f && G(out a)) || No()); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (108,49): error CS0165: Use of unassigned local variable 'a'
// { int a; if ((f && G(out a)) || No()) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (109,60): error CS0165: Use of unassigned local variable 'a'
// { int a; if ((f && G(out a)) || No()) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (113,59): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f && G(out a)) || (f || G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (116,59): error CS0165: Use of unassigned local variable 'a'
// { int a; Q((f && G(out a)) || (f && G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (120,27): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f || F(a)); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (122,38): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f || G(out a)); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (125,45): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f || (f || G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (128,45): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f || (f && G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (129,46): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || (f && G(out a))) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (130,57): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || (f && G(out a))) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (132,31): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(f || f); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (133,32): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || f) F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (134,43): error CS0165: Use of unassigned local variable 'a'
// { int a; if (f || f) No(); else F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (139,22): error CS0165: Use of unassigned local variable 'a'
// { bool a; Q(!a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (142,30): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(!No()); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (145,41): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(!(f || G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (149,41): error CS0165: Use of unassigned local variable 'a'
// { int a; Q(!(f && G(out a))); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (156,21): error CS0165: Use of unassigned local variable 'a'
// { bool a; F(a ? 1 : 2); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (159,24): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f ? a : 2); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (160,28): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f ? 1 : a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (161,34): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f ? 1 : 2); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (164,33): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fFalse ? 1 : a); } //
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (166,28): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fTrue ? a : 2); } // Error - should it also be unreachable?
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (178,40): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f && G(out a) ? 1 : a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (179,46): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f && G(out a) ? 1 : 2); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Dev10 spurious: (188,43,188,44): error CS0165: Use of unassigned local variable 'a'
// (189,45): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fFalse && G(out a) ? 1 : a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (190,51): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fFalse && G(out a) ? 1 : 2); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Dev10 spurious: (191,61,191,62): error CS0165: Use of unassigned local variable 'a'
// Dev10 spurious: (194,39,194,40): error CS0165: Use of unassigned local variable 'a'
// (195,41): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fFalse && F(a) ? 1 : a); } // Error on a
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (196,47): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fFalse && F(a) ? 1 : 2); F(a); } // Error on second F(a)
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Dev10 spurious: error CS0165: Use of unassigned local variable 'a'
// (200,36): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f || G(out a) ? a : 2); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (202,46): error CS0165: Use of unassigned local variable 'a'
// { int a; F(f || G(out a) ? 1 : 2); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// (206,40): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fTrue || G(out a) ? a : 2); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a"),
// Dev10 spurious: (207,46,207,47): error CS0165: Use of unassigned local variable 'a'
// (208,50): error CS0165: Use of unassigned local variable 'a'
// { int a; F(fTrue || G(out a) ? 1 : 2); F(a); } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a")
// Dev10 spurious: (209,60,209,61): error CS0165: Use of unassigned local variable 'a'
);
}
[Fact]
public void WhidbeyBug467493()
{
var source = prefix + @"
// Whidbey bug #467493
public static void M4() {
int x;
throw new Exception();
((DI)(delegate { if (x == 1) return 1; Console.WriteLine(""Bug""); }))();
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (78,15): error CS1643: Not all code paths return a value in anonymous method of type 'DI'
// ((DI)(delegate { if (x == 1) return 1; Console.WriteLine("Bug"); }))();
Diagnostic(ErrorCode.ERR_AnonymousReturnExpected, "delegate").WithArguments("anonymous method", "DI").WithLocation(78, 15),
// (78,9): warning CS0162: Unreachable code detected
// ((DI)(delegate { if (x == 1) return 1; Console.WriteLine("Bug"); }))();
Diagnostic(ErrorCode.WRN_UnreachableCode, "(").WithLocation(78, 9)
);
}
[WorkItem(648107, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/648107")]
[Fact]
public void WhidbeyBug479106()
{
var source = prefix + @"
// Whidbey bug #479106
public unsafe struct SF {
public int x;
public fixed int arr[5];
}
public unsafe static void M5() {
SF s;
s.arr[0]++; // OK
SF[] rgs = new SF[2];
fixed (SF * prgs = rgs) {
int a;
int b;
prgs[a].arr[0] = 5; // Error: a
prgs[b = 1].arr[0] = 5; // No error
Console.WriteLine(b);
}
}
" + suffix;
CreateCompilation(source, options: TestOptions.UnsafeReleaseDll).VerifyDiagnostics(
// (62,18): error CS0165: Use of unassigned local variable 'a'
// prgs[a].arr[0] = 5; // Error: a
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a")
);
}
[Fact, WorkItem(31370, "https://github.com/dotnet/roslyn/issues/31370")]
public void WhidbeyBug467493_WithSuppression()
{
var source = prefix + @"
// Whidbey bug #467493
public static void M4() {
int x;
throw new Exception();
((DI)(delegate { if (x == 1) return 1; Console.WriteLine(""Bug""); } !))();
}
" + suffix;
// Covers GenerateExplicitConversionErrors
CreateCompilation(source).VerifyDiagnostics(
// (78,15): error CS1643: Not all code paths return a value in anonymous method of type 'DI'
// ((DI)(delegate { if (x == 1) return 1; Console.WriteLine("Bug"); }))();
Diagnostic(ErrorCode.ERR_AnonymousReturnExpected, "delegate").WithArguments("anonymous method", "DI").WithLocation(78, 15),
// (78,9): warning CS0162: Unreachable code detected
// ((DI)(delegate { if (x == 1) return 1; Console.WriteLine("Bug"); }))();
Diagnostic(ErrorCode.WRN_UnreachableCode, "(").WithLocation(78, 9)
);
}
[Fact]
public void AccessingFixedFieldUsesTheReceiver()
{
var source = prefix + @"
// Whidbey bug #479106
public unsafe struct SF {
public int x;
public fixed int arr[5];
}
public unsafe struct SF2 {
public SF z;
}
public unsafe static void M5() {
SF2 s;
s.z.arr[0]++; // OK
}
" + suffix;
CreateCompilation(source, options: TestOptions.UnsafeReleaseDll).VerifyDiagnostics();
}
[WorkItem(529603, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529603")]
[Fact]
public void TernaryOperator()
{
var source = prefix + @"
public static void M8()
{
int b = 1;
int c = 1;
int d = 1;
bool x = true;
bool y = false;
bool z = false;
// ?: operator
// Check for state before exprtrue:
/* NDA --> NDA */ { int a; if (x ? F(a) : F(b)) b = c; else d = c; } // Error
/* DAT --> DA */ { int a; if ((x && G(out a)) ? F(a) : F(b)) b = c; else d = c; } // OK
/* DAF --> NDA */ { int a; if ((x || G(out a)) ? F(a) : F(b)) b = c; else d = c; } // Error
/* DA --> DA */ { int a; if (G(out a) ? F(a) : F(b)) b = c; else d = c; } // OK
// Check for state before exprfalse:
/* NDA --> NDA */ { int a; if (x ? F(b) : F(a)) b = c; else d = c; } // Error
/* DAT --> NDA */ { int a; if ((x && G(out a)) ? F(b) : F(a)) b = c; else d = c; } // Error
/* DAF --> DA */ { int a; if ((x || G(out a)) ? F(b) : F(a)) b = c; else d = c; } // OK
/* DA --> DA */ { int a; if (G(out a) ? F(b) : F(a)) b = c; else d = c; } // OK
// Check for state after expr:
/* NDA?NDA:NDA-->NDA */ { int a; if (x ? y : z) b = a; else d = c; } // Error
/* NDA?NDA:NDA-->NDA */ { int a; if (x ? y : z) b = c; else d = a; } // Error
/* NDA?NDA:DAT-->NDA */ { int a; if (x ? y : (z && G(out a))) b = a; else d = c; } // Error
/* NDA?NDA:DAT-->NDA */ { int a; if (x ? y : (z && G(out a))) b = c; else d = a; } // Error
/* NDA?NDA:DAF-->NDA */ { int a; if (x ? y : (z || G(out a))) b = a; else d = c; } // Error
/* NDA?NDA:DAF-->NDA */ { int a; if (x ? y : (z || G(out a))) b = c; else d = a; } // Error
/* NDA?NDA:DA -->NDA */ { int a; if (x ? y : G(out a)) b = a; else d = c; } // Error
/* NDA?NDA:DA -->NDA */ { int a; if (x ? y : G(out a)) b = c; else d = a; } // Error
/* NDA?DAT:NDA-->NDA */ { int a; if (x ? (y && G(out a)) : z) b = a; else d = c; } // Error
/* NDA?DAT:NDA-->NDA */ { int a; if (x ? (y && G(out a)) : z) b = c; else d = a; } // Error
/* NDA?DAT:DAT-->DAT */ { int a; if (x ? (y && G(out a)) : (z && G(out a))) b = a; else d = c; } // OK
/* NDA?DAT:DAT-->DAT */ { int a; if (x ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
/* NDA?DAT:DAF-->NDA */ { int a; if (x ? (y && G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
/* NDA?DAT:DAF-->NDA */ { int a; if (x ? (y && G(out a)) : (z || G(out a))) b = c; else d = a; } // Error
/* NDA?DAT:DA -->DAT */ { int a; if (x ? (y && G(out a)) : G(out a)) b = a; else d = c; } // OK
/* NDA?DAT:DA -->DAT */ { int a; if (x ? (y && G(out a)) : G(out a)) b = c; else d = a; } // Error
/* NDA?DAF:NDA-->NDA */ { int a; if (x ? (y || G(out a)) : z) b = a; else d = c; } // Error
/* NDA?DAF:NDA-->NDA */ { int a; if (x ? (y || G(out a)) : z) b = c; else d = a; } // Error
/* NDA?DAF:DAT-->NDA */ { int a; if (x ? (y || G(out a)) : (z && G(out a))) b = a; else d = c; } // Error
/* NDA?DAF:DAT-->NDA */ { int a; if (x ? (y || G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
/* NDA?DAF:DAF-->DAF */ { int a; if (x ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
/* NDA?DAF:DAF-->DAF */ { int a; if (x ? (y || G(out a)) : (z || G(out a))) b = c; else d = a; } // OK
/* NDA?DAF:DA -->DAF */ { int a; if (x ? (y || G(out a)) : G(out a)) b = a; else d = c; } // Error
/* NDA?DAF:DA -->DAF */ { int a; if (x ? (y || G(out a)) : G(out a)) b = c; else d = a; } // OK
/* NDA?DA :NDA-->NDA */ { int a; if (x ? G(out a) : z) b = a; else d = c; } // Error
/* NDA?DA :NDA-->NDA */ { int a; if (x ? G(out a) : z) b = c; else d = a; } // Error
/* NDA?DA :DAT-->DAT */ { int a; if (x ? G(out a) : (z && G(out a))) b = a; else d = c; } // OK
/* NDA?DA :DAT-->DAT */ { int a; if (x ? G(out a) : (z && G(out a))) b = c; else d = a; } // Error
/* NDA?DA :DAF-->DAF */ { int a; if (x ? G(out a) : (z || G(out a))) b = a; else d = c; } // Error
/* NDA?DA :DAF-->DAF */ { int a; if (x ? G(out a) : (z || G(out a))) b = c; else d = a; } // OK
/* NDA?DA :DA -->DA */ { int a; if (x ? G(out a) : G(out a)) b = a; else d = a; } // OK
/* DAT?NDA:NDA-->NDA */ { int a; if ((x && G(out a)) ? y : z) b = a; else d = c; } // Error
/* DAT?NDA:NDA-->NDA */ { int a; if ((x && G(out a)) ? y : z) b = c; else d = a; } // Error
/* DAT?NDA:DAT-->DAT */ { int a; if ((x && G(out a)) ? y : (z && G(out a))) b = a; else d = c; } // OK
/* DAT?NDA:DAT-->DAT */ { int a; if ((x && G(out a)) ? y : (z && G(out a))) b = c; else d = a; } // Error
/* DAT?NDA:DAF-->DAF */ { int a; if ((x && G(out a)) ? y : (z || G(out a))) b = a; else d = c; } // Error
/* DAT?NDA:DAF-->DAF */ { int a; if ((x && G(out a)) ? y : (z || G(out a))) b = c; else d = a; } // OK
/* DAT?NDA:DA -->DA */ { int a; if ((x && G(out a)) ? y : G(out a)) b = a; else d = a; } // OK
/* DAT?DAT:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y && G(out a)) : z) b = a; else d = c; } // Error
/* DAT?DAT:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y && G(out a)) : z) b = c; else d = a; } // Error
/* DAT?DAT:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z && G(out a))) b = a; else d = c; } // OK
/* DAT?DAT:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
/* DAT?DAT:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
/* DAT?DAT:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z || G(out a))) b = c; else d = a; } // OK
/* DAT?DAT:DA -->DA */ { int a; if ((x && G(out a)) ? (y && G(out a)) : G(out a)) b = a; else d = a; } // OK
/* DAT?DAF:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y || G(out a)) : z) b = a; else d = c; } // Error
/* DAT?DAF:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y || G(out a)) : z) b = c; else d = a; } // Error
/* DAT?DAF:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z && G(out a))) b = a; else d = c; } // OK
/* DAT?DAF:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
/* DAT?DAF:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
/* DAT?DAF:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z || G(out a))) b = c; else d = a; } // OK
/* DAT?DAF:DA -->DA */ { int a; if ((x && G(out a)) ? (y || G(out a)) : G(out a)) b = a; else d = a; } // OK
/* DAT?DA :NDA-->NDA */ { int a; if ((x && G(out a)) ? G(out a) : z) b = a; else d = c; } // Error
/* DAT?DA :NDA-->NDA */ { int a; if ((x && G(out a)) ? G(out a) : z) b = c; else d = a; } // Error
/* DAT?DA :DAT-->DAT */ { int a; if ((x && G(out a)) ? G(out a) : (z && G(out a))) b = a; else d = c; } // OK
/* DAT?DA :DAT-->DAT */ { int a; if ((x && G(out a)) ? G(out a) : (z && G(out a))) b = c; else d = a; } // Error
/* DAT?DA :DAF-->DAF */ { int a; if ((x && G(out a)) ? G(out a) : (z || G(out a))) b = a; else d = c; } // Error
/* DAT?DA :DAF-->DAF */ { int a; if ((x && G(out a)) ? G(out a) : (z || G(out a))) b = c; else d = a; } // OK
/* DAT?DA :DA -->DA */ { int a; if ((x && G(out a)) ? G(out a) : G(out a)) b = a; else d = a; } // OK
/* DAF?NDA:NDA-->NDA */ { int a; if ((x || G(out a)) ? y : z) b = a; else d = c; } // Error
/* DAF?NDA:NDA-->NDA */ { int a; if ((x || G(out a)) ? y : z) b = c; else d = a; } // Error
/* DAF?NDA:DAT-->NDA */ { int a; if ((x || G(out a)) ? y : (z && G(out a))) b = a; else d = c; } // Error
/* DAF?NDA:DAT-->NDA */ { int a; if ((x || G(out a)) ? y : (z && G(out a))) b = c; else d = a; } // Error
/* DAF?NDA:DAF-->NDA */ { int a; if ((x || G(out a)) ? y : (z || G(out a))) b = a; else d = c; } // Error
/* DAF?NDA:DAF-->NDA */ { int a; if ((x || G(out a)) ? y : (z || G(out a))) b = c; else d = a; } // Error
/* DAF?NDA:DA -->NDA */ { int a; if ((x || G(out a)) ? y : G(out a)) b = c; else d = a; } // Error
/* DAF?NDA:DA -->NDA */ { int a; if ((x || G(out a)) ? y : G(out a)) b = c; else d = a; } // Error
/* DAF?DAT:NDA-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : z) b = a; else d = c; } // OK
/* DAF?DAT:NDA-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : z) b = c; else d = a; } // Error
/* DAF?DAT:DAT-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z && G(out a))) b = a; else d = c; } // OK
/* DAF?DAT:DAT-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
/* DAF?DAT:DAF-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z || G(out a))) b = a; else d = c; } // OK
/* DAF?DAT:DAF-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z || G(out a))) b = c; else d = a; } // Error
/* DAF?DAT:DA -->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : G(out a)) b = a; else d = c; } // OK
/* DAF?DAT:DA -->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : G(out a)) b = c; else d = a; } // Error
/* DAF?DAF:NDA-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : z) b = a; else d = c; } // Error
/* DAF?DAF:NDA-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : z) b = c; else d = a; } // OK
/* DAF?DAF:DAT-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z && G(out a))) b = a; else d = c; } // Error
/* DAF?DAF:DAT-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z && G(out a))) b = c; else d = a; } // OK
/* DAF?DAF:DAF-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
/* DAF?DAF:DAF-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z || G(out a))) b = c; else d = a; } // OK
/* DAF?DAF:DA -->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : G(out a)) b = a; else d = c; } // Error
/* DAF?DAF:DA -->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : G(out a)) b = c; else d = a; } // OK
/* DAF?DA :NDA-->DA */ { int a; if ((x || G(out a)) ? G(out a) : z) b = a; else d = a; } // OK
/* DAF?DA :DAT-->DA */ { int a; if ((x || G(out a)) ? G(out a) : (z && G(out a))) b = a; else d = a; } // OK
/* DAF?DA :DAF-->DA */ { int a; if ((x || G(out a)) ? G(out a) : (z || G(out a))) b = a; else d = a; } // OK
/* DAF?DA :DA -->DA */ { int a; if ((x || G(out a)) ? G(out a) : G(out a)) b = a; else d = a; } // OK
/* DA ?NDA:NDA-->DA */ { int a; if (G(out a) ? y : z) b = a; else d = a; } // OK
/* DA ?NDA:DAT-->DA */ { int a; if (G(out a) ? y : (z && G(out a))) b = a; else d = a; } // OK
/* DA ?NDA:DAF-->DA */ { int a; if (G(out a) ? y : (z || G(out a))) b = a; else d = a; } // OK
/* DA ?NDA:DA -->DA */ { int a; if (G(out a) ? y : G(out a)) b = a; else d = a; } // OK
/* DA ?DAT:NDA-->DA */ { int a; if (G(out a) ? (y && G(out a)) : z) b = a; else d = a; } // OK
/* DA ?DAT:DAT-->DA */ { int a; if (G(out a) ? (y && G(out a)) : (z && G(out a))) b = a; else d = a; } // OK
/* DA ?DAT:DAF-->DA */ { int a; if (G(out a) ? (y && G(out a)) : (z || G(out a))) b = a; else d = a; } // OK
/* DA ?DAT:DA -->DA */ { int a; if (G(out a) ? (y && G(out a)) : G(out a)) b = a; else d = a; } // OK
/* DA ?DAF:NDA-->DA */ { int a; if (G(out a) ? (y || G(out a)) : z) b = a; else d = a; } // OK
/* DA ?DAF:DAT-->DA */ { int a; if (G(out a) ? (y || G(out a)) : (z && G(out a))) b = a; else d = a; } // OK
/* DA ?DAF:DAF-->DA */ { int a; if (G(out a) ? (y || G(out a)) : (z || G(out a))) b = a; else d = a; } // OK
/* DA ?DAF:DA -->DA */ { int a; if (G(out a) ? (y || G(out a)) : G(out a)) b = a; else d = a; } // OK
/* DA ?DA :NDA-->DA */ { int a; if (G(out a) ? G(out a) : z) b = a; else d = a; } // OK
/* DA ?DA :DAT-->DA */ { int a; if (G(out a) ? G(out a) : (z && G(out a))) b = a; else d = a; } // OK
/* DA ?DA :DAF-->DA */ { int a; if (G(out a) ? G(out a) : (z || G(out a))) b = a; else d = a; } // OK
}
" + suffix;
CreateCompilation(source).VerifyDiagnostics(
// (87,58): error CS0165: Use of unassigned local variable 'a'
// /* NDA --> NDA */ { int a; if (x ? F(a) : F(b)) b = c; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(87, 58),
// (89,58): error CS0165: Use of unassigned local variable 'a'
// /* DAF --> NDA */ { int a; if ((x || G(out a)) ? F(a) : F(b)) b = c; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(89, 58),
// (94,65): error CS0165: Use of unassigned local variable 'a'
// /* NDA --> NDA */ { int a; if (x ? F(b) : F(a)) b = c; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(94, 65),
// (95,65): error CS0165: Use of unassigned local variable 'a'
// /* DAT --> NDA */ { int a; if ((x && G(out a)) ? F(b) : F(a)) b = c; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(95, 65),
// (101,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:NDA-->NDA */ { int a; if (x ? y : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(101, 95),
// (102,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:NDA-->NDA */ { int a; if (x ? y : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(102, 107),
// (103,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DAT-->NDA */ { int a; if (x ? y : (z && G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(103, 95),
// (104,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DAT-->NDA */ { int a; if (x ? y : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(104, 107),
// (105,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DAF-->NDA */ { int a; if (x ? y : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(105, 95),
// (106,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DAF-->NDA */ { int a; if (x ? y : (z || G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(106, 107),
// (107,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DA -->NDA */ { int a; if (x ? y : G(out a)) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(107, 95),
// (108,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?NDA:DA -->NDA */ { int a; if (x ? y : G(out a)) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(108, 107),
// (109,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:NDA-->NDA */ { int a; if (x ? (y && G(out a)) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(109, 95),
// (110,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:NDA-->NDA */ { int a; if (x ? (y && G(out a)) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(110, 107),
// (112,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:DAT-->DAT */ { int a; if (x ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(112, 107),
// (113,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:DAF-->NDA */ { int a; if (x ? (y && G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(113, 95),
// (114,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:DAF-->NDA */ { int a; if (x ? (y && G(out a)) : (z || G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(114, 107),
// (116,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAT:DA -->DAT */ { int a; if (x ? (y && G(out a)) : G(out a)) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(116, 107),
// (117,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:NDA-->NDA */ { int a; if (x ? (y || G(out a)) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(117, 95),
// (118,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:NDA-->NDA */ { int a; if (x ? (y || G(out a)) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(118, 107),
// (119,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:DAT-->NDA */ { int a; if (x ? (y || G(out a)) : (z && G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(119, 95),
// (120,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:DAT-->NDA */ { int a; if (x ? (y || G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(120, 107),
// (121,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:DAF-->DAF */ { int a; if (x ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(121, 95),
// (123,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DAF:DA -->DAF */ { int a; if (x ? (y || G(out a)) : G(out a)) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(123, 95),
// (125,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DA :NDA-->NDA */ { int a; if (x ? G(out a) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(125, 95),
// (126,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DA :NDA-->NDA */ { int a; if (x ? G(out a) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(126, 107),
// (128,107): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DA :DAT-->DAT */ { int a; if (x ? G(out a) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(128, 107),
// (129,95): error CS0165: Use of unassigned local variable 'a'
// /* NDA?DA :DAF-->DAF */ { int a; if (x ? G(out a) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(129, 95),
// (132,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?NDA:NDA-->NDA */ { int a; if ((x && G(out a)) ? y : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(132, 95),
// (133,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?NDA:NDA-->NDA */ { int a; if ((x && G(out a)) ? y : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(133, 107),
// (135,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?NDA:DAT-->DAT */ { int a; if ((x && G(out a)) ? y : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(135, 107),
// (136,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?NDA:DAF-->DAF */ { int a; if ((x && G(out a)) ? y : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(136, 95),
// (139,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAT:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y && G(out a)) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(139, 95),
// (140,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAT:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y && G(out a)) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(140, 107),
// (142,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAT:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(142, 107),
// (143,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAT:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y && G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(143, 95),
// (146,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAF:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y || G(out a)) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(146, 95),
// (147,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAF:NDA-->NDA */ { int a; if ((x && G(out a)) ? (y || G(out a)) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(147, 107),
// (149,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAF:DAT-->DAT */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(149, 107),
// (150,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DAF:DAF-->DAF */ { int a; if ((x && G(out a)) ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(150, 95),
// (153,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DA :NDA-->NDA */ { int a; if ((x && G(out a)) ? G(out a) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(153, 95),
// (154,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DA :NDA-->NDA */ { int a; if ((x && G(out a)) ? G(out a) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(154, 107),
// (156,107): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DA :DAT-->DAT */ { int a; if ((x && G(out a)) ? G(out a) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(156, 107),
// (157,95): error CS0165: Use of unassigned local variable 'a'
// /* DAT?DA :DAF-->DAF */ { int a; if ((x && G(out a)) ? G(out a) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(157, 95),
// (160,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:NDA-->NDA */ { int a; if ((x || G(out a)) ? y : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(160, 95),
// (161,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:NDA-->NDA */ { int a; if ((x || G(out a)) ? y : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(161, 107),
// (162,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DAT-->NDA */ { int a; if ((x || G(out a)) ? y : (z && G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(162, 95),
// (163,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DAT-->NDA */ { int a; if ((x || G(out a)) ? y : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(163, 107),
// (164,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DAF-->NDA */ { int a; if ((x || G(out a)) ? y : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(164, 95),
// (165,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DAF-->NDA */ { int a; if ((x || G(out a)) ? y : (z || G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(165, 107),
// (166,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DA -->NDA */ { int a; if ((x || G(out a)) ? y : G(out a)) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(166, 107),
// (167,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?NDA:DA -->NDA */ { int a; if ((x || G(out a)) ? y : G(out a)) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(167, 107),
// (169,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAT:NDA-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : z) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(169, 107),
// (171,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAT:DAT-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z && G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(171, 107),
// (173,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAT:DAF-->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : (z || G(out a))) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(173, 107),
// (175,107): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAT:DA -->DAT */ { int a; if ((x || G(out a)) ? (y && G(out a)) : G(out a)) b = c; else d = a; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(175, 107),
// (176,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAF:NDA-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : z) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(176, 95),
// (178,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAF:DAT-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z && G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(178, 95),
// (180,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAF:DAF-->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : (z || G(out a))) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(180, 95),
// (182,95): error CS0165: Use of unassigned local variable 'a'
// /* DAF?DAF:DA -->DAF */ { int a; if ((x || G(out a)) ? (y || G(out a)) : G(out a)) b = a; else d = c; } // Error
Diagnostic(ErrorCode.ERR_UseDefViolation, "a").WithArguments("a").WithLocation(182, 95)
);
}
[Fact, WorkItem(529603, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529603")]
public void IfConditionalAnd()
{
var source = @"
class C
{
static void Main(string[] args)
{
bool a = true, b = true, c = true; // values don't matter
int x;
if (a ? (b && Set(out x)) : (c && Set(out x)))
{
int y = x; // x is definitely assigned if we reach this point
}
}
static bool Set(out int x)
{
x = 1;
return true;
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void CondAccess_NullCoalescing_01()
{
var source = @"
class C
{
void M1(C c)
{
int x, y;
_ = c?.M(out x, out y) ?? true
? x.ToString() // 1
: y.ToString();
}
void M2(C c)
{
int x, y;
_ = c?.M(out x, out y) ?? false
? x.ToString()
: y.ToString(); // 2;
}
bool M(out int x, out int y) { x = 42; y = 42; return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (8,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(8, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2;
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_02()
{
var source = @"
class C
{
void M1(C c1, C c2)
{
int x, y;
_ = c1?.M(out x, out y) ?? c2?.M(out x, out y) ?? true
? x.ToString() // 1
: y.ToString();
}
void M2(C c1, C c2)
{
int x, y;
_ = c1?.M(out x, out y) ?? c2?.M(out x, out y) ?? false
? x.ToString()
: y.ToString(); // 2;
}
bool M(out int x, out int y) { x = 42; y = 42; return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (8,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(8, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2;
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_03()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = c1?.MA().MB(out x, out y) ?? false
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = c1?.MA()?.MB(out x, out y) ?? false
? x.ToString()
: y.ToString(); // 2
}
C MA() { return this; }
bool MB(out int x, out int y) { x = 42; y = 42; return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_04()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = c1?.MA(out x, out y).MB() ?? false
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = c1?.MA(out x, out y)?.MB() ?? false
? x.ToString()
: y.ToString(); // 2
}
C MA(out int x, out int y) { x = 42; y = 42; return this; }
bool MB() { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_05()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = c1?.MA(c1.MB(out x, out y)) ?? false
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = c1?.MA(c1?.MB(out x, out y)) ?? false
? x.ToString() // 2
: y.ToString(); // 3
}
bool MA(object obj) { return true; }
C MB(out int x, out int y) { x = 42; y = 42; return this; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15),
// (16,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(16, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_06()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = c1?.M(x = y = 0) ?? true
? x.ToString() // 1
: y.ToString();
}
void M2(C c1)
{
int x, y;
_ = c1?.M(x = y = 0) ?? false
? x.ToString()
: y.ToString(); // 2
}
bool M(object obj) { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (8,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(8, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_07()
{
var source = @"
class C
{
void M1(bool b, C c1)
{
int x, y;
_ = c1?.M(x = y = 0) ?? b
? x.ToString() // 1
: y.ToString(); // 2
}
bool M(object obj) { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (8,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(8, 15),
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15));
}
[Fact]
public void CondAccess_NullCoalescing_08()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = (c1?.M(x = y = 0)) ?? false
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = c1?.M(x = y = 0)! ?? false
? x.ToString()
: y.ToString(); // 2
}
void M3(C c1)
{
int x, y;
_ = (c1?.M(x = y = 0))! ?? false
? x.ToString()
: y.ToString(); // 3
}
bool M(object obj) { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15),
// (17,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(17, 15),
// (25,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(25, 15));
}
[Fact]
public void CondAccess_NullCoalescing_09()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = (c1?[x = y = 0]) ?? false
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = (c1?[x = y = 0]) ?? true
? x.ToString() // 2
: y.ToString();
}
public bool this[int x] => false;
}
";
CreateCompilation(source).VerifyDiagnostics(
// (10,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(10, 15),
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15));
}
[Fact]
public void CondAccess_NullCoalescing_10()
{
var source = @"
class C
{
void M1(C c1)
{
int x, y;
_ = (bool?)null ?? (c1?.M(x = y = 0) ?? false)
? x.ToString()
: y.ToString(); // 1
}
void M2(C c1)
{
int x, y;
_ = (bool?)null ?? (c1?.M(x = y = 0) ?? true)
? x.ToString() // 2
: y.ToString();
}
bool M(object obj) { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (10,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(10, 15),
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15));
}
[Fact]
public void NullCoalescing_CondAccess_NonNullConstantLeft()
{
var source = @"
#nullable enable
static class C
{
static string M0(this string s, object x) => s;
static void M1()
{
object x, y;
_ = """"?.Equals(x = y = new object()) ?? false
? x.ToString()
: y.ToString();
}
static void M2()
{
object w, x, y, z;
_ = """"?.M0(w = x = new object())?.Equals(y = z = new object()) ?? false
? w.ToString() + y.ToString()
: x.ToString() + z.ToString(); // 1
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (21,30): error CS0165: Use of unassigned local variable 'z'
// : x.ToString() + z.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "z").WithArguments("z").WithLocation(21, 30)
);
}
[Fact]
public void NullCoalescing_NonNullConstantLeft()
{
var source = @"
#nullable enable
static class C
{
static void M1()
{
object x;
_ = """" ?? $""{x.ToString()}""; // unreachable
_ = """".ToString() ?? $""{x.ToString()}""; // 1
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (10,33): error CS0165: Use of unassigned local variable 'x'
// _ = "".ToString() ?? $"{x.ToString()}"; // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(10, 33)
);
}
[Fact]
public void NullCoalescing_ConditionalLeft()
{
var source = @"
class C
{
void M1(C c1, bool b)
{
int x, y;
_ = (bool?)(b && c1.M(x = y = 0)) ?? false
? x.ToString() // 1
: y.ToString(); // 2
}
void M2(C c1, bool b)
{
int x, y;
_ = (bool?)c1.M(x = y = 0) ?? false
? x.ToString()
: y.ToString();
}
void M3(C c1, bool b)
{
int x, y;
_ = (bool?)((y = 0) is 0 && c1.M(x = 0)) ?? false
? x.ToString() // 3
: y.ToString();
}
bool M(object obj) { return true; }
}
";
// Note that in definite assignment we unsplit any conditional state after visiting the left side of `??`.
CreateCompilation(source).VerifyDiagnostics(
// (8,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(8, 15),
// (9,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(9, 15),
// (24,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(24, 15));
}
[Fact]
public void NullCoalescing_CondAccess_Throw()
{
var source = @"
class C
{
void M1(C c1, bool b)
{
int x;
_ = c1?.M(x = 0) ?? throw new System.Exception();
x.ToString();
}
bool M(object obj) { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_Cast()
{
var source = @"
class C
{
void M1(C c1, bool b)
{
int x;
_ = (object)c1?.M(x = 0) ?? throw new System.Exception();
x.ToString();
}
C M(object obj) { return this; }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_UserDefinedConv_01()
{
var source = @"
struct S { }
struct C
{
public static implicit operator S(C? c)
{
return default(S);
}
void M1(C? c1)
{
int x;
S s = c1?.M2(x = 0) ?? c1.Value.M3(x = 0);
x.ToString();
}
C M2(object obj) { return this; }
S M3(object obj) { return this; }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_UserDefinedConv_02()
{
var source = @"
class B { }
class C
{
public static implicit operator B(C c) => new B();
void M1(C c1)
{
int x;
B b = c1?.M1(x = 0) ?? c1!.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B M2(object obj) { return new B(); }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_UserDefinedConv_03()
{
var source = @"
struct B { }
struct C
{
public static implicit operator B(C c) => new B();
void M1(C? c1)
{
int x;
B b = c1?.M1(x = 0) ?? c1!.Value.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B M2(object obj) { return new B(); }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_UserDefinedConv_04()
{
var source = @"
struct B { }
struct C
{
public static implicit operator B?(C c) => null;
void M1(C? c1)
{
int x;
B? b = c1?.M1(x = 0) ?? c1!.Value.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B? M2(object obj) { return new B(); }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NullCoalescing_CondAccess_UserDefinedConv_05()
{
var source = @"
struct B
{
public static implicit operator B(C c) => default;
}
class C
{
static void M1(C c1)
{
int x;
B b = c1?.M1(x = 0) ?? c1.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B M2(object obj) { return this; }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Theory]
[InlineData("explicit")]
[InlineData("implicit")]
public void NullCoalescing_CondAccess_ExplicitUserDefinedConv_01(string conversionKind)
{
var source = @"
struct S { }
struct C
{
public static " + conversionKind + @" operator S(C? c)
{
return default(S);
}
void M1(C? c1)
{
int x;
S s = (S?)c1?.M2(x = 0) ?? c1.Value.M3(x = 0);
x.ToString(); // 1
}
C M2(object obj) { return this; }
S M3(object obj) { return (S)this; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (15,9): error CS0165: Use of unassigned local variable 'x'
// x.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(15, 9));
}
[Theory]
[InlineData("explicit")]
[InlineData("implicit")]
public void NullCoalescing_CondAccess_ExplicitUserDefinedConv_02(string conversionKind)
{
var source = @"
class B { }
class C
{
public static " + conversionKind + @" operator B(C c) => new B();
void M1(C c1)
{
int x;
B b = (B)c1?.M1(x = 0) ?? c1!.M2(x = 0);
x.ToString(); // 1
}
C M1(object obj) { return this; }
B M2(object obj) { return new B(); }
}
";
// If the LHS of a `??` is cast using a user-defined conversion whose parameter
// is not a non-nullable value type, we can't propagate out the "state when not null"
// because we can't know whether the conditional access itself was non-null.
CreateCompilation(source).VerifyDiagnostics(
// (11,9): error CS0165: Use of unassigned local variable 'x'
// x.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 9));
}
[Theory]
[InlineData("explicit")]
[InlineData("implicit")]
public void NullCoalescing_CondAccess_ExplicitUserDefinedConv_03(string conversionKind)
{
var source = @"
struct B { }
struct C
{
public static " + conversionKind + @" operator B(C c) => new B();
void M1(C? c1)
{
int x;
B b = (B?)c1?.M1(x = 0) ?? c1!.Value.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B M2(object obj) { return new B(); }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Theory]
[InlineData("explicit")]
[InlineData("implicit")]
public void NullCoalescing_CondAccess_ExplicitUserDefinedConv_04(string conversionKind)
{
var source = @"
struct B { }
struct C
{
public static " + conversionKind + @" operator B?(C c) => null;
void M1(C? c1)
{
int x;
B? b = (B?)c1?.M1(x = 0) ?? c1!.Value.M2(x = 0);
x.ToString();
}
C M1(object obj) { return this; }
B? M2(object obj) { return new B(); }
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Theory]
[InlineData("explicit")]
[InlineData("implicit")]
public void NullCoalescing_CondAccess_ExplicitUserDefinedConv_05(string conversionKind)
{
var source = @"
struct B
{
public static " + conversionKind + @" operator B(C c) => default;
}
class C
{
static void M1(C c1)
{
int x;
B b = (B?)c1?.M1(x = 0) ?? c1.M2(x = 0);
x.ToString(); // 1
}
C M1(object obj) { return this; }
B M2(object obj) { return default; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,9): error CS0165: Use of unassigned local variable 'x'
// x.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(13, 9));
}
[Fact]
public void NullCoalescing_CondAccess_NullableEnum()
{
var source = @"
public enum E { E1 = 1 }
public static class Extensions
{
public static E M1(this E e, object obj) => e;
static void M2(E? e)
{
int x;
E e2 = e?.M1(x = 0) ?? e.Value.M1(x = 0);
x.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[WorkItem(529603, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529603")]
[Theory]
[InlineData("true", "false")]
[InlineData("FIELD_TRUE", "FIELD_FALSE")]
[InlineData("LOCAL_TRUE", "LOCAL_FALSE")]
[InlineData("true || false", "true && false")]
[InlineData("!false", "!true")]
public void IfConditionalConstant(string @true, string @false)
{
var source = @"
#pragma warning disable 219 // The variable is assigned but its value is never used
class C
{
const bool FIELD_TRUE = true;
const bool FIELD_FALSE = false;
static void M(bool b)
{
const bool LOCAL_TRUE = true;
const bool LOCAL_FALSE = false;
{
int x, y;
if (b ? Set(out x) : " + @false + @")
y = x;
}
{
int x, y;
if (b ? Set(out x) : " + @true + @")
y = x; // 1
}
{
int x, y;
if (b ? " + @false + @" : Set(out x))
y = x;
}
{
int x, y;
if (b ? " + @true + @" : Set(out x))
y = x; // 2
}
static bool Set(out int x)
{
x = 1;
return true;
}
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (23,21): error CS0165: Use of unassigned local variable 'x'
// y = x; // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(23, 21),
// (35,21): error CS0165: Use of unassigned local variable 'x'
// y = x; // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(35, 21)
);
}
[Fact]
public void IfConditional_ComplexCondition_ConstantConsequence()
{
var source = @"
class C
{
bool M0(int x) => true;
void M1(bool b)
{
int x;
_ = (b && M0(x = 0) ? true : false)
? x.ToString()
: x.ToString(); // 1
}
void M2(bool b)
{
int x;
_ = (b && M0(x = 0) ? false : true)
? x.ToString() // 2
: x.ToString();
}
void M3(bool b)
{
int x;
_ = (b || M0(x = 0) ? true : false)
? x.ToString() // 3
: x.ToString();
}
void M4(bool b)
{
int x;
_ = (b || M0(x = 0) ? false : true)
? x.ToString()
: x.ToString(); // 4
}
}
";
var comp = CreateCompilation(source);
comp.VerifyDiagnostics(
// (11,15): error CS0165: Use of unassigned local variable 'x'
// : x.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 15),
// (18,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(18, 15),
// (26,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(26, 15),
// (35,15): error CS0165: Use of unassigned local variable 'x'
// : x.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(35, 15));
}
[Theory]
[InlineData("true", "false")]
[InlineData("!false", "!true")]
[InlineData("(true || false)", "(true && false)")]
public void EqualsBoolConstant_01(string @true, string @false)
{
var source = @"
#nullable enable
class C
{
public bool M0(out int x, out int y) { x = 42; y = 42; return true; }
public void M1(bool b)
{
int x, y;
_ = ((b && M0(out x, out y)) == " + @true + @")
? x.ToString()
: y.ToString(); // 1
}
public void M2(bool b)
{
int x, y;
_ = ((b && M0(out x, out y)) != " + @true + @")
? x.ToString() // 2
: y.ToString();
}
public void M3(bool b)
{
int x, y;
_ = ((b && M0(out x, out y)) == " + @false + @")
? x.ToString() // 3
: y.ToString();
}
public void M4(bool b)
{
int x, y;
_ = ((b && M0(out x, out y)) != " + @false + @")
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (28,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(28, 15),
// (37,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(37, 15)
);
}
[Theory]
[InlineData("true", "false")]
[InlineData("!false", "!true")]
[InlineData("(true || false)", "(true && false)")]
public void EqualsBoolConstant_02(string @true, string @false)
{
var source = @"
#nullable enable
class C
{
public bool M0(out int x, out int y) { x = 42; y = 42; return true; }
public void M1(bool b)
{
int x, y;
_ = (" + @true + @" == (b && M0(out x, out y)))
? x.ToString()
: y.ToString(); // 1
}
public void M2(bool b)
{
int x, y;
_ = (" + @true + @" != (b && M0(out x, out y)))
? x.ToString() // 2
: y.ToString();
}
public void M3(bool b)
{
int x, y;
_ = (" + @false + @" == (b && M0(out x, out y)))
? x.ToString() // 3
: y.ToString();
}
public void M4(bool b)
{
int x, y;
_ = (" + @false + @" != (b && M0(out x, out y)))
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (28,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(28, 15),
// (37,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(37, 15)
);
}
[Fact]
public void EqualsBoolConstant_03()
{
var source = @"
#nullable enable
class C
{
public bool M0(out int x, out int y) { x = 42; y = 42; return true; }
public void M1(bool b)
{
int x, y;
_ = ((b && M0(out x, out y)) == true != false)
? x.ToString()
: y.ToString(); // 1
}
public void M2(bool b)
{
int x, y;
_ = (false == (b && M0(out x, out y)) != true)
? x.ToString()
: y.ToString(); // 2
}
public void M3(bool b)
{
int x, y;
_ = (true == false != (b && M0(out x, out y)))
? x.ToString()
: y.ToString(); // 3
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(21, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15)
);
}
[Fact]
public void EqualsBoolConstant_04()
{
var source = @"
#nullable enable
class C
{
void M1(object obj)
{
_ = (obj is string x and string y == true)
? x.ToString()
: y.ToString(); // 1
}
void M2(object obj)
{
_ = (obj is string x and string y == false)
? x.ToString() // 2
: y.ToString();
}
void M3(object obj)
{
_ = (obj is string x and string y != true)
? x.ToString() // 3
: y.ToString();
}
void M4(object obj)
{
_ = (obj is string x and string y != false)
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (10,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(10, 15),
// (16,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(16, 15),
// (23,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(23, 15),
// (31,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(31, 15)
);
}
[Fact]
public void EqualsBoolConstant_05()
{
var source = @"
#nullable enable
class C
{
void M1(object obj)
{
_ = (true == obj is string x and string y)
? x.ToString()
: y.ToString(); // 1
}
void M2(object obj)
{
_ = (false == obj is string x and string y)
? x.ToString() // 2
: y.ToString();
}
void M3(object obj)
{
_ = (true != obj is string x and string y)
? x.ToString() // 3
: y.ToString();
}
void M4(object obj)
{
_ = (false != obj is string x and string y)
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (10,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(10, 15),
// (16,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(16, 15),
// (23,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(23, 15),
// (31,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(31, 15)
);
}
[Fact, WorkItem(56298, "https://github.com/dotnet/roslyn/issues/56298")]
public void Equals_IsPatternVariables_01()
{
var source = @"
#nullable enable
using System;
int? c = 4, d = null;
if ((c is int ci) != (d is int di))
Console.WriteLine(di.ToString()); // 1
";
CreateCompilation(source).VerifyDiagnostics(
// (6,23): error CS0165: Use of unassigned local variable 'di'
// Console.WriteLine(di.ToString()); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "di").WithArguments("di").WithLocation(6, 23)
);
}
[Fact, WorkItem(56298, "https://github.com/dotnet/roslyn/issues/56298")]
public void Equals_IsPatternVariables_02()
{
var source = @"
#nullable enable
int? c = 4, d = null;
_ = (c is int c1) != (d is int d1)
? c1.ToString() // 1
: d1.ToString(); // 2
_ = (c is int c2) == (d is int d2)
? c2.ToString() // 3
: d2.ToString(); // 4
";
CreateCompilation(source).VerifyDiagnostics(
// (6,7): error CS0165: Use of unassigned local variable 'c1'
// ? c1.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "c1").WithArguments("c1").WithLocation(6, 7),
// (7,7): error CS0165: Use of unassigned local variable 'd1'
// : d1.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "d1").WithArguments("d1").WithLocation(7, 7),
// (10,7): error CS0165: Use of unassigned local variable 'c2'
// ? c2.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "c2").WithArguments("c2").WithLocation(10, 7),
// (11,7): error CS0165: Use of unassigned local variable 'd2'
// : d2.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "d2").WithArguments("d2").WithLocation(11, 7)
);
}
[Theory]
[InlineData("b")]
[InlineData("true")]
[InlineData("false")]
public void EqualsCondAccess_01(string operand)
{
var source = @"
#nullable enable
class C
{
public bool M0(out int x, out int y) { x = 42; y = 42; return true; }
public void M1(C? c, bool b)
{
int x, y;
_ = c?.M0(out x, out y) == " + operand + @"
? x.ToString()
: y.ToString(); // 1
}
public void M2(C? c, bool b)
{
int x, y;
_ = c?.M0(out x, out y) != " + operand + @"
? x.ToString() // 2
: y.ToString();
}
public void M3(C? c, bool b)
{
int x, y;
_ = " + operand + @" == c?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 3
}
public void M4(C? c, bool b)
{
int x, y;
_ = " + operand + @" != c?.M0(out x, out y)
? x.ToString() // 4
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (36,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(36, 15)
);
}
[Theory]
[InlineData("i")]
[InlineData("42")]
public void EqualsCondAccess_02(string operand)
{
var source = @"
#nullable enable
class C
{
public int M0(out int x, out int y) { x = 1; y = 2; return 0; }
public void M1(C? c, int i)
{
int x, y;
_ = c?.M0(out x, out y) == " + operand + @"
? x.ToString()
: y.ToString(); // 1
}
public void M2(C? c, int i)
{
int x, y;
_ = c?.M0(out x, out y) != " + operand + @"
? x.ToString() // 2
: y.ToString();
}
public void M3(C? c, int i)
{
int x, y;
_ = " + operand + @" == c?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 3
}
public void M4(C? c, int i)
{
int x, y;
_ = " + operand + @" != c?.M0(out x, out y)
? x.ToString() // 4
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (36,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(36, 15)
);
}
[Theory]
[InlineData("object?")]
[InlineData("int?")]
[InlineData("bool?")]
public void EqualsCondAccess_03(string returnType)
{
var source = @"
#nullable enable
class C
{
public " + returnType + @" M0(out int x, out int y) { x = 42; y = 42; return null; }
public void M1(C? c)
{
int x, y;
_ = c?.M0(out x, out y) != null
? x.ToString()
: y.ToString(); // 1
}
public void M2(C? c)
{
int x, y;
_ = c?.M0(out x, out y) == null
? x.ToString() // 2
: y.ToString();
}
public void M3(C? c)
{
int x, y;
_ = null != c?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 3
}
public void M4(C? c)
{
int x, y;
_ = null == c?.M0(out x, out y)
? x.ToString() // 4
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (36,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(36, 15)
);
}
[Fact]
public void EqualsCondAccess_04()
{
var source = @"
#nullable enable
class C
{
public bool M0(out int x, out int y) { x = 42; y = 42; return false; }
public void M1(C? c, bool b)
{
int x1, y1, x2, y2;
_ = c?.M0(out x1, out y1) == c!.M0(out x2, out y2)
? x1.ToString() + x2.ToString()
: y1.ToString() + y2.ToString(); // 1
}
public void M2(C? c, bool b)
{
int x1, y1, x2, y2;
_ = c?.M0(out x1, out y1) != c!.M0(out x2, out y2)
? x1.ToString() + x2.ToString() // 2
: y1.ToString() + y2.ToString();
}
public void M3(C? c, bool b)
{
int x1, y1, x2, y2;
_ = c!.M0(out x2, out y2) == c?.M0(out x1, out y1)
? x1.ToString() + x2.ToString()
: y1.ToString() + y2.ToString(); // 3
}
public void M4(C? c, bool b)
{
int x1, y1, x2, y2;
_ = c!.M0(out x2, out y2) != c?.M0(out x1, out y1)
? x1.ToString() + x2.ToString() // 4
: y1.ToString() + y2.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y1'
// : y1.ToString() + y2.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y1").WithArguments("y1").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x1'
// ? x1.ToString() + x2.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(20, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y1'
// : y1.ToString() + y2.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y1").WithArguments("y1").WithLocation(29, 15),
// (36,15): error CS0165: Use of unassigned local variable 'x1'
// ? x1.ToString() + x2.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x1").WithArguments("x1").WithLocation(36, 15)
);
}
[Fact]
public void EqualsCondAccess_05()
{
var source = @"
#nullable enable
class C
{
public static bool operator ==(C? left, C? right) => false;
public static bool operator !=(C? left, C? right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public C? M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(C? c)
{
int x, y;
_ = c?.M0(out x, out y) != null
? x.ToString() // 1
: y.ToString(); // 2
}
public void M2(C? c)
{
int x, y;
_ = c?.M0(out x, out y) == null
? x.ToString() // 3
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15),
// (18,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(18, 15),
// (25,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(25, 15),
// (26,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(26, 15)
);
}
[Fact]
public void EqualsCondAccess_06()
{
var source = @"
#nullable enable
class C
{
public C? M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(C c)
{
int x1, y1, x2, y2;
_ = c.M0(out x1, out y1)?.M0(out x2, out y2) != null
? x1.ToString() + x2.ToString()
: y1.ToString() + y2.ToString(); // 1
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,31): error CS0165: Use of unassigned local variable 'y2'
// : y1.ToString() + y2.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y2").WithArguments("y2").WithLocation(13, 31)
);
}
[Fact]
public void EqualsCondAccess_07()
{
var source = @"
#nullable enable
struct S
{
public static bool operator ==(S left, S right) => false;
public static bool operator !=(S left, S right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public S M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(S? s)
{
int x, y;
_ = s?.M0(out x, out y) != null
? x.ToString()
: y.ToString(); // 1
}
public void M2(S? s)
{
int x, y;
_ = s?.M0(out x, out y) == null
? x.ToString() // 2
: y.ToString();
}
public void M3(S? s)
{
int x, y;
_ = null != s?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 3
}
public void M4(S? s)
{
int x, y;
_ = null == s?.M0(out x, out y)
? x.ToString() // 4
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (18,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(18, 15),
// (25,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(25, 15),
// (34,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(34, 15),
// (41,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(41, 15)
);
}
[Fact]
public void EqualsCondAccess_08()
{
var source = @"
#nullable enable
struct S
{
public static bool operator ==(S left, S right) => false;
public static bool operator !=(S left, S right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public S M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(S? s)
{
int x, y;
_ = s?.M0(out x, out y) != new S()
? x.ToString() // 1
: y.ToString();
}
public void M2(S? s)
{
int x, y;
_ = s?.M0(out x, out y) == new S()
? x.ToString()
: y.ToString(); // 2
}
public void M3(S? s)
{
int x, y;
_ = new S() != s?.M0(out x, out y)
? x.ToString() // 3
: y.ToString();
}
public void M4(S? s)
{
int x, y;
_ = new S() == s?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15),
// (26,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(26, 15),
// (33,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(33, 15),
// (42,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(42, 15)
);
}
[Fact]
public void EqualsCondAccess_09()
{
var source = @"
#nullable enable
struct S
{
public static bool operator ==(S left, S right) => false;
public static bool operator !=(S left, S right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public S M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(S? s)
{
int x, y;
_ = s?.M0(out x, out y) != s
? x.ToString() // 1
: y.ToString(); // 2
}
public void M2(S? s)
{
int x, y;
_ = s?.M0(out x, out y) == s
? x.ToString() // 3
: y.ToString(); // 4
}
public void M3(S? s)
{
int x, y;
_ = s != s?.M0(out x, out y)
? x.ToString() // 5
: y.ToString(); // 6
}
public void M4(S? s)
{
int x, y;
_ = s == s?.M0(out x, out y)
? x.ToString() // 7
: y.ToString(); // 8
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15),
// (18,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(18, 15),
// (25,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(25, 15),
// (26,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(26, 15),
// (33,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(33, 15),
// (34,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(34, 15),
// (41,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(41, 15),
// (42,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 8
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(42, 15)
);
}
[Theory]
[InlineData("S? left, S? right")]
[InlineData("S? left, S right")]
public void EqualsCondAccess_10(string operatorParameters)
{
var source = @"
#nullable enable
struct S
{
public static bool operator ==(" + operatorParameters + @") => false;
public static bool operator !=(" + operatorParameters + @") => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public S M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(S? s)
{
int x, y;
_ = s?.M0(out x, out y) != new S()
? x.ToString() // 1
: y.ToString(); // 2
}
public void M2(S? s)
{
int x, y;
_ = s?.M0(out x, out y) == new S()
? x.ToString() // 3
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15),
// (18,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(18, 15),
// (25,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(25, 15),
// (26,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(26, 15)
);
}
[Fact]
public void EqualsCondAccess_11()
{
var source = @"
#nullable enable
struct T
{
public static implicit operator S(T t) => new S();
public T M0(out int x, out int y) { x = 42; y = 42; return this; }
}
struct S
{
public static bool operator ==(S left, S right) => false;
public static bool operator !=(S left, S right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public void M1(T? t)
{
int x, y;
_ = t?.M0(out x, out y) != new S()
? x.ToString() // 1
: y.ToString();
}
public void M2(T? t)
{
int x, y;
_ = t?.M0(out x, out y) == new S()
? x.ToString()
: y.ToString(); // 2
}
public void M3(T? t)
{
int x, y;
_ = new S() != t?.M0(out x, out y)
? x.ToString() // 3
: y.ToString();
}
public void M4(T? t)
{
int x, y;
_ = new S() == t?.M0(out x, out y)
? x.ToString()
: y.ToString(); // 4
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (21,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(21, 15),
// (30,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(30, 15),
// (37,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(37, 15),
// (46,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(46, 15)
);
}
[Fact]
public void EqualsCondAccess_12()
{
var source = @"
#nullable enable
class C
{
int? M0(object obj) => null;
void M1(C? c, object? obj)
{
int x, y;
_ = (c?.M0(x = y = 0) == (int?)obj)
? x.ToString() // 1
: y.ToString(); // 2
}
void M2(C? c, object? obj)
{
int x, y;
_ = (c?.M0(x = y = 0) == (int?)null)
? x.ToString() // 3
: y.ToString();
}
void M3(C? c, object? obj)
{
int x, y;
_ = (c?.M0(x = y = 0) == null)
? x.ToString() // 4
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(12, 15),
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (28,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(28, 15)
);
}
[Fact]
public void EqualsCondAccess_13()
{
var source = @"
#nullable enable
class C
{
long? M0(object obj) => null;
void M(C? c, int i)
{
int x, y;
_ = (c?.M0(x = y = 0) == i)
? x.ToString()
: y.ToString(); // 2
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(12, 15)
);
}
[Fact]
public void EqualsCondAccess_14()
{
var source = @"
#nullable enable
class C
{
long? M0(object obj) => null;
void M(C? c, int? i)
{
int x, y;
_ = (c?.M0(x = y = 0) == i)
? x.ToString() // 1
: y.ToString(); // 2
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (11,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 15),
// (12,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(12, 15)
);
}
[Fact]
public void EqualsCondAccess_15()
{
var source = @"
#nullable enable
class C
{
C M0(object obj) => this;
void M(C? c)
{
int x, y;
_ = ((object?)c?.M0(x = y = 0) != null)
? x.ToString()
: y.ToString(); // 1
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(12, 15)
);
}
[Fact]
public void EqualsCondAccess_16()
{
var source = @"
#nullable enable
class C
{
void M()
{
int x, y;
_ = ""a""?.Equals(x = y = 0) == true
? x.ToString()
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
);
}
[Fact]
public void EqualsCondAccess_17()
{
var source = @"
#nullable enable
class C
{
void M(C? c)
{
int x, y;
_ = (c?.Equals(x = 0), c?.Equals(y = 0)) == (true, true)
? x.ToString() // 1
: y.ToString(); // 2
}
}
";
// This could be made to work (i.e. removing diagnostic 1) but isn't a high priority scenario.
// The corresponding scenario in nullable also doesn't work:
// void M(string? x, string? y)
// {
// if ((x, y) == ("a", "b"))
// {
// x.ToString(); // warning
// y.ToString(); // warning
// }
// }
// https://github.com/dotnet/roslyn/issues/50980
CreateCompilation(source).VerifyDiagnostics(
// (10,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(10, 15),
// (11,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(11, 15)
);
}
[Fact]
public void EqualsCondAccess_18()
{
var source = @"
#nullable enable
class C
{
public static bool operator ==(C? left, C? right) => false;
public static bool operator !=(C? left, C? right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public C M0(out int x, out int y) { x = 42; y = 42; return this; }
public void M1(C? c)
{
int x, y;
_ = c?.M0(out x, out y) != null
? x.ToString() // 1
: y.ToString(); // 2
}
public void M2(C? c)
{
int x, y;
_ = c?.M0(out x, out y) == null
? x.ToString() // 3
: y.ToString(); // 4
}
public void M3(C? c)
{
int x, y;
_ = null != c?.M0(out x, out y)
? x.ToString() // 5
: y.ToString(); // 6
}
public void M4(C? c)
{
int x, y;
_ = null == c?.M0(out x, out y)
? x.ToString() // 7
: y.ToString(); // 8
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (17,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(17, 15),
// (18,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(18, 15),
// (25,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(25, 15),
// (26,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(26, 15),
// (33,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(33, 15),
// (34,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(34, 15),
// (41,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(41, 15),
// (42,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 8
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(42, 15)
);
}
[Fact]
public void EqualsCondAccess_19()
{
var source = @"
#nullable enable
class C
{
public int M0(object obj) => 1;
public void M1(C? c)
{
int x, y, z;
_ = c?.M0(x = y = z = 1) != x // 1
? y.ToString() // 2
: z.ToString();
}
public void M2(C? c)
{
int x, y, z;
_ = x != c?.M0(x = y = z = 1) // 3
? y.ToString() // 4
: z.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (11,37): error CS0165: Use of unassigned local variable 'x'
// _ = c?.M0(x = y = z = 1) != x // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 37),
// (12,15): error CS0165: Use of unassigned local variable 'y'
// ? y.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(12, 15),
// (19,13): error CS0165: Use of unassigned local variable 'x'
// _ = x != c?.M0(x = y = z = 1) // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(19, 13),
// (20,15): error CS0165: Use of unassigned local variable 'y'
// ? y.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(20, 15)
);
}
[Fact]
public void EqualsCondAccess_LeftCondAccess()
{
var source = @"
#nullable enable
class C
{
public C M0(object x) => this;
public void M1(C? c)
{
int w, x, y, z;
_ = (c?.M0(w = x = 1))?.M0(y = z = 1) != null
? w.ToString() + y.ToString()
: x.ToString() + z.ToString(); // 1, 2
}
public void M2(C? c)
{
int w, x, y, z;
_ = (c?.M0(w = x = 1)?.M0(y = z = 1))?.GetHashCode() != null
? w.ToString() + y.ToString()
: x.ToString() + z.ToString(); // 3, 4
}
public void M3(C? c)
{
int x, y;
_ = ((object?)c?.M0(x = y = 1))?.GetHashCode() != null
? x.ToString() + y.ToString()
: x.ToString() + y.ToString(); // 5, 6
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'x'
// : x.ToString() + z.ToString(); // 1, 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(13, 15),
// (13,30): error CS0165: Use of unassigned local variable 'z'
// : x.ToString() + z.ToString(); // 1, 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "z").WithArguments("z").WithLocation(13, 30),
// (21,15): error CS0165: Use of unassigned local variable 'x'
// : x.ToString() + z.ToString(); // 3, 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(21, 15),
// (21,30): error CS0165: Use of unassigned local variable 'z'
// : x.ToString() + z.ToString(); // 3, 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "z").WithArguments("z").WithLocation(21, 30),
// (29,15): error CS0165: Use of unassigned local variable 'x'
// : x.ToString() + y.ToString(); // 5, 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(29, 15),
// (29,30): error CS0165: Use of unassigned local variable 'y'
// : x.ToString() + y.ToString(); // 5, 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 30)
);
}
[Theory]
[InlineData("")]
[InlineData("T t, int i")]
public void EqualsCondAccess_BadUserDefinedConversion(string conversionParams)
{
var source = @"
#nullable enable
struct T
{
public static implicit operator S(" + conversionParams + @") => new S(); // 1
public T M0(out int x, out int y) { x = 42; y = 42; return this; }
}
struct S
{
public static bool operator ==(S left, S right) => false;
public static bool operator !=(S left, S right) => false;
public override bool Equals(object obj) => false;
public override int GetHashCode() => 0;
public void M1(T? t)
{
int x, y;
_ = t?.M0(out x, out y) != new S() // 2
? x.ToString() // 3
: y.ToString(); // 4
}
public void M2(T? t)
{
int x, y;
_ = t?.M0(out x, out y) == new S() // 5
? x.ToString() // 6
: y.ToString(); // 7
}
public void M3(T? t)
{
int x, y;
_ = new S() != t?.M0(out x, out y) // 8
? x.ToString() // 9
: y.ToString(); // 10
}
public void M4(T? t)
{
int x, y;
_ = new S() == t?.M0(out x, out y) // 11
? x.ToString() // 12
: y.ToString(); // 13
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (6,38): error CS1019: Overloadable unary operator expected
// public static implicit operator S(T t, int i) => new S(); // 1
Diagnostic(ErrorCode.ERR_OvlUnaryOperatorExpected, "(" + conversionParams + ")").WithLocation(6, 38),
// (20,13): error CS0019: Operator '!=' cannot be applied to operands of type 'T?' and 'S'
// _ = t?.M0(out x, out y) != new S() // 2
Diagnostic(ErrorCode.ERR_BadBinaryOps, "t?.M0(out x, out y) != new S()").WithArguments("!=", "T?", "S").WithLocation(20, 13),
// (21,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(21, 15),
// (22,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(22, 15),
// (28,13): error CS0019: Operator '==' cannot be applied to operands of type 'T?' and 'S'
// _ = t?.M0(out x, out y) == new S() // 5
Diagnostic(ErrorCode.ERR_BadBinaryOps, "t?.M0(out x, out y) == new S()").WithArguments("==", "T?", "S").WithLocation(28, 13),
// (29,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(29, 15),
// (30,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(30, 15),
// (36,13): error CS0019: Operator '!=' cannot be applied to operands of type 'S' and 'T?'
// _ = new S() != t?.M0(out x, out y) // 8
Diagnostic(ErrorCode.ERR_BadBinaryOps, "new S() != t?.M0(out x, out y)").WithArguments("!=", "S", "T?").WithLocation(36, 13),
// (37,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 9
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(37, 15),
// (38,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 10
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(38, 15),
// (44,13): error CS0019: Operator '==' cannot be applied to operands of type 'S' and 'T?'
// _ = new S() == t?.M0(out x, out y) // 11
Diagnostic(ErrorCode.ERR_BadBinaryOps, "new S() == t?.M0(out x, out y)").WithArguments("==", "S", "T?").WithLocation(44, 13),
// (45,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 12
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(45, 15),
// (46,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 13
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(46, 15)
);
}
[Fact]
public void IsBool()
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is bool // 1
? x.ToString() // 2
: y.ToString(); // 3
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (11,13): warning CS0183: The given expression is always of the provided ('bool') type
// _ = (b && M0(x = y = 0)) is bool // 1
Diagnostic(ErrorCode.WRN_IsAlwaysTrue, "(b && M0(x = y = 0)) is bool").WithArguments("bool").WithLocation(11, 13),
// (12,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(12, 15),
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15)
);
}
[Theory]
[InlineData("true", "false")]
[InlineData("!false", "!true")]
[InlineData("(true || false)", "(true && false)")]
public void IsBoolConstant_01(string @true, string @false)
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is " + @true + @"
? x.ToString()
: y.ToString(); // 1
}
void M2(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is " + @false + @"
? x.ToString() // 2
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15)
);
}
[Fact]
public void IsBoolConstant_02()
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is var z
? x.ToString() // 1
: y.ToString(); // unreachable
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(12, 15)
);
}
[Fact]
public void IsBoolConstant_03()
{
var source = @"
#nullable enable
#pragma warning disable 8794 // An expression always matches the provided pattern
class C
{
bool M0(object obj) => false;
void M1(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is not true
? x.ToString() // 1
: y.ToString();
}
void M2(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is true or false
? x.ToString() // 2
: y.ToString(); // unreachable
}
void M3(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is true and false // 3
? x.ToString() // unreachable
: y.ToString(); // 4
}
void M4(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is true or true
? x.ToString()
: y.ToString(); // 5
}
void M5(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is true and true
? x.ToString()
: y.ToString(); // 6
}
void M6(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is false or false
? x.ToString() // 7
: y.ToString();
}
void M7(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is false and var z
? x.ToString() // 8
: y.ToString();
}
void M8(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is var z or true // 9
? x.ToString() // 10
: y.ToString(); // unreachable
}
void M9(bool b)
{
int x, y;
_ = (b && M0(x = y = 0)) is not (false and false)
? x.ToString()
: y.ToString(); // 11
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(21, 15),
// (28,13): error CS8518: An expression of type 'bool' can never match the provided pattern.
// _ = (b && M0(x = y = 0)) is true and false // 3
Diagnostic(ErrorCode.ERR_IsPatternImpossible, "(b && M0(x = y = 0)) is true and false").WithArguments("bool").WithLocation(28, 13),
// (30,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(30, 15),
// (38,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(38, 15),
// (46,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(46, 15),
// (53,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(53, 15),
// (61,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 8
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(61, 15),
// (68,41): error CS8780: A variable may not be declared within a 'not' or 'or' pattern.
// _ = (b && M0(x = y = 0)) is var z or true // 9
Diagnostic(ErrorCode.ERR_DesignatorBeneathPatternCombinator, "z").WithLocation(68, 41),
// (69,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 10
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(69, 15),
// (78,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 11
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(78, 15)
);
}
[Fact]
public void IsCondAccess_01()
{
var source = @"
#nullable enable
class C
{
C M0(object obj) => this;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is C
? x.ToString()
: y.ToString(); // 1
}
void M2(C? c)
{
int x, y;
_ = c?.Equals(x = y = 0) is bool
? x.ToString()
: y.ToString(); // 2
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(21, 15)
);
}
[Fact]
public void IsCondAccess_02()
{
var source = @"
#nullable enable
class C
{
C M0(object obj) => this;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is (_)
? x.ToString() // 1
: y.ToString(); // unreachable
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is var z
? x.ToString() // 2
: y.ToString(); // unreachable
}
void M3(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is { }
? x.ToString()
: y.ToString(); // 3
}
void M4(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is { } c1
? x.ToString()
: y.ToString(); // 4
}
void M5(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is C c1
? x.ToString()
: y.ToString(); // 5
}
void M6(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not null
? x.ToString()
: y.ToString(); // 6
}
void M7(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not C
? x.ToString() // 7
: y.ToString();
}
void M8(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null
? x.ToString() // 8
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(12, 15),
// (20,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(20, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (37,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(37, 15),
// (45,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(45, 15),
// (53,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(53, 15),
// (60,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(60, 15),
// (68,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 8
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(68, 15)
);
}
[Fact]
public void IsCondAccess_03()
{
var source = @"
#nullable enable
class C
{
(C, C) M0(object obj) => (this, this);
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is (_, _)
? x.ToString()
: y.ToString(); // 1
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not null
? x.ToString()
: y.ToString(); // 2
}
void M3(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is (not null, null)
? x.ToString()
: y.ToString(); // 3
}
void M4(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null
? x.ToString() // 4
: y.ToString();
}
void M5(C? c)
{
int x, y;
_ = (c?.M0(x = 0), c?.M0(y = 0)) is (not null, not null)
? x.ToString() // 5
: y.ToString(); // 6
}
}
";
// note: "state when not null" is not tracked when pattern matching against tuples containing conditional accesses.
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(21, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (36,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(36, 15),
// (44,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(44, 15),
// (45,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(45, 15)
);
}
[Fact]
public void IsCondAccess_04()
{
var source = @"
#nullable enable
#pragma warning disable 8794 // An expression always matches the provided pattern
class C
{
C M0(object obj) => this;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null or not null
? x.ToString() // 1
: y.ToString(); // unreachable
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is C or null
? x.ToString() // 2
: y.ToString(); // unreachable
}
void M3(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not null and C
? x.ToString()
: y.ToString(); // 3
}
void M4(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null
? x.ToString() // 4
: y.ToString();
}
void M5(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not (C or { })
? x.ToString() // 5
: y.ToString();
}
void M6(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is _ and C
? x.ToString()
: y.ToString(); // 6
}
void M7(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is C and _
? x.ToString()
: y.ToString(); // 7
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(21, 15),
// (30,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(30, 15),
// (37,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(37, 15),
// (45,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(45, 15),
// (54,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(54, 15),
// (62,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 7
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(62, 15)
);
}
[Theory]
[InlineData("int")]
[InlineData("int?")]
public void IsCondAccess_05(string returnType)
{
var source = @"
#nullable enable
class C
{
" + returnType + @" M0(object obj) => 1;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is 1
? x.ToString()
: y.ToString(); // 1
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is > 10
? x.ToString()
: y.ToString(); // 2
}
void M3(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is > 10 or < 0
? x.ToString()
: y.ToString(); // 3
}
void M4(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is 1 or 2
? x.ToString()
: y.ToString(); // 4
}
void M5(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null
? x.ToString() // 5
: y.ToString();
}
void M6(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not null
? x.ToString()
: y.ToString(); // 6
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15),
// (21,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(21, 15),
// (29,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 3
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(29, 15),
// (37,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 4
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(37, 15),
// (44,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 5
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(44, 15),
// (53,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 6
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(53, 15)
);
}
[Fact]
public void IsCondAccess_06()
{
var source = @"
#nullable enable
class C
{
int M0(object obj) => 1;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not null is true
? x.ToString()
: y.ToString(); // 1
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (13,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(13, 15)
);
}
[Fact]
public void IsCondAccess_07()
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is true or false
? x.ToString()
: y.ToString(); // 1
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not (true or false)
? x.ToString() // 2
: y.ToString();
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(12, 15),
// (19,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(19, 15)
);
}
[Fact]
public void IsCondAccess_08()
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is null or false
? x.ToString() // 1
: y.ToString();
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is not (true or null)
? x.ToString()
: y.ToString(); // 2
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (11,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 15),
// (20,15): error CS0165: Use of unassigned local variable 'y'
// : y.ToString(); // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "y").WithArguments("y").WithLocation(20, 15)
);
}
[Fact]
public void IsCondAccess_09()
{
var source = @"
#nullable enable
class C
{
bool M0(object obj) => false;
void M1(C? c)
{
int x, y;
_ = c?.M0(x = y = 0) is var z
? x.ToString() // 1
: y.ToString(); // unreachable
}
void M2(C? c)
{
int x, y;
_ = c?.M0(x = 0) is var z
? x.ToString() // 2
: y.ToString(); // unreachable
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (11,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 1
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(11, 15),
// (19,15): error CS0165: Use of unassigned local variable 'x'
// ? x.ToString() // 2
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x").WithLocation(19, 15)
);
}
[WorkItem(545352, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545352")]
[Fact]
public void UseDefViolationInDelegateInSwitchWithGoto()
{
var source = @"
public class C
{
public static void Main()
{
switch (5)
{
case 1:
System.Action a = delegate { int b; int c = b; }; // Error on b.
Lab:
break;
case 5:
goto Lab;
}
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,31): warning CS0162: Unreachable code detected
// System.Action a = delegate { int b; int c = b; }; // Error on b.
Diagnostic(ErrorCode.WRN_UnreachableCode, "System"),
// (9,61): error CS0165: Use of unassigned local variable 'b'
// System.Action a = delegate { int b; int c = b; }; // Error on b.
Diagnostic(ErrorCode.ERR_UseDefViolation, "b").WithArguments("b")
);
}
[Fact]
public void UseDefViolationInUnreachableDelegate()
{
var source = @"
class C
{
static void Main()
{
if (false)
{
System.Action a = () => { int x; int y = x; };
}
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (8,27): warning CS0162: Unreachable code detected
// System.Action a = () => { int x; int y = x; };
Diagnostic(ErrorCode.WRN_UnreachableCode, "System"),
// (8,54): error CS0165: Use of unassigned local variable 'x'
// System.Action a = () => { int x; int y = x; };
Diagnostic(ErrorCode.ERR_UseDefViolation, "x").WithArguments("x"));
}
[Fact]
public void UseDef_ExceptionFilters1()
{
var source = @"
class C
{
static void Main()
{
try
{
}
catch (System.Exception e) when (e.Message == null)
{
}
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void UseDef_ExceptionFilters2()
{
var source = @"
class C
{
static void Main()
{
try
{
}
catch (System.Exception e) when (F())
{
}
}
static bool F() { return true; }
}
";
CreateCompilation(source).VerifyDiagnostics(
// (9,33): warning CS0168: The variable 'e' is declared but never used
// catch (System.Exception e) when (true)
Diagnostic(ErrorCode.WRN_UnreferencedVar, "e").WithArguments("e").WithLocation(9, 33));
}
[Fact]
public void UseDef_ExceptionFilters3()
{
var source = @"
using System;
class C
{
static void Main()
{
Exception f;
try
{
}
catch (Exception e) when ((f = e) != null)
{
Console.WriteLine(f);
}
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void UseDef_ExceptionFilters4()
{
var source = @"
using System;
class C
{
static void Main()
{
Exception f;
try
{
}
catch (Exception e) when (f == e)
{
}
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (12,33): error CS0165: Use of unassigned local variable 'f'
// catch (Exception e) when (f == e)
Diagnostic(ErrorCode.ERR_UseDefViolation, "f").WithArguments("f"));
}
[Fact]
public void UseDef_ExceptionFilters5()
{
var source = @"
using System;
class C
{
static void Main()
{
Exception f;
try
{
}
catch (Exception e) when ((f = e) != null)
{
}
catch (Exception e) when (f == e)
{
}
}
}
";
// TODO (tomat): f is always gonna be assigned in subsequent filter expressions.
CreateCompilation(source).VerifyDiagnostics(
// (15,33): error CS0165: Use of unassigned local variable 'f'
// catch (Exception e) when (f == e)
Diagnostic(ErrorCode.ERR_UseDefViolation, "f").WithArguments("f"));
}
[Fact]
public void UseDef_ExceptionFilters6()
{
var source = @"
using System;
class C
{
static void Main()
{
Exception f, g;
try
{
}
catch (Exception e) when ((f = e) != null)
{
Console.WriteLine(f);
Console.WriteLine(g);
}
}
}
";
CreateCompilation(source).VerifyDiagnostics(
// (15,31): error CS0165: Use of unassigned local variable 'g'
// Console.WriteLine(g);
Diagnostic(ErrorCode.ERR_UseDefViolation, "g").WithArguments("g"));
}
[Fact]
public void UseDef_CondAccess()
{
var source = @"
class C
{
C M1(out C arg)
{
arg = this;
return arg;
}
static void Main()
{
C o;
var d = new C();
var v = d ?. M1(out o);
System.Console.WriteLine(o);
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics(
// (17,34): error CS0165: Use of unassigned local variable 'o'
// System.Console.WriteLine(o);
Diagnostic(ErrorCode.ERR_UseDefViolation, "o").WithArguments("o").WithLocation(17, 34)
);
}
[Fact]
public void UseDef_CondAccess01()
{
var source = @"
class C
{
C M1(out C arg)
{
arg = this;
return arg;
}
static void Main()
{
C o;
var d = new C();
// equivalent to:
// var v = d != null ? d.M1(out o) : (o = null);
var v = d ?. M1(out o) ?? (o = null);
System.Console.WriteLine(o);
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics();
}
[Fact]
public void UseDef_CondAccess02()
{
var source = @"
class C
{
C M1(out C arg)
{
arg = this;
return arg;
}
C M2( C arg)
{
return arg;
}
static void Main()
{
C o;
var d = new C();
var v = d ?. M1(out o) ?. M2(o);
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics();
}
[Fact]
public void UseDef_CondAccess03()
{
var source = @"
class C
{
C M1(out C arg)
{
arg = this;
return arg;
}
C M2( C arg)
{
return arg;
}
static void Main()
{
C o;
var d = new C();
var v = d.M1(out o) ?. M1(out o) ?. M2(o);
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics(
);
}
[Fact, WorkItem(14651, "https://github.com/dotnet/roslyn/issues/14651")]
public void IrrefutablePattern_1()
{
var source =
@"using System;
class C
{
void TestFunc(int i)
{
int x;
if (i is int j)
{
Console.WriteLine(""matched"");
}
else
{
x = x + 1; // reachable, and x is definitely assigned here
}
Console.WriteLine(j);
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics();
}
// DataFlowPass.VisitConversion with IsConditionalState.
[Fact]
public void OutVarConversion()
{
var source =
@"class C
{
static object F(bool b)
{
return ((bool)(b && G(out var o))) ? o : null;
}
static bool G(out object o)
{
o = null;
return true;
}
}";
var comp = CreateCompilation(source);
comp.VerifyDiagnostics();
}
// DataFlowPass.VisitConversion with IsConditionalState.
[Fact]
public void IsPatternConversion()
{
var source =
@"class C
{
static object F(object o)
{
return ((bool)(o is C c)) ? c: null;
}
}";
var comp = CreateCompilation(source);
comp.VerifyDiagnostics();
}
// DataFlowPass.VisitConversion with IsConditionalState.
[Fact]
public void IsPatternBadValueConversion()
{
// C#7.0 does not support this particular pattern so the pattern
// expression is bound as a BadExpression with a conversion.
var source =
@"class C
{
static T F<T>(System.ValueType o)
{
return o is T t ? t : default(T);
}
}";
var comp = CreateCompilation(source, parseOptions: TestOptions.Regular7);
comp.VerifyDiagnostics(
// (5,21): error CS8314: An expression of type 'ValueType' cannot be handled by a pattern of type 'T' in C# 7. Please use language version 7.1 or greater.
// return o is T t ? t : default(T);
Diagnostic(ErrorCode.ERR_PatternWrongGenericTypeInVersion, "T").WithArguments("System.ValueType", "T", "7.0", "7.1").WithLocation(5, 21));
}
[Fact, WorkItem(19831, "https://github.com/dotnet/roslyn/issues/19831")]
public void AssignedInFinallyUsedInTry()
{
var source =
@"
public class Program
{
static void Main(string[] args)
{
Test();
}
public static void Test()
{
object obj;
try
{
goto l3;
l1:
goto l2;
l3:
goto l1;
l2:
// Should be compile error
// 'obj' is uninitialized
obj.ToString();
}
finally
{
obj = 1;
}
}
}
";
CreateCompilationWithMscorlib461(source).VerifyDiagnostics(
// (28,17): error CS0165: Use of unassigned local variable 'obj'
// obj.ToString();
Diagnostic(ErrorCode.ERR_UseDefViolation, "obj").WithArguments("obj").WithLocation(28, 17)
);
}
[Fact, WorkItem(63911, "https://github.com/dotnet/roslyn/issues/63911")]
public void LocalMethod_ParameterAttribute()
{
var source = """
using System;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
const int N = 10;
const int Unused = 20;
void F([Optional, DefaultParameterValue(N)] int x) => Console.WriteLine(x);
F();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (8,19): warning CS0219: The variable 'Unused' is assigned but its value is never used
// const int Unused = 20;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Unused").WithArguments("Unused").WithLocation(8, 19));
}
[Fact, WorkItem(63911, "https://github.com/dotnet/roslyn/issues/63911")]
public void Lambda_ParameterAttribute()
{
var source = """
using System;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
const int N = 10;
const int Unused = 20;
var lam = ([Optional, DefaultParameterValue(N)] int x) => Console.WriteLine(x);
lam(100);
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (8,19): warning CS0219: The variable 'Unused' is assigned but its value is never used
// const int Unused = 20;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Unused").WithArguments("Unused").WithLocation(8, 19));
}
[Fact, WorkItem(63911, "https://github.com/dotnet/roslyn/issues/63911")]
public void LocalMethod_ParameterAttribute_NamedArguments()
{
var source = """
using System;
[AttributeUsage(AttributeTargets.Parameter)]
class A : Attribute
{
public int Prop { get; set; }
}
class Program
{
static void Main()
{
const int N = 10;
const int Unused = 20;
void F([A(Prop = N)] int x) { }
F(100);
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (12,19): warning CS0219: The variable 'Unused' is assigned but its value is never used
// const int Unused = 20;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Unused").WithArguments("Unused").WithLocation(12, 19));
}
[Fact, WorkItem(63911, "https://github.com/dotnet/roslyn/issues/63911")]
public void Lambda_ParameterAttribute_NamedArguments()
{
var source = """
using System;
[AttributeUsage(AttributeTargets.Parameter)]
class A : Attribute
{
public int Prop { get; set; }
}
class Program
{
static void Main()
{
const int N = 10;
const int Unused = 20;
var lam = ([A(Prop = N)] int x) => { };
lam(100);
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (12,19): warning CS0219: The variable 'Unused' is assigned but its value is never used
// const int Unused = 20;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Unused").WithArguments("Unused").WithLocation(12, 19));
}
[Fact, WorkItem(60645, "https://github.com/dotnet/roslyn/issues/60645")]
public void LocalMethod_AttributeArguments()
{
var source = """
using System;
class A : Attribute
{
public A(int param) { }
public int Prop { get; set; }
}
class Program
{
static void Main()
{
const int N1 = 10;
const int N2 = 20;
const int N3 = 30;
const int N4 = 40;
const int N5 = 50;
const int N6 = 60;
[A(N1, Prop = N2)][return: A(N3, Prop = N4)] int F() => N5;
F();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (16,19): warning CS0219: The variable 'N6' is assigned but its value is never used
// const int N6 = 60;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "N6").WithArguments("N6").WithLocation(16, 19));
}
[Fact, WorkItem(60645, "https://github.com/dotnet/roslyn/issues/60645")]
public void LocalMethod_AttributeArguments_GenericParameter()
{
var source = """
using System;
class A : Attribute
{
public A(int param) { }
}
class Program
{
static void Main()
{
[A(default(T))] void F<T>() { }
F<int>();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (10,20): error CS0246: The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
// [A(default(T))] void F<T>() { }
Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "T").WithArguments("T").WithLocation(10, 20));
}
[Fact, WorkItem(60645, "https://github.com/dotnet/roslyn/issues/60645")]
public void LocalMethod_AttributeArguments_StringInterpolation()
{
var source = """
public class C
{
public int P
{
get
{
const string X = "Hello";
const string Y = "World";
const string Z = "unused";
[My($"{X}, World", Prop = $"Hello, {Y}")] int F() => 0;
return F();
}
}
}
public class MyAttribute : System.Attribute
{
public MyAttribute(string param) { }
public string Prop { get; set; }
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (9,26): warning CS0219: The variable 'Z' is assigned but its value is never used
// const string Z = "unused";
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Z").WithArguments("Z").WithLocation(9, 26));
}
[Fact, WorkItem(60645, "https://github.com/dotnet/roslyn/issues/60645")]
public void LambdaMethod_AttributeArguments()
{
var source = """
using System;
class A : Attribute
{
public A(int param) { }
public int Prop { get; set; }
}
class Program
{
static void Main()
{
const int N1 = 10;
const int N2 = 20;
const int N3 = 30;
const int N4 = 40;
const int N5 = 50;
const int N6 = 60;
var lam = [A(N1, Prop = N2)][return: A(N3, Prop = N4)] () => N5;
lam();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (16,19): warning CS0219: The variable 'N6' is assigned but its value is never used
// const int N6 = 60;
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "N6").WithArguments("N6").WithLocation(16, 19));
}
[Fact, WorkItem(60645, "https://github.com/dotnet/roslyn/issues/60645")]
public void LambdaMethod_AttributeArguments_StringInterpolation()
{
var source = """
public class C
{
public int P
{
get
{
const string X = "Hello";
const string Y = "World";
const string Z = "unused";
var f = [My($"{X}, World", Prop = $"Hello, {Y}")] () => 0;
return f();
}
}
}
public class MyAttribute : System.Attribute
{
public MyAttribute(string param) { }
public string Prop { get; set; }
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (9,26): warning CS0219: The variable 'Z' is assigned but its value is never used
// const string Z = "unused";
Diagnostic(ErrorCode.WRN_UnreferencedVarAssg, "Z").WithArguments("Z").WithLocation(9, 26));
}
[Fact]
public void Setter_AttributeArguments()
{
var source = """
using System;
class A : Attribute
{
public A(int param) { }
public int Prop { get; set; }
}
class Program
{
const int N1 = 10;
const int N2 = 20;
const int N3 = 30;
const int N4 = 40;
const int N5 = 50;
const int N6 = 60;
public int Prop
{
[A(N1, Prop = N4)][param: A(N2, Prop = N5)][return: A(N3, Prop = N6)]
set
{
Console.WriteLine(value);
}
}
}
""";
var compilation = CreateCompilation(source).VerifyDiagnostics();
var tree = compilation.SyntaxTrees[0];
var model = compilation.GetSemanticModel(tree);
var declarations = tree.GetRoot().DescendantNodes().OfType<PropertyDeclarationSyntax>().ToImmutableArray();
var property = declarations.Select(d => model.GetDeclaredSymbol(d)).Where(p => p.ContainingSymbol.Name == "Program").Single();
var parameter = property.SetMethod.Parameters[0].GetSymbol<SourceComplexParameterSymbolBase>();
var attributes = parameter.BindParameterAttributes();
Assert.Equal(3, attributes.Length);
Assert.Equal("A(10, Prop = 40)", attributes[0].Item1.ToString());
Assert.Equal("A(20, Prop = 50)", attributes[1].Item1.ToString());
Assert.Equal("A(30, Prop = 60)", attributes[2].Item1.ToString());
}
[Fact]
public void LocalConstantUsedInLocalFunctionDefaultParameterValue()
{
var source =
@"
using System;
public class Program
{
public static void Main()
{
const int c = 10;
static void Local(int arg = c) => Console.WriteLine(arg);
Local();
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void LocalConstantUsedInLambdaDefaultParameterValue()
{
var source =
@"
using System;
public class Program
{
public static void Main()
{
const int c = 10;
var f = (int arg = c) => Console.WriteLine(arg);
f();
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void MultipleDependentLocalConstants_LambdaDefaultParameterValue()
{
var source =
@"
using System;
public class Program
{
public static void Main()
{
const int a = 10;
const int b = a + 1;
const int c = a + b;
var f = (int arg = c) => Console.WriteLine(arg);
f();
}
}
";
CreateCompilation(source).VerifyDiagnostics();
}
[Fact]
public void NameOf_Nested()
{
var source = """
System.Console.WriteLine(C.M());
public class C
{
private C c;
public static string M() => nameof(c.c.c);
}
""";
var expectedDiagnostic =
// (4,15): warning CS0649: Field 'C.c' is never assigned to, and will always have its default value null
// private C c;
Diagnostic(ErrorCode.WRN_UnassignedInternalField, "c").WithArguments("C.c", "null").WithLocation(4, 15);
CompileAndVerify(source, parseOptions: TestOptions.Regular12, expectedOutput: "c").VerifyDiagnostics(expectedDiagnostic);
CompileAndVerify(source, parseOptions: TestOptions.RegularPreview, expectedOutput: "c").VerifyDiagnostics(expectedDiagnostic);
CreateCompilation(source, parseOptions: TestOptions.Regular11).VerifyDiagnostics(
expectedDiagnostic,
// (5,40): error CS9058: Feature 'instance member in 'nameof'' is not available in C# 11.0. Please use language version 12.0 or greater.
// public static string M() => nameof(c.c.c);
Diagnostic(ErrorCode.ERR_FeatureNotAvailableInVersion11, "c").WithArguments("instance member in 'nameof'", "12.0").WithLocation(5, 40));
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_01()
{
var source = """
#pragma warning disable CS8321 // The local function is declared but never used
static void bug(out int a)
{
bool hasLevel() => true;
hasLevel();
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (3,13): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(3, 13)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_02()
{
var source = """
#pragma warning disable CS8321 // The local function is declared but never used
static void bug(out int a)
{
bool hasLevel() => true;
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (3,13): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(3, 13)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_03()
{
var source = """
#pragma warning disable CS8321 // The local function is declared but never used
class C
{
static void bug(out int a)
{
bool hasLevel() => true;
hasLevel();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (5,17): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(5, 17)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_04()
{
var source = """
#pragma warning disable CS8321 // The local function is declared but never used
class C
{
static void bug(out int a)
{
bool hasLevel() => true;
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (5,17): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(5, 17)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_05()
{
var source = """
#pragma warning disable CS8321 // The local function is declared but never used
static void bug(out int a)
{
System.Func<bool> hasLevel = () => true;
hasLevel();
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (3,13): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(3, 13)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_06()
{
var source = """
class C
{
static void bug(out int a)
{
System.Func<bool> hasLevel = () => true;
hasLevel();
}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (3,17): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// static void bug(out int a)
Diagnostic(ErrorCode.ERR_ParamUnassigned, "bug").WithArguments("a").WithLocation(3, 17)
);
}
[Fact]
[WorkItem("https://github.com/dotnet/roslyn/issues/69775")]
public void OutParameterIsNotAssigned_07()
{
var source = """
class C(out int a) : Base(Test(() =>
{
System.Func<bool> hasLevel = () => true;
return hasLevel();
}))
{
int F = Test(() =>
{
System.Func<bool> hasLevel = () => true;
return hasLevel();
});
static int Test(System.Func<bool> x) => 0;
}
class Base
{
public Base(int x){}
}
""";
CreateCompilation(source).VerifyDiagnostics(
// (1,7): error CS0177: The out parameter 'a' must be assigned to before control leaves the current method
// class C(out int a) : Base(Test(() =>
Diagnostic(ErrorCode.ERR_ParamUnassigned, "C").WithArguments("a").WithLocation(1, 7)
);
}
}
}
|