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