clang: include/clang/AST/RecursiveASTVisitor.h Source File (original) (raw)

62#define TRY_TO(CALL_EXPR) \

63 do { \

64 if (!getDerived().CALL_EXPR) \

65 return false; \

66 } while (false)

80isSameMethod([[maybe_unused]] FirstMethodPtrTy FirstMethodPtr,

81 [[maybe_unused]] SecondMethodPtrTy SecondMethodPtr)

82 -> bool {

84 SecondMethodPtrTy>::value)

85 return FirstMethodPtr == SecondMethodPtr;

86 return false;

87}

157public:

158

159

160

161

162

165

166

167 Derived &getDerived() { return *static_cast<Derived *>(this); }

168

169

170

172

173

174

176

177

178

180

181

183

184

186

187

188

194

195

196

197

198

199

201

202

203

204

206

207

208

209

210

211

213

214

215

216

217

218

220

221

222

223

224

225

227

228

229

230

231

232

234

235

236

237

238

239

241

242

243

244

246

247

248

249

250

252

253

254

255

257

258

259

260

261

263

264

265

266

267

268

270

271

272

273

274

276

277

278

279

280

281

282

284

285

286

287

288

290

291

292

293

294

295

296

298

299

300

301

302

305

306

307

308

309

312

313

314

315

316

318

319

320

321

323

324

326

327

328

330

331

332#define ATTR_VISITOR_DECLS_ONLY

333#include "clang/AST/AttrVisitor.inc"

334#undef ATTR_VISITOR_DECLS_ONLY

335

336

337

339

340private:

341

342

343

344

345

346#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) \

347 (::clang::detail::has_same_member_pointer_type< \

348 decltype(&RecursiveASTVisitor::Traverse##NAME), \

349 decltype(&Derived::Traverse##NAME)>::value \

350 ? static_cast<std::conditional_t< \

351 ::clang::detail::has_same_member_pointer_type< \

352 decltype(&RecursiveASTVisitor::Traverse##NAME), \

353 decltype(&Derived::Traverse##NAME)>::value, \

354 Derived &, RecursiveASTVisitor &>>(*this) \

355 .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \

356 : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))

357

358

359

360

361#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) \

362 do { \

363 if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \

364 return false; \

365 } while (false)

366

367public:

368

369#define ABSTRACT_STMT(STMT)

370#define STMT(CLASS, PARENT) \

371 bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);

372#include "clang/AST/StmtNodes.inc"

373

374

375

378#define STMT(CLASS, PARENT) \

379 bool WalkUpFrom##CLASS(CLASS *S) { \

380 TRY_TO(WalkUpFrom##PARENT(S)); \

381 TRY_TO(Visit##CLASS(S)); \

382 return true; \

383 } \

384 bool Visit##CLASS(CLASS *S) { return true; }

385#include "clang/AST/StmtNodes.inc"

386

387

388

389

390

391#define ABSTRACT_TYPE(CLASS, BASE)

392#define TYPE(CLASS, BASE) \

393 bool Traverse##CLASS##Type(CLASS##Type *T, bool TraverseQualifier);

394#include "clang/AST/TypeNodes.inc"

395

396

397

400#define TYPE(CLASS, BASE) \

401 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \

402 TRY_TO(WalkUpFrom##BASE(T)); \

403 TRY_TO(Visit##CLASS##Type(T)); \

404 return true; \

405 } \

406 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }

407#include "clang/AST/TypeNodes.inc"

408

409

410

411

412

413#define ABSTRACT_TYPELOC(CLASS, BASE)

414#define TYPELOC(CLASS, BASE) \

415 bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL, bool TraverseQualifier);

416#include "clang/AST/TypeLocNodes.def"

417

418

419

422

423

424

433

434

435#define TYPE(CLASS, BASE) \

436 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \

437 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \

438 TRY_TO(Visit##CLASS##TypeLoc(TL)); \

439 return true; \

440 } \

441 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }

442#include "clang/AST/TypeNodes.inc"

443

444

445

446

447#define ABSTRACT_DECL(DECL)

448#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);

449#include "clang/AST/DeclNodes.inc"

450

451

452

455#define DECL(CLASS, BASE) \

456 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \

457 TRY_TO(WalkUpFrom##BASE(D)); \

458 TRY_TO(Visit##CLASS##Decl(D)); \

459 return true; \

460 } \

461 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }

462#include "clang/AST/DeclNodes.inc"

463

465

466#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND) \

467 bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);

471#undef DEF_TRAVERSE_TMPL_INST

472

474

479

481

482private:

483

485

486

487 template

488 bool TraverseDeclTemplateParameterLists(T *D);

489

490 bool TraverseTemplateTypeParamDeclConstraints(const TemplateTypeParmDecl *D);

491

493 unsigned Count);

494 bool TraverseArrayTypeLocHelper(ArrayTypeLoc TL);

495 bool TraverseSubstPackTypeHelper(SubstPackType *T);

497 bool TraverseRecordHelper(RecordDecl *D);

500 bool TraverseDeclContextHelper(DeclContext *DC);

501 bool TraverseFunctionHelper(FunctionDecl *D);

502 bool TraverseVarHelper(VarDecl *D);

505 bool TraverseOMPClause(OMPClause *C);

506 bool TraverseTagType(TagType *T, bool TraverseQualifier);

507 bool TraverseTagTypeLoc(TagTypeLoc TL, bool TraverseQualifier);

508#define GEN_CLANG_CLAUSE_CLASS

509#define CLAUSE_CLASS(Enum, Str, Class) bool Visit##Class(Class *C);

510#include "llvm/Frontend/OpenMP/OMP.inc"

511

512 template bool VisitOMPClauseList(T *Node);

513

514 bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *Node);

515 bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *Node);

516

517 bool PostVisitStmt(Stmt *S);

519 bool

522 bool VisitOpenACCClause(const OpenACCClause *);

523};

530 return true;

531 }

532 if (Expr *IDC = C->getImmediatelyDeclaredConstraint()) {

534 } else {

535

536

537

538

540 }

541 return true;

542}

549 return getDerived().TraverseConceptTypeRequirement(

553 return getDerived().TraverseConceptExprRequirement(

556 return getDerived().TraverseConceptNestedRequirement(

558 }

559 llvm_unreachable("unexpected case");

560}

565

568 break;

569#define ABSTRACT_STMT(STMT)

570#define STMT(CLASS, PARENT) \

571 case Stmt::CLASS##Class: \

572 return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);

573#include "clang/AST/StmtNodes.inc"

574 }

575

576 return true;

577}

595 if (RetReq.isTypeConstraint()) {

597 TRY_TO(TraverseTemplateParameterListHelper(

598 RetReq.getTypeConstraintTemplateParameterList()));

599 } else {

600

602 }

603 }

604 return true;

605}

668 if (!S)

669 return true;

670

671 if (Queue) {

672 Queue->push_back({S, false});

673 return true;

674 }

675

677 LocalQueue.push_back({S, false});

678

679 while (!LocalQueue.empty()) {

680 auto &CurrSAndVisited = LocalQueue.back();

681 Stmt *CurrS = CurrSAndVisited.getPointer();

682 bool Visited = CurrSAndVisited.getInt();

683 if (Visited) {

684 LocalQueue.pop_back();

687 TRY_TO(PostVisitStmt(CurrS));

688 }

689 continue;

690 }

691

693 CurrSAndVisited.setInt(true);

694 size_t N = LocalQueue.size();

696

697 std::reverse(LocalQueue.begin() + N, LocalQueue.end());

698 } else {

699 LocalQueue.pop_back();

700 }

701 }

702

703 return true;

704}

708 bool TraverseQualifier) {

709 if (T.isNull())

710 return true;

711

712 switch (T->getTypeClass()) {

713#define ABSTRACT_TYPE(CLASS, BASE)

714#define TYPE(CLASS, BASE) \

715 case Type::CLASS: \

716 return getDerived().Traverse##CLASS##Type( \

717 static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())), \

718 TraverseQualifier);

719#include "clang/AST/TypeNodes.inc"

720 }

721

722 return true;

723}

