/++
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;
    }
}
