41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
|
// 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}}
|
||
|
}
|