727 bool TraverseQualifier) {

729 return true;

730

732#define ABSTRACT_TYPELOC(CLASS, BASE)

733#define TYPELOC(CLASS, BASE) \

734 case TypeLoc::CLASS: \

735 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>(), \

736 TraverseQualifier);

737#include "clang/AST/TypeLocNodes.def"

738 }

739

740 return true;

741}

750 if (!D)

751 return true;

752

753

754

757

758

759

760 if (auto *TTPD = dyn_cast(D))

761 return TraverseTemplateTypeParamDeclConstraints(TTPD);

762 return true;

763 }

764

765

766

767

768

769

770

771

772 if (auto *FTD = dyn_cast(D))

773 if (llvm::isa_and_present(

774 FTD->getDeclName().getCXXDeductionGuideTemplate()))

775 return true;

776 }

777

779#define ABSTRACT_DECL(DECL)

780#define DECL(CLASS, BASE) \

781 case Decl::CLASS: \

782 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \

783 return false; \

784 break;

785#include "clang/AST/DeclNodes.inc"

786 }

787 return true;

788}

797 return true;

800 return true;

805 return true;

806 }

807 }

808 llvm_unreachable("unhandled kind");

809}

818 return true;

822 return true;

827 return true;

828 }

829 }

830

831 return true;

832}

843 break;

844

848 break;

849

857 break;

858 }

859

860 return true;

861}

868 Template.getAsQualifiedTemplateName()) {

869 if (QTN->getQualifier()) {

871 }

872 }

873

874 return true;

875}

886 return true;

887

890

893 return getDerived().TraverseTemplateName(

895

898

901 }

902

903 return true;

904}

912

919 return true;

920

922

924 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());

925 else

927 }

928

934 return getDerived().TraverseTemplateName(

936

939

942 }

943

944 return true;

945}

952

953 return true;

954}

961

964

965 return true;

966}

973 if (LE->isInitCapture(C))

975 else

977 return true;

978}

983#define DEF_TRAVERSE_TYPE(TYPE, CODE) \

984 template \

985 bool RecursiveASTVisitor::Traverse##TYPE(TYPE *T, \

986 bool TraverseQualifier) { \

987 if (!getDerived().shouldTraversePostOrder()) \

988 TRY_TO(WalkUpFrom##TYPE(T)); \

989 { \

990 CODE; \

991 } \

992 if (getDerived().shouldTraversePostOrder()) \

993 TRY_TO(WalkUpFrom##TYPE(T)); \

994 return true; \

995 }

1089 for (const auto &A : T->param_types()) {

1090 TRY_TO(TraverseType(A));

1091 }

1093 for (const auto &E : T->exceptions()) {

1094 TRY_TO(TraverseType(E));

1095 }

1174 { TRY_TO(TraverseType(T->getUnderlyingType())); })

1175

1176template

1177bool RecursiveASTVisitor::TraverseTagType(TagType *T,

1178 bool TraverseQualifier) {

1179 if (TraverseQualifier)

1180 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));

1181 return true;

1182}

1218

1220

1222

1224

1225

1226 if (T->getBaseType().getTypePtr() != T)

1227 TRY_TO(TraverseType(T->getBaseType()));

1228 for (auto typeArg : T->getTypeArgsAsWritten()) {

1229 TRY_TO(TraverseType(typeArg));

1230 }

1231})

1232

1234 { TRY_TO(TraverseType(T->getPointeeType())); })

1235

1237

1239

1242 { TRY_TO(TraverseStmt(T->getNumBitsExpr())); })

1243

1245

1247

1248

1249

1250

1251

1252

1253

1254

1256 template \

1257 bool RecursiveASTVisitor::Traverse##TYPE##Loc( \

1258 TYPE##Loc TL, bool TraverseQualifier) { \

1259 if (!getDerived().shouldTraversePostOrder()) { \

1260 TRY_TO(WalkUpFrom##TYPE##Loc(TL)); \

1261 if (getDerived().shouldWalkTypesOfTypeLocs()) \

1262 TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr()))); \

1263 } \

1264 { \

1265 CODE; \

1266 } \

1267 if (getDerived().shouldTraversePostOrder()) { \

1268 TRY_TO(WalkUpFrom##TYPE##Loc(TL)); \

1269 if (getDerived().shouldWalkTypesOfTypeLocs()) \

1270 TRY_TO(WalkUpFrom##TYPE(const_cast<TYPE *>(TL.getTypePtr()))); \

1271 } \

1272 return true; \

1273 }

1274

1275template

1278 assert(TraverseQualifier &&

1279 "Qualifiers should never occur within NestedNameSpecifiers");

1280

1281

1282

1283

1284

1285

1286

1287

1288

1289

1290

1291

1292

1293

1294

1295 return TraverseTypeLoc(TL.getUnqualifiedLoc());

1296}

1297

1299

1300

1302 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1303})

1304

1306 { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })

1307

1309 { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })

1310

1312 { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })

1313

1315 { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })

1316

1317

1318

1320 if (NestedNameSpecifierLoc QL = TL.getQualifierLoc())

1322 else

1323 TRY_TO(TraverseNestedNameSpecifier(TL.getTypePtr()->getQualifier()));

1324 TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));

1325})

1326

1328 { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })

1329

1331 { TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })

1332

1333template

1334bool RecursiveASTVisitor::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {

1335

1336 TRY_TO(TraverseStmt(TL.getSizeExpr()));

1337 return true;

1338}

1339

1341 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));

1342 TRY_TO(TraverseArrayTypeLocHelper(TL));

1343})

1344

1346 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));

1347 TRY_TO(TraverseArrayTypeLocHelper(TL));

1348})

1349

1351 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));

1352 TRY_TO(TraverseArrayTypeLocHelper(TL));

1353})

1354

1356 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));

1357 TRY_TO(TraverseArrayTypeLocHelper(TL));

1358})

1359

1361 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));

1362 TRY_TO(TraverseArrayTypeLocHelper(TL));

1363})

1364

1366 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));

1367 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));

1368})

1369

1370

1371

1373 if (TL.getTypePtr()->getSizeExpr())

1374 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));

1375 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1376})

1377

1378

1380 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1381})

1382

1384 if (TL.getTypePtr()->getSizeExpr())

1385 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));

1386 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1387})

1388

1389

1390

1392 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1393})

1394

1396 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));

1397 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));

1398 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1399})

1400

1402 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));

1403 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));

1404 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));

1405})

1406

1408 { TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })

1409

1410

1412 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));

1413

1415

1416 for (unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {

1417 if (TL.getParam(I)) {

1418 TRY_TO(TraverseDecl(TL.getParam(I)));

1419 } else if (I < T->getNumParams()) {

1420 TRY_TO(TraverseType(T->getParamType(I)));

1421 }

1422 }

1423

1424 for (const auto &E : T->exceptions()) {

1425 TRY_TO(TraverseType(E));

1426 }

1427

1428 if (Expr *NE = T->getNoexceptExpr())

1429 TRY_TO(TraverseStmt(NE));

1430})

1431

1434 TraverseQualifier && QualifierLoc)

1436})

1438 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();

1439 TraverseQualifier && QualifierLoc)

1441})

1444 TraverseQualifier && QualifierLoc)

1446})

1447

1449 { TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })

1450

1452 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));

1453})

1454

1455

1457 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));

1458})

1459

1461 TRY_TO(TraverseType(TL.getPattern()));

1462 TRY_TO(TraverseStmt(TL.getTypePtr()->getIndexExpr()));

1463})

1464

1466 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));

1467})

1468

1470 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));

1471 if (TL.isConstrained()) {

1472 TRY_TO(TraverseConceptReference(TL.getConceptReference()));

1473 }

1474})

1475

1478 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));

1479})

1480

1481template

1482bool RecursiveASTVisitor::TraverseSubstPackTypeLocHelper(

1484 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));

1485 return true;

1486}

1487

1488template

1489bool RecursiveASTVisitor::TraverseSubstPackTypeHelper(

1490 SubstPackType *T) {

1491 TRY_TO(TraverseTemplateArgument(T->getArgumentPack()));

1492 return true;

1493}

1494

1496 { TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })

1497

1499 { TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })

1500

1502

1504 { TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })

1505

1507 { TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })

1508

1510 { TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })

1511

1513 { TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })

1514

1516 { TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })

1517

