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