Home | History | Annotate | Download | only in namespace.udecl
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // C++03 [namespace.udecl]p11: (per DR101)
      4 //   If a function declaration in namespace scope or block scope has
      5 //   the same name and the same parameter types as a function
      6 //   introduced by a using-declaration, and the declarations do not declare the
      7 //   same function, the program is ill-formed. [Note: two using-declarations may
      8 //   introduce functions with the same name and the same parameter types. If,
      9 //   for a call to an unqualified function name, function overload resolution
     10 //   selects the functions introduced by such using-declarations, the function
     11 //   call is ill-formed.]
     12 //
     13 // FIXME: DR565 introduces parallel wording here for function templates.
     14 
     15 namespace test0 {
     16   namespace ns { void foo(); } // expected-note {{target of using declaration}}
     17   int foo(void); // expected-note {{conflicting declaration}}
     18   using ns::foo; // expected-error {{target of using declaration conflicts with declaration already in scope}}
     19 }
     20 
     21 namespace test1 {
     22   namespace ns { void foo(); } // expected-note {{target of using declaration}}
     23   using ns::foo; //expected-note {{using declaration}}
     24   int foo(void); // expected-error {{declaration conflicts with target of using declaration already in scope}}
     25 }
     26 
     27 namespace test2 {
     28   namespace ns { void foo(); } // expected-note 2 {{target of using declaration}}
     29   void test0() {
     30     int foo(void); // expected-note {{conflicting declaration}}
     31     using ns::foo; // expected-error {{target of using declaration conflicts with declaration already in scope}}
     32   }
     33 
     34   void test1() {
     35     using ns::foo; //expected-note {{using declaration}}
     36     int foo(void); // expected-error {{declaration conflicts with target of using declaration already in scope}}
     37   }
     38 }
     39 
     40 namespace test3 {
     41   namespace ns { void foo(); } // expected-note 2 {{target of using declaration}}
     42   class Test0 {
     43     void test() {
     44       int foo(void); // expected-note {{conflicting declaration}}
     45       using ns::foo; // expected-error {{target of using declaration conflicts with declaration already in scope}}
     46     }
     47   };
     48 
     49   class Test1 {
     50     void test() {
     51       using ns::foo; //expected-note {{using declaration}}
     52       int foo(void); // expected-error {{declaration conflicts with target of using declaration already in scope}}
     53     }
     54   };
     55 }
     56 
     57 namespace test4 {
     58   namespace ns { void foo(); } // expected-note 2 {{target of using declaration}}
     59   template <typename> class Test0 {
     60     void test() {
     61       int foo(void); // expected-note {{conflicting declaration}}
     62       using ns::foo; // expected-error {{target of using declaration conflicts with declaration already in scope}}
     63     }
     64   };
     65 
     66   template <typename> class Test1 {
     67     void test() {
     68       using ns::foo; //expected-note {{using declaration}}
     69       int foo(void); // expected-error {{declaration conflicts with target of using declaration already in scope}}
     70     }
     71   };
     72 }
     73 
     74 // FIXME: we should be able to diagnose both of these, but we can't.
     75 namespace test5 {
     76   namespace ns { void foo(int); }
     77   template <typename T> class Test0 {
     78     void test() {
     79       int foo(T);
     80       using ns::foo;
     81     }
     82   };
     83 
     84   template <typename T> class Test1 {
     85     void test() {
     86       using ns::foo;
     87       int foo(T);
     88     }
     89   };
     90 
     91   template class Test0<int>;
     92   template class Test1<int>;
     93 }
     94 
     95 namespace test6 {
     96   namespace ns { void foo(); } // expected-note {{target of using declaration}}
     97   using ns::foo; // expected-note {{using declaration}}
     98   namespace ns {
     99     using test6::foo;
    100     void foo() {}
    101   }
    102   void foo(); // expected-error {{declaration conflicts with target of using declaration already in scope}}
    103 }
    104 
    105 namespace test7 {
    106   void foo();
    107   using test7::foo;
    108   void foo() {}
    109 }
    110