16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 26bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 3bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlsson 4bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlssonextern "C" { void f(bool); } 5bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlsson 6bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlssonnamespace std { 7bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlsson using ::f; 8bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlsson inline void f() { return f(true); } 9bc13ab2bc75bd997a2a40e371f50a4c456d8ee69Anders Carlsson} 102531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor 112531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregornamespace M { 122531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor void f(float); 132531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor} 142531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor 152531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregornamespace N { 162531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor using M::f; 172531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor void f(int) { } // expected-note{{previous}} 182531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor 192531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor void f(int) { } // expected-error{{redefinition}} 202531c2d2f1e8ce35f2ce8e9539738ddf8dccb7ccDouglas Gregor} 21891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor 22891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregornamespace N { 23891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void f(double); 24891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void f(long); 25891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor} 26891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor 27891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregorstruct X0 { 28891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void operator()(int); 29891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void operator()(long); 30891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor}; 31891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor 32891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregorstruct X1 : X0 { 33891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor // FIXME: give this operator() a 'float' parameter to test overloading 34891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor // behavior. It currently fails. 35891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void operator()(); 36891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor using X0::operator(); 37891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor 38891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor void test() { 39891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor (*this)(1); 40891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor } 41891fdae811e991d15b26fc165724c4cf6b6737a6Douglas Gregor}; 42ca910e84ea026a898c7184d3f3608403005b9bc0Anders Carlsson 43ca910e84ea026a898c7184d3f3608403005b9bc0Anders Carlssonstruct A { void f(); }; 44ca910e84ea026a898c7184d3f3608403005b9bc0Anders Carlssonstruct B : A { }; 45ca910e84ea026a898c7184d3f3608403005b9bc0Anders Carlssonclass C : B { using B::f; }; 46bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth 47bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth// PR5751: Resolve overloaded functions through using decls. 48bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruthnamespace O { 49bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void f(int i); 50bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void f(double d); 51bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth} 52bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruthnamespace P { 53bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void f(); 54bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void g(void (*ptr)(int)); 55bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth using O::f; 56bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void test() { 57bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth f(); 58bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth f(1); 59bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void (*f_ptr1)(double) = f; 60bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth void (*f_ptr2)() = f; 61bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth g(f); 62bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth } 63bd64729ac6de8fed320e7a722597cc5444709c63Chandler Carruth} 64a113e7263c5337731c65fada9de7ff72af25423bJohn McCall 65a113e7263c5337731c65fada9de7ff72af25423bJohn McCall// Make sure that ADL can find names brought in by using decls. 66a113e7263c5337731c65fada9de7ff72af25423bJohn McCallnamespace test0 { 67a113e7263c5337731c65fada9de7ff72af25423bJohn McCall namespace ns { 68a113e7263c5337731c65fada9de7ff72af25423bJohn McCall class Foo {}; 69a113e7263c5337731c65fada9de7ff72af25423bJohn McCall 70a113e7263c5337731c65fada9de7ff72af25423bJohn McCall namespace inner { 71a113e7263c5337731c65fada9de7ff72af25423bJohn McCall void foo(char *); // expected-note {{no known conversion}} 72a113e7263c5337731c65fada9de7ff72af25423bJohn McCall } 73a113e7263c5337731c65fada9de7ff72af25423bJohn McCall 74a113e7263c5337731c65fada9de7ff72af25423bJohn McCall using inner::foo; 75a113e7263c5337731c65fada9de7ff72af25423bJohn McCall } 76a113e7263c5337731c65fada9de7ff72af25423bJohn McCall 77a113e7263c5337731c65fada9de7ff72af25423bJohn McCall void test(ns::Foo *p) { 78a113e7263c5337731c65fada9de7ff72af25423bJohn McCall foo(*p); // expected-error {{no matching function for call to 'foo'}} 79a113e7263c5337731c65fada9de7ff72af25423bJohn McCall } 80a113e7263c5337731c65fada9de7ff72af25423bJohn McCall} 817edb5fdf9703e1abd780417db691b77d5fcbc610John McCall 827edb5fdf9703e1abd780417db691b77d5fcbc610John McCall// Redeclarations! 837edb5fdf9703e1abd780417db691b77d5fcbc610John McCallnamespace test1 { 847edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace ns0 { struct Foo {}; } 857edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace A { void foo(ns0::Foo *p, int y, int z); } 867edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace ns2 { using A::foo; } 877edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace ns1 { struct Bar : ns0::Foo {}; } 887edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace A { void foo(ns0::Foo *p, int y, int z = 0); } // expected-note {{candidate}} 897edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace ns1 { using A::foo; } 907edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace ns2 { struct Baz : ns1::Bar {}; } 917edb5fdf9703e1abd780417db691b77d5fcbc610John McCall namespace A { void foo(ns0::Foo *p, int y = 0, int z); } 927edb5fdf9703e1abd780417db691b77d5fcbc610John McCall 937edb5fdf9703e1abd780417db691b77d5fcbc610John McCall void test(ns2::Baz *p) { 947edb5fdf9703e1abd780417db691b77d5fcbc610John McCall foo(p, 0, 0); // okay! 957edb5fdf9703e1abd780417db691b77d5fcbc610John McCall foo(p, 0); // should be fine! 967edb5fdf9703e1abd780417db691b77d5fcbc610John McCall foo(p); // expected-error {{no matching function}} 977edb5fdf9703e1abd780417db691b77d5fcbc610John McCall } 987edb5fdf9703e1abd780417db691b77d5fcbc610John McCall} 9978b810559d89e996e00684335407443936ce34a1John McCall 10078b810559d89e996e00684335407443936ce34a1John McCallnamespace test2 { 10178b810559d89e996e00684335407443936ce34a1John McCall namespace ns { int foo; } 10278b810559d89e996e00684335407443936ce34a1John McCall template <class T> using ns::foo; // expected-error {{cannot template a using declaration}} 10378b810559d89e996e00684335407443936ce34a1John McCall 10478b810559d89e996e00684335407443936ce34a1John McCall // PR8022 10578b810559d89e996e00684335407443936ce34a1John McCall struct A { 10678b810559d89e996e00684335407443936ce34a1John McCall template <typename T> void f(T); 10778b810559d89e996e00684335407443936ce34a1John McCall }; 10878b810559d89e996e00684335407443936ce34a1John McCall class B : A { 10978b810559d89e996e00684335407443936ce34a1John McCall template <typename T> using A::f<T>; // expected-error {{cannot template a using declaration}} 11078b810559d89e996e00684335407443936ce34a1John McCall }; 11178b810559d89e996e00684335407443936ce34a1John McCall} 1126fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor 1136fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor// PR8756 1146fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregornamespace foo 1156fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor{ 1166fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor class Class1; // expected-note{{forward declaration}} 1176fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor class Class2 1186fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor { 1196fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor using ::foo::Class1::Function; // expected-error{{incomplete type 'foo::Class1' named in nested name specifier}} 1206fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor }; 1216fb0729241ab204e9bed9a5ff2f5bd396db111d4Douglas Gregor} 1220daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1230daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain// Don't suggest non-typenames for positions requiring typenames. 1240daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_tyname_val { 1250daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace N { void FFF() {} } 1260daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainusing typename N::FFG; // expected-error {{no member named 'FFG' in namespace 'using_suggestion_tyname_val::N'}} 1270daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1280daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1290daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_member_tyname_val { 1300daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainclass CCC { public: void AAA() { } }; 1310daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainclass DDD : public CCC { public: using typename CCC::AAB; }; // expected-error {{no member named 'AAB' in 'using_suggestion_member_tyname_val::CCC'}} 1320daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1330daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1340daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_tyname_val_dropped_specifier { 1350daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainvoid FFF() {} 1360daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace N { } 1370daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainusing typename N::FFG; // expected-error {{no member named 'FFG' in namespace 'using_suggestion_tyname_val_dropped_specifier::N'}} 1380daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1390daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1400daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain// Currently hints aren't provided to drop out the incorrect M::. 1410daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_ty_dropped_nested_specifier { 1420daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace N { 1436e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainclass AAA {}; // expected-note {{'N::AAA' declared here}} 1440daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace M { } 1450daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1466e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainusing N::M::AAA; // expected-error {{no member named 'AAA' in namespace 'using_suggestion_ty_dropped_nested_specifier::N::M'; did you mean 'N::AAA'?}} 1470daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1480daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1490daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_tyname_ty_dropped_nested_specifier { 1500daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace N { 1516e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainclass AAA {}; // expected-note {{'N::AAA' declared here}} 1520daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace M { } 1530daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1546e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainusing typename N::M::AAA; // expected-error {{no member named 'AAA' in namespace 'using_suggestion_tyname_ty_dropped_nested_specifier::N::M'; did you mean 'N::AAA'?}} 1550daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1560daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain 1570daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace using_suggestion_val_dropped_nested_specifier { 1580daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace N { 1596e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainvoid FFF() {} // expected-note {{'N::FFF' declared here}} 1600daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrainnamespace M { } 1610daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1626e4f6f865010649bc3969e57436b5501544a0c39Kaelyn Uhrainusing N::M::FFF; // expected-error {{no member named 'FFF' in namespace 'using_suggestion_val_dropped_nested_specifier::N::M'; did you mean 'N::FFF'?}} 1630daf1f4a0ff1cd6487c7040ac8f97eee48185536Kaelyn Uhrain} 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace UsingDeclVsHiddenName { 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines namespace A { 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum HiddenTag1 {}; // expected-note {{previous use is here}} 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines enum HiddenTag2 {}; // expected-note {{target}} 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int HiddenFn1; // expected-note {{target}} 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int HiddenFn2; // expected-note {{target}} 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int HiddenLocalExtern1; 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int HiddenLocalExtern2; 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines namespace B { 1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenTag1; 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenFn1; // expected-note {{using declaration}} 1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenLocalExtern1; 1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct S { 1816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend struct HiddenTag1; // expected-error {{tag type that does not match previous}} 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend struct HiddenTag2; // expected-note {{conflicting declaration}} 1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend void HiddenFn1(); // expected-error {{cannot befriend target of using declaration}} 1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend void HiddenFn2(); // expected-note {{conflicting declaration}} 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void f() { 1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // OK, these are not in the scope of namespace B, even though they're 1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // members of the namespace. 1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void HiddenLocalExtern1(); 1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void HiddenLocalExtern2(); 1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 1926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenTag2; // expected-error {{conflicts with declaration already in scope}} 1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenFn2; // expected-error {{conflicts with declaration already in scope}} 1956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::HiddenLocalExtern2; 1966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19171 { 2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct Z { 2016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Z(); 2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines typedef struct { 2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Z i; 2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } S; 2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct Y : S { 2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using S::S; 2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus < 201103L 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-error@-2 {{no member named 'S' in 'PR19171::S'}} 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 2136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // [namespace.udecl]p3: In a using-declaration used as a member-declaration, 2166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // the nested-name-specifier shall name a base class of the class being defined. 2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If such a using-declaration names a constructor, the nested-name-specifier 2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // shall name a direct base class of the class being defined; 2196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct B_blah { }; 2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct C_blah : B_blah { C_blah(int); }; // expected-note 0-1{{declared here}} 2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct D1 : C_blah { 2236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: We should be able to correct this in C++11 mode. 2246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using B_blah::C_blah; // expected-error-re {{no member named 'C_blah' in 'PR19171::B_blah'{{$}}}} 2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct D2 : C_blah { 2276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Somewhat bizarrely, this names the injected-class-name of B_blah within 2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // C_blah, and is valid. 2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using C_blah::B_blah; 2306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct D3 : C_blah { 2326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using C_blah::D_blah; 2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus < 201103L 2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-error-re@-2 {{no member named 'D_blah' in 'PR19171::C_blah'{{$}}}} 2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#else 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // expected-error@-4 {{no member named 'D_blah' in 'PR19171::C_blah'; did you mean 'C_blah'?}} 2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L 2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines D3 d3(0); // ok 2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct E { }; 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct EE { int EE; }; 2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct F : E { 2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using E::EE; // expected-error-re {{no member named 'EE' in 'PR19171::E'{{$}}}} 2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace TypoCorrectTemplateMember { 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct A { 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> void foobar(T); // expected-note {{'foobar' declared here}} 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct B : A { 2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines using A::goobar; // expected-error {{no member named 'goobar' in 'TypoCorrectTemplateMember::A'; did you mean 'foobar'?}} 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 258