1519 { TRY_TO(TraverseType(TL.getType())); })

1520

1521template

1522bool RecursiveASTVisitor::TraverseTagTypeLoc(TagTypeLoc TL,

1523 bool TraverseQualifier) {

1524 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();

1525 TraverseQualifier && QualifierLoc)

1527 return true;

1528}

1529

1531 { TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })

1533 { TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })

1535 { TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })

1536

1538 if (TraverseQualifier)

1540})

1541

1543 if (TraverseQualifier)

1545

1546

1547 TRY_TO(TraverseTemplateName(

1548 TemplateName(TL.getTypePtr()->getTemplateName().getAsTemplateDecl(

1549 true))));

1550

1551 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {

1552 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));

1553 }

1554})

1555

1557 if (TraverseQualifier)

1559

1560 const auto *T = TL.getTypePtr();

1561

1563 TraverseTemplateName(TemplateName(T->getTemplateName().getAsTemplateDecl(

1564 true))));

1565

1566 TRY_TO(TraverseType(T->getDeducedType()));

1567})

1568

1570 { TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })

1571

1573 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {

1574 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));

1575 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));

1576 }

1577})

1578

1580

1582

1583

1584 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())

1585 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));

1586 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)

1587 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));

1588 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {

1589 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));

1590 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));

1591 }

1592})

1593

1595 { TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })

1596

1598

1600

1603 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));

1604})

1605

1607

1609

1610

1611

1612

1613

1614

1615

1616

1617template

1619 const Decl *Child) {

1620

1621

1623 return true;

1624

1625 if (const CXXRecordDecl* Cls = dyn_cast(Child))

1626 return Cls->isLambda();

1627 return false;

1628}

1629

1630template

1631bool RecursiveASTVisitor::TraverseDeclContextHelper(DeclContext *DC) {

1632 if (!DC)

1633 return true;

1634

1635 for (auto *Child : DC->decls()) {

1636 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))

1637 TRY_TO(TraverseDecl(Child));

1638 }

1639

1640 return true;

1641}

1642

1643

1644#define DEF_TRAVERSE_DECL(DECL, CODE) \

1645 template \

1646 bool RecursiveASTVisitor::Traverse##DECL(DECL *D) { \

1647 bool ShouldVisitChildren = true; \

1648 bool ReturnValue = true; \

1649 if (!getDerived().shouldTraversePostOrder()) \

1650 TRY_TO(WalkUpFrom##DECL(D)); \

1651 { CODE; } \

1652 if (ReturnValue && ShouldVisitChildren) \

1653 TRY_TO(TraverseDeclContextHelper(dyn_cast(D))); \

1654 if (ReturnValue) { \

1655 \

1656 for (auto *I : D->attrs()) \

1657 TRY_TO(getDerived().TraverseAttr(I)); \

1658 } \

1659 if (ReturnValue && getDerived().shouldTraversePostOrder()) \

1660 TRY_TO(WalkUpFrom##DECL(D)); \

1661 return ReturnValue; \

1662 }

1663

1665

1667 if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())

1668 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));

1669 TRY_TO(TraverseStmt(D->getBody()));

1670 for (const auto &I : D->captures()) {

1671 if (I.hasCopyExpr()) {

1672 TRY_TO(TraverseStmt(I.getCopyExpr()));

1673 }

1674 }

1675 ShouldVisitChildren = false;

1676})

1677

1679 TRY_TO(TraverseStmt(D->getBody()));

1680 ShouldVisitChildren = false;

1681})

1682

1684 TRY_TO(TraverseStmt(D->getBody()));

1685 ShouldVisitChildren = false;

1686})

1687

1689

1691

1693

1695 TRY_TO(TraverseStmt(D->getTemporaryExpr()));

1696})

1697

1699 { TRY_TO(TraverseStmt(D->getAsmStringExpr())); })

1700

1702

1704

1706

1707 if (D->getFriendType()) {

1708 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));

1709

1710

1711 if (auto *TT = D->getFriendType()->getType()->getAs();

1712 TT && TT->isTagOwned())

1713 TRY_TO(TraverseDecl(TT->getDecl()));

1714 } else {

1715 TRY_TO(TraverseDecl(D->getFriendDecl()));

1716 }

1717})

1718

1720 if (D->getFriendType())

1721 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));

1722 else

1723 TRY_TO(TraverseDecl(D->getFriendDecl()));

1724 for (unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {

1727 ITPL != ETPL; ++ITPL) {

1728 TRY_TO(TraverseDecl(*ITPL));

1729 }

1730 }

1731})

1732

1734

1736

1738 })

1739

1741 TRY_TO(TraverseStmt(D->getAssertExpr()));

1742 TRY_TO(TraverseStmt(D->getMessage()));

1743})

1744

1746

1747

1748

1749

1750

1751

1752 auto Scope = D->getASTContext().getTraversalScope();

1753 bool HasLimitedScope =

1755 if (HasLimitedScope) {

1756 ShouldVisitChildren = false;

1757 for (auto *Child : Scope) {

1758 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))

1759 TRY_TO(TraverseDecl(Child));

1760 }

1761 }

1762})

1763

1765

1767

1769

1772

1773

1774

1775 ShouldVisitChildren = false;

1776})

1777

1779 })

1780

1783 {

1784

1785

1786 })

1787

1789 })

1790

1793 for (auto typeParam : *typeParamList) {

1794 TRY_TO(TraverseObjCTypeParamDecl(typeParam));

1795 }

1796 }

1797 for (auto It : llvm::zip(D->protocols(), D->protocol_locs())) {

1798 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));

1799 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));

1800 }

1801})

1802

1804 })

1805

1807 })

1808

1810 if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {

1811 for (auto typeParam : *typeParamList) {

1812 TRY_TO(TraverseObjCTypeParamDecl(typeParam));

1813 }

1814 }

1815

1816 if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {

1817 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));

1818 }

1819 if (D->isThisDeclarationADefinition()) {

1820 for (auto It : llvm::zip(D->protocols(), D->protocol_locs())) {

1821 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));

1822 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));

1823 }

1824 }

1825})

1826

1828 if (D->isThisDeclarationADefinition()) {

1829 for (auto It : llvm::zip(D->protocols(), D->protocol_locs())) {

1830 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));

1831 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));

1832 }

1833 }

1834})

1835

1837 if (D->getReturnTypeSourceInfo()) {

1838 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));

1839 }

1842 }

1843 if (D->isThisDeclarationADefinition()) {

1844 TRY_TO(TraverseStmt(D->getBody()));

1845 }

1846 ShouldVisitChildren = false;

1847})

1848

1850 if (D->hasExplicitBound()) {

1851 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));

1852

1853

1854

1855 }

1856})

1857

1859 if (D->getTypeSourceInfo())

1860 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));

1861 else

1862 TRY_TO(TraverseType(D->getType()));

1863 ShouldVisitChildren = false;

1864})

1865

1868 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));

1869})

1870

1872 { TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })

1873

1875

1878})

1879

1881

1883

1885 for (auto *I : D->varlist()) {

1886 TRY_TO(TraverseStmt(I));

1887 }

1888})

1889

1891 for (auto *I : D->varlist()) {

1892 TRY_TO(TraverseStmt(I));

1893 }

1894})

1895

1897 for (auto *C : D->clauselists()) {

1898 TRY_TO(TraverseOMPClause(C));

1899 }

1900})

1901

1903 TRY_TO(TraverseStmt(D->getCombiner()));

1904 if (auto *Initializer = D->getInitializer())

1906 TRY_TO(TraverseType(D->getType()));

1907 return true;

1908})

1909

1911 for (auto *C : D->clauselists())

1912 TRY_TO(TraverseOMPClause(C));

1913 TRY_TO(TraverseType(D->getType()));

1914 return true;

1915})

1916

1918

1920 for (auto *I : D->varlist())

1921 TRY_TO(TraverseStmt(I));

1922 for (auto *C : D->clauselists())

1923 TRY_TO(TraverseOMPClause(C));

1924})

1925

1927 { TRY_TO(VisitOpenACCClauseList(D->clauses())); })

1928

1930 TRY_TO(TraverseStmt(D->getFunctionReference()));

1931 TRY_TO(VisitOpenACCClauseList(D->clauses()));

