xref: /llvm-project/clang/test/CXX/basic/basic.link/p7.cpp (revision 541b38be7bf3afded3269a33586418254d82d7b3)
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