On Thu, Oct 19, 2023 at 07:39:43AM -0400, Eric Sokolowsky via Gcc wrote: > I am using gcc 13.2 on Fedora 38. Consider the following program. > > #include <stdio.h> > int main(int argc, char **argv) > { > printf("Enter a number: "); > int num = 0; > scanf("%d", &num); > > switch (num) > { > case 1: > int a = num + 3; > printf("The new number is %d.\n", a); > break; > case 2: > int b = num - 4; > printf("The new number is %d.\n", b); > break; > default: > int c = num * 3; > printf("The new number is %d.\n", c); > break; > } > } > > I would expect that gcc would complain about the declaration of > variables (a, b, and c) within the case statements. When I run "gcc > -Wall t.c" I get no warnings. When I run "g++ -Wall t.c" I get > warnings and errors as expected. I do get warnings when using MinGW on > Windows (gcc version 6.3 specifically). Did something change in 13.2? C isn't C++. In particular, the above is valid C23, which is why it is accepted as an extension in older C language versions starting with GCC 11. It is warned about with -pedantic/-Wpedantic and errored on with -pedantic-errors/-Werror=pedantic unless -std=c2x or -std=gnu2x is used. The C++ case is completely different. There labels are allowed before declarations already in C++98, but it is invalid to cross initialization of some variable using the jump to case 2 or default labels above. If you rewrite it as: case 1: int a; a = num + 3; printf("The new number is %d.\n", a); break; case 2: int b; b = num - 4; printf("The new number is %d.\n", b); break; default: int c; c = num * 3; printf("The new number is %d.\n", c); break; it is valid C++ and it won't be diagnosed. Note, this should have been posted to gcc-help instead. Jakub