1932})

1933

1934

1935template

1936bool RecursiveASTVisitor::TraverseTemplateParameterListHelper(

1938 if (TPL) {

1940 TRY_TO(TraverseDecl(D));

1941 }

1942 if (Expr *RequiresClause = TPL->getRequiresClause()) {

1943 TRY_TO(TraverseStmt(RequiresClause));

1944 }

1945 }

1946 return true;

1947}

1948

1949template

1950template

1951bool RecursiveASTVisitor::TraverseDeclTemplateParameterLists(T *D) {

1952 for (unsigned i = 0; i < D->getNumTemplateParameterLists(); i++) {

1954 TraverseTemplateParameterListHelper(TPL);

1955 }

1956 return true;

1957}

1958

1959template

1962 for (auto *SD : D->specializations()) {

1963 for (auto *RD : SD->redecls()) {

1965 switch (

1967

1970 TRY_TO(TraverseDecl(RD));

1971 break;

1972

1973

1974

1975

1979 break;

1980 }

1981 }

1982 }

1983

1984 return true;

1985}

1986

1987template

1990 for (auto *SD : D->specializations()) {

1991 for (auto *RD : SD->redecls()) {

1992 switch (

1996 TRY_TO(TraverseDecl(RD));

1997 break;

1998

2002 break;

2003 }

2004 }

2005 }

2006

2007 return true;

2008}

2009

2010

2011

2012template

2015 for (auto *FD : D->specializations()) {

2016 for (auto *RD : FD->redecls()) {

2017 switch (RD->getTemplateSpecializationKind()) {

2020

2021 TRY_TO(TraverseDecl(RD));

2022 break;

2023

2024

2025

2028 TRY_TO(TraverseDecl(RD));

2029 break;

2030

2032 break;

2033 }

2034 }

2035 }

2036

2037 return true;

2038}

2039

2040

2041

2042#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \

2043 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \

2044 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \

2045 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \

2046 \

2047

2048

2049

2050

2051

2052 \

2053 if (getDerived().shouldVisitTemplateInstantiations() && \

2054 D == D->getCanonicalDecl()) \

2055 TRY_TO(TraverseTemplateInstantiations(D)); \

2056 \

2057

2058

2059 \

2060 })

2061

2065

2067

2068

2069 TRY_TO(TraverseDecl(D->getTemplatedDecl()));

2070 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())

2071 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));

2072 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));

2073})

2074

2076 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));

2077})

2078

2079template

2080bool RecursiveASTVisitor::TraverseTemplateTypeParamDeclConstraints(

2082 if (const auto *TC = D->getTypeConstraint())

2083 TRY_TO(TraverseTypeConstraint(TC));

2084 return true;

2085}

2086

2088

2089 if (D->getTypeForDecl())

2090 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));

2091 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));

2092 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())

2093 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));

2094})

2095

2097 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));

2098

2099

2100

2101})

2102

2104 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));

2105

2106

2107

2108})

2109

2111 TRY_TO(TraverseDecl(D->getTemplatedDecl()));

2112 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));

2113})

2114

2116 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));

2117 TRY_TO(TraverseStmt(D->getConstraintExpr()));

2118})

2119

2121

2122

2124

2125

2126

2127})

2128

2130

2132 TRY_TO(TraverseDeclTemplateParameterLists(D));

2133

2135 if (auto *TSI = D->getIntegerTypeSourceInfo())

2136 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));

2137

2138

2139})

2140

2141

2142template

2143bool RecursiveASTVisitor::TraverseRecordHelper(RecordDecl *D) {

2144

2145

2146

2147 TRY_TO(TraverseDeclTemplateParameterLists(D));

2149 return true;

2150}

2151

2152template

2155 TRY_TO(TraverseTypeLoc(Base.getTypeSourceInfo()->getTypeLoc()));

2156 return true;

2157}

2158

2159template

2160bool RecursiveASTVisitor::TraverseCXXRecordHelper(CXXRecordDecl *D) {

2161 if (!TraverseRecordHelper(D))

2162 return false;

2163 if (D->isCompleteDefinition()) {

2164 for (const auto &I : D->bases()) {

2165 TRY_TO(TraverseCXXBaseSpecifier(I));

2166 }

2167

2168

2169 }

2170 return true;

2171}

2172

2174

2176

2177template

2178bool RecursiveASTVisitor::TraverseTemplateArgumentLocsHelper(

2180 for (unsigned I = 0; I < Count; ++I) {

2181 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));

2182 }

2183 return true;

2184}

2185

2186#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND) \

2187 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \

2188

2189

2190

2191

2192

2193

2194

2195 \

2196 if (const auto *ArgsWritten = D->getTemplateArgsAsWritten()) { \

2197 assert(D->getTemplateSpecializationKind() != TSK_ImplicitInstantiation); \

2198 \

2199 TRY_TO(TraverseTemplateArgumentLocsHelper( \

2200 ArgsWritten->getTemplateArgs(), ArgsWritten->NumTemplateArgs)); \

2201 } \

2202 \

2203 if (getDerived().shouldVisitTemplateInstantiations() || \

2204 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \

2205 \

2206 TRY_TO(Traverse##DECLKIND##Helper(D)); \

2207 } else { \

2208 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \

2209 \

2210

2211

2212

2213 \

2214 return true; \

2215 } \

2216 })

2217

2220

2221#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \

2222 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \

2223 \

2224 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \

2225 \

2226 TRY_TO(TraverseTemplateArgumentLocsHelper( \

2227 D->getTemplateArgsAsWritten()->getTemplateArgs(), \

2228 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \

2229 \

2230

2231

2232 \

2233 TRY_TO(Traverse##DECLKIND##Helper(D)); \

2234 \

2235 \

2236 })

2237

2240

2242

2244

2245

2247 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));

2248})

2249

2251

2252template

2253bool RecursiveASTVisitor::TraverseDeclaratorHelper(DeclaratorDecl *D) {

2254 TRY_TO(TraverseDeclTemplateParameterLists(D));

2256 if (D->getTypeSourceInfo())

2257 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));

2258 else

2259 TRY_TO(TraverseType(D->getType()));

2260 return true;

2261}

2262

2264 TRY_TO(TraverseVarHelper(D));

2265 for (auto *Binding : D->bindings()) {

2266 TRY_TO(TraverseDecl(Binding));

2267 }

2268})

2269

2271 if (getDerived().shouldVisitImplicitCode()) {

2272 TRY_TO(TraverseStmt(D->getBinding()));

2273 if (const auto HoldingVar = D->getHoldingVar())

2274 TRY_TO(TraverseDecl(HoldingVar));

2275 }

2276})

2277

2279

2282

2284

2286 TRY_TO(TraverseDeclaratorHelper(D));

2287 if (D->isBitField())

2288 TRY_TO(TraverseStmt(D->getBitWidth()));

2289 if (D->hasInClassInitializer())

2290 TRY_TO(TraverseStmt(D->getInClassInitializer()));

2291})

2292

2294 TRY_TO(TraverseDeclaratorHelper(D));

2295 if (D->isBitField())

2296 TRY_TO(TraverseStmt(D->getBitWidth()));

2297

2298})

2299

2301 TRY_TO(TraverseDeclaratorHelper(D));

2302 if (D->isBitField())

2303 TRY_TO(TraverseStmt(D->getBitWidth()));

2304

2305})

2306

2307template

2308bool RecursiveASTVisitor::TraverseFunctionHelper(FunctionDecl *D) {

2309 TRY_TO(TraverseDeclTemplateParameterLists(D));

2311 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));

2312

2313

2314

2315

2316

2317

2319 D->getTemplateSpecializationInfo()) {

2320 if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&

2322

2323

2325 FTSI->TemplateArgumentsAsWritten) {

2326 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),

2327 TALI->NumTemplateArgs));

2328 }

2329 }

2331 D->getDependentSpecializationInfo()) {

2333 DFSI->TemplateArgumentsAsWritten) {

2334 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),

2335 TALI->NumTemplateArgs));

2336 }

2337 }

2338

2339

2340

2341

2342

2344 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));

2345 } else if (getDerived().shouldVisitImplicitCode()) {

2346

2347

2348

2349

2352 }

2353 }

2354

