Home | History | Annotate | Download | only in basic.link
      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 }
     74