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