101e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor// RUN: %clang_cc1 -verify %s 201e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 301e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregortemplate <class T> struct Base { // expected-note 4 {{member found by ambiguous name lookup}} 401e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor static void f(); 501e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor}; 601e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 701e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregorstruct X0 { }; 801e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 901e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregortemplate <class T> struct Derived: Base<int>, Base<char> { 1001e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor typename Derived::Base b; // expected-error{{member 'Base' found in multiple base classes of different types}} 1101e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor typename Derived::Base<double> d; // OK 1201e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 1301e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor void g(X0 *t) { 1401e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor t->Derived::Base<T>::f(); 1501e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor t->Base<T>::f(); 1601e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor t->Base::f(); // expected-error{{member 'Base' found in multiple base classes of different types}} \ 1701e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor // expected-error{{no member named 'f' in 'X0'}} \ 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error{{'Base' is not a class, namespace, or scoped enumeration}} 1901e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor } 2001e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor}; 2101e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 2201e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregornamespace PR6717 { 2301e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor template <typename T> 2401e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor class WebVector { 25cf6b0a20c697ba8daf2dff3a4cce2a028b33cb48Richard Smith } // expected-error {{expected ';' after class}} 2601e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 27cf6b0a20c697ba8daf2dff3a4cce2a028b33cb48Richard Smith WebVector(const WebVector<T>& other) { } // expected-error{{undeclared identifier 'T'}} \ 28cf6b0a20c697ba8daf2dff3a4cce2a028b33cb48Richard Smith expected-error{{requires a type specifier}} 2901e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor 3001e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor template <typename C> 31cf6b0a20c697ba8daf2dff3a4cce2a028b33cb48Richard Smith WebVector<T>& operator=(const C& other) { } // expected-error{{undeclared identifier 'T'}} 3201e56aecb77a96dcd93fa0e901b919f2e441981dDouglas Gregor} 33