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