2355

2357 D->getTrailingRequiresClause()) {

2358 TRY_TO(TraverseStmt(

2359 const_cast<Expr *>(TrailingRequiresClause.ConstraintExpr)));

2360 }

2361

2363

2364 for (auto *I : Ctor->inits()) {

2365 if (I->isWritten() || getDerived().shouldVisitImplicitCode())

2366 TRY_TO(TraverseConstructorInitializer(I));

2367 }

2368 }

2369

2370 bool VisitBody =

2371 D->isThisDeclarationADefinition() &&

2372

2373

2374 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());

2375

2376 if (const auto *MD = dyn_cast(D)) {

2378 if (RD->isLambda() &&

2380 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();

2381 }

2382 }

2383 }

2384

2385 if (VisitBody) {

2386 TRY_TO(TraverseStmt(D->getBody()));

2387

2388

2389 for (auto *Child : D->decls()) {

2391 TRY_TO(TraverseDecl(Child));

2392 }

2393 }

2394 return true;

2395}

2396

2398

2399

2400 ShouldVisitChildren = false;

2401 ReturnValue = TraverseFunctionHelper(D);

2402})

2403

2405

2406

2407 ShouldVisitChildren = false;

2408 ReturnValue = TraverseFunctionHelper(D);

2409})

2410

2412

2413

2414 ShouldVisitChildren = false;

2415 ReturnValue = TraverseFunctionHelper(D);

2416})

2417

2419

2420

2421 ShouldVisitChildren = false;

2422 ReturnValue = TraverseFunctionHelper(D);

2423})

2424

2425

2426

2428

2429

2430 ShouldVisitChildren = false;

2431 ReturnValue = TraverseFunctionHelper(D);

2432})

2433

2435

2436

2437 ShouldVisitChildren = false;

2438 ReturnValue = TraverseFunctionHelper(D);

2439})

2440

2441template

2442bool RecursiveASTVisitor::TraverseVarHelper(VarDecl *D) {

2443 TRY_TO(TraverseDeclaratorHelper(D));

2444

2446 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))

2447 TRY_TO(TraverseStmt(D->getInit()));

2448 return true;

2449}

2450

2452

2454

2456

2457 TRY_TO(TraverseDeclaratorHelper(D));

2458 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())

2459 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));

2460})

2461

2463 TRY_TO(TraverseVarHelper(D));

2464

2465 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&

2466 !D->hasUnparsedDefaultArg())

2467 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));

2468

2469 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&

2470 !D->hasUnparsedDefaultArg())

2471 TRY_TO(TraverseStmt(D->getDefaultArg()));

2472})

2473

2475

2477 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));

2478})

2479

2481

2482

2483

2484

2485

2486

2487

2488

2489

2490

2491

2493 template \

2495 STMT *S, DataRecursionQueue *Queue) { \

2496 bool ShouldVisitChildren = true; \

2498 if (!getDerived().shouldTraversePostOrder()) \

2499 TRY_TO(WalkUpFrom##STMT(S)); \

2500 { CODE; } \

2501 if (ShouldVisitChildren) { \

2502 for (Stmt * SubStmt : getDerived().getStmtChildren(S)) { \

2503 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \

2504 } \

2505 } \

2506

2507

2508

2509 \

2510 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \

2511 TRY_TO(WalkUpFrom##STMT(S)); \

2512 } \

2514 }

2515

2518 for (unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {

2520 }

2521 for (unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {

2523 }

2524 for (unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {

2526 }

2527

2528})

2529

2532 {

2533

2534 })

2535

2537 TRY_TO(TraverseDecl(S->getExceptionDecl()));

2538

2539})

2540

2542 for (auto *I : S->decls()) {

2543 TRY_TO(TraverseDecl(I));

2544 }

2545

2546

2547

2548

2549

2550 ShouldVisitChildren = false;

2551})

2552

2553

2554

2577

2579 if (!getDerived().shouldVisitImplicitCode()) {

2580 if (S->getInit())

2585

2586 ShouldVisitChildren = false;

2587 }

2588})

2589

2592 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));

2593})

2594

2598

2600

2603 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));

2604 if (S->hasExplicitTemplateArgs()) {

2605 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

2606 S->getNumTemplateArgs()));

2607 }

2608})

2609

2612 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));

2613 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

2614 S->getNumTemplateArgs()));

2615})

2616

2619 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));

2620 if (S->hasExplicitTemplateArgs()) {

2621 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

2622 S->getNumTemplateArgs()));

2623 }

2624})

2625

2628 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));

2629 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

2630 S->getNumTemplateArgs()));

2631})

2632

2635 {

2636

2637 })

2638

2640 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2641})

2642

2644 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2645})

2646

2648 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2649})

2650

2652 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2653})

2654

2656 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2657})

2658

2660 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2661})

2662

2664 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2665})

2666

2668 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2669})

2670

2671template

2673 InitListExpr *S, DataRecursionQueue *Queue) {

2674 if (S) {

2675

2676

2677 if (!getDerived().shouldTraversePostOrder())

2678 TRY_TO(WalkUpFromInitListExpr(S));

2679

2680

2683 }

2684

2685 if (!Queue && getDerived().shouldTraversePostOrder())

2686 TRY_TO(WalkUpFromInitListExpr(S));

2687 }

2688 return true;

2689}

2690

2691template

2694 return true;

2695}

2696

2697template

2700 if (!getDerived().shouldTraversePostOrder())

2701 TRY_TO(VisitConceptReference(CR));

2703 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));

2704 if (CR->hasExplicitTemplateArgs())

2705 TRY_TO(TraverseTemplateArgumentLocsHelper(

2706 CR->getTemplateArgsAsWritten()->getTemplateArgs(),

2707 CR->getTemplateArgsAsWritten()->NumTemplateArgs));

2708 if (getDerived().shouldTraversePostOrder())

2709 TRY_TO(VisitConceptReference(CR));

2710 return true;

2711}

2712

2713

2714

2715

2716

2717

2718

2719

2720

2721template

2723 InitListExpr *S, DataRecursionQueue *Queue) {

2724 if (S->isSemanticForm() && S->isSyntacticForm()) {

2725

2726 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));

2727 return true;

2728 }

2729 TRY_TO(TraverseSynOrSemInitListExpr(

2730 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));

2731 if (getDerived().shouldVisitImplicitCode()) {

2732

2733

2734 TRY_TO(TraverseSynOrSemInitListExpr(

2735 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));

2736 }

2737 return true;

2738}

2739

2740

2741

2742

2744 if (S->isExprPredicate())

2745 TRY_TO(TraverseStmt(S->getControllingExpr()));

2746 else

2747 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));

2748

2750 if (TypeSourceInfo *TSI = Assoc.getTypeSourceInfo())

2751 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));

2753 }

2754 ShouldVisitChildren = false;

2755})

2756

2757

2758

2762 e = S->semantics_end();

2763 i != e; ++i) {

2764 Expr *sub = *i;

2765 if (OpaqueValueExpr *OVE = dyn_cast(sub))

2766 sub = OVE->getSourceExpr();

2768 }

2769 ShouldVisitChildren = false;

2770})

2771

2773

2774

2775 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2776})

2777

2779

2780 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));

2781})

2782

2784

2785

2786

2787

2788 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2789})

2790

2792

2793

2794 if (S->isArgumentType())

2795 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));

2796})

2797

2799

2800

2801 if (S->isTypeOperand())

2802 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));

2803})

2804

2807})

2808

2810

2812

2813

2814 if (S->isTypeOperand())

2815 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));

2816})

2817

2819 for (unsigned I = 0, N = S->getNumArgs(); I != N; ++I)

2820 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));

2821})

2822

2824 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));

2825})

2826

2829

2831

2832 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));

2833})

2834

2836

2837 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2838})

2839

2840

2842

2843 for (unsigned I = 0, N = S->capture_size(); I != N; ++I) {

2845 if (C->isExplicit() || getDerived().shouldVisitImplicitCode()) {

2846 TRY_TO(TraverseLambdaCapture(S, C, S->capture_init_begin()[I]));

2847 }

2848 }

2849

2850 if (getDerived().shouldVisitImplicitCode()) {

2851

2852 TRY_TO(TraverseDecl(S->getLambdaClass()));

2853 } else {

2854

2855 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();

2857

2858 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));

