// 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}}
}