blob: 98460d959c37bce5d34a80dab0c9f15408e32dfe [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:
63 virtual SourceRange getRange(const LabelStmt &Node) {
64 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);
95 EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", newExpr()));
96}
97
David Blaikie3a0de212012-11-08 22:53:48 +000098TEST(CXXNewExpr, ParenRange) {
99 RangeVerifier<CXXNewExpr> Verifier;
100 Verifier.expectRange(1, 12, 1, 20);
101 EXPECT_TRUE(Verifier.match("void f() { new int(); }", newExpr()));
102}
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; }",
109 memberExpr()));
110}
111
Abramo Bagnara341ab732012-11-08 14:44:42 +0000112TEST(VarDecl, VMTypeFixedVarDeclRange) {
113 RangeVerifier<VarDecl> Verifier;
114 Verifier.expectRange(1, 1, 1, 23);
115 EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
116 varDecl(), Lang_C89));
117}
118
119TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
120 RangeVerifier<CXXConstructorDecl> Verifier;
121 Verifier.expectRange(1, 11, 1, 13);
122 EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
123}
124
Eli Bendersky5f4d76e2015-03-23 21:43:28 +0000125TEST(CXXConstructorDecl, DefaultedCtorLocRange) {
126 RangeVerifier<CXXConstructorDecl> Verifier;
127 Verifier.expectRange(1, 11, 1, 23);
128 EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl()));
129}
130
131TEST(CXXConstructorDecl, DeletedCtorLocRange) {
132 RangeVerifier<CXXConstructorDecl> Verifier;
133 Verifier.expectRange(1, 11, 1, 22);
134 EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl()));
135}
136
Richard Smith9ca91012013-02-05 05:55:57 +0000137TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
138 RangeVerifier<CompoundLiteralExpr> Verifier;
139 Verifier.expectRange(2, 11, 2, 22);
140 EXPECT_TRUE(Verifier.match(
141 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
142 "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
143}
144
145TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
146 RangeVerifier<CompoundLiteralExpr> Verifier;
Tanya Lattner713eef42013-04-05 20:14:50 +0000147 Verifier.expectRange(2, 20, 2, 31);
Richard Smith9ca91012013-02-05 05:55:57 +0000148 EXPECT_TRUE(Verifier.match(
149 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner713eef42013-04-05 20:14:50 +0000150 "constant int2 i2 = (int2)(1, 2);",
Richard Smith9ca91012013-02-05 05:55:57 +0000151 compoundLiteralExpr(), Lang_OpenCL));
152}
153
154TEST(InitListExpr, VectorLiteralListBraceRange) {
155 RangeVerifier<InitListExpr> Verifier;
156 Verifier.expectRange(2, 17, 2, 22);
157 EXPECT_TRUE(Verifier.match(
158 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
159 "int2 i2 = (int2){1, 2};", initListExpr()));
160}
161
162TEST(InitListExpr, VectorLiteralInitListParens) {
163 RangeVerifier<InitListExpr> Verifier;
Tanya Lattner713eef42013-04-05 20:14:50 +0000164 Verifier.expectRange(2, 26, 2, 31);
Richard Smith9ca91012013-02-05 05:55:57 +0000165 EXPECT_TRUE(Verifier.match(
166 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner713eef42013-04-05 20:14:50 +0000167 "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
Richard Smith9ca91012013-02-05 05:55:57 +0000168}
169
Manuel Klimek81228302013-06-07 11:27:57 +0000170class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
171protected:
172 virtual SourceRange getRange(const TypeLoc &Node) {
173 TemplateSpecializationTypeLoc T =
Eli Friedman7152fbe2013-06-07 20:31:48 +0000174 Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
Manuel Klimek81228302013-06-07 11:27:57 +0000175 assert(!T.isNull());
176 return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
177 }
178};
179
180TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
181 TemplateAngleBracketLocRangeVerifier Verifier;
182 Verifier.expectRange(2, 8, 2, 10);
183 EXPECT_TRUE(Verifier.match(
184 "template<typename T> struct A {}; struct B{}; void f(\n"
185 "const A<B>&);",
186 loc(templateSpecializationType())));
187}
188
Eli Friedman2dcbdc02013-06-17 22:35:10 +0000189TEST(CXXNewExpr, TypeParenRange) {
190 RangeVerifier<CXXNewExpr> Verifier;
191 Verifier.expectRange(1, 10, 1, 18);
192 EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
193}
194
Enea Zaffanellaa90af722013-07-06 18:54:58 +0000195class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
196protected:
197 virtual SourceRange getRange(const TypeLoc &Node) {
198 UnaryTransformTypeLoc T =
199 Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
200 assert(!T.isNull());
201 return SourceRange(T.getLParenLoc(), T.getRParenLoc());
202 }
203};
204
205TEST(UnaryTransformTypeLoc, ParensRange) {
206 UnaryTransformTypeLocParensRangeVerifier Verifier;
207 Verifier.expectRange(3, 26, 3, 28);
208 EXPECT_TRUE(Verifier.match(
209 "template <typename T>\n"
210 "struct S {\n"
211 "typedef __underlying_type(T) type;\n"
212 "};",
213 loc(unaryTransformType())));
214}
215
Enea Zaffanella8421a062013-07-07 06:41:54 +0000216TEST(CXXFunctionalCastExpr, SourceRange) {
217 RangeVerifier<CXXFunctionalCastExpr> Verifier;
218 Verifier.expectRange(2, 10, 2, 14);
219 EXPECT_TRUE(Verifier.match(
220 "int foo() {\n"
221 " return int{};\n"
222 "}",
223 functionalCastExpr(), Lang_CXX11));
224}
225
Peter Collingbourneb8d17e72014-02-22 02:59:41 +0000226TEST(CXXConstructExpr, SourceRange) {
227 RangeVerifier<CXXConstructExpr> Verifier;
228 Verifier.expectRange(3, 14, 3, 19);
229 EXPECT_TRUE(Verifier.match(
230 "struct A { A(int, int); };\n"
231 "void f(A a);\n"
232 "void g() { f({0, 0}); }",
233 constructExpr(), Lang_CXX11));
234}
235
Enea Zaffanella76e98fe2013-09-07 05:49:53 +0000236TEST(CXXTemporaryObjectExpr, SourceRange) {
237 RangeVerifier<CXXTemporaryObjectExpr> Verifier;
238 Verifier.expectRange(2, 6, 2, 12);
239 EXPECT_TRUE(Verifier.match(
240 "struct A { A(int, int); };\n"
241 "A a( A{0, 0} );",
242 temporaryObjectExpr(), Lang_CXX11));
243}
244
Enea Zaffanella8421a062013-07-07 06:41:54 +0000245TEST(CXXUnresolvedConstructExpr, SourceRange) {
246 RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
247 Verifier.expectRange(3, 10, 3, 12);
Enea Zaffanella4c409492013-07-08 14:50:30 +0000248 std::vector<std::string> Args;
249 Args.push_back("-fno-delayed-template-parsing");
Enea Zaffanella8421a062013-07-07 06:41:54 +0000250 EXPECT_TRUE(Verifier.match(
251 "template <typename U>\n"
252 "U foo() {\n"
253 " return U{};\n"
254 "}",
Enea Zaffanella4c409492013-07-08 14:50:30 +0000255 unresolvedConstructExpr(), Args, Lang_CXX11));
Enea Zaffanella8421a062013-07-07 06:41:54 +0000256}
257
Enea Zaffanellac70b2512013-07-17 17:28:56 +0000258TEST(UsingDecl, SourceRange) {
259 RangeVerifier<UsingDecl> Verifier;
260 Verifier.expectRange(2, 22, 2, 25);
261 EXPECT_TRUE(Verifier.match(
262 "class B { protected: int i; };\n"
263 "class D : public B { B::i; };",
264 usingDecl()));
265}
266
267TEST(UnresolvedUsingValueDecl, SourceRange) {
268 RangeVerifier<UnresolvedUsingValueDecl> Verifier;
269 Verifier.expectRange(3, 3, 3, 6);
270 EXPECT_TRUE(Verifier.match(
271 "template <typename B>\n"
272 "class D : public B {\n"
273 " B::i;\n"
274 "};",
275 unresolvedUsingValueDecl()));
276}
277
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000278TEST(FriendDecl, FriendNonMemberFunctionLocation) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000279 LocationVerifier<FriendDecl> Verifier;
280 Verifier.expectLocation(2, 13);
281 EXPECT_TRUE(Verifier.match("struct A {\n"
282 "friend void f();\n"
283 "};\n",
284 friendDecl()));
285}
286
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000287TEST(FriendDecl, FriendNonMemberFunctionRange) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000288 RangeVerifier<FriendDecl> Verifier;
289 Verifier.expectRange(2, 1, 2, 15);
290 EXPECT_TRUE(Verifier.match("struct A {\n"
291 "friend void f();\n"
292 "};\n",
293 friendDecl()));
294}
295
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000296TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) {
297 LocationVerifier<FriendDecl> Verifier;
298 Verifier.expectLocation(2, 12);
299 EXPECT_TRUE(Verifier.match("struct A {\n"
300 "friend int f() { return 0; }\n"
301 "};\n",
302 friendDecl()));
303}
304
305TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) {
306 RangeVerifier<FriendDecl> Verifier;
307 Verifier.expectRange(2, 1, 2, 28);
308 EXPECT_TRUE(Verifier.match("struct A {\n"
309 "friend int f() { return 0; }\n"
310 "};\n",
311 friendDecl()));
312}
313
314TEST(FriendDecl, FriendElaboratedTypeLocation) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000315 LocationVerifier<FriendDecl> Verifier;
316 Verifier.expectLocation(2, 8);
317 EXPECT_TRUE(Verifier.match("struct A {\n"
318 "friend class B;\n"
319 "};\n",
320 friendDecl()));
321}
322
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000323TEST(FriendDecl, FriendElaboratedTypeRange) {
Nikola Smiljanic357af642014-06-06 04:40:35 +0000324 RangeVerifier<FriendDecl> Verifier;
325 Verifier.expectRange(2, 1, 2, 14);
326 EXPECT_TRUE(Verifier.match("struct A {\n"
327 "friend class B;\n"
328 "};\n",
329 friendDecl()));
330}
331
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000332TEST(FriendDecl, FriendSimpleTypeLocation) {
333 LocationVerifier<FriendDecl> Verifier;
334 Verifier.expectLocation(3, 8);
335 EXPECT_TRUE(Verifier.match("class B;\n"
336 "struct A {\n"
337 "friend B;\n"
338 "};\n",
339 friendDecl(), Lang_CXX11));
340}
341
342TEST(FriendDecl, FriendSimpleTypeRange) {
343 RangeVerifier<FriendDecl> Verifier;
344 Verifier.expectRange(3, 1, 3, 8);
345 EXPECT_TRUE(Verifier.match("class B;\n"
346 "struct A {\n"
347 "friend B;\n"
348 "};\n",
349 friendDecl(), Lang_CXX11));
350}
351
Nikola Smiljanic357af642014-06-06 04:40:35 +0000352TEST(FriendDecl, FriendTemplateParameterLocation) {
353 LocationVerifier<FriendDecl> Verifier;
354 Verifier.expectLocation(3, 8);
355 EXPECT_TRUE(Verifier.match("template <typename T>\n"
356 "struct A {\n"
357 "friend T;\n"
358 "};\n",
359 friendDecl(), Lang_CXX11));
360}
361
362TEST(FriendDecl, FriendTemplateParameterRange) {
363 RangeVerifier<FriendDecl> Verifier;
364 Verifier.expectRange(3, 1, 3, 8);
365 EXPECT_TRUE(Verifier.match("template <typename T>\n"
366 "struct A {\n"
367 "friend T;\n"
368 "};\n",
369 friendDecl(), Lang_CXX11));
370}
371
372TEST(FriendDecl, FriendDecltypeLocation) {
373 LocationVerifier<FriendDecl> Verifier;
374 Verifier.expectLocation(4, 8);
375 EXPECT_TRUE(Verifier.match("struct A;\n"
376 "A foo();\n"
377 "struct A {\n"
378 "friend decltype(foo());\n"
379 "};\n",
380 friendDecl(), Lang_CXX11));
381}
382
383TEST(FriendDecl, FriendDecltypeRange) {
384 RangeVerifier<FriendDecl> Verifier;
385 Verifier.expectRange(4, 1, 4, 8);
386 EXPECT_TRUE(Verifier.match("struct A;\n"
387 "A foo();\n"
388 "struct A {\n"
389 "friend decltype(foo());\n"
390 "};\n",
391 friendDecl(), Lang_CXX11));
392}
393
Nikola Smiljanic4fc91532014-07-17 01:59:34 +0000394TEST(FriendDecl, FriendConstructorDestructorLocation) {
395 const std::string Code = "struct B {\n"
396 "B();\n"
397 "~B();\n"
398 "};\n"
399 "struct A {\n"
400 "friend B::B(), B::~B();\n"
401 "};\n";
402 LocationVerifier<FriendDecl> ConstructorVerifier;
403 ConstructorVerifier.expectLocation(6, 11);
404 EXPECT_TRUE(ConstructorVerifier.match(
405 Code, friendDecl(has(constructorDecl(ofClass(hasName("B")))))));
406 LocationVerifier<FriendDecl> DestructorVerifier;
407 DestructorVerifier.expectLocation(6, 19);
408 EXPECT_TRUE(DestructorVerifier.match(
409 Code, friendDecl(has(destructorDecl(ofClass(hasName("B")))))));
410}
411
412TEST(FriendDecl, FriendConstructorDestructorRange) {
413 const std::string Code = "struct B {\n"
414 "B();\n"
415 "~B();\n"
416 "};\n"
417 "struct A {\n"
418 "friend B::B(), B::~B();\n"
419 "};\n";
420 RangeVerifier<FriendDecl> ConstructorVerifier;
421 ConstructorVerifier.expectRange(6, 1, 6, 13);
422 EXPECT_TRUE(ConstructorVerifier.match(
423 Code, friendDecl(has(constructorDecl(ofClass(hasName("B")))))));
424 RangeVerifier<FriendDecl> DestructorVerifier;
425 DestructorVerifier.expectRange(6, 1, 6, 22);
426 EXPECT_TRUE(DestructorVerifier.match(
427 Code, friendDecl(has(destructorDecl(ofClass(hasName("B")))))));
428}
429
430TEST(FriendDecl, FriendTemplateFunctionLocation) {
431 LocationVerifier<FriendDecl> Verifier;
432 Verifier.expectLocation(3, 13);
433 EXPECT_TRUE(Verifier.match("struct A {\n"
434 "template <typename T>\n"
435 "friend void f();\n"
436 "};\n",
437 friendDecl()));
438}
439
440TEST(FriendDecl, FriendTemplateFunctionRange) {
441 RangeVerifier<FriendDecl> Verifier;
442 Verifier.expectRange(2, 1, 3, 15);
443 EXPECT_TRUE(Verifier.match("struct A {\n"
444 "template <typename T>\n"
445 "friend void f();\n"
446 "};\n",
447 friendDecl()));
448}
449
450TEST(FriendDecl, FriendTemplateClassLocation) {
451 LocationVerifier<FriendDecl> Verifier;
452 Verifier.expectLocation(3, 14);
453 EXPECT_TRUE(Verifier.match("struct A {\n"
454 "template <typename T>\n"
455 "friend class B;\n"
456 "};\n",
457 friendDecl()));
458}
459
460TEST(FriendDecl, FriendTemplateClassRange) {
461 RangeVerifier<FriendDecl> Verifier;
462 Verifier.expectRange(2, 1, 3, 14);
463 EXPECT_TRUE(Verifier.match("struct A {\n"
464 "template <typename T>\n"
465 "friend class B;\n"
466 "};\n",
467 friendDecl()));
468}
469
470TEST(FriendDecl, FriendInlineFunctionLocation) {
471 LocationVerifier<FriendDecl> Verifier;
472 Verifier.expectLocation(2, 19);
473 EXPECT_TRUE(Verifier.match("struct A {\n"
474 "int inline friend f() { return 0; }"
475 "};\n",
476 friendDecl()));
477}
478
479TEST(FriendDecl, FriendInlineFunctionRange) {
480 RangeVerifier<FriendDecl> Verifier;
481 Verifier.expectRange(2, 1, 2, 35);
482 EXPECT_TRUE(Verifier.match("struct A {\n"
483 "int inline friend f() { return 0; }"
484 "};\n",
485 friendDecl(), Lang_CXX11));
486}
487
Enea Zaffanella25723ce2013-07-19 18:02:36 +0000488TEST(FriendDecl, InstantiationSourceRange) {
489 RangeVerifier<FriendDecl> Verifier;
490 Verifier.expectRange(4, 3, 4, 35);
491 EXPECT_TRUE(Verifier.match(
492 "template <typename T> class S;\n"
493 "template<class T> void operator+(S<T> x);\n"
494 "template<class T> struct S {\n"
495 " friend void operator+<>(S<T> src);\n"
496 "};\n"
497 "void test(S<double> s) { +s; }",
498 friendDecl(hasParent(recordDecl(isTemplateInstantiation())))));
499}
500
Fariborz Jahaniana1db7df2014-07-31 17:39:50 +0000501TEST(ObjCMessageExpr, CXXConstructExprRange) {
502 RangeVerifier<CXXConstructExpr> Verifier;
503 Verifier.expectRange(5, 25, 5, 27);
504 EXPECT_TRUE(Verifier.match(
505 "struct A { int a; };\n"
506 "@interface B {}\n"
507 "+ (void) f1: (A)arg;\n"
508 "@end\n"
509 "void f2() { A a; [B f1: (a)]; }\n",
510 constructExpr(), Lang_OBJCXX));
511}
512
Manuel Klimeke6de22d2012-11-06 17:31:40 +0000513} // end namespace ast_matchers
514} // end namespace clang