blob: 5f69c54043614ad2e6c3c1541bbc9897a08f8b7a [file] [log] [blame]
Manuel Klimeke6de22d2012-11-06 17:31:40 +00001//===- unittest/AST/SourceLocationTest.cpp - AST source loc unit tests ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains tests for SourceLocation and SourceRange fields
11// in AST nodes.
12//
13// FIXME: In the long-term, when we test more than source locations, we may
14// want to have a unit test file for an AST node (or group of related nodes),
15// rather than a unit test file for source locations for all AST nodes.
16//
17//===----------------------------------------------------------------------===//
18
19#include "clang/AST/ASTContext.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000020#include "MatchVerifier.h"
Manuel Klimeke6de22d2012-11-06 17:31:40 +000021#include "clang/ASTMatchers/ASTMatchFinder.h"
Chandler Carruth320d9662012-12-04 09:45:34 +000022#include "clang/ASTMatchers/ASTMatchers.h"
Manuel Klimeke6de22d2012-11-06 17:31:40 +000023#include "clang/Tooling/Tooling.h"
24#include "gtest/gtest.h"
25
26namespace clang {
27namespace ast_matchers {
28
Manuel Klimekaa58b972013-01-31 13:10:40 +000029// FIXME: Pull the *Verifier tests into their own test file.
Manuel Klimeke6de22d2012-11-06 17:31:40 +000030
31TEST(MatchVerifier, ParseError) {
32 LocationVerifier<VarDecl> Verifier;
33 Verifier.expectLocation(1, 1);
34 EXPECT_FALSE(Verifier.match("int i", varDecl()));
35}
36
37TEST(MatchVerifier, NoMatch) {
38 LocationVerifier<VarDecl> Verifier;
39 Verifier.expectLocation(1, 1);
40 EXPECT_FALSE(Verifier.match("int i;", recordDecl()));
41}
42
43TEST(MatchVerifier, WrongType) {
44 LocationVerifier<RecordDecl> Verifier;
45 Verifier.expectLocation(1, 1);
46 EXPECT_FALSE(Verifier.match("int i;", varDecl()));
47}
48
49TEST(LocationVerifier, WrongLocation) {
50 LocationVerifier<VarDecl> Verifier;
51 Verifier.expectLocation(1, 1);
52 EXPECT_FALSE(Verifier.match("int i;", varDecl()));
53}
54
55TEST(RangeVerifier, WrongRange) {
56 RangeVerifier<VarDecl> Verifier;
57 Verifier.expectRange(1, 1, 1, 1);
58 EXPECT_FALSE(Verifier.match("int i;", varDecl()));
59}
60
61class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> {
62protected:
Alexander Kornienko34eb2072015-04-11 02:00:23 +000063 SourceRange getRange(const LabelStmt &Node) override {
Manuel Klimeke6de22d2012-11-06 17:31:40 +000064 return Node.getDecl()->getSourceRange();
65 }
66};
67
68TEST(LabelDecl, Range) {
69 LabelDeclRangeVerifier Verifier;
70 Verifier.expectRange(1, 12, 1, 12);
71 EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
72}
73
74TEST(LabelStmt, Range) {
75 RangeVerifier<LabelStmt> Verifier;
76 Verifier.expectRange(1, 12, 1, 15);
77 EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
78}
79
80TEST(ParmVarDecl, KNRLocation) {
81 LocationVerifier<ParmVarDecl> Verifier;
82 Verifier.expectLocation(1, 8);
83 EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
84}
85
86TEST(ParmVarDecl, KNRRange) {
87 RangeVerifier<ParmVarDecl> Verifier;
88 Verifier.expectRange(1, 8, 1, 8);
89 EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
90}
91
David Blaikieb9db60f2012-11-07 17:17:07 +000092TEST(CXXNewExpr, ArrayRange) {
93 RangeVerifier<CXXNewExpr> Verifier;
94 Verifier.expectRange(1, 12, 1, 22);
Aaron Ballman512fb642015-09-17 13:30:52 +000095 EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", cxxNewExpr()));
David Blaikieb9db60f2012-11-07 17:17:07 +000096}
97
David Blaikie3a0de212012-11-08 22:53:48 +000098TEST(CXXNewExpr, ParenRange) {
99 RangeVerifier<CXXNewExpr> Verifier;
100 Verifier.expectRange(1, 12, 1, 20);
Aaron Ballman512fb642015-09-17 13:30:52 +0000101 EXPECT_TRUE(Verifier.match("void f() { new int(); }", cxxNewExpr()));
David Blaikie3a0de212012-11-08 22:53:48 +0000102}
103
Abramo Bagnara9b836fb2012-11-08 13:52:58 +0000104TEST(MemberExpr, ImplicitMemberRange) {
105 RangeVerifier<MemberExpr> Verifier;
106 Verifier.expectRange(2, 30, 2, 30);
107 EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
108 "int foo(const S& s) { return s; }",
Yunzhong Gaoeba323a2015-05-01 02:04:32 +0000109 memberExpr()));
110}
111
112class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> {
Alexander Kornienko34eb2072015-04-11 02:00:23 +0000113protected:
114 SourceRange getRange(const MemberExpr &Node) override {
Yunzhong Gaoeba323a2015-05-01 02:04:32 +0000115 return Node.getOperatorLoc();
116 }
117};
118
119TEST(MemberExpr, ArrowRange) {
120 MemberExprArrowLocVerifier Verifier;
121 Verifier.expectRange(2, 19, 2, 19);
122 EXPECT_TRUE(Verifier.match("struct S { int x; };\n"
123 "void foo(S *s) { s->x = 0; }",
124 memberExpr()));
125}
126
127TEST(MemberExpr, MacroArrowRange) {
128 MemberExprArrowLocVerifier Verifier;
129 Verifier.expectRange(1, 24, 1, 24);
130 EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n"
131 "struct S { int x; };\n"
132 "void foo(S *s) { MEMBER(s, x) = 0; }",
133 memberExpr()));
134}
135
136TEST(MemberExpr, ImplicitArrowRange) {
137 MemberExprArrowLocVerifier Verifier;
138 Verifier.expectRange(0, 0, 0, 0);
139 EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n"
140 "void S::Test() { x = 1; }",
141 memberExpr()));
142}
143
144TEST(VarDecl, VMTypeFixedVarDeclRange) {
145 RangeVerifier<VarDecl> Verifier;
146 Verifier.expectRange(1, 1, 1, 23);
Abramo Bagnara341ab732012-11-08 14:44:42 +0000147 EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
148 varDecl(), Lang_C89));
149}
150
Malcolm Parsons57c09c82016-10-21 21:13:56 +0000151TEST(TypeLoc, IntRange) {
152 RangeVerifier<TypeLoc> Verifier;
153 Verifier.expectRange(1, 1, 1, 1);
154 EXPECT_TRUE(Verifier.match("int a;", typeLoc()));
155}
156
157TEST(TypeLoc, LongRange) {
158 RangeVerifier<TypeLoc> Verifier;
159 Verifier.expectRange(1, 1, 1, 1);
160 EXPECT_TRUE(Verifier.match("long a;", typeLoc()));
161}
162
163TEST(TypeLoc, LongDoubleRange) {
164 RangeVerifier<TypeLoc> Verifier;
165 Verifier.expectRange(1, 1, 1, 6);
166 EXPECT_TRUE(Verifier.match("long double a;", typeLoc()));
167}
168
169TEST(TypeLoc, DoubleLongRange) {
170 RangeVerifier<TypeLoc> Verifier;
171 Verifier.expectRange(1, 1, 1, 8);
172 EXPECT_TRUE(Verifier.match("double long a;", typeLoc()));
173}
174
175TEST(TypeLoc, LongIntRange) {
176 RangeVerifier<TypeLoc> Verifier;
177 Verifier.expectRange(1, 1, 1, 6);
178 EXPECT_TRUE(Verifier.match("long int a;", typeLoc()));
179}
180
181TEST(TypeLoc, IntLongRange) {
182 RangeVerifier<TypeLoc> Verifier;
183 Verifier.expectRange(1, 1, 1, 5);
184 EXPECT_TRUE(Verifier.match("int long a;", typeLoc()));
185}
186
187TEST(TypeLoc, UnsignedIntRange) {
188 RangeVerifier<TypeLoc> Verifier;
189 Verifier.expectRange(1, 1, 1, 10);
190 EXPECT_TRUE(Verifier.match("unsigned int a;", typeLoc()));
191}
192
193TEST(TypeLoc, IntUnsignedRange) {
194 RangeVerifier<TypeLoc> Verifier;
195 Verifier.expectRange(1, 1, 1, 5);
196 EXPECT_TRUE(Verifier.match("int unsigned a;", typeLoc()));
197}
198
199TEST(TypeLoc, LongLongRange) {
200 RangeVerifier<TypeLoc> Verifier;
201 Verifier.expectRange(1, 1, 1, 6);
202 EXPECT_TRUE(Verifier.match("long long a;", typeLoc()));
203}
204
205TEST(TypeLoc, UnsignedLongLongRange) {
206 RangeVerifier<TypeLoc> Verifier;
207 Verifier.expectRange(1, 1, 1, 15);
208 EXPECT_TRUE(Verifier.match("unsigned long long a;", typeLoc()));
209}
210
211TEST(TypeLoc, LongUnsignedLongRange) {
212 RangeVerifier<TypeLoc> Verifier;
213 Verifier.expectRange(1, 1, 1, 15);
214 EXPECT_TRUE(Verifier.match("long unsigned long a;", typeLoc()));
215}
216
217TEST(TypeLoc, LongLongUnsignedRange) {
218 RangeVerifier<TypeLoc> Verifier;
219 Verifier.expectRange(1, 1, 1, 11);
220 EXPECT_TRUE(Verifier.match("long long unsigned a;", typeLoc()));
221}
222
223TEST(TypeLoc, ConstLongLongRange) {
224 RangeVerifier<TypeLoc> Verifier;
225 Verifier.expectRange(1, 7, 1, 12);
226 EXPECT_TRUE(Verifier.match("const long long a = 0;", typeLoc()));
227}
228
229TEST(TypeLoc, LongConstLongRange) {
230 RangeVerifier<TypeLoc> Verifier;
231 Verifier.expectRange(1, 1, 1, 12);
232 EXPECT_TRUE(Verifier.match("long const long a = 0;", typeLoc()));
233}
234
235TEST(TypeLoc, LongLongConstRange) {
236 RangeVerifier<TypeLoc> Verifier;
237 Verifier.expectRange(1, 1, 1, 6);
238 EXPECT_TRUE(Verifier.match("long long const a = 0;", typeLoc()));
239}
240
Abramo Bagnara341ab732012-11-08 14:44:42 +0000241TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
242 RangeVerifier<CXXConstructorDecl> Verifier;
243 Verifier.expectRange(1, 11, 1, 13);
244 EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
245}
246
Eli Bendersky5f4d76e2015-03-23 21:43:28 +0000247TEST(CXXConstructorDecl, DefaultedCtorLocRange) {
248 RangeVerifier<CXXConstructorDecl> Verifier;
249 Verifier.expectRange(1, 11, 1, 23);
250 EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl()));
251}
252
253TEST(CXXConstructorDecl, DeletedCtorLocRange) {
254 RangeVerifier<CXXConstructorDecl> Verifier;
255 Verifier.expectRange(1, 11, 1, 22);
256 EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl()));
257}
258
Richard Smith9ca91012013-02-05 05:55:57 +0000259TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
260 RangeVerifier<CompoundLiteralExpr> Verifier;
261 Verifier.expectRange(2, 11, 2, 22);
262 EXPECT_TRUE(Verifier.match(
263 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
264 "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
265}
266
267TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
268 RangeVerifier<CompoundLiteralExpr> Verifier;
Tanya Lattner713eef42013-04-05 20:14:50 +0000269 Verifier.expectRange(2, 20, 2, 31);
Richard Smith9ca91012013-02-05 05:55:57 +0000270 EXPECT_TRUE(Verifier.match(
271 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner713eef42013-04-05 20:14:50 +0000272 "constant int2 i2 = (int2)(1, 2);",
Richard Smith9ca91012013-02-05 05:55:57 +0000273 compoundLiteralExpr(), Lang_OpenCL));
274}
275
276TEST(InitListExpr, VectorLiteralListBraceRange) {
277 RangeVerifier<InitListExpr> Verifier;
278 Verifier.expectRange(2, 17, 2, 22);
279 EXPECT_TRUE(Verifier.match(
280 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
281 "int2 i2 = (int2){1, 2};", initListExpr()));
282}
283
284TEST(InitListExpr, VectorLiteralInitListParens) {
285 RangeVerifier<InitListExpr> Verifier;
Tanya Lattner713eef42013-04-05 20:14:50 +0000286 Verifier.expectRange(2, 26, 2, 31);
Richard Smith9ca91012013-02-05 05:55:57 +0000287 EXPECT_TRUE(Verifier.match(
288 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner713eef42013-04-05 20:14:50 +0000289 "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
Richard Smith9ca91012013-02-05 05:55:57 +0000290}
291
Manuel Klimek81228302013-06-07 11:27:57 +0000292class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
293protected:
Alexander Kornienko34eb2072015-04-11 02:00:23 +0000294 SourceRange getRange(const TypeLoc &Node) override {
Manuel Klimek81228302013-06-07 11:27:57 +0000295 TemplateSpecializationTypeLoc T =
Eli Friedman7152fbe2013-06-07 20:31:48 +0000296 Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
Manuel Klimek81228302013-06-07 11:27:57 +0000297 assert(!T.isNull());
298 return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
299 }
300};
301
302TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
303 TemplateAngleBracketLocRangeVerifier Verifier;
304 Verifier.expectRange(2, 8, 2, 10);
305 EXPECT_TRUE(Verifier.match(
306 "template<typename T> struct A {}; struct B{}; void f(\n"
307 "const A<B>&);",
308 loc(templateSpecializationType())));
309}
310
Eli Friedman2dcbdc02013-06-17 22:35:10 +0000311TEST(CXXNewExpr, TypeParenRange) {
312 RangeVerifier<CXXNewExpr> Verifier;
313 Verifier.expectRange(1, 10, 1, 18);
Aaron Ballman512fb642015-09-17 13:30:52 +0000314 EXPECT_TRUE(Verifier.match("int* a = new (int);", cxxNewExpr()));
Eli Friedman2dcbdc02013-06-17 22:35:10 +0000315}
316
Enea Zaffanellaa90af722013-07-06 18:54:58 +0000317class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
318protected:
Alexander Kornienko34eb2072015-04-11 02:00:23 +0000319 SourceRange getRange(const TypeLoc &Node) override {
Enea Zaffanellaa90af722013-07-06 18:54:58 +0000320 UnaryTransformTypeLoc T =
321 Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
322 assert(!T.isNull());
323 return SourceRange(T.getLParenLoc(), T.getRParenLoc());
324 }
325};
326
327TEST(UnaryTransformTypeLoc, ParensRange) {
328 UnaryTransformTypeLocParensRangeVerifier Verifier;
329 Verifier.expectRange(3, 26, 3, 28);
330 EXPECT_TRUE(Verifier.match(
331 "template <typename T>\n"
332 "struct S {\n"
333 "typedef __underlying_type(T) type;\n"
334 "};",
335 loc(unaryTransformType())));
336}
337
Enea Zaffanella8421a062013-07-07 06:41:54 +0000338TEST(CXXFunctionalCastExpr, SourceRange) {
339 RangeVerifier<CXXFunctionalCastExpr> Verifier;
340 Verifier.expectRange(2, 10, 2, 14);
341 EXPECT_TRUE(Verifier.match(
342 "int foo() {\n"
343 " return int{};\n"
344 "}",
Aaron Ballman512fb642015-09-17 13:30:52 +0000345 cxxFunctionalCastExpr(), Lang_CXX11));
Enea Zaffanella8421a062013-07-07 06:41:54 +0000346}
347
Peter Collingbourneb8d17e72014-02-22 02:59:41 +0000348TEST(CXXConstructExpr, SourceRange) {
349 RangeVerifier<CXXConstructExpr> Verifier;
350 Verifier.expectRange(3, 14, 3, 19);
351 EXPECT_TRUE(Verifier.match(
352 "struct A { A(int, int); };\n"
353 "void f(A a);\n"
354 "void g() { f({0, 0}); }",
Aaron Ballman512fb642015-09-17 13:30:52 +0000355 cxxConstructExpr(), Lang_CXX11));
Peter Collingbourneb8d17e72014-02-22 02:59:41 +0000356}
357
Enea Zaffanella76e98fe2013-09-07 05:49:53 +0000358TEST(CXXTemporaryObjectExpr, SourceRange) {
359 RangeVerifier<CXXTemporaryObjectExpr> Verifier;
360 Verifier.expectRange(2, 6, 2, 12);
361 EXPECT_TRUE(Verifier.match(
362 "struct A { A(int, int); };\n"
363 "A a( A{0, 0} );",
Aaron Ballman512fb642015-09-17 13:30:52 +0000364 cxxTemporaryObjectExpr(), Lang_CXX11));
Enea Zaffanella76e98fe2013-09-07 05:49:53 +0000365}
366
Enea Zaffanella8421a062013-07-07 06:41:54 +0000367TEST(CXXUnresolvedConstructExpr, SourceRange) {
368 RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
369 Verifier.expectRange(3, 10, 3, 12);
Enea Zaffanella4c409492013-07-08 14:50:30 +0000370 std::vector<std::string> Args;
371 Args.push_back("-fno-delayed-template-parsing");
Enea Zaffanella8421a062013-07-07 06:41:54 +0000372 EXPECT_TRUE(Verifier.match(
373 "template <typename U>\n"
374 "U foo() {\n"
375 " return U{};\n"
376 "}",
Aaron Ballman512fb642015-09-17 13:30:52 +0000377 cxxUnresolvedConstructExpr(), Args, Lang_CXX11));
Enea Zaffanella8421a062013-07-07 06:41:54 +0000378}
379
Enea Zaffanellac70b2512013-07-17 17:28:56 +0000380TEST(UsingDecl, SourceRange) {
381 RangeVerifier<UsingDecl> Verifier;
382 Verifier.expectRange(2, 22, 2, 25);
383 EXPECT_TRUE(Verifier.match(
384 "class B { protected: int i; };\n"
385 "class D : public B { B::i; };",
386 usingDecl()));
387}
388
389TEST(UnresolvedUsingValueDecl, SourceRange) {
390 RangeVerifier<UnresolvedUsingValueDecl> Verifier;
391 Verifier.expectRange(3, 3, 3, 6);
392 EXPECT_TRUE(Verifier.match(
393 "template <typename B>\n"
394 "class D : public B {\n"
395 " B::i;\n"
396 "};",
397 unresolvedUsingValueDecl()));
398}
399
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000400TEST(FriendDecl, FriendNonMemberFunctionLocation) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000401 LocationVerifier<FriendDecl> Verifier;
402 Verifier.expectLocation(2, 13);
403 EXPECT_TRUE(Verifier.match("struct A {\n"
404 "friend void f();\n"
405 "};\n",
406 friendDecl()));
407}
408
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000409TEST(FriendDecl, FriendNonMemberFunctionRange) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000410 RangeVerifier<FriendDecl> Verifier;
411 Verifier.expectRange(2, 1, 2, 15);
412 EXPECT_TRUE(Verifier.match("struct A {\n"
413 "friend void f();\n"
414 "};\n",
415 friendDecl()));
416}
417
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000418TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) {
419 LocationVerifier<FriendDecl> Verifier;
420 Verifier.expectLocation(2, 12);
421 EXPECT_TRUE(Verifier.match("struct A {\n"
422 "friend int f() { return 0; }\n"
423 "};\n",
424 friendDecl()));
425}
426
427TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) {
428 RangeVerifier<FriendDecl> Verifier;
429 Verifier.expectRange(2, 1, 2, 28);
430 EXPECT_TRUE(Verifier.match("struct A {\n"
431 "friend int f() { return 0; }\n"
432 "};\n",
433 friendDecl()));
434}
435
436TEST(FriendDecl, FriendElaboratedTypeLocation) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000437 LocationVerifier<FriendDecl> Verifier;
438 Verifier.expectLocation(2, 8);
439 EXPECT_TRUE(Verifier.match("struct A {\n"
440 "friend class B;\n"
441 "};\n",
442 friendDecl()));
443}
444
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000445TEST(FriendDecl, FriendElaboratedTypeRange) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000446 RangeVerifier<FriendDecl> Verifier;
447 Verifier.expectRange(2, 1, 2, 14);
448 EXPECT_TRUE(Verifier.match("struct A {\n"
449 "friend class B;\n"
450 "};\n",
451 friendDecl()));
452}
453
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000454TEST(FriendDecl, FriendSimpleTypeLocation) {
455 LocationVerifier<FriendDecl> Verifier;
456 Verifier.expectLocation(3, 8);
457 EXPECT_TRUE(Verifier.match("class B;\n"
458 "struct A {\n"
459 "friend B;\n"
460 "};\n",
461 friendDecl(), Lang_CXX11));
462}
463
464TEST(FriendDecl, FriendSimpleTypeRange) {
465 RangeVerifier<FriendDecl> Verifier;
466 Verifier.expectRange(3, 1, 3, 8);
467 EXPECT_TRUE(Verifier.match("class B;\n"
468 "struct A {\n"
469 "friend B;\n"
470 "};\n",
471 friendDecl(), Lang_CXX11));
472}
473
Nikola Smiljanic357af642014-06-06 04:40:35 +0000474TEST(FriendDecl, FriendTemplateParameterLocation) {
475 LocationVerifier<FriendDecl> Verifier;
476 Verifier.expectLocation(3, 8);
477 EXPECT_TRUE(Verifier.match("template <typename T>\n"
478 "struct A {\n"
479 "friend T;\n"
480 "};\n",
481 friendDecl(), Lang_CXX11));
482}
483
484TEST(FriendDecl, FriendTemplateParameterRange) {
485 RangeVerifier<FriendDecl> Verifier;
486 Verifier.expectRange(3, 1, 3, 8);
487 EXPECT_TRUE(Verifier.match("template <typename T>\n"
488 "struct A {\n"
489 "friend T;\n"
490 "};\n",
491 friendDecl(), Lang_CXX11));
492}
493
494TEST(FriendDecl, FriendDecltypeLocation) {
495 LocationVerifier<FriendDecl> Verifier;
496 Verifier.expectLocation(4, 8);
497 EXPECT_TRUE(Verifier.match("struct A;\n"
498 "A foo();\n"
499 "struct A {\n"
500 "friend decltype(foo());\n"
501 "};\n",
502 friendDecl(), Lang_CXX11));
503}
504
505TEST(FriendDecl, FriendDecltypeRange) {
506 RangeVerifier<FriendDecl> Verifier;
507 Verifier.expectRange(4, 1, 4, 8);
508 EXPECT_TRUE(Verifier.match("struct A;\n"
509 "A foo();\n"
510 "struct A {\n"
511 "friend decltype(foo());\n"
512 "};\n",
513 friendDecl(), Lang_CXX11));
514}
515
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000516TEST(FriendDecl, FriendConstructorDestructorLocation) {
517 const std::string Code = "struct B {\n"
518 "B();\n"
519 "~B();\n"
520 "};\n"
521 "struct A {\n"
522 "friend B::B(), B::~B();\n"
523 "};\n";
524 LocationVerifier<FriendDecl> ConstructorVerifier;
525 ConstructorVerifier.expectLocation(6, 11);
526 EXPECT_TRUE(ConstructorVerifier.match(
Aaron Ballman512fb642015-09-17 13:30:52 +0000527 Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000528 LocationVerifier<FriendDecl> DestructorVerifier;
529 DestructorVerifier.expectLocation(6, 19);
530 EXPECT_TRUE(DestructorVerifier.match(
Aaron Ballman512fb642015-09-17 13:30:52 +0000531 Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000532}
533
534TEST(FriendDecl, FriendConstructorDestructorRange) {
535 const std::string Code = "struct B {\n"
536 "B();\n"
537 "~B();\n"
538 "};\n"
539 "struct A {\n"
540 "friend B::B(), B::~B();\n"
541 "};\n";
542 RangeVerifier<FriendDecl> ConstructorVerifier;
543 ConstructorVerifier.expectRange(6, 1, 6, 13);
544 EXPECT_TRUE(ConstructorVerifier.match(
Aaron Ballman512fb642015-09-17 13:30:52 +0000545 Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000546 RangeVerifier<FriendDecl> DestructorVerifier;
547 DestructorVerifier.expectRange(6, 1, 6, 22);
548 EXPECT_TRUE(DestructorVerifier.match(
Aaron Ballman512fb642015-09-17 13:30:52 +0000549 Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000550}
551
552TEST(FriendDecl, FriendTemplateFunctionLocation) {
553 LocationVerifier<FriendDecl> Verifier;
554 Verifier.expectLocation(3, 13);
555 EXPECT_TRUE(Verifier.match("struct A {\n"
556 "template <typename T>\n"
557 "friend void f();\n"
558 "};\n",
559 friendDecl()));
560}
561
562TEST(FriendDecl, FriendTemplateFunctionRange) {
563 RangeVerifier<FriendDecl> Verifier;
564 Verifier.expectRange(2, 1, 3, 15);
565 EXPECT_TRUE(Verifier.match("struct A {\n"
566 "template <typename T>\n"
567 "friend void f();\n"
568 "};\n",
569 friendDecl()));
570}
571
572TEST(FriendDecl, FriendTemplateClassLocation) {
573 LocationVerifier<FriendDecl> Verifier;
574 Verifier.expectLocation(3, 14);
575 EXPECT_TRUE(Verifier.match("struct A {\n"
576 "template <typename T>\n"
577 "friend class B;\n"
578 "};\n",
579 friendDecl()));
580}
581
582TEST(FriendDecl, FriendTemplateClassRange) {
583 RangeVerifier<FriendDecl> Verifier;
584 Verifier.expectRange(2, 1, 3, 14);
585 EXPECT_TRUE(Verifier.match("struct A {\n"
586 "template <typename T>\n"
587 "friend class B;\n"
588 "};\n",
589 friendDecl()));
590}
591
592TEST(FriendDecl, FriendInlineFunctionLocation) {
593 LocationVerifier<FriendDecl> Verifier;
594 Verifier.expectLocation(2, 19);
595 EXPECT_TRUE(Verifier.match("struct A {\n"
596 "int inline friend f() { return 0; }"
597 "};\n",
598 friendDecl()));
599}
600
601TEST(FriendDecl, FriendInlineFunctionRange) {
602 RangeVerifier<FriendDecl> Verifier;
603 Verifier.expectRange(2, 1, 2, 35);
604 EXPECT_TRUE(Verifier.match("struct A {\n"
605 "int inline friend f() { return 0; }"
606 "};\n",
607 friendDecl(), Lang_CXX11));
608}
609
Enea Zaffanella25723ce2013-07-19 18:02:36 +0000610TEST(FriendDecl, InstantiationSourceRange) {
611 RangeVerifier<FriendDecl> Verifier;
612 Verifier.expectRange(4, 3, 4, 35);
613 EXPECT_TRUE(Verifier.match(
614 "template <typename T> class S;\n"
615 "template<class T> void operator+(S<T> x);\n"
616 "template<class T> struct S {\n"
617 " friend void operator+<>(S<T> src);\n"
618 "};\n"
619 "void test(S<double> s) { +s; }",
Aaron Ballman512fb642015-09-17 13:30:52 +0000620 friendDecl(hasParent(cxxRecordDecl(isTemplateInstantiation())))));
Enea Zaffanella25723ce2013-07-19 18:02:36 +0000621}
622
Fariborz Jahaniana1db7df2014-07-31 17:39:50 +0000623TEST(ObjCMessageExpr, CXXConstructExprRange) {
624 RangeVerifier<CXXConstructExpr> Verifier;
625 Verifier.expectRange(5, 25, 5, 27);
626 EXPECT_TRUE(Verifier.match(
627 "struct A { int a; };\n"
628 "@interface B {}\n"
629 "+ (void) f1: (A)arg;\n"
630 "@end\n"
631 "void f2() { A a; [B f1: (a)]; }\n",
Aaron Ballman512fb642015-09-17 13:30:52 +0000632 cxxConstructExpr(), Lang_OBJCXX));
Fariborz Jahaniana1db7df2014-07-31 17:39:50 +0000633}
634
Aaron Ballman580ccaf2016-01-12 21:04:22 +0000635TEST(FunctionDecl, FunctionDeclWithThrowSpecification) {
636 RangeVerifier<FunctionDecl> Verifier;
637 Verifier.expectRange(1, 1, 1, 16);
638 EXPECT_TRUE(Verifier.match(
639 "void f() throw();\n",
640 functionDecl()));
641}
642
643TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) {
644 RangeVerifier<FunctionDecl> Verifier;
645 Verifier.expectRange(1, 1, 1, 24);
646 EXPECT_TRUE(Verifier.match(
647 "void f() noexcept(false);\n",
648 functionDecl(),
649 Language::Lang_CXX11));
650}
651
652TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) {
653 RangeVerifier<FunctionDecl> Verifier;
654 Verifier.expectRange(2, 1, 2, 16);
655 EXPECT_TRUE(Verifier.match(
656 "class A {\n"
657 "void f() throw();\n"
658 "};\n",
659 functionDecl()));
660}
661
662TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) {
663 RangeVerifier<FunctionDecl> Verifier;
664 Verifier.expectRange(2, 1, 2, 24);
665 EXPECT_TRUE(Verifier.match(
666 "class A {\n"
667 "void f() noexcept(false);\n"
668 "};\n",
669 functionDecl(),
670 Language::Lang_CXX11));
671}
672
Malcolm Parsonsa3220ce2017-01-12 16:11:28 +0000673class ExceptionSpecRangeVerifier : public RangeVerifier<TypeLoc> {
674protected:
675 SourceRange getRange(const TypeLoc &Node) override {
676 auto T =
677 Node.getUnqualifiedLoc().castAs<FunctionProtoTypeLoc>();
678 assert(!T.isNull());
679 return T.getExceptionSpecRange();
680 }
681};
682
683class ParmVarExceptionSpecRangeVerifier : public RangeVerifier<ParmVarDecl> {
684protected:
685 SourceRange getRange(const ParmVarDecl &Node) override {
686 if (const TypeSourceInfo *TSI = Node.getTypeSourceInfo()) {
687 TypeLoc TL = TSI->getTypeLoc();
688 if (TL.getType()->isPointerType()) {
689 TL = TL.getNextTypeLoc().IgnoreParens();
690 if (auto FPTL = TL.getAs<FunctionProtoTypeLoc>()) {
691 return FPTL.getExceptionSpecRange();
692 }
693 }
694 }
695 return SourceRange();
696 }
697};
698
699TEST(FunctionDecl, ExceptionSpecifications) {
700 ExceptionSpecRangeVerifier Verifier;
701
702 Verifier.expectRange(1, 10, 1, 16);
703 EXPECT_TRUE(Verifier.match("void f() throw();\n", loc(functionType())));
704
705 Verifier.expectRange(1, 10, 1, 34);
706 EXPECT_TRUE(Verifier.match("void f() throw(void(void) throw());\n",
707 loc(functionType())));
708
709 Verifier.expectRange(1, 10, 1, 19);
710 std::vector<std::string> Args;
711 Args.push_back("-fms-extensions");
712 EXPECT_TRUE(Verifier.match("void f() throw(...);\n", loc(functionType()),
713 Args, Language::Lang_CXX));
714
715 Verifier.expectRange(1, 10, 1, 10);
716 EXPECT_TRUE(Verifier.match("void f() noexcept;\n", loc(functionType()),
717 Language::Lang_CXX11));
718
719 Verifier.expectRange(1, 10, 1, 24);
720 EXPECT_TRUE(Verifier.match("void f() noexcept(false);\n", loc(functionType()),
721 Language::Lang_CXX11));
722
723 Verifier.expectRange(1, 10, 1, 32);
724 EXPECT_TRUE(Verifier.match("void f() noexcept(noexcept(1+1));\n",
725 loc(functionType()), Language::Lang_CXX11));
726
727 ParmVarExceptionSpecRangeVerifier Verifier2;
728 Verifier2.expectRange(1, 25, 1, 31);
729 EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) throw());\n",
730 parmVarDecl(hasType(pointerType(pointee(
731 parenType(innerType(functionType()))))))));
732
733 Verifier2.expectRange(1, 25, 1, 38);
734 EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) noexcept(true));\n",
735 parmVarDecl(hasType(pointerType(pointee(
736 parenType(innerType(functionType())))))),
737 Language::Lang_CXX11));
738}
739
Manuel Klimeke6de22d2012-11-06 17:31:40 +0000740} // end namespace ast_matchers
741} // end namespace clang