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