xref: /aosp_15_r20/external/clang/test/CXX/class.derived/p1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -fsyntax-only -verify -std=c++11
2*67e74705SXin Li 
3*67e74705SXin Li // base-clause:
4*67e74705SXin Li //         : base-specifier-list
5*67e74705SXin Li // base-specifier-list:
6*67e74705SXin Li //         base-specifier ...[opt]
7*67e74705SXin Li //         base-specifier-list , base-specifier ...[opt]
8*67e74705SXin Li // base-specifier:
9*67e74705SXin Li //         attribute-specifier-seq[opt] base-type-specifier
10*67e74705SXin Li //         attribute-specifier-seq[opt] virtual access-specifier[opt] base-type-specifier
11*67e74705SXin Li //         attribute-specifier-seq[opt] access-specifier virtual[opt] base-type-specifier
12*67e74705SXin Li // class-or-decltype:
13*67e74705SXin Li //         nested-name-specifier[opt] class-name
14*67e74705SXin Li //         decltype-specifier
15*67e74705SXin Li // base-type-specifier:
16*67e74705SXin Li //         class-or-decltype
17*67e74705SXin Li // access-specifier:
18*67e74705SXin Li //         private
19*67e74705SXin Li //         protected
20*67e74705SXin Li //         public
21*67e74705SXin Li 
22*67e74705SXin Li namespace PR11216 {
23*67e74705SXin Li   struct Base { };
24*67e74705SXin Li   struct Derived : decltype(Base()) { };
25*67e74705SXin Li 
26*67e74705SXin Li   int func();
27*67e74705SXin Li   struct Derived2 : decltype(func()) { }; // expected-error {{base specifier must name a class}}
28*67e74705SXin Li 
29*67e74705SXin Li   template<typename T>
30*67e74705SXin Li   struct Derived3 : decltype(T().foo()) { };
31*67e74705SXin Li   struct Foo { Base foo(); };
32*67e74705SXin Li   Derived3<Foo> d;
33*67e74705SXin Li 
34*67e74705SXin Li   struct Derived4 : :: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
35*67e74705SXin Li 
36*67e74705SXin Li   struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
37*67e74705SXin Li 
38*67e74705SXin Li   template<typename T>
39*67e74705SXin Li   struct Derived6 : typename T::foo { }; // expected-error {{'typename' is redundant; base classes are implicitly types}}
40*67e74705SXin Li }
41