2859 if (S->hasExplicitParameters()) {

2860

2861 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)

2862 TRY_TO(TraverseDecl(Proto.getParam(I)));

2863 }

2864

2865 auto *T = Proto.getTypePtr();

2866 for (const auto &E : T->exceptions())

2867 TRY_TO(TraverseType(E));

2868

2869 if (Expr *NE = T->getNoexceptExpr())

2871

2872 if (S->hasExplicitResultType())

2873 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));

2875 const_cast<Expr *>(S->getTrailingRequiresClause().ConstraintExpr));

2876

2878 }

2879 ShouldVisitChildren = false;

2880})

2881

2883

2884 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2885})

2886

2887

2888

2892

2893

2894

2901

2903 TRY_TO(TraverseDecl(S->getBlockDecl()));

2904 return true;

2905})

2906

2909 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2910})

2913

2915 if (getDerived().shouldVisitImplicitCode())

2916 TRY_TO(TraverseStmt(S->getExpr()));

2917})

2918

2920 if (getDerived().shouldVisitImplicitCode())

2921 TRY_TO(TraverseStmt(S->getExpr()));

2922})

2923

2929

2932 if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())

2933 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));

2934 if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())

2935 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));

2936})

2937

2948

2949

2952})

2955

2957 if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())

2958 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));

2959})

2960

2963

2965 if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())

2966 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));

2967})

2968

2970 if (S->isClassReceiver()) {

2972 QualType Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);

2974 Data.NameLoc = S->getReceiverLocation();

2975 Data.NameEndLoc = Data.NameLoc;

2977 }

2978})

2983

2985 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));

2986})

2987

2992 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));

2993})

3001 for (IntegerLiteral *IL : S->underlying_data_elements()) {

3003 }

3004})

3005

3008 if (S->hasExplicitTemplateArgs()) {

3009 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

3010 S->getNumTemplateArgs()));

3011 }

3012})

3013

3016 if (S->hasExplicitTemplateArgs()) {

3017 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),

3018 S->getNumTemplateArgs()));

3019 }

3020})

3021

3027

3029 if (getDerived().shouldVisitImplicitCode()) {

3030 TRY_TO(TraverseStmt(S->getOriginalStmt()));

3031 TRY_TO(TraverseDecl(S->getOutlinedFunctionDecl()));

3032 ShouldVisitChildren = false;

3033 }

3034})

3035

3038 if (!getDerived().shouldVisitImplicitCode()) {

3040 S->getDecomposedForm();

3041 TRY_TO(TraverseStmt(const_cast<Expr*>(Decomposed.LHS)));

3042 TRY_TO(TraverseStmt(const_cast<Expr*>(Decomposed.RHS)));

3043 ShouldVisitChildren = false;

3044 }

3045})

3049

3050

3051

3067

3069 if (S->getLifetimeExtendedTemporaryDecl()) {

3070 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(

3071 S->getLifetimeExtendedTemporaryDecl()));

3072 ShouldVisitChildren = false;

3073 }

3074})

3075

3076

3077

3079 if (!getDerived().shouldVisitImplicitCode()) {

3081 ShouldVisitChildren = false;

3082 }

3083})

3085 if (!getDerived().shouldVisitImplicitCode()) {

3087 ShouldVisitChildren = false;

3088 }

3089})

3091 if (!getDerived().shouldVisitImplicitCode()) {

3093 ShouldVisitChildren = false;

3094 }

3095})

3097 if (!getDerived().shouldVisitImplicitCode()) {

3099 ShouldVisitChildren = false;

3100 }

3101})

3103 if (!getDerived().shouldVisitImplicitCode()) {

3105 ShouldVisitChildren = false;

3106 }

3107})

3108

3110 TRY_TO(TraverseConceptReference(S->getConceptReference()));

3111})

3112

3114 TRY_TO(TraverseDecl(S->getBody()));

3115 for (ParmVarDecl *Parm : S->getLocalParameters())

3116 TRY_TO(TraverseDecl(Parm));

3118 TRY_TO(TraverseConceptRequirement(Req));

3119})

3120

3121

3132

3133

3135

3136

3137template

3138bool RecursiveASTVisitor::TraverseOMPExecutableDirective(

3139 OMPExecutableDirective *S) {

3140 for (auto *C : S->clauses()) {

3141 TRY_TO(TraverseOMPClause(C));

3142 }

3143 return true;

3144}

3145

3147 if (!getDerived().shouldVisitImplicitCode()) {

3148

3149 TRY_TO(TraverseStmt(S->getLoopStmt()));

3150 ShouldVisitChildren = false;

3151 }

3152})

3153

3154template

3155bool

3156RecursiveASTVisitor::TraverseOMPLoopDirective(OMPLoopDirective *S) {

3157 return TraverseOMPExecutableDirective(S);

3158}

3159

3161 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3162

3164 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3165

3167 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3168

3170 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3171

3173 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3174

3176 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3177

3179 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3180

3182 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3183

3185 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3186

3188 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3189

3191 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3192

3194 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3195

3197 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3198

3200 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3201

3203 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3204

3206 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3207

3209 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));

3210 TRY_TO(TraverseOMPExecutableDirective(S));

3211})

3212

3214 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3215

3217 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3218

3220 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3221

3223 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3224

3226 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3227

3229 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3230

3232 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3233

3235 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3236

3238 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3239

3241 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3242

3244 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3245

3247 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3248

3250 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3251

3253 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3254

3256 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3257

3259 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3260

3262 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3263

3265 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3266

3268 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3269

3271 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3272

3274 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3275

3277 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3278

3280 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3281

3283 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3284

3286 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3287

3289 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3290

3292 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3293

3295 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3296

3298 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3299

3301 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3302

3304 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3305

3307 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3308

3310 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3311

3313 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3314

3316 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3317

3319 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3320

3322 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3323

3325 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3326

3328 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3329

3331 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3332

3334 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3335

3337 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3338

3340 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3341

3343 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3344

3346 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3347

3349 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3350

3352 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3353

3355 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3356

3357DEF_TRAVERSE_STMT(OMPTargetTeamsDistributeParallelForSimdDirective,

3358 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3359

3361 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3362

3364 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3365

3367 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3368

3370 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3371

3373 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3374

3376 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3377

3379 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3380

3382 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3383

3385 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3386

3388 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3389

3391 { TRY_TO(TraverseOMPExecutableDirective(S)); })

3392

3393

3394template

3395bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) {

3396 if (C)

3397 return true;

3398 switch (C->getClauseKind()) {

3399#define GEN_CLANG_CLAUSE_CLASS

3400#define CLAUSE_CLASS(Enum, Str, Class) \

3401 case llvm::omp::Clause::Enum: \

3402 TRY_TO(Visit##Class(static_cast<Class *>(C))); \

3403 break;

3404#define CLAUSE_NO_CLASS(Enum, Str) \

3405 case llvm::omp::Clause::Enum: \

3406 break;

3407#include "llvm/Frontend/OpenMP/OMP.inc"

3408 }

3409 return true;

3410}

3411

3412template

3413bool RecursiveASTVisitor::VisitOMPClauseWithPreInit(

3415 TRY_TO(TraverseStmt(Node->getPreInitStmt()));

3416 return true;

3417}

3418

3419template

3420bool RecursiveASTVisitor::VisitOMPClauseWithPostUpdate(

3422 TRY_TO(VisitOMPClauseWithPreInit(Node));

3423 TRY_TO(TraverseStmt(Node->getPostUpdateExpr()));

3424 return true;

3425}

3426

3427template

3430 TRY_TO(TraverseStmt(C->getAllocator()));

3431 return true;

3432}

3433

3434template

3436 TRY_TO(TraverseStmt(C->getAllocator()));

3437 TRY_TO(VisitOMPClauseList(C));

3438 return true;

3439}

3440

3441template

3443 TRY_TO(VisitOMPClauseWithPreInit(C));

3444 TRY_TO(TraverseStmt(C->getCondition()));

3445 return true;

3446}

3447

3448template

3450 TRY_TO(VisitOMPClauseWithPreInit(C));

3451 TRY_TO(TraverseStmt(C->getCondition()));

