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