| 1 | // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 2 | // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 3 | // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 4 | // RUN: %clang_cc1 -std=c++17 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 5 | // RUN: %clang_cc1 -std=c++2a %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 6 | |
| 7 | namespace dr1113 { // dr1113: partial |
| 8 | namespace named { |
| 9 | extern int a; // expected-note {{previous}} |
| 10 | static int a; // expected-error {{static declaration of 'a' follows non-static}} |
| 11 | } |
| 12 | namespace { |
| 13 | extern int a; |
| 14 | static int a; // ok, both declarations have internal linkage |
| 15 | int b = a; |
| 16 | } |
| 17 | |
| 18 | // FIXME: Per DR1113 and DR4, this is ill-formed due to ambiguity: the second |
| 19 | // 'f' has internal linkage, and so does not have C language linkage, so is |
| 20 | // not a redeclaration of the first 'f'. |
| 21 | // |
| 22 | // To avoid a breaking change here, Clang ignores the "internal linkage" effect |
| 23 | // of anonymous namespaces on declarations declared within an 'extern "C"' |
| 24 | // linkage-specification. |
| 25 | extern "C" void f(); |
| 26 | namespace { |
| 27 | extern "C" void f(); |
| 28 | } |
| 29 | void g() { f(); } |
| 30 | } |
| 31 | |