llvm-project

Форк
0
/
cxx-decl.cpp 
312 строк · 7.7 Кб
1
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions %s
2
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions -std=c++98 %s
3
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -Wredundant-parens -pedantic-errors -fcxx-exceptions -fexceptions -std=c++11 %s
4

5
const char const *x10; // expected-error {{duplicate 'const' declaration specifier}}
6

7
int x(*g); // expected-error {{use of undeclared identifier 'g'}}
8

9
private int cplusplus_is_not_opencl; // expected-error {{expected unqualified-id}}
10

11
struct Type {
12
  int Type;
13
};
14

15
typedef 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.
18
namespace y {
19
  struct a { };
20
  typedef int b;
21
}
22

23
y::a a1;
24
y:a a2;  // expected-error {{unexpected ':' in nested name specifier}}
25
y::a a3 = a2;
26

27
// Some valid colons:
28
void foo() {
29
y:  // label
30
  y::a s;
31

32
  int a = 4;
33
  a = a ? a : a+1;
34
}
35

36
struct b : y::a {};
37

38
template <typename T>
39
class someclass {
40

41
  int bar() {
42
    T *P;
43
    return 1 ? P->x : P->y;
44
  }
45
};
46

47
class asm_class_test {
48
  void foo() __asm__("baz");
49
};
50

51
enum { fooenum = 1, };
52
#if __cplusplus <= 199711L
53
// expected-error@-2 {{commas at the end of enumerator lists are a C++11 extension}}
54
#endif
55

56
struct a {
57
  int Type : fooenum;
58
};
59

60
void 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

70
struct 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 ';'.
77
namespace 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 <= 199711L
91
  // expected-error@-2 2{{rvalue references are a C++11 extension}}
92
#endif
93

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
// PR5825
111
struct test5 {};
112
::new(static_cast<void*>(0)) test5; // expected-error {{expected unqualified-id}}
113

114

115
// PR6782
116
template<class T>
117
class Class1;
118

119
class Class2 {
120
} // expected-error {{expected ';' after class}}
121

122
typedef Class1<Class2> Type1;
123

124
struct CodeCompleteConsumer {
125
};
126

127
void CodeCompleteConsumer::() { // expected-error {{xpected unqualified-id}}
128
}
129

130
;
131

132
// PR4111
133
void f(sqrgl); // expected-error {{unknown type name 'sqrgl'}}
134

135
// PR9903
136
struct 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

144
namespace TestIsValidAfterTypeSpecifier {
145
struct s {} v;
146

147
namespace a {
148
struct s operator++(struct s a)
149
{ return a; }
150
}
151

152
namespace b {
153
// The newline after s should make no difference.
154
struct s
155
operator++(struct s a)
156
{ return a; }
157
}
158

159
struct X {
160
  struct s
161
  friend f();
162
  struct s
163
  virtual f();
164
};
165

166
struct s
167
&r0 = v;
168
struct s
169
bitand r2 = v;
170

171
}
172

173
struct DIE {
174
  void foo() {}
175
};
176

177
void 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

191
namespace 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 < 201103L
198
// expected-error@-2 {{[[]] attributes are a C++11 extension}}
199
#endif
200

201
namespace 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

216
void test8() {
217
  struct {} o;
218
  // This used to crash.
219
  (&o)->(); // expected-error{{expected unqualified-id}}
220
}
221

222
namespace 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 <= 199711L
228
  // expected-error@-2 {{alias declarations are a C++11 extensio}}
229
#endif
230

231
}
232

233
namespace PR17255 {
234
void foo() {
235
  typename A::template B<> c; // expected-error {{use of undeclared identifier 'A'}}
236
#if __cplusplus <= 199711L
237
  // expected-error@-2 {{'template' keyword outside of a template}}
238
#endif
239
}
240
}
241

242
namespace 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

251
namespace 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

258
namespace 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 parens
262
  // 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

277
inline 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 as
286
      //   friend (::B::C)();
287
      // we do need parentheses *somewhere* here.
288
      friend A (::B::C());
289
    };
290
  }
291
}
292

293
namespace 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
// PR8380
299
extern ""      // expected-error {{unknown linkage language}}
300
test6a { ;// expected-error {{a type specifier is required for all declarations}}
301
#if __cplusplus <= 199711L
302
// expected-error@-2 {{expected ';' after top level declarator}}
303
#else
304
// expected-error@-4 {{expected expression}}
305
// expected-note@-5 {{to match this}}
306
#endif
307

308
  int test6b;
309
#if __cplusplus >= 201103L
310
// expected-error@+3 {{expected}}
311
// expected-error@-3 {{expected ';' after top level declarator}}
312
#endif
313

314

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.