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