74 lines
1.4 KiB
C++
74 lines
1.4 KiB
C++
// 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, "");
|
|
}
|