// RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11 // base-clause: // : base-specifier-list // base-specifier-list: // base-specifier ...[opt] // base-specifier-list , base-specifier ...[opt] // base-specifier: // attribute-specifier-seq[opt] base-type-specifier // attribute-specifier-seq[opt] virtual access-specifier[opt] base-type-specifier // attribute-specifier-seq[opt] access-specifier virtual[opt] base-type-specifier // class-or-decltype: // nested-name-specifier[opt] class-name // decltype-specifier // base-type-specifier: // class-or-decltype // access-specifier: // private // protected // public namespace PR11216 { struct Base { }; struct Derived : decltype(Base()) { }; int func(); struct Derived2 : decltype(func()) { }; // expected-error {{base specifier must name a class}} template<typename T> struct Derived3 : decltype(T().foo()) { }; struct Foo { Base foo(); }; Derived3<Foo> d; struct Derived4 : :: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}} struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}} template<typename T> struct Derived6 : typename T::foo { }; // expected-error {{'typename' is redundant; base classes are implicitly types}} } |