blob: d45c6448c7932ca3d3c8c4f443f1b8ef86da6e80 [file] [log] [blame]
Manuel Klimek975a9492012-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"
Manuel Klimek975a9492012-11-06 17:31:40 +000020#include "clang/ASTMatchers/ASTMatchFinder.h"
Chandler Carruth1050e8b2012-12-04 09:45:34 +000021#include "clang/ASTMatchers/ASTMatchers.h"
Manuel Klimek975a9492012-11-06 17:31:40 +000022#include "clang/Tooling/Tooling.h"
23#include "gtest/gtest.h"
Manuel Klimek4d0e9f52013-01-31 13:10:40 +000024#include "MatchVerifier.h"
Manuel Klimek975a9492012-11-06 17:31:40 +000025
26namespace clang {
27namespace ast_matchers {
28
Manuel Klimek4d0e9f52013-01-31 13:10:40 +000029// FIXME: Pull the *Verifier tests into their own test file.
Manuel Klimek975a9492012-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 Blaikie5a789852012-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 Blaikiec2fc67e2012-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 Bagnara13fd6842012-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 Bagnara4c5750e2012-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
Richard Smithafbcab82013-02-05 05:55:57 +0000125TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
126 RangeVerifier<CompoundLiteralExpr> Verifier;
127 Verifier.expectRange(2, 11, 2, 22);
128 EXPECT_TRUE(Verifier.match(
129 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
130 "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
131}
132
133TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
134 RangeVerifier<CompoundLiteralExpr> Verifier;
Tanya Lattner8aa86d12013-04-05 20:14:50 +0000135 Verifier.expectRange(2, 20, 2, 31);
Richard Smithafbcab82013-02-05 05:55:57 +0000136 EXPECT_TRUE(Verifier.match(
137 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner8aa86d12013-04-05 20:14:50 +0000138 "constant int2 i2 = (int2)(1, 2);",
Richard Smithafbcab82013-02-05 05:55:57 +0000139 compoundLiteralExpr(), Lang_OpenCL));
140}
141
142TEST(InitListExpr, VectorLiteralListBraceRange) {
143 RangeVerifier<InitListExpr> Verifier;
144 Verifier.expectRange(2, 17, 2, 22);
145 EXPECT_TRUE(Verifier.match(
146 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
147 "int2 i2 = (int2){1, 2};", initListExpr()));
148}
149
150TEST(InitListExpr, VectorLiteralInitListParens) {
151 RangeVerifier<InitListExpr> Verifier;
Tanya Lattner8aa86d12013-04-05 20:14:50 +0000152 Verifier.expectRange(2, 26, 2, 31);
Richard Smithafbcab82013-02-05 05:55:57 +0000153 EXPECT_TRUE(Verifier.match(
154 "typedef int int2 __attribute__((ext_vector_type(2)));\n"
Tanya Lattner8aa86d12013-04-05 20:14:50 +0000155 "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
Richard Smithafbcab82013-02-05 05:55:57 +0000156}
157
Manuel Klimek7e6e5152013-06-07 11:27:57 +0000158class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
159protected:
160 virtual SourceRange getRange(const TypeLoc &Node) {
161 TemplateSpecializationTypeLoc T =
Eli Friedman44ee0a72013-06-07 20:31:48 +0000162 Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
Manuel Klimek7e6e5152013-06-07 11:27:57 +0000163 assert(!T.isNull());
164 return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
165 }
166};
167
168TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
169 TemplateAngleBracketLocRangeVerifier Verifier;
170 Verifier.expectRange(2, 8, 2, 10);
171 EXPECT_TRUE(Verifier.match(
172 "template<typename T> struct A {}; struct B{}; void f(\n"
173 "const A<B>&);",
174 loc(templateSpecializationType())));
175}
176
Eli Friedman6e40c952013-06-17 22:35:10 +0000177TEST(CXXNewExpr, TypeParenRange) {
178 RangeVerifier<CXXNewExpr> Verifier;
179 Verifier.expectRange(1, 10, 1, 18);
180 EXPECT_TRUE(Verifier.match("int* a = new (int);", newExpr()));
181}
182
Enea Zaffanella2d776342013-07-06 18:54:58 +0000183class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
184protected:
185 virtual SourceRange getRange(const TypeLoc &Node) {
186 UnaryTransformTypeLoc T =
187 Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
188 assert(!T.isNull());
189 return SourceRange(T.getLParenLoc(), T.getRParenLoc());
190 }
191};
192
193TEST(UnaryTransformTypeLoc, ParensRange) {
194 UnaryTransformTypeLocParensRangeVerifier Verifier;
195 Verifier.expectRange(3, 26, 3, 28);
196 EXPECT_TRUE(Verifier.match(
197 "template <typename T>\n"
198 "struct S {\n"
199 "typedef __underlying_type(T) type;\n"
200 "};",
201 loc(unaryTransformType())));
202}
203
Enea Zaffanellabd9cbd22013-07-07 06:41:54 +0000204TEST(CXXFunctionalCastExpr, SourceRange) {
205 RangeVerifier<CXXFunctionalCastExpr> Verifier;
206 Verifier.expectRange(2, 10, 2, 14);
207 EXPECT_TRUE(Verifier.match(
208 "int foo() {\n"
209 " return int{};\n"
210 "}",
211 functionalCastExpr(), Lang_CXX11));
212}
213
214TEST(CXXUnresolvedConstructExpr, SourceRange) {
215 RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
216 Verifier.expectRange(3, 10, 3, 12);
Enea Zaffanella51da1422013-07-08 14:50:30 +0000217 std::vector<std::string> Args;
218 Args.push_back("-fno-delayed-template-parsing");
Enea Zaffanellabd9cbd22013-07-07 06:41:54 +0000219 EXPECT_TRUE(Verifier.match(
220 "template <typename U>\n"
221 "U foo() {\n"
222 " return U{};\n"
223 "}",
Enea Zaffanella51da1422013-07-08 14:50:30 +0000224 unresolvedConstructExpr(), Args, Lang_CXX11));
Enea Zaffanellabd9cbd22013-07-07 06:41:54 +0000225}
226
Enea Zaffanellad4de59d2013-07-17 17:28:56 +0000227TEST(UsingDecl, SourceRange) {
228 RangeVerifier<UsingDecl> Verifier;
229 Verifier.expectRange(2, 22, 2, 25);
230 EXPECT_TRUE(Verifier.match(
231 "class B { protected: int i; };\n"
232 "class D : public B { B::i; };",
233 usingDecl()));
234}
235
236TEST(UnresolvedUsingValueDecl, SourceRange) {
237 RangeVerifier<UnresolvedUsingValueDecl> Verifier;
238 Verifier.expectRange(3, 3, 3, 6);
239 EXPECT_TRUE(Verifier.match(
240 "template <typename B>\n"
241 "class D : public B {\n"
242 " B::i;\n"
243 "};",
244 unresolvedUsingValueDecl()));
245}
246
Enea Zaffanellade9ed712013-07-19 18:02:36 +0000247TEST(FriendDecl, InstantiationSourceRange) {
248 RangeVerifier<FriendDecl> Verifier;
249 Verifier.expectRange(4, 3, 4, 35);
250 EXPECT_TRUE(Verifier.match(
251 "template <typename T> class S;\n"
252 "template<class T> void operator+(S<T> x);\n"
253 "template<class T> struct S {\n"
254 " friend void operator+<>(S<T> src);\n"
255 "};\n"
256 "void test(S<double> s) { +s; }",
257 friendDecl(hasParent(recordDecl(isTemplateInstantiation())))));
258}
259
Manuel Klimek975a9492012-11-06 17:31:40 +0000260} // end namespace ast_matchers
261} // end namespace clang