3452 return true;

3453}

3454

3455template

3456bool

3458 TRY_TO(VisitOMPClauseWithPreInit(C));

3459 TRY_TO(TraverseStmt(C->getNumThreads()));

3460 return true;

3461}

3462

3463template

3465 TRY_TO(TraverseStmt(C->getAlignment()));

3466 return true;

3467}

3468

3469template

3471 TRY_TO(TraverseStmt(C->getSafelen()));

3472 return true;

3473}

3474

3475template

3477 TRY_TO(TraverseStmt(C->getSimdlen()));

3478 return true;

3479}

3480

3481template

3483 for (Expr *E : C->getSizesRefs())

3484 TRY_TO(TraverseStmt(E));

3485 return true;

3486}

3487

3488template

3491 for (Expr *E : C->getArgsRefs())

3492 TRY_TO(TraverseStmt(E));

3493 return true;

3494}

3495

3496template

3498 return true;

3499}

3500

3501template

3504 TRY_TO(TraverseStmt(C->getFirst()));

3505 TRY_TO(TraverseStmt(C->getCount()));

3506 return true;

3507}

3508

3509template

3511 TRY_TO(TraverseStmt(C->getFactor()));

3512 return true;

3513}

3514

3515template

3516bool

3518 TRY_TO(TraverseStmt(C->getNumForLoops()));

3519 return true;

3520}

3521

3522template

3524 return true;

3525}

3526

3527template

3530 return true;

3531}

3532

3533template

3535 return true;

3536}

3537

3538template

3541 return true;

3542}

3543

3544template

3547 return true;

3548}

3549

3550template

3553 return true;

3554}

3555

3556template

3559 return true;

3560}

3561

3562template

3565 return true;

3566}

3567

3568template

3570 return true;

3571}

3572

3573template

3575 return true;

3576}

3577

3578template

3580 return true;

3581}

3582

3583template

3585 TRY_TO(TraverseStmt(C->getMessageString()));

3586 return true;

3587}

3588

3589template

3590bool

3592 TRY_TO(VisitOMPClauseWithPreInit(C));

3593 TRY_TO(TraverseStmt(C->getChunkSize()));

3594 return true;

3595}

3596

3597template

3599 TRY_TO(TraverseStmt(C->getNumForLoops()));

3600 return true;

3601}

3602

3603template

3605 TRY_TO(TraverseStmt(C->getCondition()));

3606 return true;

3607}

3608

3609template

3611 return true;

3612}

3613

3614template

3615bool

3617 return true;

3618}

3619

3620template

3622 return true;

3623}

3624

3625template

3627 return true;

3628}

3629

3630template

3632 return true;

3633}

3634

3635template

3637 return true;

3638}

3639

3640template

3642 return true;

3643}

3644

3645template

3647 return true;

3648}

3649

3650template

3652 return true;

3653}

3654

3655template

3657 return true;

3658}

3659

3660template

3662 return true;

3663}

3664

3665template

3667 return true;

3668}

3669

3670template

3672 return true;

3673}

3674

3675template

3677 return true;

3678}

3679

3680template

3683 return true;

3684}

3685

3686template

3689 return true;

3690}

3691

3692template

3695 return true;

3696}

3697

3698template

3700 return true;

3701}

3702

3703template

3705 return true;

3706}

3707

3708template

3710 return true;

3711}

3712

3713template

3715 return true;

3716}

3717

3718template

3720 return true;

3721}

3722

3723template

3725 return true;

3726}

3727

3728template

3730 return true;

3731}

3732

3733template

3735 TRY_TO(VisitOMPClauseList(C));

3736 return true;

3737}

3738

3739template

3741 TRY_TO(TraverseStmt(C->getInteropVar()));

3742 return true;

3743}

3744

3745template

3747 TRY_TO(TraverseStmt(C->getInteropVar()));

3748 return true;

3749}

3750

3751template

3754 TRY_TO(VisitOMPClauseWithPreInit(C));

3755 TRY_TO(TraverseStmt(C->getCondition()));

3756 return true;

3757}

3758

3759template

3762 TRY_TO(VisitOMPClauseWithPreInit(C));

3763 TRY_TO(TraverseStmt(C->getCondition()));

3764 return true;

3765}

3766

3767template

3768template

3769bool RecursiveASTVisitor::VisitOMPClauseList(T *Node) {

3770 for (auto *E : Node->varlist()) {

3771 TRY_TO(TraverseStmt(E));

3772 }

3773 return true;

3774}

3775

3776template

3779 TRY_TO(VisitOMPClauseList(C));

3780 return true;

3781}

3782

3783template

3786 TRY_TO(VisitOMPClauseList(C));

3787 return true;

3788}

3789

3790template

3792 TRY_TO(VisitOMPClauseList(C));

3793 for (auto *E : C->private_copies()) {

3794 TRY_TO(TraverseStmt(E));

3795 }

3796 return true;

3797}

3798

3799template

3802 TRY_TO(VisitOMPClauseList(C));

3803 TRY_TO(VisitOMPClauseWithPreInit(C));

3804 for (auto *E : C->private_copies()) {

3805 TRY_TO(TraverseStmt(E));

3806 }

3807 for (auto *E : C->inits()) {

3808 TRY_TO(TraverseStmt(E));

3809 }

3810 return true;

3811}

3812

3813template

3816 TRY_TO(VisitOMPClauseList(C));

3817 TRY_TO(VisitOMPClauseWithPostUpdate(C));

3818 for (auto *E : C->private_copies()) {

3819 TRY_TO(TraverseStmt(E));

3820 }

3821 for (auto *E : C->source_exprs()) {

3822 TRY_TO(TraverseStmt(E));

3823 }

3824 for (auto *E : C->destination_exprs()) {

3825 TRY_TO(TraverseStmt(E));

3826 }

3827 for (auto *E : C->assignment_ops()) {

3828 TRY_TO(TraverseStmt(E));

3829 }

3830 return true;

3831}

3832

3833template

3835 TRY_TO(VisitOMPClauseList(C));

3836 return true;

3837}

3838

3839template

3841 TRY_TO(TraverseStmt(C->getStep()));

3842 TRY_TO(TraverseStmt(C->getCalcStep()));

3843 TRY_TO(VisitOMPClauseList(C));

3844 TRY_TO(VisitOMPClauseWithPostUpdate(C));

3845 for (auto *E : C->privates()) {

3846 TRY_TO(TraverseStmt(E));

3847 }

3848 for (auto *E : C->inits()) {

3849 TRY_TO(TraverseStmt(E));

3850 }

3851 for (auto *E : C->updates()) {

3852 TRY_TO(TraverseStmt(E));

3853 }

3854 for (auto *E : C->finals()) {

3855 TRY_TO(TraverseStmt(E));

3856 }

3857 return true;

3858}

3859

3860template

3862 TRY_TO(TraverseStmt(C->getAlignment()));

3863 TRY_TO(VisitOMPClauseList(C));

3864 return true;

3865}

3866

3867template

3869 TRY_TO(VisitOMPClauseList(C));

3870 for (auto *E : C->source_exprs()) {

3871 TRY_TO(TraverseStmt(E));

3872 }

3873 for (auto *E : C->destination_exprs()) {

3874 TRY_TO(TraverseStmt(E));

3875 }

3876 for (auto *E : C->assignment_ops()) {

3877 TRY_TO(TraverseStmt(E));

3878 }

3879 return true;

3880}

3881

3882template

3885 TRY_TO(VisitOMPClauseList(C));

3886 for (auto *E : C->source_exprs()) {

3887 TRY_TO(TraverseStmt(E));

3888 }

3889 for (auto *E : C->destination_exprs()) {

3890 TRY_TO(TraverseStmt(E));

3891 }

3892 for (auto *E : C->assignment_ops()) {

3893 TRY_TO(TraverseStmt(E));

3894 }

3895 return true;

3896}

3897

3898template

3899bool

3902 TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));

3903 TRY_TO(VisitOMPClauseList(C));

3904 TRY_TO(VisitOMPClauseWithPostUpdate(C));

3905 for (auto *E : C->privates()) {

3906 TRY_TO(TraverseStmt(E));

3907 }

