13a0f7ac43aa3dcf1e3231549ca9ce8cffd5a2d7cRichard Smith// RUN: %clang_cc1 -verify -fsyntax-only -std=c++11 -pedantic-errors -triple x86_64-linux-gnu %s 20706df40064d4d7559b4304af79d519033414b84Richard Smith 30706df40064d4d7559b4304af79d519033414b84Richard Smith// Make sure we know these are legitimate commas and not typos for ';'. 40706df40064d4d7559b4304af79d519033414b84Richard Smithnamespace Commas { 50706df40064d4d7559b4304af79d519033414b84Richard Smith int a, 60706df40064d4d7559b4304af79d519033414b84Richard Smith b [[ ]], 70706df40064d4d7559b4304af79d519033414b84Richard Smith c alignas(double); 80706df40064d4d7559b4304af79d519033414b84Richard Smith} 97796eb5643244f3134834253ce5ea89107ac21c1Richard Smith 107796eb5643244f3134834253ce5ea89107ac21c1Richard Smithstruct S {}; 11eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smithenum E { e, }; 127796eb5643244f3134834253ce5ea89107ac21c1Richard Smith 137796eb5643244f3134834253ce5ea89107ac21c1Richard Smithauto f() -> struct S { 147796eb5643244f3134834253ce5ea89107ac21c1Richard Smith return S(); 157796eb5643244f3134834253ce5ea89107ac21c1Richard Smith} 167796eb5643244f3134834253ce5ea89107ac21c1Richard Smithauto g() -> enum E { 177796eb5643244f3134834253ce5ea89107ac21c1Richard Smith return E(); 187796eb5643244f3134834253ce5ea89107ac21c1Richard Smith} 19eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith 20eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smithclass ExtraSemiAfterMemFn { 21eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith // Due to a peculiarity in the C++11 grammar, a deleted or defaulted function 22eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith // is permitted to be followed by either one or two semicolons. 23eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith void f() = delete // expected-error {{expected ';' after delete}} 24eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith void g() = delete; // ok 25eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith void h() = delete;; // ok 26d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith void i() = delete;;; // expected-error {{extra ';' after member function definition}} 27eab9d6f9065b042d39fbaf9842c9d8cc968dd6d0Richard Smith}; 2842926a065572a63610f651bb1589fe1217e2e0a7Richard Smith 29d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smithint *const const p = 0; // expected-error {{duplicate 'const' declaration specifier}} 30d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smithconst const int *q = 0; // expected-error {{duplicate 'const' declaration specifier}} 31d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith 32d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smithstruct MultiCV { 33d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith void f() const const; // expected-error {{duplicate 'const' declaration specifier}} 34d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith}; 353686c71ff92e4357a78993a16a27185f16ab6234Richard Smith 363686c71ff92e4357a78993a16a27185f16ab6234Richard Smithstatic_assert(something, ""); // expected-error {{undeclared identifier}} 376f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith 386f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith// PR9903 396f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smithstruct SS { 406f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith typedef void d() = default; // expected-error {{function definition declared 'typedef'}} expected-error {{only special member functions may be defaulted}} 416f9a445760992a6fbff2c0b08becf35ae9eafa71Richard Smith}; 426a502c4430088fe3bac7b5886cd9425f7e306b63Richard Smith 436a502c4430088fe3bac7b5886cd9425f7e306b63Richard Smithusing PR14855 = int S::; // expected-error {{expected ';' after alias declaration}} 447b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smith 457b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smith// Ensure that 'this' has a const-qualified type in a trailing return type for 467b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smith// a constexpr function. 477b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smithstruct ConstexprTrailingReturn { 487b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smith int n; 49840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith constexpr auto f() const -> decltype((n)); 507b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smith}; 517b19cb116d0909de72dc8242b0a4e6c5ed39d421Richard Smithconstexpr const int &ConstexprTrailingReturn::f() const { return n; } 52ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 53ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithnamespace TestIsValidAfterTypeSpecifier { 54ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s {} v; 55ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 56ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s 57ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smiththread_local tl; 58ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 59ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s 60ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith&r0 = v; 61ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 62ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s 63ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith&&r1 = s(); 64ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 65ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s 66ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithbitand r2 = v; 67ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 68ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithstruct s 69ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithand r3 = s(); 70ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 71ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithenum E {}; 72ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smithenum E 73ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith[[]] e; 74ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith 75ba65f505b7cc2551571b299d05d767e0a892aaaeRichard Smith} 76a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith 77a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smithnamespace PR5066 { 78a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith using T = int (*f)(); // expected-error {{type-id cannot have a name}} 79a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith template<typename T> using U = int (*f)(); // expected-error {{type-id cannot have a name}} 80a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith auto f() -> int (*f)(); // expected-error {{type-id cannot have a name}} 81a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith auto g = []() -> int (*f)() {}; // expected-error {{type-id cannot have a name}} 82a38253c3e7dbd2b5aadb0556845dc3848168b904Richard Smith} 838d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith 848d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smithnamespace FinalOverride { 858d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith struct Base { 868d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual void *f(); 878d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual void *g(); 888d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual void *h(); 898d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual void *i(); 908d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith }; 918d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith struct Derived : Base { 928d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual auto f() -> void *final; 938d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual auto g() -> void *override; 948d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual auto h() -> void *final override; 958d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith virtual auto i() -> void *override final; 968d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith }; 978d1ab8a083d5613b24bbfd68bf02cd2a295dab22Richard Smith} 98df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith 99df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smithnamespace UsingDeclAttrs { 100df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith using T __attribute__((aligned(1))) = int; 101df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith using T [[gnu::aligned(1)]] = int; 102df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith static_assert(alignof(T) == 1, ""); 103df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith 104df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith using [[gnu::aligned(1)]] T = int; // expected-error {{an attribute list cannot appear here}} 105df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith using T = int [[gnu::aligned(1)]]; // expected-error {{'aligned' attribute cannot be applied to types}} 106df1cce5bcd367ee47f4a7579c3a1cb4618248514Richard Smith} 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace DuplicateSpecifier { 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr constexpr int f(); // expected-warning {{duplicate 'constexpr' declaration specifier}} 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines constexpr int constexpr a = 0; // expected-warning {{duplicate 'constexpr' declaration specifier}} 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct A { 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend constexpr int constexpr friend f(); // expected-warning {{duplicate 'friend' declaration specifier}} \ 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-warning {{duplicate 'constexpr' declaration specifier}} 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines friend struct A friend; // expected-warning {{duplicate 'friend'}} expected-error {{'friend' must appear first}} 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace ColonColonDecltype { 120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct S { struct T {}; }; 121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ::decltype(S())::T invalid; // expected-error {{expected unqualified-id}} 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Base { virtual void f() = 0; virtual void g() = 0; virtual void h() = 0; }; 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct MemberComponentOrder : Base { 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() override __asm__("foobar") __attribute__(( )) {} 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() __attribute__(( )) override; 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h() __attribute__(( )) override {} 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid NoMissingSemicolonHere(struct S 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines [3]); 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate<int ...N> void NoMissingSemicolonHereEither(struct S 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ... [N]); 135a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar 136a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// This must be at the end of the file; we used to look ahead past the EOF token here. 137a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar// expected-error@+1 {{expected unqualified-id}} 138a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainarusing 139