clang 20.0.0git
JSONNodeDumper.cpp
Go to the documentation of this file.
2#include "clang/AST/Type.h"
5#include "clang/Lex/Lexer.h"
6#include "llvm/ADT/StringExtras.h"
7#include <optional>
8
9using namespace clang;
10
11void JSONNodeDumper::addPreviousDeclaration(const Decl *D) {
12 switch (D->getKind()) {
13#define DECL(DERIVED, BASE) \
14 case Decl::DERIVED: \
15 return writePreviousDeclImpl(cast<DERIVED##Decl>(D));
16#define ABSTRACT_DECL(DECL)
17#include "clang/AST/DeclNodes.inc"
18#undef ABSTRACT_DECL
19#undef DECL
20 }
21 llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
22}
23
25 const char *AttrName = nullptr;
26 switch (A->getKind()) {
27#define ATTR(X) \
28 case attr::X: \
29 AttrName = #X"Attr"; \
30 break;
31#include "clang/Basic/AttrList.inc"
32#undef ATTR
33 }
34 JOS.attribute("id", createPointerRepresentation(A));
35 JOS.attribute("kind", AttrName);
36 JOS.attributeObject("range", [A, this] { writeSourceRange(A->getRange()); });
37 attributeOnlyIfTrue("inherited", A->isInherited());
38 attributeOnlyIfTrue("implicit", A->isImplicit());
39
40 // FIXME: it would be useful for us to output the spelling kind as well as
41 // the actual spelling. This would allow us to distinguish between the
42 // various attribute syntaxes, but we don't currently track that information
43 // within the AST.
44 //JOS.attribute("spelling", A->getSpelling());
45
47}
48
50 if (!S)
51 return;
52
53 JOS.attribute("id", createPointerRepresentation(S));
54 JOS.attribute("kind", S->getStmtClassName());
55 JOS.attributeObject("range",
56 [S, this] { writeSourceRange(S->getSourceRange()); });
57
58 if (const auto *E = dyn_cast<Expr>(S)) {
59 JOS.attribute("type", createQualType(E->getType()));
60 const char *Category = nullptr;
61 switch (E->getValueKind()) {
62 case VK_LValue: Category = "lvalue"; break;
63 case VK_XValue: Category = "xvalue"; break;
64 case VK_PRValue:
65 Category = "prvalue";
66 break;
67 }
68 JOS.attribute("valueCategory", Category);
69 }
71}
72
74 JOS.attribute("id", createPointerRepresentation(T));
75
76 if (!T)
77 return;
78
79 JOS.attribute("kind", (llvm::Twine(T->getTypeClassName()) + "Type").str());
80 JOS.attribute("type", createQualType(QualType(T, 0), /*Desugar=*/false));
81 attributeOnlyIfTrue("containsErrors", T->containsErrors());
82 attributeOnlyIfTrue("isDependent", T->isDependentType());
83 attributeOnlyIfTrue("isInstantiationDependent",
85 attributeOnlyIfTrue("isVariablyModified", T->isVariablyModifiedType());
86 attributeOnlyIfTrue("containsUnexpandedPack",
88 attributeOnlyIfTrue("isImported", T->isFromAST());
90}
91
93 JOS.attribute("id", createPointerRepresentation(T.getAsOpaquePtr()));
94 JOS.attribute("kind", "QualType");
95 JOS.attribute("type", createQualType(T));
96 JOS.attribute("qualifiers", T.split().Quals.getAsString());
97}
98
100 if (TL.isNull())
101 return;
102 JOS.attribute("kind",
103 (llvm::Twine(TL.getTypeLocClass() == TypeLoc::Qualified
104 ? "Qualified"
105 : TL.getTypePtr()->getTypeClassName()) +
106 "TypeLoc")
107 .str());
108 JOS.attribute("type",
109 createQualType(QualType(TL.getType()), /*Desugar=*/false));
110 JOS.attributeObject("range",
111 [TL, this] { writeSourceRange(TL.getSourceRange()); });
112}
113
115 JOS.attribute("id", createPointerRepresentation(D));
116
117 if (!D)
118 return;
119
120 JOS.attribute("kind", (llvm::Twine(D->getDeclKindName()) + "Decl").str());
121 JOS.attributeObject("loc",
122 [D, this] { writeSourceLocation(D->getLocation()); });
123 JOS.attributeObject("range",
124 [D, this] { writeSourceRange(D->getSourceRange()); });
125 attributeOnlyIfTrue("isImplicit", D->isImplicit());
126 attributeOnlyIfTrue("isInvalid", D->isInvalidDecl());
127
128 if (D->isUsed())
129 JOS.attribute("isUsed", true);
130 else if (D->isThisDeclarationReferenced())
131 JOS.attribute("isReferenced", true);
132
133 if (const auto *ND = dyn_cast<NamedDecl>(D))
134 attributeOnlyIfTrue("isHidden", !ND->isUnconditionallyVisible());
135
137 // Because of multiple inheritance, a DeclContext pointer does not produce
138 // the same pointer representation as a Decl pointer that references the
139 // same AST Node.
140 const auto *ParentDeclContextDecl = dyn_cast<Decl>(D->getDeclContext());
141 JOS.attribute("parentDeclContextId",
142 createPointerRepresentation(ParentDeclContextDecl));
143 }
144
145 addPreviousDeclaration(D);
147}
148
150 const comments::FullComment *FC) {
151 if (!C)
152 return;
153
154 JOS.attribute("id", createPointerRepresentation(C));
155 JOS.attribute("kind", C->getCommentKindName());
156 JOS.attributeObject("loc",
157 [C, this] { writeSourceLocation(C->getLocation()); });
158 JOS.attributeObject("range",
159 [C, this] { writeSourceRange(C->getSourceRange()); });
160
162}
163
165 const Decl *From, StringRef Label) {
166 JOS.attribute("kind", "TemplateArgument");
167 if (R.isValid())
168 JOS.attributeObject("range", [R, this] { writeSourceRange(R); });
169
170 if (From)
171 JOS.attribute(Label.empty() ? "fromDecl" : Label, createBareDeclRef(From));
172
174}
175
177 JOS.attribute("kind", "CXXCtorInitializer");
178 if (Init->isAnyMemberInitializer())
179 JOS.attribute("anyInit", createBareDeclRef(Init->getAnyMember()));
180 else if (Init->isBaseInitializer())
181 JOS.attribute("baseInit",
182 createQualType(QualType(Init->getBaseClass(), 0)));
183 else if (Init->isDelegatingInitializer())
184 JOS.attribute("delegatingInit",
185 createQualType(Init->getTypeSourceInfo()->getType()));
186 else
187 llvm_unreachable("Unknown initializer type");
188}
189
191
193
195 JOS.attribute("kind", "Capture");
196 attributeOnlyIfTrue("byref", C.isByRef());
197 attributeOnlyIfTrue("nested", C.isNested());
198 if (C.getVariable())
199 JOS.attribute("var", createBareDeclRef(C.getVariable()));
200}
201
203 JOS.attribute("associationKind", A.getTypeSourceInfo() ? "case" : "default");
204 attributeOnlyIfTrue("selected", A.isSelected());
205}
206
208 if (!R)
209 return;
210
211 switch (R->getKind()) {
213 JOS.attribute("kind", "TypeRequirement");
214 break;
216 JOS.attribute("kind", "SimpleRequirement");
217 break;
219 JOS.attribute("kind", "CompoundRequirement");
220 break;
222 JOS.attribute("kind", "NestedRequirement");
223 break;
224 }
225
226 if (auto *ER = dyn_cast<concepts::ExprRequirement>(R))
227 attributeOnlyIfTrue("noexcept", ER->hasNoexceptRequirement());
228
229 attributeOnlyIfTrue("isDependent", R->isDependent());
230 if (!R->isDependent())
231 JOS.attribute("satisfied", R->isSatisfied());
232 attributeOnlyIfTrue("containsUnexpandedPack",
234}
235
237 std::string Str;
238 llvm::raw_string_ostream OS(Str);
239 Value.printPretty(OS, Ctx, Ty);
240 JOS.attribute("value", Str);
241}
242
244 JOS.attribute("kind", "ConceptReference");
245 JOS.attribute("id", createPointerRepresentation(CR->getNamedConcept()));
246 if (const auto *Args = CR->getTemplateArgsAsWritten()) {
247 JOS.attributeArray("templateArgsAsWritten", [Args, this] {
248 for (const TemplateArgumentLoc &TAL : Args->arguments())
249 JOS.object(
250 [&TAL, this] { Visit(TAL.getArgument(), TAL.getSourceRange()); });
251 });
252 }
253 JOS.attributeObject("loc",
254 [CR, this] { writeSourceLocation(CR->getLocation()); });
255 JOS.attributeObject("range",
256 [CR, this] { writeSourceRange(CR->getSourceRange()); });
257}
258
259void JSONNodeDumper::writeIncludeStack(PresumedLoc Loc, bool JustFirst) {
260 if (Loc.isInvalid())
261 return;
262
263 JOS.attributeBegin("includedFrom");
264 JOS.objectBegin();
265
266 if (!JustFirst) {
267 // Walk the stack recursively, then print out the presumed location.
268 writeIncludeStack(SM.getPresumedLoc(Loc.getIncludeLoc()));
269 }
270
271 JOS.attribute("file", Loc.getFilename());
272 JOS.objectEnd();
273 JOS.attributeEnd();
274}
275
276void JSONNodeDumper::writeBareSourceLocation(SourceLocation Loc,
277 bool IsSpelling) {
278 PresumedLoc Presumed = SM.getPresumedLoc(Loc);
279 unsigned ActualLine = IsSpelling ? SM.getSpellingLineNumber(Loc)
281 StringRef ActualFile = SM.getBufferName(Loc);
282
283 if (Presumed.isValid()) {
284 JOS.attribute("offset", SM.getDecomposedLoc(Loc).second);
285 if (LastLocFilename != ActualFile) {
286 JOS.attribute("file", ActualFile);
287 JOS.attribute("line", ActualLine);
288 } else if (LastLocLine != ActualLine)
289 JOS.attribute("line", ActualLine);
290
291 StringRef PresumedFile = Presumed.getFilename();
292 if (PresumedFile != ActualFile && LastLocPresumedFilename != PresumedFile)
293 JOS.attribute("presumedFile", PresumedFile);
294
295 unsigned PresumedLine = Presumed.getLine();
296 if (ActualLine != PresumedLine && LastLocPresumedLine != PresumedLine)
297 JOS.attribute("presumedLine", PresumedLine);
298
299 JOS.attribute("col", Presumed.getColumn());
300 JOS.attribute("tokLen",
302 LastLocFilename = ActualFile;
303 LastLocPresumedFilename = PresumedFile;
304 LastLocPresumedLine = PresumedLine;
305 LastLocLine = ActualLine;
306
307 // Orthogonal to the file, line, and column de-duplication is whether the
308 // given location was a result of an include. If so, print where the
309 // include location came from.
310 writeIncludeStack(SM.getPresumedLoc(Presumed.getIncludeLoc()),
311 /*JustFirst*/ true);
312 }
313}
314
315void JSONNodeDumper::writeSourceLocation(SourceLocation Loc) {
316 SourceLocation Spelling = SM.getSpellingLoc(Loc);
317 SourceLocation Expansion = SM.getExpansionLoc(Loc);
318
319 if (Expansion != Spelling) {
320 // If the expansion and the spelling are different, output subobjects
321 // describing both locations.
322 JOS.attributeObject("spellingLoc", [Spelling, this] {
323 writeBareSourceLocation(Spelling, /*IsSpelling*/ true);
324 });
325 JOS.attributeObject("expansionLoc", [Expansion, Loc, this] {
326 writeBareSourceLocation(Expansion, /*IsSpelling*/ false);
327 // If there is a macro expansion, add extra information if the interesting
328 // bit is the macro arg expansion.
329 if (SM.isMacroArgExpansion(Loc))
330 JOS.attribute("isMacroArgExpansion", true);
331 });
332 } else
333 writeBareSourceLocation(Spelling, /*IsSpelling*/ true);
334}
335
336void JSONNodeDumper::writeSourceRange(SourceRange R) {
337 JOS.attributeObject("begin",
338 [R, this] { writeSourceLocation(R.getBegin()); });
339 JOS.attributeObject("end", [R, this] { writeSourceLocation(R.getEnd()); });
340}
341
342std::string JSONNodeDumper::createPointerRepresentation(const void *Ptr) {
343 // Because JSON stores integer values as signed 64-bit integers, trying to
344 // represent them as such makes for very ugly pointer values in the resulting
345 // output. Instead, we convert the value to hex and treat it as a string.
346 return "0x" + llvm::utohexstr(reinterpret_cast<uint64_t>(Ptr), true);
347}
348
349llvm::json::Object JSONNodeDumper::createQualType(QualType QT, bool Desugar) {
350 SplitQualType SQT = QT.split();
351 std::string SQTS = QualType::getAsString(SQT, PrintPolicy);
352 llvm::json::Object Ret{{"qualType", SQTS}};
353
354 if (Desugar && !QT.isNull()) {
356 if (DSQT != SQT) {
357 std::string DSQTS = QualType::getAsString(DSQT, PrintPolicy);
358 if (DSQTS != SQTS)
359 Ret["desugaredQualType"] = DSQTS;
360 }
361 if (const auto *TT = QT->getAs<TypedefType>())
362 Ret["typeAliasDeclId"] = createPointerRepresentation(TT->getDecl());
363 }
364 return Ret;
365}
366
367void JSONNodeDumper::writeBareDeclRef(const Decl *D) {
368 JOS.attribute("id", createPointerRepresentation(D));
369 if (!D)
370 return;
371
372 JOS.attribute("kind", (llvm::Twine(D->getDeclKindName()) + "Decl").str());
373 if (const auto *ND = dyn_cast<NamedDecl>(D))
374 JOS.attribute("name", ND->getDeclName().getAsString());
375 if (const auto *VD = dyn_cast<ValueDecl>(D))
376 JOS.attribute("type", createQualType(VD->getType()));
377}
378
379llvm::json::Object JSONNodeDumper::createBareDeclRef(const Decl *D) {
380 llvm::json::Object Ret{{"id", createPointerRepresentation(D)}};
381 if (!D)
382 return Ret;
383
384 Ret["kind"] = (llvm::Twine(D->getDeclKindName()) + "Decl").str();
385 if (const auto *ND = dyn_cast<NamedDecl>(D))
386 Ret["name"] = ND->getDeclName().getAsString();
387 if (const auto *VD = dyn_cast<ValueDecl>(D))
388 Ret["type"] = createQualType(VD->getType());
389 return Ret;
390}
391
392llvm::json::Array JSONNodeDumper::createCastPath(const CastExpr *C) {
393 llvm::json::Array Ret;
394 if (C->path_empty())
395 return Ret;
396
397 for (auto I = C->path_begin(), E = C->path_end(); I != E; ++I) {
398 const CXXBaseSpecifier *Base = *I;
399 const auto *RD =
400 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
401
402 llvm::json::Object Val{{"name", RD->getName()}};
403 if (Base->isVirtual())
404 Val["isVirtual"] = true;
405 Ret.push_back(std::move(Val));
406 }
407 return Ret;
408}
409
410#define FIELD2(Name, Flag) if (RD->Flag()) Ret[Name] = true
411#define FIELD1(Flag) FIELD2(#Flag, Flag)
412
413static llvm::json::Object
415 llvm::json::Object Ret;
416
417 FIELD2("exists", hasDefaultConstructor);
418 FIELD2("trivial", hasTrivialDefaultConstructor);
419 FIELD2("nonTrivial", hasNonTrivialDefaultConstructor);
420 FIELD2("userProvided", hasUserProvidedDefaultConstructor);
421 FIELD2("isConstexpr", hasConstexprDefaultConstructor);
422 FIELD2("needsImplicit", needsImplicitDefaultConstructor);
423 FIELD2("defaultedIsConstexpr", defaultedDefaultConstructorIsConstexpr);
424
425 return Ret;
426}
427
428static llvm::json::Object
430 llvm::json::Object Ret;
431
432 FIELD2("simple", hasSimpleCopyConstructor);
433 FIELD2("trivial", hasTrivialCopyConstructor);
434 FIELD2("nonTrivial", hasNonTrivialCopyConstructor);
435 FIELD2("userDeclared", hasUserDeclaredCopyConstructor);
436 FIELD2("hasConstParam", hasCopyConstructorWithConstParam);
437 FIELD2("implicitHasConstParam", implicitCopyConstructorHasConstParam);
438 FIELD2("needsImplicit", needsImplicitCopyConstructor);
439 FIELD2("needsOverloadResolution", needsOverloadResolutionForCopyConstructor);
441 FIELD2("defaultedIsDeleted", defaultedCopyConstructorIsDeleted);
442
443 return Ret;
444}
445
446static llvm::json::Object
448 llvm::json::Object Ret;
449
450 FIELD2("exists", hasMoveConstructor);
451 FIELD2("simple", hasSimpleMoveConstructor);
452 FIELD2("trivial", hasTrivialMoveConstructor);
453 FIELD2("nonTrivial", hasNonTrivialMoveConstructor);
454 FIELD2("userDeclared", hasUserDeclaredMoveConstructor);
455 FIELD2("needsImplicit", needsImplicitMoveConstructor);
456 FIELD2("needsOverloadResolution", needsOverloadResolutionForMoveConstructor);
458 FIELD2("defaultedIsDeleted", defaultedMoveConstructorIsDeleted);
459
460 return Ret;
461}
462
463static llvm::json::Object
465 llvm::json::Object Ret;
466
467 FIELD2("simple", hasSimpleCopyAssignment);
468 FIELD2("trivial", hasTrivialCopyAssignment);
469 FIELD2("nonTrivial", hasNonTrivialCopyAssignment);
470 FIELD2("hasConstParam", hasCopyAssignmentWithConstParam);
471 FIELD2("implicitHasConstParam", implicitCopyAssignmentHasConstParam);
472 FIELD2("userDeclared", hasUserDeclaredCopyAssignment);
473 FIELD2("needsImplicit", needsImplicitCopyAssignment);
474 FIELD2("needsOverloadResolution", needsOverloadResolutionForCopyAssignment);
475
476 return Ret;
477}
478
479static llvm::json::Object
481 llvm::json::Object Ret;
482
483 FIELD2("exists", hasMoveAssignment);
484 FIELD2("simple", hasSimpleMoveAssignment);
485 FIELD2("trivial", hasTrivialMoveAssignment);
486 FIELD2("nonTrivial", hasNonTrivialMoveAssignment);
487 FIELD2("userDeclared", hasUserDeclaredMoveAssignment);
488 FIELD2("needsImplicit", needsImplicitMoveAssignment);
489 FIELD2("needsOverloadResolution", needsOverloadResolutionForMoveAssignment);
490
491 return Ret;
492}
493
494static llvm::json::Object
496 llvm::json::Object Ret;
497
498 FIELD2("simple", hasSimpleDestructor);
499 FIELD2("irrelevant", hasIrrelevantDestructor);
500 FIELD2("trivial", hasTrivialDestructor);
501 FIELD2("nonTrivial", hasNonTrivialDestructor);
502 FIELD2("userDeclared", hasUserDeclaredDestructor);
503 FIELD2("needsImplicit", needsImplicitDestructor);
504 FIELD2("needsOverloadResolution", needsOverloadResolutionForDestructor);
506 FIELD2("defaultedIsDeleted", defaultedDestructorIsDeleted);
507
508 return Ret;
509}
510
511llvm::json::Object
512JSONNodeDumper::createCXXRecordDefinitionData(const CXXRecordDecl *RD) {
513 llvm::json::Object Ret;
514
515 // This data is common to all C++ classes.
516 FIELD1(isGenericLambda);
517 FIELD1(isLambda);
518 FIELD1(isEmpty);
519 FIELD1(isAggregate);
520 FIELD1(isStandardLayout);
521 FIELD1(isTriviallyCopyable);
522 FIELD1(isPOD);
524 FIELD1(isPolymorphic);
525 FIELD1(isAbstract);
526 FIELD1(isLiteral);
528 FIELD1(hasUserDeclaredConstructor);
529 FIELD1(hasConstexprNonCopyMoveConstructor);
530 FIELD1(hasMutableFields);
531 FIELD1(hasVariantMembers);
532 FIELD2("canConstDefaultInit", allowConstDefaultInit);
533
534 Ret["defaultCtor"] = createDefaultConstructorDefinitionData(RD);
537 Ret["copyAssign"] = createCopyAssignmentDefinitionData(RD);
538 Ret["moveAssign"] = createMoveAssignmentDefinitionData(RD);
540
541 return Ret;
542}
543
544#undef FIELD1
545#undef FIELD2
546
547std::string JSONNodeDumper::createAccessSpecifier(AccessSpecifier AS) {
548 const auto AccessSpelling = getAccessSpelling(AS);
549 if (AccessSpelling.empty())
550 return "none";
551 return AccessSpelling.str();
552}
553
554llvm::json::Object
555JSONNodeDumper::createCXXBaseSpecifier(const CXXBaseSpecifier &BS) {
556 llvm::json::Object Ret;
557
558 Ret["type"] = createQualType(BS.getType());
559 Ret["access"] = createAccessSpecifier(BS.getAccessSpecifier());
560 Ret["writtenAccess"] =
561 createAccessSpecifier(BS.getAccessSpecifierAsWritten());
562 if (BS.isVirtual())
563 Ret["isVirtual"] = true;
564 if (BS.isPackExpansion())
565 Ret["isPackExpansion"] = true;
566
567 return Ret;
568}
569
570void JSONNodeDumper::VisitAliasAttr(const AliasAttr *AA) {
571 JOS.attribute("aliasee", AA->getAliasee());
572}
573
574void JSONNodeDumper::VisitCleanupAttr(const CleanupAttr *CA) {
575 JOS.attribute("cleanup_function", createBareDeclRef(CA->getFunctionDecl()));
576}
577
578void JSONNodeDumper::VisitDeprecatedAttr(const DeprecatedAttr *DA) {
579 if (!DA->getMessage().empty())
580 JOS.attribute("message", DA->getMessage());
581 if (!DA->getReplacement().empty())
582 JOS.attribute("replacement", DA->getReplacement());
583}
584
585void JSONNodeDumper::VisitUnavailableAttr(const UnavailableAttr *UA) {
586 if (!UA->getMessage().empty())
587 JOS.attribute("message", UA->getMessage());
588}
589
590void JSONNodeDumper::VisitSectionAttr(const SectionAttr *SA) {
591 JOS.attribute("section_name", SA->getName());
592}
593
594void JSONNodeDumper::VisitVisibilityAttr(const VisibilityAttr *VA) {
595 JOS.attribute("visibility", VisibilityAttr::ConvertVisibilityTypeToStr(
596 VA->getVisibility()));
597}
598
599void JSONNodeDumper::VisitTLSModelAttr(const TLSModelAttr *TA) {
600 JOS.attribute("tls_model", TA->getModel());
601}
602
604 JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
605 if (!TT->typeMatchesDecl())
606 JOS.attribute("type", createQualType(TT->desugar()));
607}
608
610 JOS.attribute("decl", createBareDeclRef(TT->getFoundDecl()));
611 if (!TT->typeMatchesDecl())
612 JOS.attribute("type", createQualType(TT->desugar()));
613}
614
617 attributeOnlyIfTrue("noreturn", E.getNoReturn());
618 attributeOnlyIfTrue("producesResult", E.getProducesResult());
619 if (E.getHasRegParm())
620 JOS.attribute("regParm", E.getRegParm());
621 JOS.attribute("cc", FunctionType::getNameForCallConv(E.getCC()));
622}
623
626 attributeOnlyIfTrue("trailingReturn", E.HasTrailingReturn);
627 attributeOnlyIfTrue("const", T->isConst());
628 attributeOnlyIfTrue("volatile", T->isVolatile());
629 attributeOnlyIfTrue("restrict", T->isRestrict());
630 attributeOnlyIfTrue("variadic", E.Variadic);
631 switch (E.RefQualifier) {
632 case RQ_LValue: JOS.attribute("refQualifier", "&"); break;
633 case RQ_RValue: JOS.attribute("refQualifier", "&&"); break;
634 case RQ_None: break;
635 }
636 switch (E.ExceptionSpec.Type) {
637 case EST_DynamicNone:
638 case EST_Dynamic: {
639 JOS.attribute("exceptionSpec", "throw");
640 llvm::json::Array Types;
641 for (QualType QT : E.ExceptionSpec.Exceptions)
642 Types.push_back(createQualType(QT));
643 JOS.attribute("exceptionTypes", std::move(Types));
644 } break;
645 case EST_MSAny:
646 JOS.attribute("exceptionSpec", "throw");
647 JOS.attribute("throwsAny", true);
648 break;
650 JOS.attribute("exceptionSpec", "noexcept");
651 break;
652 case EST_NoexceptTrue:
654 JOS.attribute("exceptionSpec", "noexcept");
655 JOS.attribute("conditionEvaluatesTo",
656 E.ExceptionSpec.Type == EST_NoexceptTrue);
657 //JOS.attributeWithCall("exceptionSpecExpr",
658 // [this, E]() { Visit(E.ExceptionSpec.NoexceptExpr); });
659 break;
660 case EST_NoThrow:
661 JOS.attribute("exceptionSpec", "nothrow");
662 break;
663 // FIXME: I cannot find a way to trigger these cases while dumping the AST. I
664 // suspect you can only run into them when executing an AST dump from within
665 // the debugger, which is not a use case we worry about for the JSON dumping
666 // feature.
668 case EST_Unevaluated:
670 case EST_Unparsed:
671 case EST_None: break;
672 }
674}
675
677 attributeOnlyIfTrue("spelledAsLValue", RT->isSpelledAsLValue());
678}
679
681 switch (AT->getSizeModifier()) {
683 JOS.attribute("sizeModifier", "*");
684 break;
686 JOS.attribute("sizeModifier", "static");
687 break;
689 break;
690 }
691
692 std::string Str = AT->getIndexTypeQualifiers().getAsString();
693 if (!Str.empty())
694 JOS.attribute("indexTypeQualifiers", Str);
695}
696
698 // FIXME: this should use ZExt instead of SExt, but JSON doesn't allow a
699 // narrowing conversion to int64_t so it cannot be expressed.
700 JOS.attribute("size", CAT->getSExtSize());
701 VisitArrayType(CAT);
702}
703
705 const DependentSizedExtVectorType *VT) {
706 JOS.attributeObject(
707 "attrLoc", [VT, this] { writeSourceLocation(VT->getAttributeLoc()); });
708}
709
711 JOS.attribute("numElements", VT->getNumElements());
712 switch (VT->getVectorKind()) {
714 break;
716 JOS.attribute("vectorKind", "altivec");
717 break;
719 JOS.attribute("vectorKind", "altivec pixel");
720 break;
722 JOS.attribute("vectorKind", "altivec bool");
723 break;
724 case VectorKind::Neon:
725 JOS.attribute("vectorKind", "neon");
726 break;
728 JOS.attribute("vectorKind", "neon poly");
729 break;
731 JOS.attribute("vectorKind", "fixed-length sve data vector");
732 break;
734 JOS.attribute("vectorKind", "fixed-length sve predicate vector");
735 break;
737 JOS.attribute("vectorKind", "fixed-length rvv data vector");
738 break;
743 JOS.attribute("vectorKind", "fixed-length rvv mask vector");
744 break;
745 }
746}
747
749 JOS.attribute("decl", createBareDeclRef(UUT->getDecl()));
750}
751
753 switch (UTT->getUTTKind()) {
754#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
755 case UnaryTransformType::Enum: \
756 JOS.attribute("transformKind", #Trait); \
757 break;
758#include "clang/Basic/TransformTypeTraits.def"
759 }
760}
761
763 JOS.attribute("decl", createBareDeclRef(TT->getDecl()));
764}
765
767 const TemplateTypeParmType *TTPT) {
768 JOS.attribute("depth", TTPT->getDepth());
769 JOS.attribute("index", TTPT->getIndex());
770 attributeOnlyIfTrue("isPack", TTPT->isParameterPack());
771 JOS.attribute("decl", createBareDeclRef(TTPT->getDecl()));
772}
773
775 const SubstTemplateTypeParmType *STTPT) {
776 JOS.attribute("index", STTPT->getIndex());
777 if (auto PackIndex = STTPT->getPackIndex())
778 JOS.attribute("pack_index", *PackIndex);
779}
780
783 JOS.attribute("index", T->getIndex());
784}
785
787 JOS.attribute("undeduced", !AT->isDeduced());
788 switch (AT->getKeyword()) {
790 JOS.attribute("typeKeyword", "auto");
791 break;
793 JOS.attribute("typeKeyword", "decltype(auto)");
794 break;
796 JOS.attribute("typeKeyword", "__auto_type");
797 break;
798 }
799}
800
802 const TemplateSpecializationType *TST) {
803 attributeOnlyIfTrue("isAlias", TST->isTypeAlias());
804
805 std::string Str;
806 llvm::raw_string_ostream OS(Str);
807 TST->getTemplateName().print(OS, PrintPolicy);
808 JOS.attribute("templateName", Str);
809}
810
812 const InjectedClassNameType *ICNT) {
813 JOS.attribute("decl", createBareDeclRef(ICNT->getDecl()));
814}
815
817 JOS.attribute("decl", createBareDeclRef(OIT->getDecl()));
818}
819
821 if (std::optional<unsigned> N = PET->getNumExpansions())
822 JOS.attribute("numExpansions", *N);
823}
824
826 if (const NestedNameSpecifier *NNS = ET->getQualifier()) {
827 std::string Str;
828 llvm::raw_string_ostream OS(Str);
829 NNS->print(OS, PrintPolicy, /*ResolveTemplateArgs*/ true);
830 JOS.attribute("qualifier", Str);
831 }
832 if (const TagDecl *TD = ET->getOwnedTagDecl())
833 JOS.attribute("ownedTagDecl", createBareDeclRef(TD));
834}
835
837 JOS.attribute("macroName", MQT->getMacroIdentifier()->getName());
838}
839
841 attributeOnlyIfTrue("isData", MPT->isMemberDataPointer());
842 attributeOnlyIfTrue("isFunction", MPT->isMemberFunctionPointer());
843}
844
846 if (ND && ND->getDeclName()) {
847 JOS.attribute("name", ND->getNameAsString());
848 // FIXME: There are likely other contexts in which it makes no sense to ask
849 // for a mangled name.
850 if (isa<RequiresExprBodyDecl>(ND->getDeclContext()))
851 return;
852
853 // If the declaration is dependent or is in a dependent context, then the
854 // mangling is unlikely to be meaningful (and in some cases may cause
855 // "don't know how to mangle this" assertion failures.
856 if (ND->isTemplated())
857 return;
858
859 // Mangled names are not meaningful for locals, and may not be well-defined
860 // in the case of VLAs.
861 auto *VD = dyn_cast<VarDecl>(ND);
862 if (VD && VD->hasLocalStorage())
863 return;
864
865 // Do not mangle template deduction guides.
866 if (isa<CXXDeductionGuideDecl>(ND))
867 return;
868
869 std::string MangledName = ASTNameGen.getName(ND);
870 if (!MangledName.empty())
871 JOS.attribute("mangledName", MangledName);
872 }
873}
874
876 VisitNamedDecl(TD);
877 JOS.attribute("type", createQualType(TD->getUnderlyingType()));
878}
879
881 VisitNamedDecl(TAD);
882 JOS.attribute("type", createQualType(TAD->getUnderlyingType()));
883}
884
886 VisitNamedDecl(ND);
887 attributeOnlyIfTrue("isInline", ND->isInline());
888 attributeOnlyIfTrue("isNested", ND->isNested());
889 if (!ND->isFirstDecl())
890 JOS.attribute("originalNamespace", createBareDeclRef(ND->getFirstDecl()));
891}
892
894 JOS.attribute("nominatedNamespace",
895 createBareDeclRef(UDD->getNominatedNamespace()));
896}
897
899 VisitNamedDecl(NAD);
900 JOS.attribute("aliasedNamespace",
901 createBareDeclRef(NAD->getAliasedNamespace()));
902}
903
905 std::string Name;
906 if (const NestedNameSpecifier *NNS = UD->getQualifier()) {
907 llvm::raw_string_ostream SOS(Name);
908 NNS->print(SOS, UD->getASTContext().getPrintingPolicy());
909 }
910 Name += UD->getNameAsString();
911 JOS.attribute("name", Name);
912}
913
915 JOS.attribute("target", createBareDeclRef(UED->getEnumDecl()));
916}
917
919 JOS.attribute("target", createBareDeclRef(USD->getTargetDecl()));
920}
921
923 VisitNamedDecl(VD);
924 JOS.attribute("type", createQualType(VD->getType()));
925 if (const auto *P = dyn_cast<ParmVarDecl>(VD))
926 attributeOnlyIfTrue("explicitObjectParameter",
927 P->isExplicitObjectParameter());
928
929 StorageClass SC = VD->getStorageClass();
930 if (SC != SC_None)
931 JOS.attribute("storageClass", VarDecl::getStorageClassSpecifierString(SC));
932 switch (VD->getTLSKind()) {
933 case VarDecl::TLS_Dynamic: JOS.attribute("tls", "dynamic"); break;
934 case VarDecl::TLS_Static: JOS.attribute("tls", "static"); break;
935 case VarDecl::TLS_None: break;
936 }
937 attributeOnlyIfTrue("nrvo", VD->isNRVOVariable());
938 attributeOnlyIfTrue("inline", VD->isInline());
939 attributeOnlyIfTrue("constexpr", VD->isConstexpr());
940 attributeOnlyIfTrue("modulePrivate", VD->isModulePrivate());
941 if (VD->hasInit()) {
942 switch (VD->getInitStyle()) {
943 case VarDecl::CInit: JOS.attribute("init", "c"); break;
944 case VarDecl::CallInit: JOS.attribute("init", "call"); break;
945 case VarDecl::ListInit: JOS.attribute("init", "list"); break;
947 JOS.attribute("init", "paren-list");
948 break;
949 }
950 }
951 attributeOnlyIfTrue("isParameterPack", VD->isParameterPack());
952}
953
955 VisitNamedDecl(FD);
956 JOS.attribute("type", createQualType(FD->getType()));
957 attributeOnlyIfTrue("mutable", FD->isMutable());
958 attributeOnlyIfTrue("modulePrivate", FD->isModulePrivate());
959 attributeOnlyIfTrue("isBitfield", FD->isBitField());
960 attributeOnlyIfTrue("hasInClassInitializer", FD->hasInClassInitializer());
961}
962
964 VisitNamedDecl(FD);
965 JOS.attribute("type", createQualType(FD->getType()));
966 StorageClass SC = FD->getStorageClass();
967 if (SC != SC_None)
968 JOS.attribute("storageClass", VarDecl::getStorageClassSpecifierString(SC));
969 attributeOnlyIfTrue("inline", FD->isInlineSpecified());
970 attributeOnlyIfTrue("virtual", FD->isVirtualAsWritten());
971 attributeOnlyIfTrue("pure", FD->isPureVirtual());
972 attributeOnlyIfTrue("explicitlyDeleted", FD->isDeletedAsWritten());
973 attributeOnlyIfTrue("constexpr", FD->isConstexpr());
974 attributeOnlyIfTrue("variadic", FD->isVariadic());
975 attributeOnlyIfTrue("immediate", FD->isImmediateFunction());
976
977 if (FD->isDefaulted())
978 JOS.attribute("explicitlyDefaulted",
979 FD->isDeleted() ? "deleted" : "default");
980
981 if (StringLiteral *Msg = FD->getDeletedMessage())
982 JOS.attribute("deletedMessage", Msg->getString());
983}
984
986 VisitNamedDecl(ED);
987 if (ED->isFixed())
988 JOS.attribute("fixedUnderlyingType", createQualType(ED->getIntegerType()));
989 if (ED->isScoped())
990 JOS.attribute("scopedEnumTag",
991 ED->isScopedUsingClassTag() ? "class" : "struct");
992}
994 VisitNamedDecl(ECD);
995 JOS.attribute("type", createQualType(ECD->getType()));
996}
997
999 VisitNamedDecl(RD);
1000 JOS.attribute("tagUsed", RD->getKindName());
1001 attributeOnlyIfTrue("completeDefinition", RD->isCompleteDefinition());
1002}
1004 VisitRecordDecl(RD);
1005
1006 // All other information requires a complete definition.
1007 if (!RD->isCompleteDefinition())
1008 return;
1009
1010 JOS.attribute("definitionData", createCXXRecordDefinitionData(RD));
1011 if (RD->getNumBases()) {
1012 JOS.attributeArray("bases", [this, RD] {
1013 for (const auto &Spec : RD->bases())
1014 JOS.value(createCXXBaseSpecifier(Spec));
1015 });
1016 }
1017}
1018
1021 JOS.attribute("bufferKind", D->isCBuffer() ? "cbuffer" : "tbuffer");
1022}
1023
1026 JOS.attribute("tagUsed", D->wasDeclaredWithTypename() ? "typename" : "class");
1027 JOS.attribute("depth", D->getDepth());
1028 JOS.attribute("index", D->getIndex());
1029 attributeOnlyIfTrue("isParameterPack", D->isParameterPack());
1030
1031 if (D->hasDefaultArgument())
1032 JOS.attributeObject("defaultArg", [=] {
1033 Visit(D->getDefaultArgument().getArgument(), SourceRange(),
1034 D->getDefaultArgStorage().getInheritedFrom(),
1035 D->defaultArgumentWasInherited() ? "inherited from" : "previous");
1036 });
1037}
1038
1040 const NonTypeTemplateParmDecl *D) {
1042 JOS.attribute("type", createQualType(D->getType()));
1043 JOS.attribute("depth", D->getDepth());
1044 JOS.attribute("index", D->getIndex());
1045 attributeOnlyIfTrue("isParameterPack", D->isParameterPack());
1046
1047 if (D->hasDefaultArgument())
1048 JOS.attributeObject("defaultArg", [=] {
1049 Visit(D->getDefaultArgument().getArgument(), SourceRange(),
1050 D->getDefaultArgStorage().getInheritedFrom(),
1051 D->defaultArgumentWasInherited() ? "inherited from" : "previous");
1052 });
1053}
1054
1056 const TemplateTemplateParmDecl *D) {
1058 JOS.attribute("depth", D->getDepth());
1059 JOS.attribute("index", D->getIndex());
1060 attributeOnlyIfTrue("isParameterPack", D->isParameterPack());
1061
1062 if (D->hasDefaultArgument())
1063 JOS.attributeObject("defaultArg", [=] {
1064 const auto *InheritedFrom = D->getDefaultArgStorage().getInheritedFrom();
1065 Visit(D->getDefaultArgument().getArgument(),
1066 InheritedFrom ? InheritedFrom->getSourceRange() : SourceLocation{},
1067 InheritedFrom,
1068 D->defaultArgumentWasInherited() ? "inherited from" : "previous");
1069 });
1070}
1071
1073 StringRef Lang;
1074 switch (LSD->getLanguage()) {
1076 Lang = "C";
1077 break;
1079 Lang = "C++";
1080 break;
1081 }
1082 JOS.attribute("language", Lang);
1083 attributeOnlyIfTrue("hasBraces", LSD->hasBraces());
1084}
1085
1087 JOS.attribute("access", createAccessSpecifier(ASD->getAccess()));
1088}
1089
1091 if (const TypeSourceInfo *T = FD->getFriendType())
1092 JOS.attribute("type", createQualType(T->getType()));
1093 attributeOnlyIfTrue("isPackExpansion", FD->isPackExpansion());
1094}
1095
1098 JOS.attribute("type", createQualType(D->getType()));
1099 attributeOnlyIfTrue("synthesized", D->getSynthesize());
1100 switch (D->getAccessControl()) {
1101 case ObjCIvarDecl::None: JOS.attribute("access", "none"); break;
1102 case ObjCIvarDecl::Private: JOS.attribute("access", "private"); break;
1103 case ObjCIvarDecl::Protected: JOS.attribute("access", "protected"); break;
1104 case ObjCIvarDecl::Public: JOS.attribute("access", "public"); break;
1105 case ObjCIvarDecl::Package: JOS.attribute("access", "package"); break;
1106 }
1107}
1108
1111 JOS.attribute("returnType", createQualType(D->getReturnType()));
1112 JOS.attribute("instance", D->isInstanceMethod());
1113 attributeOnlyIfTrue("variadic", D->isVariadic());
1114}
1115
1118 JOS.attribute("type", createQualType(D->getUnderlyingType()));
1119 attributeOnlyIfTrue("bounded", D->hasExplicitBound());
1120 switch (D->getVariance()) {
1122 break;
1124 JOS.attribute("variance", "covariant");
1125 break;
1127 JOS.attribute("variance", "contravariant");
1128 break;
1129 }
1130}
1131
1134 JOS.attribute("interface", createBareDeclRef(D->getClassInterface()));
1135 JOS.attribute("implementation", createBareDeclRef(D->getImplementation()));
1136
1137 llvm::json::Array Protocols;
1138 for (const auto* P : D->protocols())
1139 Protocols.push_back(createBareDeclRef(P));
1140 if (!Protocols.empty())
1141 JOS.attribute("protocols", std::move(Protocols));
1142}
1143
1146 JOS.attribute("interface", createBareDeclRef(D->getClassInterface()));
1147 JOS.attribute("categoryDecl", createBareDeclRef(D->getCategoryDecl()));
1148}
1149
1152
1153 llvm::json::Array Protocols;
1154 for (const auto *P : D->protocols())
1155 Protocols.push_back(createBareDeclRef(P));
1156 if (!Protocols.empty())
1157 JOS.attribute("protocols", std::move(Protocols));
1158}
1159
1162 JOS.attribute("super", createBareDeclRef(D->getSuperClass()));
1163 JOS.attribute("implementation", createBareDeclRef(D->getImplementation()));
1164
1165 llvm::json::Array Protocols;
1166 for (const auto* P : D->protocols())
1167 Protocols.push_back(createBareDeclRef(P));
1168 if (!Protocols.empty())
1169 JOS.attribute("protocols", std::move(Protocols));
1170}
1171
1173 const ObjCImplementationDecl *D) {
1175 JOS.attribute("super", createBareDeclRef(D->getSuperClass()));
1176 JOS.attribute("interface", createBareDeclRef(D->getClassInterface()));
1177}
1178
1180 const ObjCCompatibleAliasDecl *D) {
1182 JOS.attribute("interface", createBareDeclRef(D->getClassInterface()));
1183}
1184
1187 JOS.attribute("type", createQualType(D->getType()));
1188
1189 switch (D->getPropertyImplementation()) {
1190 case ObjCPropertyDecl::None: break;
1191 case ObjCPropertyDecl::Required: JOS.attribute("control", "required"); break;
1192 case ObjCPropertyDecl::Optional: JOS.attribute("control", "optional"); break;
1193 }
1194
1195 ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
1198 JOS.attribute("getter", createBareDeclRef(D->getGetterMethodDecl()));
1200 JOS.attribute("setter", createBareDeclRef(D->getSetterMethodDecl()));
1201 attributeOnlyIfTrue("readonly",
1203 attributeOnlyIfTrue("assign", Attrs & ObjCPropertyAttribute::kind_assign);
1204 attributeOnlyIfTrue("readwrite",
1206 attributeOnlyIfTrue("retain", Attrs & ObjCPropertyAttribute::kind_retain);
1207 attributeOnlyIfTrue("copy", Attrs & ObjCPropertyAttribute::kind_copy);
1208 attributeOnlyIfTrue("nonatomic",
1210 attributeOnlyIfTrue("atomic", Attrs & ObjCPropertyAttribute::kind_atomic);
1211 attributeOnlyIfTrue("weak", Attrs & ObjCPropertyAttribute::kind_weak);
1212 attributeOnlyIfTrue("strong", Attrs & ObjCPropertyAttribute::kind_strong);
1213 attributeOnlyIfTrue("unsafe_unretained",
1215 attributeOnlyIfTrue("class", Attrs & ObjCPropertyAttribute::kind_class);
1216 attributeOnlyIfTrue("direct", Attrs & ObjCPropertyAttribute::kind_direct);
1217 attributeOnlyIfTrue("nullability",
1219 attributeOnlyIfTrue("null_resettable",
1221 }
1222}
1223
1225 VisitNamedDecl(D->getPropertyDecl());
1226 JOS.attribute("implKind", D->getPropertyImplementation() ==
1228 ? "synthesize"
1229 : "dynamic");
1230 JOS.attribute("propertyDecl", createBareDeclRef(D->getPropertyDecl()));
1231 JOS.attribute("ivarDecl", createBareDeclRef(D->getPropertyIvarDecl()));
1232}
1233
1235 attributeOnlyIfTrue("variadic", D->isVariadic());
1236 attributeOnlyIfTrue("capturesThis", D->capturesCXXThis());
1237}
1238
1240 JOS.attribute("name", AE->getOpAsString());
1241}
1242
1244 JOS.attribute("encodedType", createQualType(OEE->getEncodedType()));
1245}
1246
1248 std::string Str;
1249 llvm::raw_string_ostream OS(Str);
1250
1251 OME->getSelector().print(OS);
1252 JOS.attribute("selector", Str);
1253
1254 switch (OME->getReceiverKind()) {
1256 JOS.attribute("receiverKind", "instance");
1257 break;
1259 JOS.attribute("receiverKind", "class");
1260 JOS.attribute("classType", createQualType(OME->getClassReceiver()));
1261 break;
1263 JOS.attribute("receiverKind", "super (instance)");
1264 JOS.attribute("superType", createQualType(OME->getSuperType()));
1265 break;
1267 JOS.attribute("receiverKind", "super (class)");
1268 JOS.attribute("superType", createQualType(OME->getSuperType()));
1269 break;
1270 }
1271
1272 QualType CallReturnTy = OME->getCallReturnType(Ctx);
1273 if (OME->getType() != CallReturnTy)
1274 JOS.attribute("callReturnType", createQualType(CallReturnTy));
1275}
1276
1278 if (const ObjCMethodDecl *MD = OBE->getBoxingMethod()) {
1279 std::string Str;
1280 llvm::raw_string_ostream OS(Str);
1281
1282 MD->getSelector().print(OS);
1283 JOS.attribute("selector", Str);
1284 }
1285}
1286
1288 std::string Str;
1289 llvm::raw_string_ostream OS(Str);
1290
1291 OSE->getSelector().print(OS);
1292 JOS.attribute("selector", Str);
1293}
1294
1296 JOS.attribute("protocol", createBareDeclRef(OPE->getProtocol()));
1297}
1298
1300 if (OPRE->isImplicitProperty()) {
1301 JOS.attribute("propertyKind", "implicit");
1302 if (const ObjCMethodDecl *MD = OPRE->getImplicitPropertyGetter())
1303 JOS.attribute("getter", createBareDeclRef(MD));
1304 if (const ObjCMethodDecl *MD = OPRE->getImplicitPropertySetter())
1305 JOS.attribute("setter", createBareDeclRef(MD));
1306 } else {
1307 JOS.attribute("propertyKind", "explicit");
1308 JOS.attribute("property", createBareDeclRef(OPRE->getExplicitProperty()));
1309 }
1310
1311 attributeOnlyIfTrue("isSuperReceiver", OPRE->isSuperReceiver());
1312 attributeOnlyIfTrue("isMessagingGetter", OPRE->isMessagingGetter());
1313 attributeOnlyIfTrue("isMessagingSetter", OPRE->isMessagingSetter());
1314}
1315
1317 const ObjCSubscriptRefExpr *OSRE) {
1318 JOS.attribute("subscriptKind",
1319 OSRE->isArraySubscriptRefExpr() ? "array" : "dictionary");
1320
1321 if (const ObjCMethodDecl *MD = OSRE->getAtIndexMethodDecl())
1322 JOS.attribute("getter", createBareDeclRef(MD));
1323 if (const ObjCMethodDecl *MD = OSRE->setAtIndexMethodDecl())
1324 JOS.attribute("setter", createBareDeclRef(MD));
1325}
1326
1328 JOS.attribute("decl", createBareDeclRef(OIRE->getDecl()));
1329 attributeOnlyIfTrue("isFreeIvar", OIRE->isFreeIvar());
1330 JOS.attribute("isArrow", OIRE->isArrow());
1331}
1332
1334 JOS.attribute("value", OBLE->getValue() ? "__objc_yes" : "__objc_no");
1335}
1336
1338 JOS.attribute("referencedDecl", createBareDeclRef(DRE->getDecl()));
1339 if (DRE->getDecl() != DRE->getFoundDecl())
1340 JOS.attribute("foundReferencedDecl",
1341 createBareDeclRef(DRE->getFoundDecl()));
1342 switch (DRE->isNonOdrUse()) {
1343 case NOUR_None: break;
1344 case NOUR_Unevaluated: JOS.attribute("nonOdrUseReason", "unevaluated"); break;
1345 case NOUR_Constant: JOS.attribute("nonOdrUseReason", "constant"); break;
1346 case NOUR_Discarded: JOS.attribute("nonOdrUseReason", "discarded"); break;
1347 }
1348 attributeOnlyIfTrue("isImmediateEscalating", DRE->isImmediateEscalating());
1349}
1350
1352 const SYCLUniqueStableNameExpr *E) {
1353 JOS.attribute("typeSourceInfo",
1354 createQualType(E->getTypeSourceInfo()->getType()));
1355}
1356
1358 const OpenACCAsteriskSizeExpr *E) {}
1359
1361 JOS.attribute("name", PredefinedExpr::getIdentKindName(PE->getIdentKind()));
1362}
1363
1365 JOS.attribute("isPostfix", UO->isPostfix());
1366 JOS.attribute("opcode", UnaryOperator::getOpcodeStr(UO->getOpcode()));
1367 if (!UO->canOverflow())
1368 JOS.attribute("canOverflow", false);
1369}
1370
1372 JOS.attribute("opcode", BinaryOperator::getOpcodeStr(BO->getOpcode()));
1373}
1374
1376 const CompoundAssignOperator *CAO) {
1378 JOS.attribute("computeLHSType", createQualType(CAO->getComputationLHSType()));
1379 JOS.attribute("computeResultType",
1380 createQualType(CAO->getComputationResultType()));
1381}
1382
1384 // Note, we always write this Boolean field because the information it conveys
1385 // is critical to understanding the AST node.
1386 ValueDecl *VD = ME->getMemberDecl();
1387 JOS.attribute("name", VD && VD->getDeclName() ? VD->getNameAsString() : "");
1388 JOS.attribute("isArrow", ME->isArrow());
1389 JOS.attribute("referencedMemberDecl", createPointerRepresentation(VD));
1390 switch (ME->isNonOdrUse()) {
1391 case NOUR_None: break;
1392 case NOUR_Unevaluated: JOS.attribute("nonOdrUseReason", "unevaluated"); break;
1393 case NOUR_Constant: JOS.attribute("nonOdrUseReason", "constant"); break;
1394 case NOUR_Discarded: JOS.attribute("nonOdrUseReason", "discarded"); break;
1395 }
1396}
1397
1399 attributeOnlyIfTrue("isGlobal", NE->isGlobalNew());
1400 attributeOnlyIfTrue("isArray", NE->isArray());
1401 attributeOnlyIfTrue("isPlacement", NE->getNumPlacementArgs() != 0);
1402 switch (NE->getInitializationStyle()) {
1404 break;
1406 JOS.attribute("initStyle", "call");
1407 break;
1409 JOS.attribute("initStyle", "list");
1410 break;
1411 }
1412 if (const FunctionDecl *FD = NE->getOperatorNew())
1413 JOS.attribute("operatorNewDecl", createBareDeclRef(FD));
1414 if (const FunctionDecl *FD = NE->getOperatorDelete())
1415 JOS.attribute("operatorDeleteDecl", createBareDeclRef(FD));
1416}
1418 attributeOnlyIfTrue("isGlobal", DE->isGlobalDelete());
1419 attributeOnlyIfTrue("isArray", DE->isArrayForm());
1420 attributeOnlyIfTrue("isArrayAsWritten", DE->isArrayFormAsWritten());
1421 if (const FunctionDecl *FD = DE->getOperatorDelete())
1422 JOS.attribute("operatorDeleteDecl", createBareDeclRef(FD));
1423}
1424
1426 attributeOnlyIfTrue("implicit", TE->isImplicit());
1427}
1428
1430 JOS.attribute("castKind", CE->getCastKindName());
1431 llvm::json::Array Path = createCastPath(CE);
1432 if (!Path.empty())
1433 JOS.attribute("path", std::move(Path));
1434 // FIXME: This may not be useful information as it can be obtusely gleaned
1435 // from the inner[] array.
1436 if (const NamedDecl *ND = CE->getConversionFunction())
1437 JOS.attribute("conversionFunc", createBareDeclRef(ND));
1438}
1439
1441 VisitCastExpr(ICE);
1442 attributeOnlyIfTrue("isPartOfExplicitCast", ICE->isPartOfExplicitCast());
1443}
1444
1446 attributeOnlyIfTrue("adl", CE->usesADL());
1447}
1448
1450 const UnaryExprOrTypeTraitExpr *TTE) {
1451 JOS.attribute("name", getTraitSpelling(TTE->getKind()));
1452 if (TTE->isArgumentType())
1453 JOS.attribute("argType", createQualType(TTE->getArgumentType()));
1454}
1455
1457 VisitNamedDecl(SOPE->getPack());
1458}
1459
1461 const UnresolvedLookupExpr *ULE) {
1462 JOS.attribute("usesADL", ULE->requiresADL());
1463 JOS.attribute("name", ULE->getName().getAsString());
1464
1465 JOS.attributeArray("lookups", [this, ULE] {
1466 for (const NamedDecl *D : ULE->decls())
1467 JOS.value(createBareDeclRef(D));
1468 });
1469}
1470
1472 JOS.attribute("name", ALE->getLabel()->getName());
1473 JOS.attribute("labelDeclId", createPointerRepresentation(ALE->getLabel()));
1474}
1475
1477 if (CTE->isTypeOperand()) {
1478 QualType Adjusted = CTE->getTypeOperand(Ctx);
1479 QualType Unadjusted = CTE->getTypeOperandSourceInfo()->getType();
1480 JOS.attribute("typeArg", createQualType(Unadjusted));
1481 if (Adjusted != Unadjusted)
1482 JOS.attribute("adjustedTypeArg", createQualType(Adjusted));
1483 }
1484}
1485
1488 Visit(CE->getAPValueResult(), CE->getType());
1489}
1490
1492 if (const FieldDecl *FD = ILE->getInitializedFieldInUnion())
1493 JOS.attribute("field", createBareDeclRef(FD));
1494}
1495
1497 const GenericSelectionExpr *GSE) {
1498 attributeOnlyIfTrue("resultDependent", GSE->isResultDependent());
1499}
1500
1502 const CXXUnresolvedConstructExpr *UCE) {
1503 if (UCE->getType() != UCE->getTypeAsWritten())
1504 JOS.attribute("typeAsWritten", createQualType(UCE->getTypeAsWritten()));
1505 attributeOnlyIfTrue("list", UCE->isListInitialization());
1506}
1507
1509 CXXConstructorDecl *Ctor = CE->getConstructor();
1510 JOS.attribute("ctorType", createQualType(Ctor->getType()));
1511 attributeOnlyIfTrue("elidable", CE->isElidable());
1512 attributeOnlyIfTrue("list", CE->isListInitialization());
1513 attributeOnlyIfTrue("initializer_list", CE->isStdInitListInitialization());
1514 attributeOnlyIfTrue("zeroing", CE->requiresZeroInitialization());
1515 attributeOnlyIfTrue("hadMultipleCandidates", CE->hadMultipleCandidates());
1516 attributeOnlyIfTrue("isImmediateEscalating", CE->isImmediateEscalating());
1517
1518 switch (CE->getConstructionKind()) {
1520 JOS.attribute("constructionKind", "complete");
1521 break;
1523 JOS.attribute("constructionKind", "delegating");
1524 break;
1526 JOS.attribute("constructionKind", "non-virtual base");
1527 break;
1529 JOS.attribute("constructionKind", "virtual base");
1530 break;
1531 }
1532}
1533
1535 attributeOnlyIfTrue("cleanupsHaveSideEffects",
1537 if (EWC->getNumObjects()) {
1538 JOS.attributeArray("cleanups", [this, EWC] {
1539 for (const ExprWithCleanups::CleanupObject &CO : EWC->getObjects())
1540 if (auto *BD = CO.dyn_cast<BlockDecl *>()) {
1541 JOS.value(createBareDeclRef(BD));
1542 } else if (auto *CLE = CO.dyn_cast<CompoundLiteralExpr *>()) {
1543 llvm::json::Object Obj;
1544 Obj["id"] = createPointerRepresentation(CLE);
1545 Obj["kind"] = CLE->getStmtClassName();
1546 JOS.value(std::move(Obj));
1547 } else {
1548 llvm_unreachable("unexpected cleanup object type");
1549 }
1550 });
1551 }
1552}
1553
1555 const CXXBindTemporaryExpr *BTE) {
1556 const CXXTemporary *Temp = BTE->getTemporary();
1557 JOS.attribute("temp", createPointerRepresentation(Temp));
1558 if (const CXXDestructorDecl *Dtor = Temp->getDestructor())
1559 JOS.attribute("dtor", createBareDeclRef(Dtor));
1560}
1561
1563 const MaterializeTemporaryExpr *MTE) {
1564 if (const ValueDecl *VD = MTE->getExtendingDecl())
1565 JOS.attribute("extendingDecl", createBareDeclRef(VD));
1566
1567 switch (MTE->getStorageDuration()) {
1568 case SD_Automatic:
1569 JOS.attribute("storageDuration", "automatic");
1570 break;
1571 case SD_Dynamic:
1572 JOS.attribute("storageDuration", "dynamic");
1573 break;
1574 case SD_FullExpression:
1575 JOS.attribute("storageDuration", "full expression");
1576 break;
1577 case SD_Static:
1578 JOS.attribute("storageDuration", "static");
1579 break;
1580 case SD_Thread:
1581 JOS.attribute("storageDuration", "thread");
1582 break;
1583 }
1584
1585 attributeOnlyIfTrue("boundToLValueRef", MTE->isBoundToLvalueReference());
1586}
1587
1589 attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1590}
1591
1593 attributeOnlyIfTrue("hasRewrittenInit", Node->hasRewrittenInit());
1594}
1595
1597 const CXXDependentScopeMemberExpr *DSME) {
1598 JOS.attribute("isArrow", DSME->isArrow());
1599 JOS.attribute("member", DSME->getMember().getAsString());
1600 attributeOnlyIfTrue("hasTemplateKeyword", DSME->hasTemplateKeyword());
1601 attributeOnlyIfTrue("hasExplicitTemplateArgs",
1602 DSME->hasExplicitTemplateArgs());
1603
1604 if (DSME->getNumTemplateArgs()) {
1605 JOS.attributeArray("explicitTemplateArgs", [DSME, this] {
1606 for (const TemplateArgumentLoc &TAL : DSME->template_arguments())
1607 JOS.object(
1608 [&TAL, this] { Visit(TAL.getArgument(), TAL.getSourceRange()); });
1609 });
1610 }
1611}
1612
1614 if (!RE->isValueDependent())
1615 JOS.attribute("satisfied", RE->isSatisfied());
1616}
1617
1619 llvm::SmallString<16> Buffer;
1620 IL->getValue().toString(Buffer,
1621 /*Radix=*/10, IL->getType()->isSignedIntegerType());
1622 JOS.attribute("value", Buffer);
1623}
1625 // FIXME: This should probably print the character literal as a string,
1626 // rather than as a numerical value. It would be nice if the behavior matched
1627 // what we do to print a string literal; right now, it is impossible to tell
1628 // the difference between 'a' and L'a' in C from the JSON output.
1629 JOS.attribute("value", CL->getValue());
1630}
1632 JOS.attribute("value", FPL->getValueAsString(/*Radix=*/10));
1633}
1635 llvm::SmallString<16> Buffer;
1636 FL->getValue().toString(Buffer);
1637 JOS.attribute("value", Buffer);
1638}
1640 std::string Buffer;
1641 llvm::raw_string_ostream SS(Buffer);
1642 SL->outputString(SS);
1643 JOS.attribute("value", Buffer);
1644}
1646 JOS.attribute("value", BLE->getValue());
1647}
1648
1650 attributeOnlyIfTrue("hasInit", IS->hasInitStorage());
1651 attributeOnlyIfTrue("hasVar", IS->hasVarStorage());
1652 attributeOnlyIfTrue("hasElse", IS->hasElseStorage());
1653 attributeOnlyIfTrue("isConstexpr", IS->isConstexpr());
1654 attributeOnlyIfTrue("isConsteval", IS->isConsteval());
1655 attributeOnlyIfTrue("constevalIsNegated", IS->isNegatedConsteval());
1656}
1657
1659 attributeOnlyIfTrue("hasInit", SS->hasInitStorage());
1660 attributeOnlyIfTrue("hasVar", SS->hasVarStorage());
1661}
1663 attributeOnlyIfTrue("isGNURange", CS->caseStmtIsGNURange());
1664}
1665
1667 JOS.attribute("name", LS->getName());
1668 JOS.attribute("declId", createPointerRepresentation(LS->getDecl()));
1669 attributeOnlyIfTrue("sideEntry", LS->isSideEntry());
1670}
1672 JOS.attribute("targetLabelDeclId",
1673 createPointerRepresentation(GS->getLabel()));
1674}
1675
1677 attributeOnlyIfTrue("hasVar", WS->hasVarStorage());
1678}
1679
1681 // FIXME: it would be nice for the ASTNodeTraverser would handle the catch
1682 // parameter the same way for C++ and ObjC rather. In this case, C++ gets a
1683 // null child node and ObjC gets no child node.
1684 attributeOnlyIfTrue("isCatchAll", OACS->getCatchParamDecl() == nullptr);
1685}
1686
1688 JOS.attribute("isNull", true);
1689}
1691 JOS.attribute("type", createQualType(TA.getAsType()));
1692}
1694 const TemplateArgument &TA) {
1695 JOS.attribute("decl", createBareDeclRef(TA.getAsDecl()));
1696}
1698 JOS.attribute("isNullptr", true);
1699}
1701 JOS.attribute("value", TA.getAsIntegral().getSExtValue());
1702}
1704 // FIXME: cannot just call dump() on the argument, as that doesn't specify
1705 // the output format.
1706}
1708 const TemplateArgument &TA) {
1709 // FIXME: cannot just call dump() on the argument, as that doesn't specify
1710 // the output format.
1711}
1713 const TemplateArgument &TA) {
1714 JOS.attribute("isExpr", true);
1715}
1717 JOS.attribute("isPack", true);
1718}
1719
1720StringRef JSONNodeDumper::getCommentCommandName(unsigned CommandID) const {
1721 if (Traits)
1722 return Traits->getCommandInfo(CommandID)->Name;
1723 if (const comments::CommandInfo *Info =
1725 return Info->Name;
1726 return "<invalid>";
1727}
1728
1730 const comments::FullComment *) {
1731 JOS.attribute("text", C->getText());
1732}
1733
1736 JOS.attribute("name", getCommentCommandName(C->getCommandID()));
1737
1738 switch (C->getRenderKind()) {
1740 JOS.attribute("renderKind", "normal");
1741 break;
1743 JOS.attribute("renderKind", "bold");
1744 break;
1746 JOS.attribute("renderKind", "emphasized");
1747 break;
1749 JOS.attribute("renderKind", "monospaced");
1750 break;
1752 JOS.attribute("renderKind", "anchor");
1753 break;
1754 }
1755
1756 llvm::json::Array Args;
1757 for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I)
1758 Args.push_back(C->getArgText(I));
1759
1760 if (!Args.empty())
1761 JOS.attribute("args", std::move(Args));
1762}
1763
1766 JOS.attribute("name", C->getTagName());
1767 attributeOnlyIfTrue("selfClosing", C->isSelfClosing());
1768 attributeOnlyIfTrue("malformed", C->isMalformed());
1769
1770 llvm::json::Array Attrs;
1771 for (unsigned I = 0, E = C->getNumAttrs(); I < E; ++I)
1772 Attrs.push_back(
1773 {{"name", C->getAttr(I).Name}, {"value", C->getAttr(I).Value}});
1774
1775 if (!Attrs.empty())
1776 JOS.attribute("attrs", std::move(Attrs));
1777}
1778
1781 JOS.attribute("name", C->getTagName());
1782}
1783
1786 JOS.attribute("name", getCommentCommandName(C->getCommandID()));
1787
1788 llvm::json::Array Args;
1789 for (unsigned I = 0, E = C->getNumArgs(); I < E; ++I)
1790 Args.push_back(C->getArgText(I));
1791
1792 if (!Args.empty())
1793 JOS.attribute("args", std::move(Args));
1794}
1795
1798 switch (C->getDirection()) {
1800 JOS.attribute("direction", "in");
1801 break;
1803 JOS.attribute("direction", "out");
1804 break;
1806 JOS.attribute("direction", "in,out");
1807 break;
1808 }
1809 attributeOnlyIfTrue("explicit", C->isDirectionExplicit());
1810
1811 if (C->hasParamName())
1812 JOS.attribute("param", C->isParamIndexValid() ? C->getParamName(FC)
1813 : C->getParamNameAsWritten());
1814
1815 if (C->isParamIndexValid() && !C->isVarArgParam())
1816 JOS.attribute("paramIdx", C->getParamIndex());
1817}
1818
1821 if (C->hasParamName())
1822 JOS.attribute("param", C->isPositionValid() ? C->getParamName(FC)
1823 : C->getParamNameAsWritten());
1824 if (C->isPositionValid()) {
1825 llvm::json::Array Positions;
1826 for (unsigned I = 0, E = C->getDepth(); I < E; ++I)
1827 Positions.push_back(C->getIndex(I));
1828
1829 if (!Positions.empty())
1830 JOS.attribute("positions", std::move(Positions));
1831 }
1832}
1833
1836 JOS.attribute("name", getCommentCommandName(C->getCommandID()));
1837 JOS.attribute("closeName", C->getCloseName());
1838}
1839
1842 const comments::FullComment *) {
1843 JOS.attribute("text", C->getText());
1844}
1845
1848 JOS.attribute("text", C->getText());
1849}
1850
1851llvm::json::Object JSONNodeDumper::createFPOptions(FPOptionsOverride FPO) {
1852 llvm::json::Object Ret;
1853#define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1854 if (FPO.has##NAME##Override()) \
1855 Ret.try_emplace(#NAME, static_cast<unsigned>(FPO.get##NAME##Override()));
1856#include "clang/Basic/FPOptions.def"
1857 return Ret;
1858}
1859
1861 VisitStmt(S);
1862 if (S->hasStoredFPFeatures())
1863 JOS.attribute("fpoptions", createFPOptions(S->getStoredFPFeatures()));
1864}
DynTypedNode Node
static bool isTrivial(ASTContext &Ctx, const Expr *E)
Checks if the expression is constant or does not have non-trivial function calls.
const Decl * D
IndirectLocalPath & Path
Expr * E
int Category
Definition: Format.cpp:3035
#define FIELD1(Flag)
static llvm::json::Object createMoveAssignmentDefinitionData(const CXXRecordDecl *RD)
#define FIELD2(Name, Flag)
static llvm::json::Object createCopyAssignmentDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createCopyConstructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createDestructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createDefaultConstructorDefinitionData(const CXXRecordDecl *RD)
static llvm::json::Object createMoveConstructorDefinitionData(const CXXRecordDecl *RD)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
std::string Label
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
@ None
There is no such object (it's outside its lifetime).
Definition: APValue.h:129
const LangOptions & getLangOpts() const
Definition: ASTContext.h:834
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:733
std::string getName(const Decl *D)
Definition: Mangle.cpp:606
Represents an access specifier followed by colon ':'.
Definition: DeclCXX.h:86
AddrLabelExpr - The GNU address of label extension, representing &&label.
Definition: Expr.h:4421
LabelDecl * getLabel() const
Definition: Expr.h:4444
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3577
ArraySizeModifier getSizeModifier() const
Definition: Type.h:3591
Qualifiers getIndexTypeQualifiers() const
Definition: Type.h:3595
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition: Expr.h:6678
StringRef getOpAsString() const
Definition: Expr.h:6743
Attr - This represents one attribute.
Definition: Attr.h:43
attr::Kind getKind() const
Definition: Attr.h:89
bool isInherited() const
Definition: Attr.h:98
bool isImplicit() const
Returns true if the attribute has been implicitly created instead of explicitly written by the user.
Definition: Attr.h:102
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: Type.h:6556
AutoTypeKeyword getKeyword() const
Definition: Type.h:6587
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3909
StringRef getOpcodeStr() const
Definition: Expr.h:3975
Opcode getOpcode() const
Definition: Expr.h:3954
A class which contains all the information about a particular captured value.
Definition: Decl.h:4480
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4474
Represents a base class of a C++ class.
Definition: DeclCXX.h:146
AccessSpecifier getAccessSpecifierAsWritten() const
Retrieves the access specifier as written in the source code (which may mean that no access specifier...
Definition: DeclCXX.h:242
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
Definition: DeclCXX.h:203
QualType getType() const
Retrieves the type of the base class.
Definition: DeclCXX.h:249
bool isPackExpansion() const
Determine whether this base specifier is a pack expansion.
Definition: DeclCXX.h:210
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
Definition: DeclCXX.h:230
Represents binding an expression to a temporary.
Definition: ExprCXX.h:1491
CXXTemporary * getTemporary()
Definition: ExprCXX.h:1509
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition: ExprCXX.h:720
bool getValue() const
Definition: ExprCXX.h:737
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1546
bool isElidable() const
Whether this construction is elidable.
Definition: ExprCXX.h:1615
bool hadMultipleCandidates() const
Whether the referred constructor was resolved from an overloaded set having size greater than 1.
Definition: ExprCXX.h:1620
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
Definition: ExprCXX.h:1639
bool isImmediateEscalating() const
Definition: ExprCXX.h:1704
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition: ExprCXX.h:1648
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition: ExprCXX.h:1609
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
Definition: ExprCXX.h:1628
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Definition: ExprCXX.h:1657
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2553
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2318
A default argument (C++ [dcl.fct.default]).
Definition: ExprCXX.h:1268
A use of a default initializer in a constructor or in aggregate initialization.
Definition: ExprCXX.h:1375
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2498
FunctionDecl * getOperatorDelete() const
Definition: ExprCXX.h:2537
bool isArrayForm() const
Definition: ExprCXX.h:2524
bool isGlobalDelete() const
Definition: ExprCXX.h:2523
bool isArrayFormAsWritten() const
Definition: ExprCXX.h:2525
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition: ExprCXX.h:3683
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition: ExprCXX.h:3786
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
Definition: ExprCXX.h:3881
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
Definition: ExprCXX.h:3860
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Definition: ExprCXX.h:3825
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
Definition: ExprCXX.h:3856
ArrayRef< TemplateArgumentLoc > template_arguments() const
Definition: ExprCXX.h:3888
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2817
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition: ExprCXX.h:2241
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
base_class_range bases()
Definition: DeclCXX.h:620
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition: DeclCXX.h:614
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
Definition: DeclCXX.h:914
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
Definition: DeclCXX.h:1025
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Definition: DeclCXX.h:817
Represents a C++ temporary.
Definition: ExprCXX.h:1457
const CXXDestructorDecl * getDestructor() const
Definition: ExprCXX.h:1468
Represents the this expression in C++.
Definition: ExprCXX.h:1152
bool isImplicit() const
Definition: ExprCXX.h:1175
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition: ExprCXX.h:845
bool isTypeOperand() const
Definition: ExprCXX.h:881
QualType getTypeOperand(const ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
Definition: ExprCXX.cpp:161
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Definition: ExprCXX.h:888
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition: ExprCXX.h:3557
bool isListInitialization() const
Determine whether this expression models list-initialization.
Definition: ExprCXX.h:3612
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Definition: ExprCXX.h:3591
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2874
bool usesADL() const
Definition: Expr.h:3034
CaseStmt - Represent a case statement.
Definition: Stmt.h:1828
bool caseStmtIsGNURange() const
True if this case statement is of the form case LHS ... RHS, which is a GNU extension.
Definition: Stmt.h:1895
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3547
NamedDecl * getConversionFunction() const
If this cast applies a user-defined conversion, retrieve the conversion function that it invokes.
Definition: Expr.cpp:2011
static const char * getCastKindName(CastKind CK)
Definition: Expr.cpp:1960
unsigned getValue() const
Definition: Expr.h:1615
CompoundAssignOperator - For compound assignments (e.g.
Definition: Expr.h:4171
QualType getComputationLHSType() const
Definition: Expr.h:4205
QualType getComputationResultType() const
Definition: Expr.h:4208
CompoundLiteralExpr - [C99 6.5.2.5].
Definition: Expr.h:3477
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1628
A reference to a concept and its template args, as it appears in the code.
Definition: ASTConcept.h:124
SourceRange getSourceRange() const LLVM_READONLY
Definition: ASTConcept.h:191
ConceptDecl * getNamedConcept() const
Definition: ASTConcept.h:199
SourceLocation getLocation() const
Definition: ASTConcept.h:175
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Definition: ASTConcept.h:203
Represents the canonical version of C arrays with a specified constant size.
Definition: Type.h:3615
int64_t getSExtSize() const
Return the size sign-extended as a uint64_t.
Definition: Type.h:3697
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition: Expr.h:1077
APValue getAPValueResult() const
Definition: Expr.cpp:413
APValue::ValueKind getResultAPValueKind() const
Definition: Expr.h:1143
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
Definition: Expr.h:1370
ValueDecl * getDecl()
Definition: Expr.h:1333
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition: Expr.h:1457
bool isImmediateEscalating() const
Definition: Expr.h:1467
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:520
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:596
bool isParameterPack() const
Whether this declaration is a parameter pack.
Definition: DeclBase.cpp:239
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
Definition: DeclBase.cpp:281
bool isInvalidDecl() const
Definition: DeclBase.h:591
SourceLocation getLocation() const
Definition: DeclBase.h:442
const char * getDeclKindName() const
Definition: DeclBase.cpp:142
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition: DeclBase.h:624
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition: DeclBase.cpp:549
DeclContext * getDeclContext()
Definition: DeclBase.h:451
AccessSpecifier getAccess() const
Definition: DeclBase.h:510
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:907
Kind getKind() const
Definition: DeclBase.h:445
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition: DeclBase.h:430
std::string getAsString() const
Retrieve the human-readable string for this name.
bool isDeduced() const
Definition: Type.h:6544
Represents an extended vector type where either the type or size is dependent.
Definition: Type.h:3960
SourceLocation getAttributeLoc() const
Definition: Type.h:3976
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
Definition: Type.h:6943
TagDecl * getOwnedTagDecl() const
Return the (re)declaration of this type owned by this occurrence of this type, or nullptr if there is...
Definition: Type.h:6991
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
Definition: Type.h:6978
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3277
Represents an enum.
Definition: Decl.h:3847
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
Definition: Decl.h:4052
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
Definition: Decl.h:4055
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition: Decl.h:4061
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition: Decl.h:4007
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition: ExprCXX.h:3474
bool cleanupsHaveSideEffects() const
Definition: ExprCXX.h:3509
ArrayRef< CleanupObject > getObjects() const
Definition: ExprCXX.h:3498
unsigned getNumObjects() const
Definition: ExprCXX.h:3502
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition: ExprCXX.h:3480
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition: Expr.h:175
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Definition: Expr.h:437
QualType getType() const
Definition: Expr.h:142
Represents difference between two FPOptions values.
Definition: LangOptions.h:978
Represents a member of a struct/union/class.
Definition: Decl.h:3033
bool isMutable() const
Determines whether this field is mutable (C++ only).
Definition: Decl.h:3121
bool isBitField() const
Determines whether this field is a bitfield.
Definition: Decl.h:3124
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition: Decl.h:3194
std::string getValueAsString(unsigned Radix) const
Definition: Expr.cpp:1008
llvm::APFloat getValue() const
Definition: Expr.h:1652
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition: DeclFriend.h:54
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Definition: DeclFriend.h:126
bool isPackExpansion() const
Definition: DeclFriend.h:193
Represents a function declaration or definition.
Definition: Decl.h:1935
bool isImmediateFunction() const
Definition: Decl.cpp:3295
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
Definition: Decl.h:2633
bool isVariadic() const
Whether this function is variadic.
Definition: Decl.cpp:3096
bool isDeleted() const
Whether this function has been deleted.
Definition: Decl.h:2468
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:2763
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition: Decl.h:2398
bool isDeletedAsWritten() const
Definition: Decl.h:2472
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition: Decl.h:2288
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2313
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition: Decl.h:2279
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition: Decl.h:2774
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5102
ExtProtoInfo getExtProtoInfo() const
Definition: Type.h:5366
A class which abstracts out some details necessary for making a call.
Definition: Type.h:4432
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4321
ExtInfo getExtInfo() const
Definition: Type.h:4655
static StringRef getNameForCallConv(CallingConv CC)
Definition: Type.cpp:3537
bool isConst() const
Definition: Type.h:4661
bool isRestrict() const
Definition: Type.h:4663
bool isVolatile() const
Definition: Type.h:4662
Represents a C11 generic selection.
Definition: Expr.h:5966
AssociationTy< true > ConstAssociation
Definition: Expr.h:6198
bool isResultDependent() const
Whether this generic selection is result-dependent.
Definition: Expr.h:6218
GotoStmt - This represents a direct goto.
Definition: Stmt.h:2889
LabelDecl * getLabel() const
Definition: Stmt.h:2902
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition: Decl.h:4927
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
Definition: Stmt.h:2165
bool hasElseStorage() const
True if this IfStmt has storage for an else statement.
Definition: Stmt.h:2240
bool hasVarStorage() const
True if this IfStmt has storage for a variable declaration.
Definition: Stmt.h:2237
bool isConstexpr() const
Definition: Stmt.h:2358
bool hasInitStorage() const
True if this IfStmt has the storage for an init statement.
Definition: Stmt.h:2234
bool isNegatedConsteval() const
Definition: Stmt.h:2354
bool isConsteval() const
Definition: Stmt.h:2345
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition: Expr.h:3724
bool isPartOfExplicitCast() const
Definition: Expr.h:3755
Describes an C or C++ initializer list.
Definition: Expr.h:5088
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
Definition: Expr.h:5207
The injected class name of a C++ class template or class template partial specialization.
Definition: Type.h:6793
CXXRecordDecl * getDecl() const
Definition: Type.cpp:4236
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *OSRE)
void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D)
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *ULE)
void VisitCleanupAttr(const CleanupAttr *CA)
void VisitCaseStmt(const CaseStmt *CS)
void VisitImplicitCastExpr(const ImplicitCastExpr *ICE)
void VisitNamespaceAliasDecl(const NamespaceAliasDecl *NAD)
void VisitFunctionProtoType(const FunctionProtoType *T)
void VisitObjCImplementationDecl(const ObjCImplementationDecl *D)
void VisitVectorType(const VectorType *VT)
void VisitFunctionDecl(const FunctionDecl *FD)
void VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE)
void VisitUsingDecl(const UsingDecl *UD)
void VisitEnumConstantDecl(const EnumConstantDecl *ECD)
void VisitConstantExpr(const ConstantExpr *CE)
void VisitRequiresExpr(const RequiresExpr *RE)
void VisitExprWithCleanups(const ExprWithCleanups *EWC)
void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *BLE)
void VisitTagType(const TagType *TT)
void Visit(const Attr *A)
void VisitLabelStmt(const LabelStmt *LS)
void VisitRValueReferenceType(const ReferenceType *RT)
void VisitObjCInterfaceType(const ObjCInterfaceType *OIT)
void VisitCXXConstructExpr(const CXXConstructExpr *CE)
void VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE)
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *ME)
void VisitStringLiteral(const StringLiteral *SL)
void VisitBlockDecl(const BlockDecl *D)
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node)
void VisitSizeOfPackExpr(const SizeOfPackExpr *SOPE)
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *UCE)
void VisitCXXTypeidExpr(const CXXTypeidExpr *CTE)
void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D)
void VisitAccessSpecDecl(const AccessSpecDecl *ASD)
void VisitDeprecatedAttr(const DeprecatedAttr *DA)
void VisitMemberPointerType(const MemberPointerType *MPT)
void VisitMemberExpr(const MemberExpr *ME)
void visitBlockCommandComment(const comments::BlockCommandComment *C, const comments::FullComment *)
void VisitCXXRecordDecl(const CXXRecordDecl *RD)
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D)
void VisitSwitchStmt(const SwitchStmt *SS)
void visitHTMLEndTagComment(const comments::HTMLEndTagComment *C, const comments::FullComment *)
void VisitBinaryOperator(const BinaryOperator *BO)
void visitVerbatimBlockLineComment(const comments::VerbatimBlockLineComment *C, const comments::FullComment *)
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D)
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D)
void VisitLinkageSpecDecl(const LinkageSpecDecl *LSD)
void VisitTypedefDecl(const TypedefDecl *TD)
void VisitTypedefType(const TypedefType *TT)
void VisitUnresolvedUsingType(const UnresolvedUsingType *UUT)
void VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T)
void VisitElaboratedType(const ElaboratedType *ET)
void VisitUnaryTransformType(const UnaryTransformType *UTT)
void VisitCallExpr(const CallExpr *CE)
void VisitVisibilityAttr(const VisibilityAttr *VA)
void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO)
void visitParamCommandComment(const comments::ParamCommandComment *C, const comments::FullComment *FC)
void visitVerbatimBlockComment(const comments::VerbatimBlockComment *C, const comments::FullComment *)
void VisitAtomicExpr(const AtomicExpr *AE)
void VisitUsingShadowDecl(const UsingShadowDecl *USD)
void VisitFloatingLiteral(const FloatingLiteral *FL)
void VisitTemplateTypeParmType(const TemplateTypeParmType *TTPT)
void VisitUsingDirectiveDecl(const UsingDirectiveDecl *UDD)
void VisitTemplateSpecializationType(const TemplateSpecializationType *TST)
void VisitWhileStmt(const WhileStmt *WS)
void VisitDeclarationTemplateArgument(const TemplateArgument &TA)
void VisitVarDecl(const VarDecl *VD)
void VisitEnumDecl(const EnumDecl *ED)
void VisitPackTemplateArgument(const TemplateArgument &TA)
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA)
void visitTextComment(const comments::TextComment *C, const comments::FullComment *)
void VisitFieldDecl(const FieldDecl *FD)
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE)
void VisitIntegralTemplateArgument(const TemplateArgument &TA)
void VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE)
void VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E)
void VisitDeclRefExpr(const DeclRefExpr *DRE)
void VisitNullPtrTemplateArgument(const TemplateArgument &TA)
void VisitNamespaceDecl(const NamespaceDecl *ND)
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *OIRE)
void visitVerbatimLineComment(const comments::VerbatimLineComment *C, const comments::FullComment *)
void VisitAutoType(const AutoType *AT)
void VisitObjCIvarDecl(const ObjCIvarDecl *D)
void VisitUnavailableAttr(const UnavailableAttr *UA)
void VisitMacroQualifiedType(const MacroQualifiedType *MQT)
void VisitObjCPropertyDecl(const ObjCPropertyDecl *D)
void VisitObjCMethodDecl(const ObjCMethodDecl *D)
void visitTParamCommandComment(const comments::TParamCommandComment *C, const comments::FullComment *FC)
void VisitAddrLabelExpr(const AddrLabelExpr *ALE)
void VisitPredefinedExpr(const PredefinedExpr *PE)
void VisitAliasAttr(const AliasAttr *AA)
void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D)
void VisitPackExpansionType(const PackExpansionType *PET)
void VisitDependentSizedExtVectorType(const DependentSizedExtVectorType *VT)
void visitHTMLStartTagComment(const comments::HTMLStartTagComment *C, const comments::FullComment *)
void VisitSectionAttr(const SectionAttr *SA)
void VisitUsingType(const UsingType *TT)
void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *STTPT)
void VisitArrayType(const ArrayType *AT)
void VisitTypeTemplateArgument(const TemplateArgument &TA)
void VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE)
void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D)
void VisitGenericSelectionExpr(const GenericSelectionExpr *GSE)
void VisitTemplateTemplateArgument(const TemplateArgument &TA)
void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node)
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *OBLE)
void VisitFixedPointLiteral(const FixedPointLiteral *FPL)
void VisitGotoStmt(const GotoStmt *GS)
void VisitCharacterLiteral(const CharacterLiteral *CL)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitObjCProtocolDecl(const ObjCProtocolDecl *D)
void VisitTLSModelAttr(const TLSModelAttr *TA)
void VisitCompoundStmt(const CompoundStmt *IS)
void VisitHLSLBufferDecl(const HLSLBufferDecl *D)
void VisitCXXThisExpr(const CXXThisExpr *TE)
void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *OPRE)
void VisitConstantArrayType(const ConstantArrayType *CAT)
void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D)
void VisitCXXNewExpr(const CXXNewExpr *NE)
void VisitOpenACCAsteriskSizeExpr(const OpenACCAsteriskSizeExpr *E)
void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *OACS)
void VisitNullTemplateArgument(const TemplateArgument &TA)
void VisitCastExpr(const CastExpr *CE)
void VisitInjectedClassNameType(const InjectedClassNameType *ICNT)
void VisitIfStmt(const IfStmt *IS)
void VisitUnaryOperator(const UnaryOperator *UO)
void visitInlineCommandComment(const comments::InlineCommandComment *C, const comments::FullComment *)
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *TTE)
void VisitIntegerLiteral(const IntegerLiteral *IL)
void VisitUsingEnumDecl(const UsingEnumDecl *UED)
void VisitObjCMessageExpr(const ObjCMessageExpr *OME)
void VisitFunctionType(const FunctionType *T)
void VisitRecordDecl(const RecordDecl *RD)
void VisitTypeAliasDecl(const TypeAliasDecl *TAD)
void VisitExpressionTemplateArgument(const TemplateArgument &TA)
void VisitNamedDecl(const NamedDecl *ND)
void VisitObjCCategoryDecl(const ObjCCategoryDecl *D)
void VisitFriendDecl(const FriendDecl *FD)
void VisitCXXDeleteExpr(const CXXDeleteExpr *DE)
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE)
LabelStmt - Represents a label, which has a substatement.
Definition: Stmt.h:2058
LabelDecl * getDecl() const
Definition: Stmt.h:2076
bool isSideEntry() const
Definition: Stmt.h:2097
const char * getName() const
Definition: Stmt.cpp:428
static unsigned MeasureTokenLength(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts)
MeasureTokenLength - Relex the token at the specified location and return its length in bytes in the ...
Definition: Lexer.cpp:498
Represents a linkage specification.
Definition: DeclCXX.h:2952
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Definition: DeclCXX.h:2975
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
Definition: DeclCXX.h:2986
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
Definition: Type.h:5765
const IdentifierInfo * getMacroIdentifier() const
Definition: Type.h:5780
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4734
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Definition: ExprCXX.h:4759
bool isBoundToLvalueReference() const
Determine whether this materialized temporary is bound to an lvalue reference; otherwise,...
Definition: ExprCXX.h:4803
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
Definition: ExprCXX.h:4784
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3236
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition: Expr.h:3319
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why? This is only meaningful if the named memb...
Definition: Expr.h:3460
bool isArrow() const
Definition: Expr.h:3420
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: Type.h:3519
bool isMemberFunctionPointer() const
Returns true if the member type (i.e.
Definition: Type.h:3539
bool isMemberDataPointer() const
Returns true if the member type (i.e.
Definition: Type.h:3545
This represents a decl that may have a name.
Definition: Decl.h:253
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Definition: DeclBase.h:645
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition: Decl.h:280
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:319
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
Definition: Decl.h:296
Represents a C++ namespace alias.
Definition: DeclCXX.h:3138
NamedDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
Definition: DeclCXX.h:3233
Represent a C++ namespace.
Definition: Decl.h:551
bool isInline() const
Returns true if this is an inline namespace declaration.
Definition: Decl.h:607
bool isNested() const
Returns true if this is a nested namespace declaration.
Definition: Decl.h:616
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
llvm::json::OStream JOS
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
This is a basic class for representing single OpenMP clause.
Definition: OpenMPClause.h:55
Represents Objective-C's @catch statement.
Definition: StmtObjC.h:77
const VarDecl * getCatchParamDecl() const
Definition: StmtObjC.h:97
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
Definition: ExprObjC.h:87
ObjCBoxedExpr - used for generalized expression boxing.
Definition: ExprObjC.h:127
ObjCMethodDecl * getBoxingMethod() const
Definition: ExprObjC.h:146
ObjCCategoryDecl - Represents a category declaration.
Definition: DeclObjC.h:2328
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition: DeclObjC.h:2544
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition: DeclObjC.h:2774
ObjCEncodeExpr, used for @encode in Objective-C.
Definition: ExprObjC.h:410
QualType getEncodedType() const
Definition: ExprObjC.h:429
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2596
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
Interfaces are the core concept in Objective-C for object oriented design.
Definition: Type.h:7524
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
Definition: Type.cpp:936
ObjCIvarDecl - Represents an ObjC instance variable.
Definition: DeclObjC.h:1951
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition: ExprObjC.h:549
ObjCIvarDecl * getDecl()
Definition: ExprObjC.h:579
bool isArrow() const
Definition: ExprObjC.h:587
bool isFreeIvar() const
Definition: ExprObjC.h:588
An expression that sends a message to the given Objective-C object or class.
Definition: ExprObjC.h:941
QualType getCallReturnType(ASTContext &Ctx) const
Definition: ExprObjC.cpp:263
Selector getSelector() const
Definition: ExprObjC.cpp:291
@ SuperInstance
The receiver is the instance of the superclass object.
Definition: ExprObjC.h:955
@ Instance
The receiver is an object instance.
Definition: ExprObjC.h:949
@ SuperClass
The receiver is a superclass.
Definition: ExprObjC.h:952
@ Class
The receiver is a class.
Definition: ExprObjC.h:946
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
Definition: ExprObjC.h:1275
QualType getSuperType() const
Retrieve the type referred to by 'super'.
Definition: ExprObjC.h:1332
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
Definition: ExprObjC.h:1230
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents one property declaration in an Objective-C interface.
Definition: DeclObjC.h:730
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition: DeclObjC.h:2804
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Definition: ExprObjC.h:617
bool isMessagingGetter() const
True if the property reference will result in a message to the getter.
Definition: ExprObjC.h:736
ObjCPropertyDecl * getExplicitProperty() const
Definition: ExprObjC.h:706
bool isMessagingSetter() const
True if the property reference will result in a message to the setter.
Definition: ExprObjC.h:743
ObjCMethodDecl * getImplicitPropertyGetter() const
Definition: ExprObjC.h:711
bool isImplicitProperty() const
Definition: ExprObjC.h:703
ObjCMethodDecl * getImplicitPropertySetter() const
Definition: ExprObjC.h:716
bool isSuperReceiver() const
Definition: ExprObjC.h:771
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2083
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition: ExprObjC.h:505
ObjCProtocolDecl * getProtocol() const
Definition: ExprObjC.h:522
ObjCSelectorExpr used for @selector in Objective-C.
Definition: ExprObjC.h:455
Selector getSelector() const
Definition: ExprObjC.h:469
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Definition: ExprObjC.h:840
bool isArraySubscriptRefExpr() const
Definition: ExprObjC.h:893
ObjCMethodDecl * getAtIndexMethodDecl() const
Definition: ExprObjC.h:885
ObjCMethodDecl * setAtIndexMethodDecl() const
Definition: ExprObjC.h:889
Represents the declaration of an Objective-C type parameter.
Definition: DeclObjC.h:578
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
Definition: Expr.h:2078
This is the base type for all OpenACC Clauses.
Definition: OpenACCClause.h:24
llvm::iterator_range< decls_iterator > decls() const
Definition: ExprCXX.h:3082
DeclarationName getName() const
Gets the name looked up.
Definition: ExprCXX.h:3093
Represents a pack expansion of types.
Definition: Type.h:7141
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
Definition: Type.h:7166
[C99 6.4.2.2] - A predefined identifier such as func.
Definition: Expr.h:1991
StringRef getIdentKindName() const
Definition: Expr.h:2048
PredefinedIdentKind getIdentKind() const
Definition: Expr.h:2026
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
bool isValid() const
unsigned getLine() const
Return the presumed line number of this location.
SourceLocation getIncludeLoc() const
Return the presumed include location of this location.
A (possibly-)qualified type.
Definition: Type.h:929
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:996
SplitQualType getSplitDesugaredType() const
Definition: Type.h:1295
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
Definition: Type.h:7952
std::string getAsString() const
std::string getAsString() const
Represents a struct/union/class.
Definition: Decl.h:4148
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:6072
RecordDecl * getDecl() const
Definition: Type.h:6082
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Definition: Redeclarable.h:215
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Definition: Redeclarable.h:222
Base for LValueReferenceType and RValueReferenceType.
Definition: Type.h:3439
bool isSpelledAsLValue() const
Definition: Type.h:3452
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Definition: ExprConcepts.h:502
bool isSatisfied() const
Whether or not the requires clause is satisfied.
Definition: ExprConcepts.h:554
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
Represents an expression that computes the length of a parameter pack.
Definition: ExprCXX.h:4258
NamedDecl * getPack() const
Retrieve the parameter pack.
Definition: ExprCXX.h:4327
Encodes a location in the source.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StringRef getBufferName(SourceLocation Loc, bool *Invalid=nullptr) const
Return the filename or buffer identifier of the buffer the location is in.
bool isMacroArgExpansion(SourceLocation Loc, SourceLocation *StartLoc=nullptr) const
Tests whether the given source location represents a macro argument's expansion into the function-lik...
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
unsigned getSpellingLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
bool isValid() const
RetTy Visit(PTR(Stmt) S, ParamTys... P)
Definition: StmtVisitor.h:44
Stmt - This represents one statement.
Definition: Stmt.h:84
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
void outputString(raw_ostream &OS) const
Definition: Expr.cpp:1209
Represents the result of substituting a set of types for a template type parameter pack.
Definition: Type.h:6464
Represents the result of substituting a type for a template type parameter.
Definition: Type.h:6383
std::optional< unsigned > getPackIndex() const
Definition: Type.h:6414
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Definition: Type.h:6412
SwitchStmt - This represents a 'switch' stmt.
Definition: Stmt.h:2415
bool hasVarStorage() const
True if this SwitchStmt has storage for a condition variable.
Definition: Stmt.h:2476
bool hasInitStorage() const
True if this SwitchStmt has storage for an init statement.
Definition: Stmt.h:2473
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3564
StringRef getKindName() const
Definition: Decl.h:3755
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition: Decl.h:3667
TagDecl * getDecl() const
Definition: Type.cpp:4122
Location wrapper for a TemplateArgument.
Definition: TemplateBase.h:524
Represents a template argument.
Definition: TemplateBase.h:61
QualType getAsType() const
Retrieve the type for a type template argument.
Definition: TemplateBase.h:319
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
Definition: TemplateBase.h:363
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
Definition: TemplateBase.h:326
void print(raw_ostream &OS, const PrintingPolicy &Policy, Qualified Qual=Qualified::AsWritten) const
Print the template name.
Represents a type template specialization; the template must be a class template, a type alias templa...
Definition: Type.h:6661
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
Definition: Type.h:6727
bool isTypeAlias() const
Determine if this template specialization type is for a type alias template that has been substituted...
Definition: Type.h:6720
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
TemplateTypeParmDecl * getDecl() const
Definition: Type.h:6348
bool isParameterPack() const
Definition: Type.h:6344
unsigned getIndex() const
Definition: Type.h:6343
unsigned getDepth() const
Definition: Type.h:6342
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition: Decl.h:3535
Base wrapper for a particular "section" of type source info.
Definition: TypeLoc.h:59
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition: TypeLoc.h:133
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition: TypeLoc.h:153
TypeLocClass getTypeLocClass() const
Definition: TypeLoc.h:116
bool isNull() const
Definition: TypeLoc.h:121
const Type * getTypePtr() const
Definition: TypeLoc.h:137
A container of type source information.
Definition: Type.h:7902
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7913
void Visit(const Type *T)
Performs the operation associated with this visitor object.
Definition: TypeVisitor.h:68
The base class of the type hierarchy.
Definition: Type.h:1828
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition: Type.cpp:2180
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
Definition: Type.h:2714
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2706
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition: Type.h:2361
const char * getTypeClassName() const
Definition: Type.cpp:3318
bool containsErrors() const
Whether this type is an error type.
Definition: Type.h:2700
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition: Type.h:2724
bool isFromAST() const
Whether this type comes from an AST file.
Definition: Type.h:2344
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8731
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3514
QualType getUnderlyingType() const
Definition: Decl.h:3468
TypedefNameDecl * getDecl() const
Definition: Type.h:5740
QualType desugar() const
Definition: Type.cpp:3920
bool typeMatchesDecl() const
Definition: Type.h:5748
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition: Expr.h:2622
QualType getArgumentType() const
Definition: Expr.h:2665
bool isArgumentType() const
Definition: Expr.h:2664
UnaryExprOrTypeTrait getKind() const
Definition: Expr.h:2654
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2232
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
Definition: Expr.h:2306
Opcode getOpcode() const
Definition: Expr.h:2272
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
Definition: Expr.cpp:1401
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
Definition: Expr.h:2290
A unary type transform, which is a type constructed from another.
Definition: Type.h:5989
UTTKind getUTTKind() const
Definition: Type.h:6018
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition: ExprCXX.h:3203
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
Definition: ExprCXX.h:3272
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition: Type.h:5667
UnresolvedUsingTypenameDecl * getDecl() const
Definition: Type.h:5678
Represents a C++ using-declaration.
Definition: DeclCXX.h:3530
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition: DeclCXX.h:3567
Represents C++ using-directive.
Definition: DeclCXX.h:3033
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Definition: DeclCXX.cpp:3050
Represents a C++ using-enum-declaration.
Definition: DeclCXX.h:3731
EnumDecl * getEnumDecl() const
Definition: DeclCXX.h:3775
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3338
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition: DeclCXX.h:3402
QualType desugar() const
Definition: Type.h:5713
UsingShadowDecl * getFoundDecl() const
Definition: Type.h:5707
bool typeMatchesDecl() const
Definition: Type.h:5716
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
QualType getType() const
Definition: Decl.h:682
Represents a variable declaration or definition.
Definition: Decl.h:882
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition: Decl.h:1513
TLSKind getTLSKind() const
Definition: Decl.cpp:2157
bool hasInit() const
Definition: Decl.cpp:2387
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
Definition: Decl.h:1410
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition: Decl.cpp:2110
@ ListInit
Direct list-initialization (C++11)
Definition: Decl.h:893
@ CInit
C-style initialization with assignment.
Definition: Decl.h:887
@ ParenListInit
Parenthesized list-initialization (C++20)
Definition: Decl.h:896
@ CallInit
Call-style initialization (C++98)
Definition: Decl.h:890
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
Definition: Decl.h:1456
bool isInline() const
Whether this variable is (C++1z) inline.
Definition: Decl.h:1495
@ TLS_Static
TLS with a known-constant initializer.
Definition: Decl.h:905
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition: Decl.h:908
@ TLS_None
Not a TLS variable.
Definition: Decl.h:902
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:1119
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
Definition: Decl.cpp:2662
Represents a GCC generic vector type.
Definition: Type.h:4034
unsigned getNumElements() const
Definition: Type.h:4049
VectorKind getVectorKind() const
Definition: Type.h:4054
WhileStmt - This represents a 'while' stmt.
Definition: Stmt.h:2611
bool hasVarStorage() const
True if this WhileStmt has storage for a condition variable.
Definition: Stmt.h:2661
RetTy Visit(PTR(Attr) A)
Definition: AttrVisitor.h:31
A command that has zero or more word-like arguments (number of word-like arguments depends on command...
Definition: Comment.h:604
static const CommandInfo * getBuiltinCommandInfo(StringRef Name)
const CommandInfo * getCommandInfo(StringRef Name) const
RetTy visit(PTR(Comment) C, ParamTys... P)
Any part of the comment.
Definition: Comment.h:65
A full comment attached to a declaration, contains block content.
Definition: Comment.h:1083
An opening HTML tag with attributes.
Definition: Comment.h:433
A command with word-like arguments that is considered inline content.
Definition: Comment.h:335
Doxygen \param command.
Definition: Comment.h:711
Doxygen \tparam command, describes a template parameter.
Definition: Comment.h:793
A verbatim block command (e.
Definition: Comment.h:879
A line of text contained in a verbatim block.
Definition: Comment.h:854
A verbatim line command.
Definition: Comment.h:930
A static requirement that can be used in a requires-expression to check properties of types and expre...
Definition: ExprConcepts.h:168
RequirementKind getKind() const
Definition: ExprConcepts.h:198
bool containsUnexpandedParameterPack() const
Definition: ExprConcepts.h:218
RetTy Visit(PTR(Decl) D)
Definition: DeclVisitor.h:37
RetTy Visit(REF(TemplateArgument) TA, ParamTys... P)
@ kind_nullability
Indicates that the nullability of the type was spelled with a property attribute rather than a type q...
bool Ret(InterpState &S, CodePtr &PC)
Definition: Interp.h:318
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
Definition: Specifiers.h:407
@ RQ_None
No ref-qualifier was provided.
Definition: Type.h:1768
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition: Type.h:1771
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition: Type.h:1774
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ SC_None
Definition: Specifiers.h:250
@ SD_Thread
Thread storage duration.
Definition: Specifiers.h:330
@ SD_Static
Static storage duration.
Definition: Specifiers.h:331
@ SD_FullExpression
Full-expression storage duration (for temporaries).
Definition: Specifiers.h:328
@ SD_Automatic
Automatic storage duration (most local variables).
Definition: Specifiers.h:329
@ SD_Dynamic
Dynamic storage duration.
Definition: Specifiers.h:332
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition: Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition: Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition: Specifiers.h:139
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
const FunctionProtoType * T
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Neon
is ARM Neon vector
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ None
New-expression has no initializer as written.
@ Braces
New-expression has a C++11 list-initializer.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_DynamicNone
throw()
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:123
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
Definition: Specifiers.h:183
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition: Specifiers.h:177
@ NOUR_None
This is an odr-use.
Definition: Specifiers.h:175
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Definition: Specifiers.h:180
unsigned long uint64_t
Extra information about a function prototype.
Definition: Type.h:5187
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition: Type.h:862
Information about a single command.