3908 for (auto *E : C->lhs_exprs()) {

3909 TRY_TO(TraverseStmt(E));

3910 }

3911 for (auto *E : C->rhs_exprs()) {

3912 TRY_TO(TraverseStmt(E));

3913 }

3914 for (auto *E : C->reduction_ops()) {

3915 TRY_TO(TraverseStmt(E));

3916 }

3917 if (C->getModifier() == OMPC_REDUCTION_inscan) {

3918 for (auto *E : C->copy_ops()) {

3919 TRY_TO(TraverseStmt(E));

3920 }

3921 for (auto *E : C->copy_array_temps()) {

3922 TRY_TO(TraverseStmt(E));

3923 }

3924 for (auto *E : C->copy_array_elems()) {

3925 TRY_TO(TraverseStmt(E));

3926 }

3927 }

3928 return true;

3929}

3930

3931template

3935 TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));

3936 TRY_TO(VisitOMPClauseList(C));

3937 TRY_TO(VisitOMPClauseWithPostUpdate(C));

3938 for (auto *E : C->privates()) {

3939 TRY_TO(TraverseStmt(E));

3940 }

3941 for (auto *E : C->lhs_exprs()) {

3942 TRY_TO(TraverseStmt(E));

3943 }

3944 for (auto *E : C->rhs_exprs()) {

3945 TRY_TO(TraverseStmt(E));

3946 }

3947 for (auto *E : C->reduction_ops()) {

3948 TRY_TO(TraverseStmt(E));

3949 }

3950 return true;

3951}

3952

3953template

3957 TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));

3958 TRY_TO(VisitOMPClauseList(C));

3959 TRY_TO(VisitOMPClauseWithPostUpdate(C));

3960 for (auto *E : C->privates()) {

3961 TRY_TO(TraverseStmt(E));

3962 }

3963 for (auto *E : C->lhs_exprs()) {

3964 TRY_TO(TraverseStmt(E));

3965 }

3966 for (auto *E : C->rhs_exprs()) {

3967 TRY_TO(TraverseStmt(E));

3968 }

3969 for (auto *E : C->reduction_ops()) {

3970 TRY_TO(TraverseStmt(E));

3971 }

3972 for (auto *E : C->taskgroup_descriptors())

3973 TRY_TO(TraverseStmt(E));

3974 return true;

3975}

3976

3977template

3979 TRY_TO(VisitOMPClauseList(C));

3980 return true;

3981}

3982

3983template

3985 TRY_TO(TraverseStmt(C->getDepobj()));

3986 return true;

3987}

3988

3989template

3991 TRY_TO(VisitOMPClauseList(C));

3992 return true;

3993}

3994

3995template

3997 TRY_TO(VisitOMPClauseWithPreInit(C));

3998 TRY_TO(TraverseStmt(C->getDevice()));

3999 return true;

4000}

4001

4002template

4004 TRY_TO(VisitOMPClauseList(C));

4005 return true;

4006}

4007

4008template

4011 TRY_TO(VisitOMPClauseList(C));

4012 TRY_TO(VisitOMPClauseWithPreInit(C));

4013 return true;

4014}

4015

4016template

4019 TRY_TO(VisitOMPClauseList(C));

4020 TRY_TO(VisitOMPClauseWithPreInit(C));

4021 return true;

4022}

4023

4024template

4027 TRY_TO(VisitOMPClauseWithPreInit(C));

4028 TRY_TO(TraverseStmt(C->getPriority()));

4029 return true;

4030}

4031

4032template

4035 TRY_TO(VisitOMPClauseWithPreInit(C));

4036 TRY_TO(TraverseStmt(C->getGrainsize()));

4037 return true;

4038}

4039

4040template

4043 TRY_TO(VisitOMPClauseWithPreInit(C));

4044 TRY_TO(TraverseStmt(C->getNumTasks()));

4045 return true;

4046}

4047

4048template

4050 TRY_TO(TraverseStmt(C->getHint()));

4051 return true;

4052}

4053

4054template

4057 TRY_TO(VisitOMPClauseWithPreInit(C));

4058 TRY_TO(TraverseStmt(C->getChunkSize()));

4059 return true;

4060}

4061

4062template

4063bool

4065 return true;

4066}

4067

4068template

4070 TRY_TO(VisitOMPClauseList(C));

4071 return true;

4072}

4073

4074template

4076 TRY_TO(VisitOMPClauseList(C));

4077 return true;

4078}

4079

4080template

4083 TRY_TO(VisitOMPClauseList(C));

4084 return true;

4085}

4086

4087template

4090 TRY_TO(VisitOMPClauseList(C));

4091 return true;

4092}

4093

4094template

4097 TRY_TO(VisitOMPClauseList(C));

4098 return true;

4099}

4100

4101template

4104 TRY_TO(VisitOMPClauseList(C));

4105 return true;

4106}

4107

4108template

4111 TRY_TO(VisitOMPClauseList(C));

4112 for (auto *E : C->private_refs()) {

4113 TRY_TO(TraverseStmt(E));

4114 }

4115 return true;

4116}

4117

4118template

4120 return true;

4121}

4122

4123template

4125 TRY_TO(TraverseStmt(C->getEventHandler()));

4126 return true;

4127}

4128

4129template

4132 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {

4134 TRY_TO(TraverseStmt(Data.Allocator));

4135 TRY_TO(TraverseStmt(Data.AllocatorTraits));

4136 }

4137 return true;

4138}

4139

4140template

4143 TRY_TO(TraverseStmt(C->getModifier()));

4144 for (Expr *E : C->varlist())

4145 TRY_TO(TraverseStmt(E));

4146 return true;

4147}

4148

4149template

4151 TRY_TO(VisitOMPClauseWithPreInit(C));

4152 TRY_TO(TraverseStmt(C->getThreadID()));

4153 return true;

4154}

4155

4156template

4158 return true;

4159}

4160

4161template

4164 TRY_TO(VisitOMPClauseWithPreInit(C));

4165 TRY_TO(TraverseStmt(C->getSize()));

4166 return true;

4167}

4168

4169template

4172 TRY_TO(VisitOMPClauseWithPreInit(C));

4173 TRY_TO(TraverseStmt(C->getSize()));

4174 return true;

4175}

4176

4177template

4180 TRY_TO(VisitOMPClauseList(C));

4181 return true;

4182}

4183

4184template

4187 return true;

4188}

4189

4190template

4192 return true;

4193}

4194

4195template

4196bool RecursiveASTVisitor::TraverseOpenACCConstructStmt(

4198 TRY_TO(VisitOpenACCClauseList(C->clauses()));

4199 return true;

4200}

4201

4202template

4203bool RecursiveASTVisitor::TraverseOpenACCAssociatedStmtConstruct(

4205 TRY_TO(TraverseOpenACCConstructStmt(S));

4206 TRY_TO(TraverseStmt(S->getAssociatedStmt()));

4207 return true;

4208}

4209

4210template

4211bool RecursiveASTVisitor::VisitOpenACCClause(const OpenACCClause *C) {

4212 for (const Stmt *Child : C->children())

4213 TRY_TO(TraverseStmt(const_cast<Stmt *>(Child)));

4214 return true;

4215}

4216

4217template

4218bool RecursiveASTVisitor::VisitOpenACCClauseList(

4220

4221 for (const auto *C : Clauses)

4222 TRY_TO(VisitOpenACCClause(C));

4223 return true;

4224}

4225

4227 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4229 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4231 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4233 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4235 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4237 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4239 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4241 if (S->hasDevNumExpr())

4242 TRY_TO(TraverseStmt(S->getDevNumExpr()));

4243 for (auto *E : S->getQueueIdExprs())

4244 TRY_TO(TraverseStmt(E));

4245 TRY_TO(VisitOpenACCClauseList(S->clauses()));

4246})

4248 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4250 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4252 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4254 { TRY_TO(VisitOpenACCClauseList(S->clauses())); })

4256 { TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })

4258 for (auto *E : S->getVarList())

4259 TRY_TO(TraverseStmt(E));

4260})

4261

4262

4264

4265

4266

4267

4268

4269

4270

4271

4272

4273

4274

4275

4276

4277

4278

4279

4280

4281

4283#undef TRAVERSE_STMT

4285

4287

4288}

4289

4290#endif