| /++ |
| https://issues.dlang.org/show_bug.cgi?id=22514 |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(13): Error: undefined identifier `doesNotExist` |
| fail_compilation/test_switch_error.d(16): Error: undefined identifier `alsoDoesNotExits` |
| fail_compilation/test_switch_error.d(19): Error: duplicate `case 2` in `switch` statement |
| --- |
| ++/ |
| |
| void test1() |
| { |
| switch (doesNotExist) |
| { |
| case 1: |
| alsoDoesNotExits(); |
| break; |
| case 2: break; |
| case 2: break; |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(105): Error: undefined identifier `doesNotExist` |
| --- |
| ++/ |
| #line 100 |
| |
| enum foo = 1; |
| |
| void test2() |
| { |
| switch (doesNotExist) |
| { |
| case foo: break; |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(206): Error: undefined identifier `a` |
| fail_compilation/test_switch_error.d(207): Error: undefined identifier `b` |
| --- |
| ++/ |
| #line 200 |
| |
| void test3() |
| { |
| |
| switch (1) |
| { |
| case a: break; |
| case b: break; |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(303): Error: undefined identifier `doesNotExits` |
| --- |
| ++/ |
| #line 300 |
| |
| void test4() |
| { |
| auto foo = doesNotExits(); |
| switch (1) |
| { |
| case foo: break; |
| case foo: break; |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(405): Error: `case` variables have to be `const` or `immutable` |
| fail_compilation/test_switch_error.d(412): Error: `case` variables not allowed in `final switch` statements |
| --- |
| ++/ |
| #line 400 |
| |
| void test5(int i) |
| { |
| switch (i) |
| { |
| case i: break; |
| default: break; |
| } |
| |
| const int j = i; |
| final switch (i) |
| { |
| case j: break; |
| |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(513): Error: undefined identifier `undefinedFunc` |
| fail_compilation/test_switch_error.d(517): Error: `case` must be a `string` or an integral constant, not `Strukt(1)` |
| fail_compilation/test_switch_error.d(518): Error: `case` variables have to be `const` or `immutable` |
| fail_compilation/test_switch_error.d(518): Error: `case` variables not allowed in `final switch` statements |
| fail_compilation/test_switch_error.d(519): Error: `case` variables not allowed in `final switch` statements |
| fail_compilation/test_switch_error.d(522): Error: undefined identifier `undefinedFunc2` |
| --- |
| ++/ |
| #line 500 |
| |
| enum Foo |
| { |
| one, two |
| } |
| |
| struct Strukt |
| { |
| int i; |
| } |
| |
| void errorsWithErrors(int param, immutable int constant) |
| { |
| final switch(undefinedFunc()) |
| { |
| case Foo.one: break; |
| case Foo.two: break; |
| case Strukt(1): break; |
| case param: break; |
| case constant: break; |
| } |
| |
| switch (undefinedFunc2()) |
| { |
| case constant: break; |
| } |
| } |
| |
| /++ |
| TEST_OUTPUT: |
| --- |
| fail_compilation/test_switch_error.d(622): Error: undefined identifier `undefinedFunc` |
| fail_compilation/test_switch_error.d(624): Error: `case` must be a `string` or an integral constant, not `SubtypeOfInt(2)` |
| fail_compilation/test_switch_error.d(625): Error: `case` must be a `string` or an integral constant, not `SubtypeOfIntMethod()` |
| --- |
| ++/ |
| #line 600 |
| |
| struct SubtypeOfInt |
| { |
| int i; |
| alias i this; |
| } |
| |
| struct SubtypeOfIntMethod |
| { |
| int getI() { return 0; } |
| alias getI this; |
| } |
| |
| void errorsWithErrors2(int param) |
| { |
| final switch(param) |
| { |
| case SubtypeOfInt(1): break; |
| case SubtypeOfIntMethod(): break; |
| } |
| |
| // This snippet causes somewhat misleading error messages |
| final switch(undefinedFunc()) |
| { |
| case SubtypeOfInt(2): break; |
| case SubtypeOfIntMethod(): break; |
| } |
| } |