314 lines · cpp
1// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions %s2// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions -std=c++98 %s3// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions -std=c++11 %s4 5const char const *x10; // expected-error {{duplicate 'const' declaration specifier}}6 7int x(*g); // expected-error {{use of undeclared identifier 'g'}}8 9private int cplusplus_is_not_opencl; // expected-error {{expected unqualified-id}}10 11struct Type {12 int Type;13};14 15typedef char bool; // expected-error {{redeclaration of C++ built-in type 'bool'}}16 17// PR4451 - We should recover well from the typo of '::' as ':' in a2.18namespace y {19 struct a { };20 typedef int b;21}22 23y::a a1;24y:a a2; // expected-error {{unexpected ':' in nested name specifier}}25y::a a3 = a2;26 27// Some valid colons:28void foo() {29y: // label30 y::a s;31 32 int a = 4;33 a = a ? a : a+1;34}35 36struct b : y::a {};37 38template <typename T>39class someclass {40 41 int bar() {42 T *P;43 return 1 ? P->x : P->y;44 }45};46 47class asm_class_test {48 void foo() __asm__("baz");49};50 51enum { fooenum = 1, };52#if __cplusplus <= 199711L53// expected-error@-2 {{commas at the end of enumerator lists are a C++11 extension}}54#endif55 56struct a {57 int Type : fooenum;58};59 60void test(struct Type *P) {61 int Type;62 Type = 1 ? P->Type : Type;63 64 Type = (y:b) 4; // expected-error {{unexpected ':' in nested name specifier}}65 Type = 1 ? (66 (y:b) // expected-error {{unexpected ':' in nested name specifier}}67 4) : 5;68}69 70struct test4 {71 int x // expected-error {{expected ';' at end of declaration list}}72 int y;73 int z // expected-error {{expected ';' at end of declaration list}}74};75 76// Make sure we know these are legitimate commas and not typos for ';'.77namespace Commas {78 struct S {79 static int a;80 int c,81 operator()();82 };83 84 int global1,85 __attribute__(()) global2,86 (global5), // expected-warning {{redundant parentheses surrounding declarator}}87 *global6,88 &global7 = global1,89 &&global8 = static_cast<int&&>(global1),90#if __cplusplus <= 199711L91 // expected-error@-2 2{{rvalue references are a C++11 extension}}92#endif93 94 S::a,95 global9,96 global10 = 0,97 global11 == 0, // expected-error {{did you mean '='}}98 global12 __attribute__(()),99 global13(0),100 global14[2],101 global15;102 103 void g() {104 static int a,105 b __asm__("ebx"), // expected-error {{expected ';' at end of declaration}}106 Statics:return;107 }108}109 110// PR5825111struct test5 {};112::new(static_cast<void*>(0)) test5; // expected-error {{expected unqualified-id}}113 114 115// PR6782116template<class T>117class Class1;118 119class Class2 {120} // expected-error {{expected ';' after class}}121 122typedef Class1<Class2> Type1;123 124struct CodeCompleteConsumer {125};126 127void CodeCompleteConsumer::() { // expected-error {{xpected unqualified-id}}128}129 130;131 132// PR4111133void f(sqrgl); // expected-error {{unknown type name 'sqrgl'}}134 135// PR9903136struct S {137 typedef void a() { }; // expected-error {{function definition declared 'typedef'}}138 typedef void c() try { } catch(...) { } // expected-error {{function definition declared 'typedef'}}139 int n, m;140 typedef S() : n(1), m(2) { } // expected-error {{function definition declared 'typedef'}}141};142 143 144namespace TestIsValidAfterTypeSpecifier {145struct s {} v;146 147namespace a {148struct s operator++(struct s a)149{ return a; }150}151 152namespace b {153// The newline after s should make no difference.154struct s155operator++(struct s a)156{ return a; }157}158 159struct X {160 struct s161 friend f();162 struct s163 virtual f();164};165 166struct s167&r0 = v;168struct s169bitand r2 = v;170 171}172 173struct DIE {174 void foo() {}175};176 177void test (DIE die, DIE *Die, DIE INT, DIE *FLOAT) {178 DIE.foo(); // expected-error {{cannot use dot operator on a type}}179 die.foo();180 181 DIE->foo(); // expected-error {{cannot use arrow operator on a type}}182 Die->foo();183 184 int.foo(); // expected-error {{cannot use dot operator on a type}}185 INT.foo();186 187 float->foo(); // expected-error {{cannot use arrow operator on a type}}188 FLOAT->foo();189}190 191namespace PR15017 {192 template<typename T = struct X { int i; }> struct S {}; // expected-error {{'PR15017::X' cannot be defined in a type specifier}}193}194 195// Ensure we produce at least some diagnostic for attributes in C++98.196[[]] struct S; // expected-error {{misplaced attributes}}197#if __cplusplus < 201103L198// expected-error@-2 {{[[]] attributes are a C++11 extension}}199#endif200 201namespace test7 {202 struct Foo {203 void a();204 void b();205 };206 207 void Foo::208 // Comment!209 a() {}210 211 212 void Foo:: // expected-error {{expected unqualified-id}}213 // Comment!214}215 216void test8() {217 struct {} o;218 // This used to crash.219 (&o)->(); // expected-error{{expected unqualified-id}}220}221 222namespace PR5066 {223 template<typename T> struct X {};224 X<int N> x; // expected-error {{type-id cannot have a name}}225 226 using T = int (*T)(); // expected-error {{type-id cannot have a name}}227#if __cplusplus <= 199711L228 // expected-error@-2 {{alias declarations are a C++11 extensio}}229#endif230 231}232 233namespace PR17255 {234void foo() {235 typename A::template B<> c; // expected-error {{use of undeclared identifier 'A'}}236#if __cplusplus <= 199711L237 // expected-error@-2 {{'template' keyword outside of a template}}238#endif239}240}241 242namespace PR17567 {243 struct Foobar { // expected-note 2{{declared here}}244 FooBar(); // expected-error {{missing return type for function 'FooBar'; did you mean the constructor name 'Foobar'?}}245 ~FooBar(); // expected-error {{undeclared identifier 'FooBar' in destructor name}}246 };247 FooBar::FooBar() {} // expected-error {{undeclared}} expected-error {{missing return type}}248 FooBar::~FooBar() {} // expected-error 2{{undeclared}}249}250 251namespace DuplicateFriend {252 struct A {253 friend void friend f(); // expected-warning {{duplicate 'friend' declaration specifier}}254 friend struct B friend; // expected-warning {{duplicate 'friend' declaration specifier}}255 };256}257 258namespace NNS {259 struct A {};260 namespace B { extern A C1, C2, *C3, C4[], C5; }261 // Do not produce a redundant parentheses warning here; removing these parens262 // changes the meaning of the program.263 A (::NNS::B::C1);264 A (NNS::B::C2); // expected-warning {{redundant parentheses surrounding declarator}}265 A (*::NNS::B::C3); // expected-warning {{redundant parentheses surrounding declarator}}266 A (::NNS::B::C4[2]);267 // Removing one of these sets of parentheses would be reasonable.268 A ((::NNS::B::C5)); // expected-warning {{redundant parentheses surrounding declarator}}269 270 void f() {271 // FIXME: A vexing-parse warning here would be useful.272 A(::NNS::B::C1); // expected-error {{definition or redeclaration}}273 A(NNS::B::C1); // expected-warning {{redundant paren}} expected-error {{definition or redeclaration}}274 }275}276 277inline namespace ParensAroundFriend { // expected-error 0-1{{C++11}}278 struct A {};279 struct B {280 static A C();281 };282 namespace X {283 struct B {};284 struct D {285 // No warning here: while this could be written as286 // friend (::B::C)();287 // we do need parentheses *somewhere* here.288 friend A (::B::C());289 };290 }291}292 293namespace rdar37099386 {294 class A typename A; // expected-error {{expected a qualified name after 'typename'}}295 // expected-error@-1 {{cannot combine with previous 'class' declaration specifier}}296}297 298// PR8380299extern "" // expected-error {{unknown linkage language}}300test6a { ;// expected-error {{a type specifier is required for all declarations}}301#if __cplusplus <= 199711L302// expected-error@-2 {{expected ';' after top level declarator}}303#else304// expected-error@-4 {{expected expression}}305// expected-note@-5 {{to match this}}306#endif307 308 int test6b;309#if __cplusplus >= 201103L310// expected-error@+3 {{expected}}311// expected-error@-3 {{expected ';' after top level declarator}}312#endif313 314