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