142aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
242aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
342aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregornamespace PR8019 {
442aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor  struct x;
542aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor  template<typename T> struct x2;
642aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor  struct y {
742aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    struct PR8019::x { int x; };  // expected-error{{non-friend class member 'x' cannot have a qualified name}}
842aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
942aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    struct inner;
1075379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor    struct y::inner { }; // expected-error{{extra qualification on member 'inner'}}
1142aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
1242aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    template<typename T>
1342aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    struct PR8019::x2 { }; // expected-error{{non-friend class member 'x2' cannot have a qualified name}}
1442aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
1542aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    template<typename T>
1642aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    struct inner_template;
1742aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
1842aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor    template<typename T>
1975379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor    struct y::inner_template { }; // expected-error{{extra qualification on member 'inner_template'}}
2042aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor  };
2142aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor
2242aceadbc3806868cee8ac576347d258ac99e1f6Douglas Gregor}
236960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor
246960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregornamespace NS {
256960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor  void foo();
266960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor  extern int bar;
276960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor  struct X;
286960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor  template<typename T> struct Y;
296960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor  template<typename T> void wibble(T);
306960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor}
316960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregornamespace NS {
3275379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  void NS::foo() {} // expected-error{{extra qualification on member 'foo'}}
3375379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  int NS::bar; // expected-error{{extra qualification on member 'bar'}}
3475379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  struct NS::X { }; // expected-error{{extra qualification on member 'X'}}
3575379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  template<typename T> struct NS::Y; // expected-error{{extra qualification on member 'Y'}}
3675379455fc88ca1f021e55ffe1cab3a9c2b2a37aDouglas Gregor  template<typename T> void NS::wibble(T) { } // expected-error{{extra qualification on member 'wibble'}}
376960587df0bd1b421c11715807a4d2302a3aae3cDouglas Gregor}
38