Question: Can we use a condition to include cases in a switch statement?

My code:

```cpp
switch(menu_option)
{
  if (g_logged_in)
  {
     case 'L':
       cout << "Login Menu\n";
       break;
     case 'S':
       cout << "Signup Menu\n";
       break;
  }
  case 'A':
    foo();
    break;
  case 'B':
    bar();
    break;

  default:
    cout << "Invalid Option!\n";
}

```

When I compile the file, I get an error

```sh
[pewpew@Sierra cpp-something]$ c++ src/main.cc -o main.out
src/main.cc: In function 'int main()':
src/main.cc:53:13: warning: statement will never be executed [-Wswitch-unreachable]
   53 |             if (g_logged_in)
      |             ^~

```

Is it not at all possible?

Answer: 
Currently, program control never reaches `if (g_logged_in)`, so that's never evaluated. Your helpful compiler is issuing a warning.

Really though a `switch` block is little more than a controlled set of `goto` statements. You could force it with

```
switch(menu_option){
    foo:
    if (g_logged_in){

```

with a `goto foo;` somewhere where program control reaches, although such an idea is ill-advised due to readability and maintainability. The following snippet is a reformulation of the "Hello World!" program:

```
#include <iostream>
int main(){
    switch (1){
    foo:
    if (true){
        case 0:
            std::cout << " World!\n";
            break;
        case 1:
            std::cout << "Hello";
            goto foo;
        }
    }   
}

```

For a real-life use-case for interleaved control loops within a `switch` block, see Duff's Device: <https://en.wikipedia.org/wiki/Duff%27s_device>
You cannot specify `case` statements conditionally. You would have to do something more like this:

```cpp
switch (menu_option)
{
  case 'L':
    // in C++17 and later, you can uncomment the following
    // attribute to avoid a compiler warning...
    //
    // [[fallthrough]];
  case 'S':
    if (g_logged_in)
    {
      if (menu_option == 'L')
        cout << "Login Menu\n";
      else
        cout << "Signup Menu\n";
    }
    else
      cout << "Invalid Option!\n";
    break;

  case 'A':
    foo();
    break;

  case 'B':
    bar();
    break;

  default:
    cout << "Invalid Option!\n";
    break;
}

```

Or this:

```cpp
switch (menu_option)
{
  case 'A':
    foo();
    break;

  case 'B':
    bar();
    break;

  default:
    if (g_logged_in)
    {
      if (menu_option == 'L')
      {
        cout << "Login Menu\n";
        break;
      }
      if (menu_option == 'S')
      {
        cout << "Signup Menu\n";
        break;
      }
    }
    cout << "Invalid Option!\n";
    break;
}

```