/* { dg-do compile } */ /* The ISO C++ standard says, in Section 3.3.2 sentence 4, that a name declared in the for-init-statement or in the condition of an if, for while, or switch statement can't be redeclared in the outermost block of the controlled statement. (Note, this is not an error in C.) */ extern void foo (int); extern int j; void e0 (void) { for (int i = 0; // { dg-message "previously declared here" "prev" } i < 10; ++i) { int i = 2; // { dg-error "redeclaration" "redecl" } foo (i); } } void e1 (void) { int i; for (i = 0; int k = j; i++) // { dg-message "previously declared here" "prev" } { int k = 2; // { dg-error "redeclaration" "redecl" } foo (k); } } void e2 (void) { if (int i = 1) // { dg-message "previously declared here" "prev" } { int i = 2; // { dg-error "redeclaration" "redecl" } foo (i); } } void e3 (void) { if (int i = 1) // { dg-message "previously declared here" "prev" } { foo (i); } else { int i = 2; // { dg-error "redeclaration" "redecl" } foo (i); } } void e4 (void) { while (int i = 1) // { dg-message "previously declared here" "prev" } { int i = 2; // { dg-error "redeclaration" "redecl" } foo (i); } } void e5 (void) { switch (int i = j) // { dg-message "previously declared here" "prev" } { int i; // { dg-error "redeclaration" "redecl" } default: { i = 2; foo (i); } } } void f0 (void) { for (int i = 0; i < 10; ++i) { foo (i); { int i = 2; // OK, not outermost block. foo (i); } } } void f1 (void) { int i; for (i = 0; int k = j; i++) { foo (k); { int k = 2; // OK, not outermost block. foo (k); } } } void f2 (void) { if (int i = 1) { foo (i); { int i = 2; // OK, not outermost block. foo (i); } } } void f3 (void) { if (int i = 1) { foo (i); } else { foo (i+2); { int i = 2; // OK, not outermost block. foo (i); } } } void f4 (void) { while (int i = 1) { foo (i); { int i = 2; // OK, not outermost block. foo (i); } } } void f5 (void) { switch (int i = j) { default: { int i = 2; // OK, not outermost block. foo (i); } } } void f6 (void) { int i = 1; for (int j = 0; j < 10; j++) { int i = 2; // OK, not variable from for-init. foo (i); } }