xref: /aosp_15_r20/external/clang/test/CXX/basic/basic.link/p7.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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