xref: /aosp_15_r20/external/clang/unittests/AST/SourceLocationTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/AST/SourceLocationTest.cpp - AST source loc unit tests ----===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file contains tests for SourceLocation and SourceRange fields
11*67e74705SXin Li // in AST nodes.
12*67e74705SXin Li //
13*67e74705SXin Li // FIXME: In the long-term, when we test more than source locations, we may
14*67e74705SXin Li // want to have a unit test file for an AST node (or group of related nodes),
15*67e74705SXin Li // rather than a unit test file for source locations for all AST nodes.
16*67e74705SXin Li //
17*67e74705SXin Li //===----------------------------------------------------------------------===//
18*67e74705SXin Li 
19*67e74705SXin Li #include "clang/AST/ASTContext.h"
20*67e74705SXin Li #include "MatchVerifier.h"
21*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchFinder.h"
22*67e74705SXin Li #include "clang/ASTMatchers/ASTMatchers.h"
23*67e74705SXin Li #include "clang/Tooling/Tooling.h"
24*67e74705SXin Li #include "gtest/gtest.h"
25*67e74705SXin Li 
26*67e74705SXin Li namespace clang {
27*67e74705SXin Li namespace ast_matchers {
28*67e74705SXin Li 
29*67e74705SXin Li // FIXME: Pull the *Verifier tests into their own test file.
30*67e74705SXin Li 
TEST(MatchVerifier,ParseError)31*67e74705SXin Li TEST(MatchVerifier, ParseError) {
32*67e74705SXin Li   LocationVerifier<VarDecl> Verifier;
33*67e74705SXin Li   Verifier.expectLocation(1, 1);
34*67e74705SXin Li   EXPECT_FALSE(Verifier.match("int i", varDecl()));
35*67e74705SXin Li }
36*67e74705SXin Li 
TEST(MatchVerifier,NoMatch)37*67e74705SXin Li TEST(MatchVerifier, NoMatch) {
38*67e74705SXin Li   LocationVerifier<VarDecl> Verifier;
39*67e74705SXin Li   Verifier.expectLocation(1, 1);
40*67e74705SXin Li   EXPECT_FALSE(Verifier.match("int i;", recordDecl()));
41*67e74705SXin Li }
42*67e74705SXin Li 
TEST(MatchVerifier,WrongType)43*67e74705SXin Li TEST(MatchVerifier, WrongType) {
44*67e74705SXin Li   LocationVerifier<RecordDecl> Verifier;
45*67e74705SXin Li   Verifier.expectLocation(1, 1);
46*67e74705SXin Li   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
47*67e74705SXin Li }
48*67e74705SXin Li 
TEST(LocationVerifier,WrongLocation)49*67e74705SXin Li TEST(LocationVerifier, WrongLocation) {
50*67e74705SXin Li   LocationVerifier<VarDecl> Verifier;
51*67e74705SXin Li   Verifier.expectLocation(1, 1);
52*67e74705SXin Li   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
53*67e74705SXin Li }
54*67e74705SXin Li 
TEST(RangeVerifier,WrongRange)55*67e74705SXin Li TEST(RangeVerifier, WrongRange) {
56*67e74705SXin Li   RangeVerifier<VarDecl> Verifier;
57*67e74705SXin Li   Verifier.expectRange(1, 1, 1, 1);
58*67e74705SXin Li   EXPECT_FALSE(Verifier.match("int i;", varDecl()));
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> {
62*67e74705SXin Li protected:
getRange(const LabelStmt & Node)63*67e74705SXin Li   SourceRange getRange(const LabelStmt &Node) override {
64*67e74705SXin Li     return Node.getDecl()->getSourceRange();
65*67e74705SXin Li   }
66*67e74705SXin Li };
67*67e74705SXin Li 
TEST(LabelDecl,Range)68*67e74705SXin Li TEST(LabelDecl, Range) {
69*67e74705SXin Li   LabelDeclRangeVerifier Verifier;
70*67e74705SXin Li   Verifier.expectRange(1, 12, 1, 12);
71*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
72*67e74705SXin Li }
73*67e74705SXin Li 
TEST(LabelStmt,Range)74*67e74705SXin Li TEST(LabelStmt, Range) {
75*67e74705SXin Li   RangeVerifier<LabelStmt> Verifier;
76*67e74705SXin Li   Verifier.expectRange(1, 12, 1, 15);
77*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt()));
78*67e74705SXin Li }
79*67e74705SXin Li 
TEST(ParmVarDecl,KNRLocation)80*67e74705SXin Li TEST(ParmVarDecl, KNRLocation) {
81*67e74705SXin Li   LocationVerifier<ParmVarDecl> Verifier;
82*67e74705SXin Li   Verifier.expectLocation(1, 8);
83*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
84*67e74705SXin Li }
85*67e74705SXin Li 
TEST(ParmVarDecl,KNRRange)86*67e74705SXin Li TEST(ParmVarDecl, KNRRange) {
87*67e74705SXin Li   RangeVerifier<ParmVarDecl> Verifier;
88*67e74705SXin Li   Verifier.expectRange(1, 8, 1, 8);
89*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C));
90*67e74705SXin Li }
91*67e74705SXin Li 
TEST(CXXNewExpr,ArrayRange)92*67e74705SXin Li TEST(CXXNewExpr, ArrayRange) {
93*67e74705SXin Li   RangeVerifier<CXXNewExpr> Verifier;
94*67e74705SXin Li   Verifier.expectRange(1, 12, 1, 22);
95*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", cxxNewExpr()));
96*67e74705SXin Li }
97*67e74705SXin Li 
TEST(CXXNewExpr,ParenRange)98*67e74705SXin Li TEST(CXXNewExpr, ParenRange) {
99*67e74705SXin Li   RangeVerifier<CXXNewExpr> Verifier;
100*67e74705SXin Li   Verifier.expectRange(1, 12, 1, 20);
101*67e74705SXin Li   EXPECT_TRUE(Verifier.match("void f() { new int(); }", cxxNewExpr()));
102*67e74705SXin Li }
103*67e74705SXin Li 
TEST(MemberExpr,ImplicitMemberRange)104*67e74705SXin Li TEST(MemberExpr, ImplicitMemberRange) {
105*67e74705SXin Li   RangeVerifier<MemberExpr> Verifier;
106*67e74705SXin Li   Verifier.expectRange(2, 30, 2, 30);
107*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
108*67e74705SXin Li                              "int foo(const S& s) { return s; }",
109*67e74705SXin Li                              memberExpr()));
110*67e74705SXin Li }
111*67e74705SXin Li 
112*67e74705SXin Li class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> {
113*67e74705SXin Li protected:
getRange(const MemberExpr & Node)114*67e74705SXin Li   SourceRange getRange(const MemberExpr &Node) override {
115*67e74705SXin Li      return Node.getOperatorLoc();
116*67e74705SXin Li   }
117*67e74705SXin Li };
118*67e74705SXin Li 
TEST(MemberExpr,ArrowRange)119*67e74705SXin Li TEST(MemberExpr, ArrowRange) {
120*67e74705SXin Li   MemberExprArrowLocVerifier Verifier;
121*67e74705SXin Li   Verifier.expectRange(2, 19, 2, 19);
122*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct S { int x; };\n"
123*67e74705SXin Li                              "void foo(S *s) { s->x = 0; }",
124*67e74705SXin Li                              memberExpr()));
125*67e74705SXin Li }
126*67e74705SXin Li 
TEST(MemberExpr,MacroArrowRange)127*67e74705SXin Li TEST(MemberExpr, MacroArrowRange) {
128*67e74705SXin Li   MemberExprArrowLocVerifier Verifier;
129*67e74705SXin Li   Verifier.expectRange(1, 24, 1, 24);
130*67e74705SXin Li   EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n"
131*67e74705SXin Li                              "struct S { int x; };\n"
132*67e74705SXin Li                              "void foo(S *s) { MEMBER(s, x) = 0; }",
133*67e74705SXin Li                              memberExpr()));
134*67e74705SXin Li }
135*67e74705SXin Li 
TEST(MemberExpr,ImplicitArrowRange)136*67e74705SXin Li TEST(MemberExpr, ImplicitArrowRange) {
137*67e74705SXin Li   MemberExprArrowLocVerifier Verifier;
138*67e74705SXin Li   Verifier.expectRange(0, 0, 0, 0);
139*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n"
140*67e74705SXin Li                              "void S::Test() { x = 1; }",
141*67e74705SXin Li                              memberExpr()));
142*67e74705SXin Li }
143*67e74705SXin Li 
TEST(VarDecl,VMTypeFixedVarDeclRange)144*67e74705SXin Li TEST(VarDecl, VMTypeFixedVarDeclRange) {
145*67e74705SXin Li   RangeVerifier<VarDecl> Verifier;
146*67e74705SXin Li   Verifier.expectRange(1, 1, 1, 23);
147*67e74705SXin Li   EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
148*67e74705SXin Li                              varDecl(), Lang_C89));
149*67e74705SXin Li }
150*67e74705SXin Li 
TEST(CXXConstructorDecl,NoRetFunTypeLocRange)151*67e74705SXin Li TEST(CXXConstructorDecl, NoRetFunTypeLocRange) {
152*67e74705SXin Li   RangeVerifier<CXXConstructorDecl> Verifier;
153*67e74705SXin Li   Verifier.expectRange(1, 11, 1, 13);
154*67e74705SXin Li   EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl()));
155*67e74705SXin Li }
156*67e74705SXin Li 
TEST(CXXConstructorDecl,DefaultedCtorLocRange)157*67e74705SXin Li TEST(CXXConstructorDecl, DefaultedCtorLocRange) {
158*67e74705SXin Li   RangeVerifier<CXXConstructorDecl> Verifier;
159*67e74705SXin Li   Verifier.expectRange(1, 11, 1, 23);
160*67e74705SXin Li   EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl()));
161*67e74705SXin Li }
162*67e74705SXin Li 
TEST(CXXConstructorDecl,DeletedCtorLocRange)163*67e74705SXin Li TEST(CXXConstructorDecl, DeletedCtorLocRange) {
164*67e74705SXin Li   RangeVerifier<CXXConstructorDecl> Verifier;
165*67e74705SXin Li   Verifier.expectRange(1, 11, 1, 22);
166*67e74705SXin Li   EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl()));
167*67e74705SXin Li }
168*67e74705SXin Li 
TEST(CompoundLiteralExpr,CompoundVectorLiteralRange)169*67e74705SXin Li TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) {
170*67e74705SXin Li   RangeVerifier<CompoundLiteralExpr> Verifier;
171*67e74705SXin Li   Verifier.expectRange(2, 11, 2, 22);
172*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
173*67e74705SXin Li                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
174*67e74705SXin Li                   "int2 i2 = (int2){1, 2};", compoundLiteralExpr()));
175*67e74705SXin Li }
176*67e74705SXin Li 
TEST(CompoundLiteralExpr,ParensCompoundVectorLiteralRange)177*67e74705SXin Li TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) {
178*67e74705SXin Li   RangeVerifier<CompoundLiteralExpr> Verifier;
179*67e74705SXin Li   Verifier.expectRange(2, 20, 2, 31);
180*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
181*67e74705SXin Li                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
182*67e74705SXin Li                   "constant int2 i2 = (int2)(1, 2);",
183*67e74705SXin Li                   compoundLiteralExpr(), Lang_OpenCL));
184*67e74705SXin Li }
185*67e74705SXin Li 
TEST(InitListExpr,VectorLiteralListBraceRange)186*67e74705SXin Li TEST(InitListExpr, VectorLiteralListBraceRange) {
187*67e74705SXin Li   RangeVerifier<InitListExpr> Verifier;
188*67e74705SXin Li   Verifier.expectRange(2, 17, 2, 22);
189*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
190*67e74705SXin Li                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
191*67e74705SXin Li                   "int2 i2 = (int2){1, 2};", initListExpr()));
192*67e74705SXin Li }
193*67e74705SXin Li 
TEST(InitListExpr,VectorLiteralInitListParens)194*67e74705SXin Li TEST(InitListExpr, VectorLiteralInitListParens) {
195*67e74705SXin Li   RangeVerifier<InitListExpr> Verifier;
196*67e74705SXin Li   Verifier.expectRange(2, 26, 2, 31);
197*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
198*67e74705SXin Li                   "typedef int int2 __attribute__((ext_vector_type(2)));\n"
199*67e74705SXin Li                   "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL));
200*67e74705SXin Li }
201*67e74705SXin Li 
202*67e74705SXin Li class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> {
203*67e74705SXin Li protected:
getRange(const TypeLoc & Node)204*67e74705SXin Li   SourceRange getRange(const TypeLoc &Node) override {
205*67e74705SXin Li     TemplateSpecializationTypeLoc T =
206*67e74705SXin Li         Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>();
207*67e74705SXin Li     assert(!T.isNull());
208*67e74705SXin Li     return SourceRange(T.getLAngleLoc(), T.getRAngleLoc());
209*67e74705SXin Li   }
210*67e74705SXin Li };
211*67e74705SXin Li 
TEST(TemplateSpecializationTypeLoc,AngleBracketLocations)212*67e74705SXin Li TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) {
213*67e74705SXin Li   TemplateAngleBracketLocRangeVerifier Verifier;
214*67e74705SXin Li   Verifier.expectRange(2, 8, 2, 10);
215*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
216*67e74705SXin Li       "template<typename T> struct A {}; struct B{}; void f(\n"
217*67e74705SXin Li       "const A<B>&);",
218*67e74705SXin Li       loc(templateSpecializationType())));
219*67e74705SXin Li }
220*67e74705SXin Li 
TEST(CXXNewExpr,TypeParenRange)221*67e74705SXin Li TEST(CXXNewExpr, TypeParenRange) {
222*67e74705SXin Li   RangeVerifier<CXXNewExpr> Verifier;
223*67e74705SXin Li   Verifier.expectRange(1, 10, 1, 18);
224*67e74705SXin Li   EXPECT_TRUE(Verifier.match("int* a = new (int);", cxxNewExpr()));
225*67e74705SXin Li }
226*67e74705SXin Li 
227*67e74705SXin Li class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> {
228*67e74705SXin Li protected:
getRange(const TypeLoc & Node)229*67e74705SXin Li   SourceRange getRange(const TypeLoc &Node) override {
230*67e74705SXin Li     UnaryTransformTypeLoc T =
231*67e74705SXin Li         Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>();
232*67e74705SXin Li     assert(!T.isNull());
233*67e74705SXin Li     return SourceRange(T.getLParenLoc(), T.getRParenLoc());
234*67e74705SXin Li   }
235*67e74705SXin Li };
236*67e74705SXin Li 
TEST(UnaryTransformTypeLoc,ParensRange)237*67e74705SXin Li TEST(UnaryTransformTypeLoc, ParensRange) {
238*67e74705SXin Li   UnaryTransformTypeLocParensRangeVerifier Verifier;
239*67e74705SXin Li   Verifier.expectRange(3, 26, 3, 28);
240*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
241*67e74705SXin Li       "template <typename T>\n"
242*67e74705SXin Li       "struct S {\n"
243*67e74705SXin Li       "typedef __underlying_type(T) type;\n"
244*67e74705SXin Li       "};",
245*67e74705SXin Li       loc(unaryTransformType())));
246*67e74705SXin Li }
247*67e74705SXin Li 
TEST(CXXFunctionalCastExpr,SourceRange)248*67e74705SXin Li TEST(CXXFunctionalCastExpr, SourceRange) {
249*67e74705SXin Li   RangeVerifier<CXXFunctionalCastExpr> Verifier;
250*67e74705SXin Li   Verifier.expectRange(2, 10, 2, 14);
251*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
252*67e74705SXin Li       "int foo() {\n"
253*67e74705SXin Li       "  return int{};\n"
254*67e74705SXin Li       "}",
255*67e74705SXin Li       cxxFunctionalCastExpr(), Lang_CXX11));
256*67e74705SXin Li }
257*67e74705SXin Li 
TEST(CXXConstructExpr,SourceRange)258*67e74705SXin Li TEST(CXXConstructExpr, SourceRange) {
259*67e74705SXin Li   RangeVerifier<CXXConstructExpr> Verifier;
260*67e74705SXin Li   Verifier.expectRange(3, 14, 3, 19);
261*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
262*67e74705SXin Li       "struct A { A(int, int); };\n"
263*67e74705SXin Li       "void f(A a);\n"
264*67e74705SXin Li       "void g() { f({0, 0}); }",
265*67e74705SXin Li       cxxConstructExpr(), Lang_CXX11));
266*67e74705SXin Li }
267*67e74705SXin Li 
TEST(CXXTemporaryObjectExpr,SourceRange)268*67e74705SXin Li TEST(CXXTemporaryObjectExpr, SourceRange) {
269*67e74705SXin Li   RangeVerifier<CXXTemporaryObjectExpr> Verifier;
270*67e74705SXin Li   Verifier.expectRange(2, 6, 2, 12);
271*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
272*67e74705SXin Li       "struct A { A(int, int); };\n"
273*67e74705SXin Li       "A a( A{0, 0} );",
274*67e74705SXin Li       cxxTemporaryObjectExpr(), Lang_CXX11));
275*67e74705SXin Li }
276*67e74705SXin Li 
TEST(CXXUnresolvedConstructExpr,SourceRange)277*67e74705SXin Li TEST(CXXUnresolvedConstructExpr, SourceRange) {
278*67e74705SXin Li   RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
279*67e74705SXin Li   Verifier.expectRange(3, 10, 3, 12);
280*67e74705SXin Li   std::vector<std::string> Args;
281*67e74705SXin Li   Args.push_back("-fno-delayed-template-parsing");
282*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
283*67e74705SXin Li       "template <typename U>\n"
284*67e74705SXin Li       "U foo() {\n"
285*67e74705SXin Li       "  return U{};\n"
286*67e74705SXin Li       "}",
287*67e74705SXin Li       cxxUnresolvedConstructExpr(), Args, Lang_CXX11));
288*67e74705SXin Li }
289*67e74705SXin Li 
TEST(UsingDecl,SourceRange)290*67e74705SXin Li TEST(UsingDecl, SourceRange) {
291*67e74705SXin Li   RangeVerifier<UsingDecl> Verifier;
292*67e74705SXin Li   Verifier.expectRange(2, 22, 2, 25);
293*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
294*67e74705SXin Li       "class B { protected: int i; };\n"
295*67e74705SXin Li       "class D : public B { B::i; };",
296*67e74705SXin Li       usingDecl()));
297*67e74705SXin Li }
298*67e74705SXin Li 
TEST(UnresolvedUsingValueDecl,SourceRange)299*67e74705SXin Li TEST(UnresolvedUsingValueDecl, SourceRange) {
300*67e74705SXin Li   RangeVerifier<UnresolvedUsingValueDecl> Verifier;
301*67e74705SXin Li   Verifier.expectRange(3, 3, 3, 6);
302*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
303*67e74705SXin Li       "template <typename B>\n"
304*67e74705SXin Li       "class D : public B {\n"
305*67e74705SXin Li       "  B::i;\n"
306*67e74705SXin Li       "};",
307*67e74705SXin Li       unresolvedUsingValueDecl()));
308*67e74705SXin Li }
309*67e74705SXin Li 
TEST(FriendDecl,FriendNonMemberFunctionLocation)310*67e74705SXin Li TEST(FriendDecl, FriendNonMemberFunctionLocation) {
311*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
312*67e74705SXin Li   Verifier.expectLocation(2, 13);
313*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
314*67e74705SXin Li                              "friend void f();\n"
315*67e74705SXin Li                              "};\n",
316*67e74705SXin Li                              friendDecl()));
317*67e74705SXin Li }
318*67e74705SXin Li 
TEST(FriendDecl,FriendNonMemberFunctionRange)319*67e74705SXin Li TEST(FriendDecl, FriendNonMemberFunctionRange) {
320*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
321*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 15);
322*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
323*67e74705SXin Li                              "friend void f();\n"
324*67e74705SXin Li                              "};\n",
325*67e74705SXin Li                              friendDecl()));
326*67e74705SXin Li }
327*67e74705SXin Li 
TEST(FriendDecl,FriendNonMemberFunctionDefinitionLocation)328*67e74705SXin Li TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) {
329*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
330*67e74705SXin Li   Verifier.expectLocation(2, 12);
331*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
332*67e74705SXin Li                              "friend int f() { return 0; }\n"
333*67e74705SXin Li                              "};\n",
334*67e74705SXin Li                              friendDecl()));
335*67e74705SXin Li }
336*67e74705SXin Li 
TEST(FriendDecl,FriendNonMemberFunctionDefinitionRange)337*67e74705SXin Li TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) {
338*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
339*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 28);
340*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
341*67e74705SXin Li                              "friend int f() { return 0; }\n"
342*67e74705SXin Li                              "};\n",
343*67e74705SXin Li                              friendDecl()));
344*67e74705SXin Li }
345*67e74705SXin Li 
TEST(FriendDecl,FriendElaboratedTypeLocation)346*67e74705SXin Li TEST(FriendDecl, FriendElaboratedTypeLocation) {
347*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
348*67e74705SXin Li   Verifier.expectLocation(2, 8);
349*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
350*67e74705SXin Li                              "friend class B;\n"
351*67e74705SXin Li                              "};\n",
352*67e74705SXin Li                              friendDecl()));
353*67e74705SXin Li }
354*67e74705SXin Li 
TEST(FriendDecl,FriendElaboratedTypeRange)355*67e74705SXin Li TEST(FriendDecl, FriendElaboratedTypeRange) {
356*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
357*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 14);
358*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
359*67e74705SXin Li                              "friend class B;\n"
360*67e74705SXin Li                              "};\n",
361*67e74705SXin Li                              friendDecl()));
362*67e74705SXin Li }
363*67e74705SXin Li 
TEST(FriendDecl,FriendSimpleTypeLocation)364*67e74705SXin Li TEST(FriendDecl, FriendSimpleTypeLocation) {
365*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
366*67e74705SXin Li   Verifier.expectLocation(3, 8);
367*67e74705SXin Li   EXPECT_TRUE(Verifier.match("class B;\n"
368*67e74705SXin Li                              "struct A {\n"
369*67e74705SXin Li                              "friend B;\n"
370*67e74705SXin Li                              "};\n",
371*67e74705SXin Li                              friendDecl(), Lang_CXX11));
372*67e74705SXin Li }
373*67e74705SXin Li 
TEST(FriendDecl,FriendSimpleTypeRange)374*67e74705SXin Li TEST(FriendDecl, FriendSimpleTypeRange) {
375*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
376*67e74705SXin Li   Verifier.expectRange(3, 1, 3, 8);
377*67e74705SXin Li   EXPECT_TRUE(Verifier.match("class B;\n"
378*67e74705SXin Li                              "struct A {\n"
379*67e74705SXin Li                              "friend B;\n"
380*67e74705SXin Li                              "};\n",
381*67e74705SXin Li                              friendDecl(), Lang_CXX11));
382*67e74705SXin Li }
383*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateParameterLocation)384*67e74705SXin Li TEST(FriendDecl, FriendTemplateParameterLocation) {
385*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
386*67e74705SXin Li   Verifier.expectLocation(3, 8);
387*67e74705SXin Li   EXPECT_TRUE(Verifier.match("template <typename T>\n"
388*67e74705SXin Li                              "struct A {\n"
389*67e74705SXin Li                              "friend T;\n"
390*67e74705SXin Li                              "};\n",
391*67e74705SXin Li                              friendDecl(), Lang_CXX11));
392*67e74705SXin Li }
393*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateParameterRange)394*67e74705SXin Li TEST(FriendDecl, FriendTemplateParameterRange) {
395*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
396*67e74705SXin Li   Verifier.expectRange(3, 1, 3, 8);
397*67e74705SXin Li   EXPECT_TRUE(Verifier.match("template <typename T>\n"
398*67e74705SXin Li                              "struct A {\n"
399*67e74705SXin Li                              "friend T;\n"
400*67e74705SXin Li                              "};\n",
401*67e74705SXin Li                              friendDecl(), Lang_CXX11));
402*67e74705SXin Li }
403*67e74705SXin Li 
TEST(FriendDecl,FriendDecltypeLocation)404*67e74705SXin Li TEST(FriendDecl, FriendDecltypeLocation) {
405*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
406*67e74705SXin Li   Verifier.expectLocation(4, 8);
407*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A;\n"
408*67e74705SXin Li                              "A foo();\n"
409*67e74705SXin Li                              "struct A {\n"
410*67e74705SXin Li                              "friend decltype(foo());\n"
411*67e74705SXin Li                              "};\n",
412*67e74705SXin Li                              friendDecl(), Lang_CXX11));
413*67e74705SXin Li }
414*67e74705SXin Li 
TEST(FriendDecl,FriendDecltypeRange)415*67e74705SXin Li TEST(FriendDecl, FriendDecltypeRange) {
416*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
417*67e74705SXin Li   Verifier.expectRange(4, 1, 4, 8);
418*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A;\n"
419*67e74705SXin Li                              "A foo();\n"
420*67e74705SXin Li                              "struct A {\n"
421*67e74705SXin Li                              "friend decltype(foo());\n"
422*67e74705SXin Li                              "};\n",
423*67e74705SXin Li                              friendDecl(), Lang_CXX11));
424*67e74705SXin Li }
425*67e74705SXin Li 
TEST(FriendDecl,FriendConstructorDestructorLocation)426*67e74705SXin Li TEST(FriendDecl, FriendConstructorDestructorLocation) {
427*67e74705SXin Li   const std::string Code = "struct B {\n"
428*67e74705SXin Li                            "B();\n"
429*67e74705SXin Li                            "~B();\n"
430*67e74705SXin Li                            "};\n"
431*67e74705SXin Li                            "struct A {\n"
432*67e74705SXin Li                            "friend B::B(), B::~B();\n"
433*67e74705SXin Li                            "};\n";
434*67e74705SXin Li   LocationVerifier<FriendDecl> ConstructorVerifier;
435*67e74705SXin Li   ConstructorVerifier.expectLocation(6, 11);
436*67e74705SXin Li   EXPECT_TRUE(ConstructorVerifier.match(
437*67e74705SXin Li       Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
438*67e74705SXin Li   LocationVerifier<FriendDecl> DestructorVerifier;
439*67e74705SXin Li   DestructorVerifier.expectLocation(6, 19);
440*67e74705SXin Li   EXPECT_TRUE(DestructorVerifier.match(
441*67e74705SXin Li       Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
442*67e74705SXin Li }
443*67e74705SXin Li 
TEST(FriendDecl,FriendConstructorDestructorRange)444*67e74705SXin Li TEST(FriendDecl, FriendConstructorDestructorRange) {
445*67e74705SXin Li   const std::string Code = "struct B {\n"
446*67e74705SXin Li                            "B();\n"
447*67e74705SXin Li                            "~B();\n"
448*67e74705SXin Li                            "};\n"
449*67e74705SXin Li                            "struct A {\n"
450*67e74705SXin Li                            "friend B::B(), B::~B();\n"
451*67e74705SXin Li                            "};\n";
452*67e74705SXin Li   RangeVerifier<FriendDecl> ConstructorVerifier;
453*67e74705SXin Li   ConstructorVerifier.expectRange(6, 1, 6, 13);
454*67e74705SXin Li   EXPECT_TRUE(ConstructorVerifier.match(
455*67e74705SXin Li       Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B")))))));
456*67e74705SXin Li   RangeVerifier<FriendDecl> DestructorVerifier;
457*67e74705SXin Li   DestructorVerifier.expectRange(6, 1, 6, 22);
458*67e74705SXin Li   EXPECT_TRUE(DestructorVerifier.match(
459*67e74705SXin Li       Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B")))))));
460*67e74705SXin Li }
461*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateFunctionLocation)462*67e74705SXin Li TEST(FriendDecl, FriendTemplateFunctionLocation) {
463*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
464*67e74705SXin Li   Verifier.expectLocation(3, 13);
465*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
466*67e74705SXin Li                              "template <typename T>\n"
467*67e74705SXin Li                              "friend void f();\n"
468*67e74705SXin Li                              "};\n",
469*67e74705SXin Li                              friendDecl()));
470*67e74705SXin Li }
471*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateFunctionRange)472*67e74705SXin Li TEST(FriendDecl, FriendTemplateFunctionRange) {
473*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
474*67e74705SXin Li   Verifier.expectRange(2, 1, 3, 15);
475*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
476*67e74705SXin Li                              "template <typename T>\n"
477*67e74705SXin Li                              "friend void f();\n"
478*67e74705SXin Li                              "};\n",
479*67e74705SXin Li                              friendDecl()));
480*67e74705SXin Li }
481*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateClassLocation)482*67e74705SXin Li TEST(FriendDecl, FriendTemplateClassLocation) {
483*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
484*67e74705SXin Li   Verifier.expectLocation(3, 14);
485*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
486*67e74705SXin Li                              "template <typename T>\n"
487*67e74705SXin Li                              "friend class B;\n"
488*67e74705SXin Li                              "};\n",
489*67e74705SXin Li                              friendDecl()));
490*67e74705SXin Li }
491*67e74705SXin Li 
TEST(FriendDecl,FriendTemplateClassRange)492*67e74705SXin Li TEST(FriendDecl, FriendTemplateClassRange) {
493*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
494*67e74705SXin Li   Verifier.expectRange(2, 1, 3, 14);
495*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
496*67e74705SXin Li                              "template <typename T>\n"
497*67e74705SXin Li                              "friend class B;\n"
498*67e74705SXin Li                              "};\n",
499*67e74705SXin Li                              friendDecl()));
500*67e74705SXin Li }
501*67e74705SXin Li 
TEST(FriendDecl,FriendInlineFunctionLocation)502*67e74705SXin Li TEST(FriendDecl, FriendInlineFunctionLocation) {
503*67e74705SXin Li   LocationVerifier<FriendDecl> Verifier;
504*67e74705SXin Li   Verifier.expectLocation(2, 19);
505*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
506*67e74705SXin Li                              "int inline friend f() { return 0; }"
507*67e74705SXin Li                              "};\n",
508*67e74705SXin Li                              friendDecl()));
509*67e74705SXin Li }
510*67e74705SXin Li 
TEST(FriendDecl,FriendInlineFunctionRange)511*67e74705SXin Li TEST(FriendDecl, FriendInlineFunctionRange) {
512*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
513*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 35);
514*67e74705SXin Li   EXPECT_TRUE(Verifier.match("struct A {\n"
515*67e74705SXin Li                              "int inline friend f() { return 0; }"
516*67e74705SXin Li                              "};\n",
517*67e74705SXin Li                              friendDecl(), Lang_CXX11));
518*67e74705SXin Li }
519*67e74705SXin Li 
TEST(FriendDecl,InstantiationSourceRange)520*67e74705SXin Li TEST(FriendDecl, InstantiationSourceRange) {
521*67e74705SXin Li   RangeVerifier<FriendDecl> Verifier;
522*67e74705SXin Li   Verifier.expectRange(4, 3, 4, 35);
523*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
524*67e74705SXin Li       "template <typename T> class S;\n"
525*67e74705SXin Li       "template<class T> void operator+(S<T> x);\n"
526*67e74705SXin Li       "template<class T> struct S {\n"
527*67e74705SXin Li       "  friend void operator+<>(S<T> src);\n"
528*67e74705SXin Li       "};\n"
529*67e74705SXin Li       "void test(S<double> s) { +s; }",
530*67e74705SXin Li       friendDecl(hasParent(cxxRecordDecl(isTemplateInstantiation())))));
531*67e74705SXin Li }
532*67e74705SXin Li 
TEST(ObjCMessageExpr,CXXConstructExprRange)533*67e74705SXin Li TEST(ObjCMessageExpr, CXXConstructExprRange) {
534*67e74705SXin Li   RangeVerifier<CXXConstructExpr> Verifier;
535*67e74705SXin Li   Verifier.expectRange(5, 25, 5, 27);
536*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
537*67e74705SXin Li       "struct A { int a; };\n"
538*67e74705SXin Li       "@interface B {}\n"
539*67e74705SXin Li       "+ (void) f1: (A)arg;\n"
540*67e74705SXin Li       "@end\n"
541*67e74705SXin Li       "void f2() { A a; [B f1: (a)]; }\n",
542*67e74705SXin Li       cxxConstructExpr(), Lang_OBJCXX));
543*67e74705SXin Li }
544*67e74705SXin Li 
TEST(FunctionDecl,FunctionDeclWithThrowSpecification)545*67e74705SXin Li TEST(FunctionDecl, FunctionDeclWithThrowSpecification) {
546*67e74705SXin Li   RangeVerifier<FunctionDecl> Verifier;
547*67e74705SXin Li   Verifier.expectRange(1, 1, 1, 16);
548*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
549*67e74705SXin Li       "void f() throw();\n",
550*67e74705SXin Li       functionDecl()));
551*67e74705SXin Li }
552*67e74705SXin Li 
TEST(FunctionDecl,FunctionDeclWithNoExceptSpecification)553*67e74705SXin Li TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) {
554*67e74705SXin Li   RangeVerifier<FunctionDecl> Verifier;
555*67e74705SXin Li   Verifier.expectRange(1, 1, 1, 24);
556*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
557*67e74705SXin Li       "void f() noexcept(false);\n",
558*67e74705SXin Li       functionDecl(),
559*67e74705SXin Li       Language::Lang_CXX11));
560*67e74705SXin Li }
561*67e74705SXin Li 
TEST(CXXMethodDecl,CXXMethodDeclWithThrowSpecification)562*67e74705SXin Li TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) {
563*67e74705SXin Li   RangeVerifier<FunctionDecl> Verifier;
564*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 16);
565*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
566*67e74705SXin Li       "class A {\n"
567*67e74705SXin Li       "void f() throw();\n"
568*67e74705SXin Li       "};\n",
569*67e74705SXin Li       functionDecl()));
570*67e74705SXin Li }
571*67e74705SXin Li 
TEST(CXXMethodDecl,CXXMethodDeclWithNoExceptSpecification)572*67e74705SXin Li TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) {
573*67e74705SXin Li   RangeVerifier<FunctionDecl> Verifier;
574*67e74705SXin Li   Verifier.expectRange(2, 1, 2, 24);
575*67e74705SXin Li   EXPECT_TRUE(Verifier.match(
576*67e74705SXin Li       "class A {\n"
577*67e74705SXin Li       "void f() noexcept(false);\n"
578*67e74705SXin Li       "};\n",
579*67e74705SXin Li       functionDecl(),
580*67e74705SXin Li       Language::Lang_CXX11));
581*67e74705SXin Li }
582*67e74705SXin Li 
583*67e74705SXin Li } // end namespace ast_matchers
584*67e74705SXin Li } // end namespace clang
585