// RUN: %clang_cc1 -verify -std=c++1y %s // Example from the standard. namespace X { void p() { q(); // expected-error {{undeclared}} extern void q(); } void middle() { q(); // expected-error {{undeclared}} } void q() { /*...*/ } void bottom() { q(); } } int q(); namespace Test1 { void f() { extern int a; // expected-note {{previous}} int g(void); // expected-note {{previous}} } double a; // expected-error {{different type: 'double' vs 'int'}} double g(); // expected-error {{differ only in their return type}} } namespace Test2 { void f() { extern int a; // expected-note {{previous}} int g(void); // expected-note {{previous}} } void h() { extern double a; // expected-error {{different type: 'double' vs 'int'}} double g(void); // expected-error {{differ only in their return type}} } } namespace Test3 { constexpr void (*f())() { void h(); return &h; } constexpr void (*g())() { void h(); return &h; } static_assert(f() == g(), ""); } namespace Test4 { template<typename T> constexpr void (*f())() { void h(); return &h; } static_assert(f<int>() == f<char>(), ""); void h(); static_assert(f<int>() == &h, ""); } namespace Test5 { constexpr auto f() -> void (*)() { void g(); struct X { friend void g(); static constexpr auto h() -> void (*)() { return g; } }; return X::h(); } void g(); static_assert(f() == g, ""); } |