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 Liconstexpr 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