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 15namespace 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 21namespace 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 27namespace 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 40namespace 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 57namespace 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. 75namespace 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 95namespace 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 105namespace test7 { 106 void foo(); 107 using test7::foo; 108 void foo() {} 109} 110