xref: /aosp_15_r20/external/clang/test/Parser/cxx0x-decl.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fsyntax-only -std=c++11 -pedantic-errors -triple x86_64-linux-gnu %s
2*67e74705SXin Li 
3*67e74705SXin Li // Make sure we know these are legitimate commas and not typos for ';'.
4*67e74705SXin Li namespace Commas {
5*67e74705SXin Li   int a,
6*67e74705SXin Li   b [[ ]],
7*67e74705SXin Li   c alignas(double);
8*67e74705SXin Li }
9*67e74705SXin Li 
10*67e74705SXin Li struct S {};
11*67e74705SXin Li enum E { e, };
12*67e74705SXin Li 
13*67e74705SXin Li auto f() -> struct S {
14*67e74705SXin Li   return S();
15*67e74705SXin Li }
16*67e74705SXin Li auto g() -> enum E {
17*67e74705SXin Li   return E();
18*67e74705SXin Li }
19*67e74705SXin Li 
20*67e74705SXin Li int decltype(f())::*ptr_mem_decltype;
21*67e74705SXin Li 
22*67e74705SXin Li class ExtraSemiAfterMemFn {
23*67e74705SXin Li   // Due to a peculiarity in the C++11 grammar, a deleted or defaulted function
24*67e74705SXin Li   // is permitted to be followed by either one or two semicolons.
25*67e74705SXin Li   void f() = delete // expected-error {{expected ';' after delete}}
26*67e74705SXin Li   void g() = delete; // ok
27*67e74705SXin Li   void h() = delete;; // ok
28*67e74705SXin Li   void i() = delete;;; // expected-error {{extra ';' after member function definition}}
29*67e74705SXin Li };
30*67e74705SXin Li 
31*67e74705SXin Li int *const const p = 0; // expected-error {{duplicate 'const' declaration specifier}}
32*67e74705SXin Li const const int *q = 0; // expected-error {{duplicate 'const' declaration specifier}}
33*67e74705SXin Li 
34*67e74705SXin Li struct MultiCV {
35*67e74705SXin Li   void f() const const; // expected-error {{duplicate 'const' declaration specifier}}
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li static_assert(something, ""); // expected-error {{undeclared identifier}}
39*67e74705SXin Li 
40*67e74705SXin Li // PR9903
41*67e74705SXin Li struct SS {
42*67e74705SXin Li   typedef void d() = default; // expected-error {{function definition declared 'typedef'}} expected-error {{only special member functions may be defaulted}}
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li using PR14855 = int S::; // expected-error {{expected ';' after alias declaration}}
46*67e74705SXin Li 
47*67e74705SXin Li // Ensure that 'this' has a const-qualified type in a trailing return type for
48*67e74705SXin Li // a constexpr function.
49*67e74705SXin Li struct ConstexprTrailingReturn {
50*67e74705SXin Li   int n;
51*67e74705SXin Li   constexpr auto f() const -> decltype((n));
52*67e74705SXin Li };
f() const53*67e74705SXin Li constexpr const int &ConstexprTrailingReturn::f() const { return n; }
54*67e74705SXin Li 
55*67e74705SXin Li namespace TestIsValidAfterTypeSpecifier {
56*67e74705SXin Li struct s {} v;
57*67e74705SXin Li 
58*67e74705SXin Li struct s
59*67e74705SXin Li thread_local tl;
60*67e74705SXin Li 
61*67e74705SXin Li struct s
62*67e74705SXin Li &r0 = v;
63*67e74705SXin Li 
64*67e74705SXin Li struct s
65*67e74705SXin Li &&r1 = s();
66*67e74705SXin Li 
67*67e74705SXin Li struct s
68*67e74705SXin Li bitand r2 = v;
69*67e74705SXin Li 
70*67e74705SXin Li struct s
71*67e74705SXin Li and r3 = s();
72*67e74705SXin Li 
73*67e74705SXin Li enum E {};
74*67e74705SXin Li enum E
75*67e74705SXin Li [[]] e;
76*67e74705SXin Li 
77*67e74705SXin Li }
78*67e74705SXin Li 
79*67e74705SXin Li namespace PR5066 {
80*67e74705SXin Li   using T = int (*f)(); // expected-error {{type-id cannot have a name}}
81*67e74705SXin Li   template<typename T> using U = int (*f)(); // expected-error {{type-id cannot have a name}}
82*67e74705SXin Li   auto f() -> int (*f)(); // expected-error {{type-id cannot have a name}}
83*67e74705SXin Li   auto g = []() -> int (*f)() {}; // expected-error {{type-id cannot have a name}}
84*67e74705SXin Li }
85*67e74705SXin Li 
86*67e74705SXin Li namespace FinalOverride {
87*67e74705SXin Li   struct Base {
88*67e74705SXin Li     virtual void *f();
89*67e74705SXin Li     virtual void *g();
90*67e74705SXin Li     virtual void *h();
91*67e74705SXin Li     virtual void *i();
92*67e74705SXin Li   };
93*67e74705SXin Li   struct Derived : Base {
94*67e74705SXin Li     virtual auto f() -> void *final;
95*67e74705SXin Li     virtual auto g() -> void *override;
96*67e74705SXin Li     virtual auto h() -> void *final override;
97*67e74705SXin Li     virtual auto i() -> void *override final;
98*67e74705SXin Li   };
99*67e74705SXin Li }
100*67e74705SXin Li 
101*67e74705SXin Li namespace UsingDeclAttrs {
102*67e74705SXin Li   using T __attribute__((aligned(1))) = int;
103*67e74705SXin Li   using T [[gnu::aligned(1)]] = int;
104*67e74705SXin Li   static_assert(alignof(T) == 1, "");
105*67e74705SXin Li 
106*67e74705SXin Li   using [[gnu::aligned(1)]] T = int; // expected-error {{an attribute list cannot appear here}}
107*67e74705SXin Li   using T = int [[gnu::aligned(1)]]; // expected-error {{'aligned' attribute cannot be applied to types}}
108*67e74705SXin Li }
109*67e74705SXin Li 
110*67e74705SXin Li namespace DuplicateSpecifier {
111*67e74705SXin Li   constexpr constexpr int f(); // expected-warning {{duplicate 'constexpr' declaration specifier}}
112*67e74705SXin Li   constexpr int constexpr a = 0; // expected-warning {{duplicate 'constexpr' declaration specifier}}
113*67e74705SXin Li 
114*67e74705SXin Li   struct A {
115*67e74705SXin Li     friend constexpr int constexpr friend f(); // expected-warning {{duplicate 'friend' declaration specifier}} \
116*67e74705SXin Li                                                // expected-warning {{duplicate 'constexpr' declaration specifier}}
117*67e74705SXin Li     friend struct A friend; // expected-warning {{duplicate 'friend'}} expected-error {{'friend' must appear first}}
118*67e74705SXin Li   };
119*67e74705SXin Li }
120*67e74705SXin Li 
121*67e74705SXin Li namespace ColonColonDecltype {
122*67e74705SXin Li   struct S { struct T {}; };
123*67e74705SXin Li   ::decltype(S())::T invalid; // expected-error {{expected unqualified-id}}
124*67e74705SXin Li }
125*67e74705SXin Li 
126*67e74705SXin Li struct Base { virtual void f() = 0; virtual void g() = 0; virtual void h() = 0; };
127*67e74705SXin Li struct MemberComponentOrder : Base {
fMemberComponentOrder128*67e74705SXin Li   void f() override __asm__("foobar") __attribute__(( )) {}
129*67e74705SXin Li   void g() __attribute__(( )) override;
hMemberComponentOrder130*67e74705SXin Li   void h() __attribute__(( )) override {}
131*67e74705SXin Li };
132*67e74705SXin Li 
133*67e74705SXin Li void NoMissingSemicolonHere(struct S
134*67e74705SXin Li                             [3]);
135*67e74705SXin Li template<int ...N> void NoMissingSemicolonHereEither(struct S
136*67e74705SXin Li                                                      ... [N]);
137*67e74705SXin Li 
138*67e74705SXin Li // This must be at the end of the file; we used to look ahead past the EOF token here.
139*67e74705SXin Li // expected-error@+1 {{expected unqualified-id}}
140*67e74705SXin Li using
141