1 //===- unittest/AST/SourceLocationTest.cpp - AST source loc unit tests ----===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains tests for SourceLocation and SourceRange fields 10 // in AST nodes. 11 // 12 // FIXME: In the long-term, when we test more than source locations, we may 13 // want to have a unit test file for an AST node (or group of related nodes), 14 // rather than a unit test file for source locations for all AST nodes. 15 // 16 //===----------------------------------------------------------------------===// 17 18 #include "MatchVerifier.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/ASTMatchers/ASTMatchFinder.h" 21 #include "clang/ASTMatchers/ASTMatchers.h" 22 #include "clang/Tooling/Tooling.h" 23 #include "llvm/Testing/Support/Annotations.h" 24 #include "gtest/gtest.h" 25 26 using namespace clang; 27 using namespace clang::ast_matchers; 28 29 namespace { 30 31 // FIXME: Pull the *Verifier tests into their own test file. 32 33 TEST(MatchVerifier, ParseError) { 34 LocationVerifier<VarDecl> Verifier; 35 Verifier.expectLocation(1, 1); 36 EXPECT_FALSE(Verifier.match("int i", varDecl())); 37 } 38 39 TEST(MatchVerifier, NoMatch) { 40 LocationVerifier<VarDecl> Verifier; 41 Verifier.expectLocation(1, 1); 42 EXPECT_FALSE(Verifier.match("int i;", recordDecl())); 43 } 44 45 TEST(MatchVerifier, WrongType) { 46 LocationVerifier<RecordDecl> Verifier; 47 Verifier.expectLocation(1, 1); 48 EXPECT_FALSE(Verifier.match("int i;", varDecl())); 49 } 50 51 TEST(LocationVerifier, WrongLocation) { 52 LocationVerifier<VarDecl> Verifier; 53 Verifier.expectLocation(1, 1); 54 EXPECT_FALSE(Verifier.match("int i;", varDecl())); 55 } 56 57 TEST(RangeVerifier, WrongRange) { 58 RangeVerifier<VarDecl> Verifier; 59 Verifier.expectRange(1, 1, 1, 1); 60 EXPECT_FALSE(Verifier.match("int i;", varDecl())); 61 } 62 63 class WhileParenLocationVerifier : public MatchVerifier<WhileStmt> { 64 unsigned ExpectLParenLine = 0, ExpectLParenColumn = 0; 65 unsigned ExpectRParenLine = 0, ExpectRParenColumn = 0; 66 67 public: 68 void expectLocations(unsigned LParenLine, unsigned LParenColumn, 69 unsigned RParenLine, unsigned RParenColumn) { 70 ExpectLParenLine = LParenLine; 71 ExpectLParenColumn = LParenColumn; 72 ExpectRParenLine = RParenLine; 73 ExpectRParenColumn = RParenColumn; 74 } 75 76 protected: 77 void verify(const MatchFinder::MatchResult &Result, 78 const WhileStmt &Node) override { 79 SourceLocation LParenLoc = Node.getLParenLoc(); 80 SourceLocation RParenLoc = Node.getRParenLoc(); 81 unsigned LParenLine = 82 Result.SourceManager->getSpellingLineNumber(LParenLoc); 83 unsigned LParenColumn = 84 Result.SourceManager->getSpellingColumnNumber(LParenLoc); 85 unsigned RParenLine = 86 Result.SourceManager->getSpellingLineNumber(RParenLoc); 87 unsigned RParenColumn = 88 Result.SourceManager->getSpellingColumnNumber(RParenLoc); 89 90 if (LParenLine != ExpectLParenLine || LParenColumn != ExpectLParenColumn || 91 RParenLine != ExpectRParenLine || RParenColumn != ExpectRParenColumn) { 92 std::string MsgStr; 93 llvm::raw_string_ostream Msg(MsgStr); 94 Msg << "Expected LParen Location <" << ExpectLParenLine << ":" 95 << ExpectLParenColumn << ">, found <"; 96 LParenLoc.print(Msg, *Result.SourceManager); 97 Msg << ">\n"; 98 99 Msg << "Expected RParen Location <" << ExpectRParenLine << ":" 100 << ExpectRParenColumn << ">, found <"; 101 RParenLoc.print(Msg, *Result.SourceManager); 102 Msg << ">"; 103 104 this->setFailure(Msg.str()); 105 } 106 } 107 }; 108 109 TEST(LocationVerifier, WhileParenLoc) { 110 WhileParenLocationVerifier Verifier; 111 Verifier.expectLocations(1, 17, 1, 38); 112 EXPECT_TRUE(Verifier.match("void f() { while(true/*some comment*/) {} }", 113 whileStmt())); 114 } 115 116 class LabelDeclRangeVerifier : public RangeVerifier<LabelStmt> { 117 protected: 118 SourceRange getRange(const LabelStmt &Node) override { 119 return Node.getDecl()->getSourceRange(); 120 } 121 }; 122 123 TEST(LabelDecl, Range) { 124 LabelDeclRangeVerifier Verifier; 125 Verifier.expectRange(1, 12, 1, 12); 126 EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt())); 127 } 128 129 TEST(LabelStmt, Range) { 130 RangeVerifier<LabelStmt> Verifier; 131 Verifier.expectRange(1, 12, 1, 15); 132 EXPECT_TRUE(Verifier.match("void f() { l: return; }", labelStmt())); 133 } 134 135 TEST(ParmVarDecl, KNRLocation) { 136 LocationVerifier<ParmVarDecl> Verifier; 137 Verifier.expectLocation(1, 8); 138 EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C89)); 139 140 Verifier.expectLocation(1, 15); 141 EXPECT_TRUE(Verifier.match("void f(i) int i; {}", varDecl(), Lang_C99)); 142 } 143 144 TEST(ParmVarDecl, KNRRange) { 145 RangeVerifier<ParmVarDecl> Verifier; 146 Verifier.expectRange(1, 8, 1, 8); 147 EXPECT_TRUE(Verifier.match("void f(i) {}", varDecl(), Lang_C89)); 148 149 Verifier.expectRange(1, 11, 1, 15); 150 EXPECT_TRUE(Verifier.match("void f(i) int i; {}", varDecl(), Lang_C99)); 151 } 152 153 TEST(CXXNewExpr, ArrayRange) { 154 RangeVerifier<CXXNewExpr> Verifier; 155 Verifier.expectRange(1, 12, 1, 22); 156 EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", cxxNewExpr())); 157 } 158 159 TEST(CXXNewExpr, ParenRange) { 160 RangeVerifier<CXXNewExpr> Verifier; 161 Verifier.expectRange(1, 12, 1, 20); 162 EXPECT_TRUE(Verifier.match("void f() { new int(); }", cxxNewExpr())); 163 } 164 165 TEST(MemberExpr, ImplicitMemberRange) { 166 RangeVerifier<MemberExpr> Verifier; 167 Verifier.expectRange(2, 30, 2, 30); 168 EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n" 169 "int foo(const S& s) { return s; }", 170 memberExpr())); 171 } 172 173 class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> { 174 protected: 175 SourceRange getRange(const MemberExpr &Node) override { 176 return Node.getOperatorLoc(); 177 } 178 }; 179 180 TEST(MemberExpr, ArrowRange) { 181 MemberExprArrowLocVerifier Verifier; 182 Verifier.expectRange(2, 19, 2, 19); 183 EXPECT_TRUE(Verifier.match("struct S { int x; };\n" 184 "void foo(S *s) { s->x = 0; }", 185 memberExpr())); 186 } 187 188 TEST(MemberExpr, MacroArrowRange) { 189 MemberExprArrowLocVerifier Verifier; 190 Verifier.expectRange(1, 24, 1, 24); 191 EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n" 192 "struct S { int x; };\n" 193 "void foo(S *s) { MEMBER(s, x) = 0; }", 194 memberExpr())); 195 } 196 197 TEST(MemberExpr, ImplicitArrowRange) { 198 MemberExprArrowLocVerifier Verifier; 199 Verifier.expectRange(0, 0, 0, 0); 200 EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n" 201 "void S::Test() { x = 1; }", 202 memberExpr())); 203 } 204 205 TEST(VarDecl, VMTypeFixedVarDeclRange) { 206 RangeVerifier<VarDecl> Verifier; 207 Verifier.expectRange(1, 1, 1, 23); 208 EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];", 209 varDecl(), Lang_C89)); 210 } 211 212 TEST(TypeLoc, IntRange) { 213 RangeVerifier<TypeLoc> Verifier; 214 Verifier.expectRange(1, 1, 1, 1); 215 EXPECT_TRUE(Verifier.match("int a;", typeLoc())); 216 } 217 218 TEST(TypeLoc, LongRange) { 219 RangeVerifier<TypeLoc> Verifier; 220 Verifier.expectRange(1, 1, 1, 1); 221 EXPECT_TRUE(Verifier.match("long a;", typeLoc())); 222 } 223 224 TEST(TypeLoc, DecltypeTypeLocRange) { 225 llvm::Annotations Code(R"( 226 $full1[[decltype(1)]] a; 227 struct A {struct B{};} var; 228 $full2[[decltype(var)]]::B c; 229 )"); 230 auto AST = tooling::buildASTFromCodeWithArgs(Code.code(), /*Args=*/{}); 231 ASTContext &Ctx = AST->getASTContext(); 232 const auto &SM = Ctx.getSourceManager(); 233 234 auto MatchedLocs = clang::ast_matchers::match( 235 typeLoc(loc(decltypeType())).bind("target"), Ctx); 236 ASSERT_EQ(MatchedLocs.size(), 2u); 237 auto verify = [&](SourceRange ActualRange, 238 const llvm::Annotations::Range &Expected) { 239 auto ActualCharRange = 240 Lexer::getAsCharRange(ActualRange, SM, Ctx.getLangOpts()); 241 EXPECT_EQ(SM.getFileOffset(ActualCharRange.getBegin()), Expected.Begin); 242 EXPECT_EQ(SM.getFileOffset(ActualCharRange.getEnd()), Expected.End); 243 }; 244 const auto *Target1 = MatchedLocs[0].getNodeAs<DecltypeTypeLoc>("target"); 245 verify(Target1->getSourceRange(), Code.range("full1")); 246 247 const auto *Target2 = MatchedLocs[1].getNodeAs<DecltypeTypeLoc>("target"); 248 verify(Target2->getSourceRange(), Code.range("full2")); 249 } 250 251 TEST(TypeLoc, AutoTypeLocRange) { 252 RangeVerifier<TypeLoc> Verifier; 253 Verifier.expectRange(1, 1, 1, 14); 254 EXPECT_TRUE(Verifier.match("decltype(auto) a = 1;", typeLoc(loc(autoType())), 255 Lang_CXX14)); 256 257 const char *Code = 258 R"cpp(template <typename T> concept C = true; 259 C auto abc(); 260 )cpp"; 261 // Should include "C auto" tokens. 262 Verifier.expectRange(2, 1, 2, 3); // token range. 263 EXPECT_TRUE(Verifier.match(Code, typeLoc(loc(autoType())), Lang_CXX20)); 264 } 265 266 TEST(TypeLoc, LongDoubleRange) { 267 RangeVerifier<TypeLoc> Verifier; 268 Verifier.expectRange(1, 1, 1, 6); 269 EXPECT_TRUE(Verifier.match("long double a;", typeLoc())); 270 } 271 272 TEST(TypeLoc, DoubleLongRange) { 273 RangeVerifier<TypeLoc> Verifier; 274 Verifier.expectRange(1, 1, 1, 8); 275 EXPECT_TRUE(Verifier.match("double long a;", typeLoc())); 276 } 277 278 TEST(TypeLoc, LongIntRange) { 279 RangeVerifier<TypeLoc> Verifier; 280 Verifier.expectRange(1, 1, 1, 6); 281 EXPECT_TRUE(Verifier.match("long int a;", typeLoc())); 282 } 283 284 TEST(TypeLoc, IntLongRange) { 285 RangeVerifier<TypeLoc> Verifier; 286 Verifier.expectRange(1, 1, 1, 5); 287 EXPECT_TRUE(Verifier.match("int long a;", typeLoc())); 288 } 289 290 TEST(TypeLoc, UnsignedIntRange) { 291 RangeVerifier<TypeLoc> Verifier; 292 Verifier.expectRange(1, 1, 1, 10); 293 EXPECT_TRUE(Verifier.match("unsigned int a;", typeLoc())); 294 } 295 296 TEST(TypeLoc, IntUnsignedRange) { 297 RangeVerifier<TypeLoc> Verifier; 298 Verifier.expectRange(1, 1, 1, 5); 299 EXPECT_TRUE(Verifier.match("int unsigned a;", typeLoc())); 300 } 301 302 TEST(TypeLoc, LongLongRange) { 303 RangeVerifier<TypeLoc> Verifier; 304 Verifier.expectRange(1, 1, 1, 6); 305 EXPECT_TRUE(Verifier.match("long long a;", typeLoc())); 306 } 307 308 TEST(TypeLoc, UnsignedLongLongRange) { 309 RangeVerifier<TypeLoc> Verifier; 310 Verifier.expectRange(1, 1, 1, 15); 311 EXPECT_TRUE(Verifier.match("unsigned long long a;", typeLoc())); 312 } 313 314 TEST(TypeLoc, LongUnsignedLongRange) { 315 RangeVerifier<TypeLoc> Verifier; 316 Verifier.expectRange(1, 1, 1, 15); 317 EXPECT_TRUE(Verifier.match("long unsigned long a;", typeLoc())); 318 } 319 320 TEST(TypeLoc, LongLongUnsignedRange) { 321 RangeVerifier<TypeLoc> Verifier; 322 Verifier.expectRange(1, 1, 1, 11); 323 EXPECT_TRUE(Verifier.match("long long unsigned a;", typeLoc())); 324 } 325 326 TEST(TypeLoc, ConstLongLongRange) { 327 RangeVerifier<TypeLoc> Verifier; 328 Verifier.expectRange(1, 7, 1, 12); 329 EXPECT_TRUE(Verifier.match("const long long a = 0;", typeLoc())); 330 } 331 332 TEST(TypeLoc, LongConstLongRange) { 333 RangeVerifier<TypeLoc> Verifier; 334 Verifier.expectRange(1, 1, 1, 12); 335 EXPECT_TRUE(Verifier.match("long const long a = 0;", typeLoc())); 336 } 337 338 TEST(TypeLoc, LongLongConstRange) { 339 RangeVerifier<TypeLoc> Verifier; 340 Verifier.expectRange(1, 1, 1, 6); 341 EXPECT_TRUE(Verifier.match("long long const a = 0;", typeLoc())); 342 } 343 344 TEST(CXXConstructorDecl, NoRetFunTypeLocRange) { 345 RangeVerifier<CXXConstructorDecl> Verifier; 346 Verifier.expectRange(1, 11, 1, 13); 347 EXPECT_TRUE(Verifier.match("class C { C(); };", functionDecl())); 348 } 349 350 TEST(CXXConstructorDecl, DefaultedCtorLocRange) { 351 RangeVerifier<CXXConstructorDecl> Verifier; 352 Verifier.expectRange(1, 11, 1, 23); 353 EXPECT_TRUE(Verifier.match("class C { C() = default; };", functionDecl())); 354 } 355 356 TEST(CXXConstructorDecl, DeletedCtorLocRange) { 357 RangeVerifier<CXXConstructorDecl> Verifier; 358 Verifier.expectRange(1, 11, 1, 22); 359 EXPECT_TRUE(Verifier.match("class C { C() = delete; };", functionDecl())); 360 } 361 362 TEST(CompoundLiteralExpr, CompoundVectorLiteralRange) { 363 RangeVerifier<CompoundLiteralExpr> Verifier; 364 Verifier.expectRange(2, 11, 2, 22); 365 EXPECT_TRUE(Verifier.match( 366 "typedef int int2 __attribute__((ext_vector_type(2)));\n" 367 "int2 i2 = (int2){1, 2};", compoundLiteralExpr())); 368 } 369 370 TEST(CompoundLiteralExpr, ParensCompoundVectorLiteralRange) { 371 RangeVerifier<CompoundLiteralExpr> Verifier; 372 Verifier.expectRange(2, 20, 2, 31); 373 EXPECT_TRUE(Verifier.match( 374 "typedef int int2 __attribute__((ext_vector_type(2)));\n" 375 "constant int2 i2 = (int2)(1, 2);", 376 compoundLiteralExpr(), Lang_OpenCL)); 377 } 378 379 TEST(InitListExpr, VectorLiteralListBraceRange) { 380 RangeVerifier<InitListExpr> Verifier; 381 Verifier.expectRange(2, 17, 2, 22); 382 EXPECT_TRUE(Verifier.match( 383 "typedef int int2 __attribute__((ext_vector_type(2)));\n" 384 "int2 i2 = (int2){1, 2};", initListExpr())); 385 } 386 387 TEST(InitListExpr, VectorLiteralInitListParens) { 388 RangeVerifier<InitListExpr> Verifier; 389 Verifier.expectRange(2, 26, 2, 31); 390 EXPECT_TRUE(Verifier.match( 391 "typedef int int2 __attribute__((ext_vector_type(2)));\n" 392 "constant int2 i2 = (int2)(1, 2);", initListExpr(), Lang_OpenCL)); 393 } 394 395 class TemplateAngleBracketLocRangeVerifier : public RangeVerifier<TypeLoc> { 396 protected: 397 SourceRange getRange(const TypeLoc &Node) override { 398 TemplateSpecializationTypeLoc T = 399 Node.getUnqualifiedLoc().castAs<TemplateSpecializationTypeLoc>(); 400 assert(!T.isNull()); 401 return SourceRange(T.getLAngleLoc(), T.getRAngleLoc()); 402 } 403 }; 404 405 TEST(TemplateSpecializationTypeLoc, AngleBracketLocations) { 406 TemplateAngleBracketLocRangeVerifier Verifier; 407 Verifier.expectRange(2, 8, 2, 10); 408 EXPECT_TRUE(Verifier.match( 409 "template<typename T> struct A {}; struct B{}; void f(\n" 410 "const A<B>&);", 411 loc(templateSpecializationType()))); 412 } 413 414 TEST(CXXNewExpr, TypeParenRange) { 415 RangeVerifier<CXXNewExpr> Verifier; 416 Verifier.expectRange(1, 10, 1, 18); 417 EXPECT_TRUE(Verifier.match("int* a = new (int);", cxxNewExpr())); 418 } 419 420 class UnaryTransformTypeLocParensRangeVerifier : public RangeVerifier<TypeLoc> { 421 protected: 422 SourceRange getRange(const TypeLoc &Node) override { 423 UnaryTransformTypeLoc T = 424 Node.getUnqualifiedLoc().castAs<UnaryTransformTypeLoc>(); 425 assert(!T.isNull()); 426 return SourceRange(T.getLParenLoc(), T.getRParenLoc()); 427 } 428 }; 429 430 TEST(UnaryTransformTypeLoc, ParensRange) { 431 UnaryTransformTypeLocParensRangeVerifier Verifier; 432 Verifier.expectRange(3, 26, 3, 28); 433 EXPECT_TRUE(Verifier.match( 434 "template <typename T>\n" 435 "struct S {\n" 436 "typedef __underlying_type(T) type;\n" 437 "};", 438 loc(unaryTransformType()))); 439 } 440 441 TEST(CXXFunctionalCastExpr, SourceRange) { 442 RangeVerifier<CXXFunctionalCastExpr> Verifier; 443 Verifier.expectRange(2, 10, 2, 14); 444 EXPECT_TRUE(Verifier.match( 445 "int foo() {\n" 446 " return int{};\n" 447 "}", 448 cxxFunctionalCastExpr(), Lang_CXX11)); 449 } 450 451 TEST(CXXConstructExpr, SourceRange) { 452 RangeVerifier<CXXConstructExpr> Verifier; 453 Verifier.expectRange(3, 14, 3, 19); 454 EXPECT_TRUE(Verifier.match( 455 "struct A { A(int, int); };\n" 456 "void f(A a);\n" 457 "void g() { f({0, 0}); }", 458 cxxConstructExpr(), Lang_CXX11)); 459 } 460 461 TEST(CXXTemporaryObjectExpr, SourceRange) { 462 RangeVerifier<CXXTemporaryObjectExpr> Verifier; 463 Verifier.expectRange(2, 6, 2, 12); 464 EXPECT_TRUE(Verifier.match( 465 "struct A { A(int, int); };\n" 466 "A a( A{0, 0} );", 467 cxxTemporaryObjectExpr(), Lang_CXX11)); 468 } 469 470 TEST(CXXUnresolvedConstructExpr, SourceRange) { 471 RangeVerifier<CXXUnresolvedConstructExpr> Verifier; 472 Verifier.expectRange(3, 10, 3, 12); 473 std::vector<std::string> Args; 474 Args.push_back("-fno-delayed-template-parsing"); 475 EXPECT_TRUE(Verifier.match( 476 "template <typename U>\n" 477 "U foo() {\n" 478 " return U{};\n" 479 "}", 480 cxxUnresolvedConstructExpr(), Args, Lang_CXX11)); 481 } 482 483 TEST(UsingDecl, SourceRange) { 484 RangeVerifier<UsingDecl> Verifier; 485 Verifier.expectRange(2, 22, 2, 25); 486 EXPECT_TRUE(Verifier.match( 487 "class B { protected: int i; };\n" 488 "class D : public B { B::i; };", 489 usingDecl())); 490 } 491 492 TEST(UnresolvedUsingValueDecl, SourceRange) { 493 RangeVerifier<UnresolvedUsingValueDecl> Verifier; 494 Verifier.expectRange(3, 3, 3, 6); 495 EXPECT_TRUE(Verifier.match( 496 "template <typename B>\n" 497 "class D : public B {\n" 498 " B::i;\n" 499 "};", 500 unresolvedUsingValueDecl())); 501 } 502 503 TEST(FriendDecl, FriendNonMemberFunctionLocation) { 504 LocationVerifier<FriendDecl> Verifier; 505 Verifier.expectLocation(2, 13); 506 EXPECT_TRUE(Verifier.match("struct A {\n" 507 "friend void f();\n" 508 "};\n", 509 friendDecl())); 510 } 511 512 TEST(FriendDecl, FriendNonMemberFunctionRange) { 513 RangeVerifier<FriendDecl> Verifier; 514 Verifier.expectRange(2, 1, 2, 15); 515 EXPECT_TRUE(Verifier.match("struct A {\n" 516 "friend void f();\n" 517 "};\n", 518 friendDecl())); 519 } 520 521 TEST(FriendDecl, FriendNonMemberFunctionDefinitionLocation) { 522 LocationVerifier<FriendDecl> Verifier; 523 Verifier.expectLocation(2, 12); 524 EXPECT_TRUE(Verifier.match("struct A {\n" 525 "friend int f() { return 0; }\n" 526 "};\n", 527 friendDecl())); 528 } 529 530 TEST(FriendDecl, FriendNonMemberFunctionDefinitionRange) { 531 RangeVerifier<FriendDecl> Verifier; 532 Verifier.expectRange(2, 1, 2, 28); 533 EXPECT_TRUE(Verifier.match("struct A {\n" 534 "friend int f() { return 0; }\n" 535 "};\n", 536 friendDecl())); 537 } 538 539 TEST(FriendDecl, FriendElaboratedTypeLocation) { 540 LocationVerifier<FriendDecl> Verifier; 541 Verifier.expectLocation(2, 8); 542 EXPECT_TRUE(Verifier.match("struct A {\n" 543 "friend class B;\n" 544 "};\n", 545 friendDecl())); 546 } 547 548 TEST(FriendDecl, FriendElaboratedTypeRange) { 549 RangeVerifier<FriendDecl> Verifier; 550 Verifier.expectRange(2, 1, 2, 14); 551 EXPECT_TRUE(Verifier.match("struct A {\n" 552 "friend class B;\n" 553 "};\n", 554 friendDecl())); 555 } 556 557 TEST(FriendDecl, FriendSimpleTypeLocation) { 558 LocationVerifier<FriendDecl> Verifier; 559 Verifier.expectLocation(3, 8); 560 EXPECT_TRUE(Verifier.match("class B;\n" 561 "struct A {\n" 562 "friend B;\n" 563 "};\n", 564 friendDecl(), Lang_CXX11)); 565 } 566 567 TEST(FriendDecl, FriendSimpleTypeRange) { 568 RangeVerifier<FriendDecl> Verifier; 569 Verifier.expectRange(3, 1, 3, 8); 570 EXPECT_TRUE(Verifier.match("class B;\n" 571 "struct A {\n" 572 "friend B;\n" 573 "};\n", 574 friendDecl(), Lang_CXX11)); 575 } 576 577 TEST(FriendDecl, FriendTemplateParameterLocation) { 578 LocationVerifier<FriendDecl> Verifier; 579 Verifier.expectLocation(3, 8); 580 EXPECT_TRUE(Verifier.match("template <typename T>\n" 581 "struct A {\n" 582 "friend T;\n" 583 "};\n", 584 friendDecl(), Lang_CXX11)); 585 } 586 587 TEST(FriendDecl, FriendTemplateParameterRange) { 588 RangeVerifier<FriendDecl> Verifier; 589 Verifier.expectRange(3, 1, 3, 8); 590 EXPECT_TRUE(Verifier.match("template <typename T>\n" 591 "struct A {\n" 592 "friend T;\n" 593 "};\n", 594 friendDecl(), Lang_CXX11)); 595 } 596 597 TEST(FriendDecl, FriendDecltypeLocation) { 598 LocationVerifier<FriendDecl> Verifier; 599 Verifier.expectLocation(4, 8); 600 EXPECT_TRUE(Verifier.match("struct A;\n" 601 "A foo();\n" 602 "struct A {\n" 603 "friend decltype(foo());\n" 604 "};\n", 605 friendDecl(), Lang_CXX11)); 606 } 607 608 TEST(FriendDecl, FriendDecltypeRange) { 609 RangeVerifier<FriendDecl> Verifier; 610 Verifier.expectRange(4, 1, 4, 22); 611 EXPECT_TRUE(Verifier.match("struct A;\n" 612 "A foo();\n" 613 "struct A {\n" 614 "friend decltype(foo());\n" 615 "};\n", 616 friendDecl(), Lang_CXX11)); 617 } 618 619 TEST(FriendDecl, FriendConstructorDestructorLocation) { 620 const std::string Code = "struct B {\n" 621 "B();\n" 622 "~B();\n" 623 "};\n" 624 "struct A {\n" 625 "friend B::B(), B::~B();\n" 626 "};\n"; 627 LocationVerifier<FriendDecl> ConstructorVerifier; 628 ConstructorVerifier.expectLocation(6, 11); 629 EXPECT_TRUE(ConstructorVerifier.match( 630 Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B"))))))); 631 LocationVerifier<FriendDecl> DestructorVerifier; 632 DestructorVerifier.expectLocation(6, 19); 633 EXPECT_TRUE(DestructorVerifier.match( 634 Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B"))))))); 635 } 636 637 TEST(FriendDecl, FriendConstructorDestructorRange) { 638 const std::string Code = "struct B {\n" 639 "B();\n" 640 "~B();\n" 641 "};\n" 642 "struct A {\n" 643 "friend B::B(), B::~B();\n" 644 "};\n"; 645 RangeVerifier<FriendDecl> ConstructorVerifier; 646 ConstructorVerifier.expectRange(6, 1, 6, 13); 647 EXPECT_TRUE(ConstructorVerifier.match( 648 Code, friendDecl(has(cxxConstructorDecl(ofClass(hasName("B"))))))); 649 RangeVerifier<FriendDecl> DestructorVerifier; 650 DestructorVerifier.expectRange(6, 1, 6, 22); 651 EXPECT_TRUE(DestructorVerifier.match( 652 Code, friendDecl(has(cxxDestructorDecl(ofClass(hasName("B"))))))); 653 } 654 655 TEST(FriendDecl, FriendTemplateFunctionLocation) { 656 LocationVerifier<FriendDecl> Verifier; 657 Verifier.expectLocation(3, 13); 658 EXPECT_TRUE(Verifier.match("struct A {\n" 659 "template <typename T>\n" 660 "friend void f();\n" 661 "};\n", 662 friendDecl())); 663 } 664 665 TEST(FriendDecl, FriendTemplateFunctionRange) { 666 RangeVerifier<FriendDecl> Verifier; 667 Verifier.expectRange(2, 1, 3, 15); 668 EXPECT_TRUE(Verifier.match("struct A {\n" 669 "template <typename T>\n" 670 "friend void f();\n" 671 "};\n", 672 friendDecl())); 673 } 674 675 TEST(FriendDecl, FriendTemplateClassLocation) { 676 LocationVerifier<FriendDecl> Verifier; 677 Verifier.expectLocation(3, 14); 678 EXPECT_TRUE(Verifier.match("struct A {\n" 679 "template <typename T>\n" 680 "friend class B;\n" 681 "};\n", 682 friendDecl())); 683 } 684 685 TEST(FriendDecl, FriendTemplateClassRange) { 686 RangeVerifier<FriendDecl> Verifier; 687 Verifier.expectRange(2, 1, 3, 14); 688 EXPECT_TRUE(Verifier.match("struct A {\n" 689 "template <typename T>\n" 690 "friend class B;\n" 691 "};\n", 692 friendDecl())); 693 } 694 695 TEST(FriendDecl, FriendInlineFunctionLocation) { 696 LocationVerifier<FriendDecl> Verifier; 697 Verifier.expectLocation(2, 19); 698 EXPECT_TRUE(Verifier.match("struct A {\n" 699 "int inline friend f() { return 0; }" 700 "};\n", 701 friendDecl())); 702 } 703 704 TEST(FriendDecl, FriendInlineFunctionRange) { 705 RangeVerifier<FriendDecl> Verifier; 706 Verifier.expectRange(2, 1, 2, 35); 707 EXPECT_TRUE(Verifier.match("struct A {\n" 708 "int inline friend f() { return 0; }" 709 "};\n", 710 friendDecl(), Lang_CXX11)); 711 } 712 713 TEST(FriendDecl, InstantiationSourceRange) { 714 RangeVerifier<FriendDecl> Verifier; 715 Verifier.expectRange(4, 3, 4, 35); 716 EXPECT_TRUE(Verifier.match( 717 "template <typename T> class S;\n" 718 "template<class T> void operator+(S<T> x);\n" 719 "template<class T> struct S {\n" 720 " friend void operator+<>(S<T> src);\n" 721 "};\n" 722 "void test(S<double> s) { +s; }", 723 friendDecl(hasParent(cxxRecordDecl(isTemplateInstantiation()))))); 724 } 725 726 TEST(ObjCMessageExpr, ParenExprRange) { 727 RangeVerifier<ParenExpr> Verifier; 728 Verifier.expectRange(5, 25, 5, 27); 729 EXPECT_TRUE(Verifier.match("struct A { int a; };\n" 730 "@interface B {}\n" 731 "+ (void) f1: (A)arg;\n" 732 "@end\n" 733 "void f2() { A a; [B f1: (a)]; }\n", 734 traverse(TK_AsIs, parenExpr()), Lang_OBJCXX)); 735 } 736 737 TEST(FunctionDecl, FunctionDeclWithThrowSpecification) { 738 RangeVerifier<FunctionDecl> Verifier; 739 Verifier.expectRange(1, 1, 1, 16); 740 EXPECT_TRUE(Verifier.match( 741 "void f() throw();\n", 742 functionDecl())); 743 } 744 745 TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) { 746 RangeVerifier<FunctionDecl> Verifier; 747 Verifier.expectRange(1, 1, 1, 24); 748 EXPECT_TRUE(Verifier.match("void f() noexcept(false);\n", functionDecl(), 749 Lang_CXX11)); 750 } 751 752 class FunctionDeclParametersRangeVerifier : public RangeVerifier<FunctionDecl> { 753 protected: 754 SourceRange getRange(const FunctionDecl &Function) override { 755 return Function.getParametersSourceRange(); 756 } 757 }; 758 759 TEST(FunctionDeclParameters, FunctionDeclOnlyVariadic) { 760 FunctionDeclParametersRangeVerifier Verifier; 761 Verifier.expectRange(1, 8, 1, 8); 762 EXPECT_TRUE(Verifier.match("void f(...);\n", functionDecl())); 763 } 764 765 TEST(FunctionDeclParameters, FunctionDeclVariadic) { 766 FunctionDeclParametersRangeVerifier Verifier; 767 Verifier.expectRange(1, 8, 1, 15); 768 EXPECT_TRUE(Verifier.match("void f(int a, ...);\n", functionDecl())); 769 } 770 771 TEST(FunctionDeclParameters, FunctionDeclMacroVariadic) { 772 FunctionDeclParametersRangeVerifier Verifier; 773 Verifier.expectRange(2, 8, 1, 18); 774 EXPECT_TRUE(Verifier.match("#define VARIADIC ...\n" 775 "void f(int a, VARIADIC);\n", 776 functionDecl())); 777 } 778 779 TEST(FunctionDeclParameters, FunctionDeclMacroParams) { 780 FunctionDeclParametersRangeVerifier Verifier; 781 Verifier.expectRange(1, 16, 2, 20); 782 EXPECT_TRUE(Verifier.match("#define PARAMS int a, int b\n" 783 "void f(PARAMS, int c);", 784 functionDecl())); 785 } 786 787 TEST(FunctionDeclParameters, FunctionDeclSingleParameter) { 788 FunctionDeclParametersRangeVerifier Verifier; 789 Verifier.expectRange(1, 8, 1, 12); 790 EXPECT_TRUE(Verifier.match("void f(int a);\n", functionDecl())); 791 } 792 793 TEST(FunctionDeclParameters, MemberFunctionDecl) { 794 FunctionDeclParametersRangeVerifier Verifier; 795 Verifier.expectRange(2, 8, 2, 12); 796 EXPECT_TRUE(Verifier.match("class A{\n" 797 "void f(int a);\n" 798 "};", 799 functionDecl())); 800 } 801 802 TEST(FunctionDeclParameters, MemberFunctionDeclVariadic) { 803 FunctionDeclParametersRangeVerifier Verifier; 804 Verifier.expectRange(2, 8, 2, 15); 805 EXPECT_TRUE(Verifier.match("class A{\n" 806 "void f(int a, ...);\n" 807 "};", 808 functionDecl())); 809 } 810 811 TEST(FunctionDeclParameters, StaticFunctionDecl) { 812 FunctionDeclParametersRangeVerifier Verifier; 813 Verifier.expectRange(2, 15, 2, 19); 814 EXPECT_TRUE(Verifier.match("class A{\n" 815 "static void f(int a);\n" 816 "};", 817 functionDecl())); 818 } 819 820 TEST(FunctionDeclParameters, FunctionDeclMultipleParameters) { 821 FunctionDeclParametersRangeVerifier Verifier; 822 Verifier.expectRange(1, 8, 1, 28); 823 EXPECT_TRUE( 824 Verifier.match("void f(int a, int b, char *c);\n", functionDecl())); 825 } 826 827 TEST(FunctionDeclParameters, FunctionDeclWithDefaultValue) { 828 FunctionDeclParametersRangeVerifier Verifier; 829 Verifier.expectRange(1, 8, 1, 16); 830 EXPECT_TRUE(Verifier.match("void f(int a = 5);\n", functionDecl())); 831 } 832 833 TEST(FunctionDeclParameters, FunctionDeclWithVolatile) { 834 FunctionDeclParametersRangeVerifier Verifier; 835 Verifier.expectRange(1, 8, 1, 22); 836 EXPECT_TRUE(Verifier.match("void f(volatile int *i);", functionDecl())); 837 } 838 839 TEST(FunctionDeclParameters, FunctionDeclWithConstParam) { 840 FunctionDeclParametersRangeVerifier Verifier; 841 Verifier.expectRange(1, 8, 1, 19); 842 EXPECT_TRUE(Verifier.match("void f(const int *i);", functionDecl())); 843 } 844 845 TEST(FunctionDeclParameters, FunctionDeclWithConstVolatileParam) { 846 FunctionDeclParametersRangeVerifier Verifier; 847 Verifier.expectRange(1, 8, 1, 28); 848 EXPECT_TRUE(Verifier.match("void f(const volatile int *i);", functionDecl())); 849 } 850 851 TEST(FunctionDeclParameters, FunctionDeclWithParamAttribute) { 852 FunctionDeclParametersRangeVerifier Verifier; 853 Verifier.expectRange(1, 8, 1, 36); 854 EXPECT_TRUE(Verifier.match("void f(__attribute__((unused)) int a) {}", 855 functionDecl())); 856 } 857 858 TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) { 859 RangeVerifier<FunctionDecl> Verifier; 860 Verifier.expectRange(2, 1, 2, 16); 861 EXPECT_TRUE(Verifier.match( 862 "class A {\n" 863 "void f() throw();\n" 864 "};\n", 865 functionDecl())); 866 } 867 868 TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) { 869 RangeVerifier<FunctionDecl> Verifier; 870 Verifier.expectRange(2, 1, 2, 24); 871 EXPECT_TRUE(Verifier.match("class A {\n" 872 "void f() noexcept(false);\n" 873 "};\n", 874 functionDecl(), Lang_CXX11)); 875 } 876 877 class ExceptionSpecRangeVerifier : public RangeVerifier<TypeLoc> { 878 protected: 879 SourceRange getRange(const TypeLoc &Node) override { 880 auto T = 881 Node.getUnqualifiedLoc().castAs<FunctionProtoTypeLoc>(); 882 assert(!T.isNull()); 883 return T.getExceptionSpecRange(); 884 } 885 }; 886 887 class ParmVarExceptionSpecRangeVerifier : public RangeVerifier<ParmVarDecl> { 888 protected: 889 SourceRange getRange(const ParmVarDecl &Node) override { 890 if (const TypeSourceInfo *TSI = Node.getTypeSourceInfo()) { 891 TypeLoc TL = TSI->getTypeLoc(); 892 if (TL.getType()->isPointerType()) { 893 TL = TL.getNextTypeLoc().IgnoreParens(); 894 if (auto FPTL = TL.getAs<FunctionProtoTypeLoc>()) { 895 return FPTL.getExceptionSpecRange(); 896 } 897 } 898 } 899 return SourceRange(); 900 } 901 }; 902 903 TEST(FunctionDecl, ExceptionSpecifications) { 904 ExceptionSpecRangeVerifier Verifier; 905 906 Verifier.expectRange(1, 10, 1, 16); 907 EXPECT_TRUE(Verifier.match("void f() throw();\n", loc(functionType()))); 908 909 Verifier.expectRange(1, 10, 1, 34); 910 EXPECT_TRUE(Verifier.match("void f() throw(void(void) throw());\n", 911 loc(functionType()))); 912 913 Verifier.expectRange(1, 10, 1, 19); 914 std::vector<std::string> Args; 915 Args.push_back("-fms-extensions"); 916 EXPECT_TRUE(Verifier.match("void f() throw(...);\n", loc(functionType()), 917 Args, Lang_CXX03)); 918 919 Verifier.expectRange(1, 10, 1, 10); 920 EXPECT_TRUE( 921 Verifier.match("void f() noexcept;\n", loc(functionType()), Lang_CXX11)); 922 923 Verifier.expectRange(1, 10, 1, 24); 924 EXPECT_TRUE(Verifier.match("void f() noexcept(false);\n", loc(functionType()), 925 Lang_CXX11)); 926 927 Verifier.expectRange(1, 10, 1, 32); 928 EXPECT_TRUE(Verifier.match("void f() noexcept(noexcept(1+1));\n", 929 loc(functionType()), Lang_CXX11)); 930 931 ParmVarExceptionSpecRangeVerifier Verifier2; 932 Verifier2.expectRange(1, 25, 1, 31); 933 EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) throw());\n", 934 parmVarDecl(hasType(pointerType(pointee( 935 parenType(innerType(functionType())))))))); 936 937 Verifier2.expectRange(1, 25, 1, 38); 938 EXPECT_TRUE(Verifier2.match("void g(void (*fp)(void) noexcept(true));\n", 939 parmVarDecl(hasType(pointerType(pointee( 940 parenType(innerType(functionType())))))), 941 Lang_CXX11)); 942 } 943 944 TEST(Decl, MemberPointerStarLoc) { 945 llvm::Annotations Example(R"cpp( 946 struct X {}; 947 int X::$star^* a; 948 )cpp"); 949 950 auto AST = tooling::buildASTFromCode(Example.code()); 951 SourceManager &SM = AST->getSourceManager(); 952 auto &Ctx = AST->getASTContext(); 953 954 auto *VD = selectFirst<VarDecl>("vd", match(varDecl().bind("vd"), Ctx)); 955 ASSERT_TRUE(VD != nullptr); 956 957 auto TL = 958 VD->getTypeSourceInfo()->getTypeLoc().castAs<MemberPointerTypeLoc>(); 959 ASSERT_EQ(SM.getFileOffset(TL.getStarLoc()), Example.point("star")); 960 } 961 962 } // end namespace 963