1 // RUN: %clang_cc1 -verify -std=c++1y %s 2 3 // Example from the standard. 4 namespace X { p()5 void p() { 6 q(); // expected-error {{undeclared}} 7 extern void q(); 8 } middle()9 void middle() { 10 q(); // expected-error {{undeclared}} 11 } q()12 void q() { /*...*/ } bottom()13 void bottom() { 14 q(); 15 } 16 } 17 int q(); 18 19 namespace Test1 { f()20 void f() { 21 extern int a; // expected-note {{previous}} 22 int g(void); // expected-note {{previous}} 23 } 24 double a; // expected-error {{different type: 'double' vs 'int'}} 25 double g(); // expected-error {{differ only in their return type}} 26 } 27 28 namespace Test2 { f()29 void f() { 30 extern int a; // expected-note {{previous}} 31 int g(void); // expected-note {{previous}} 32 } h()33 void h() { 34 extern double a; // expected-error {{different type: 'double' vs 'int'}} 35 double g(void); // expected-error {{differ only in their return type}} 36 } 37 } 38 39 namespace Test3 { f()40 constexpr void (*f())() { 41 void h(); 42 return &h; 43 } g()44 constexpr void (*g())() { 45 void h(); 46 return &h; 47 } 48 static_assert(f() == g(), ""); 49 } 50 51 namespace Test4 { 52 template<typename T> f()53 constexpr void (*f())() { 54 void h(); 55 return &h; 56 } 57 static_assert(f<int>() == f<char>(), ""); 58 void h(); 59 static_assert(f<int>() == &h, ""); 60 } 61 62 namespace Test5 { f()63 constexpr auto f() -> void (*)() { 64 void g(); 65 struct X { 66 friend void g(); 67 static constexpr auto h() -> void (*)() { return g; } 68 }; 69 return X::h(); 70 } 71 void g(); 72 static_assert(f() == g, ""); 73 } 74