blob: 990e6dfc85a8b34c2a917ee3e32b610a638163f2 [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
Manuel Klimek975a9492012-11-06 17:31:40 +0000177} // end namespace ast_matchers
178} // end namespace clang