40 #include "llvm/ADT/DenseMap.h"
41 #include "llvm/ADT/SmallSet.h"
42 using namespace clang;
59 Policy.
Bool = BoolMacro->isObjectLike() &&
60 BoolMacro->getNumTokens() == 1 &&
61 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
75 : ExternalSource(nullptr), isMultiplexExternalSource(
false),
76 FPFeatures(pp.getLangOpts()), LangOpts(pp.getLangOpts()), PP(pp),
77 Context(ctxt), Consumer(consumer), Diags(PP.getDiagnostics()),
79 CodeCompleter(CodeCompleter), CurContext(nullptr),
80 OriginalLexicalContext(nullptr), MSStructPragmaOn(
false),
81 MSPointerToMemberRepresentationMethod(
82 LangOpts.getMSPointerToMemberRepresentationMethod()),
83 VtorDispStack(MSVtorDispAttr::Mode(LangOpts.VtorDispMode)), PackStack(0),
84 DataSegStack(nullptr), BSSSegStack(nullptr), ConstSegStack(nullptr),
85 CodeSegStack(nullptr), CurInitSeg(nullptr), VisContext(nullptr),
86 PragmaAttributeCurrentTargetDecl(nullptr),
87 IsBuildingRecoveryCallExpr(
false), Cleanup{}, LateTemplateParser(
nullptr),
88 LateTemplateParserCleanup(
nullptr), OpaqueParser(
nullptr), IdResolver(pp),
89 StdExperimentalNamespaceCache(
nullptr), StdInitializerList(
nullptr),
90 CXXTypeInfoDecl(
nullptr), MSVCGuidDecl(
nullptr), NSNumberDecl(
nullptr),
91 NSValueDecl(
nullptr), NSStringDecl(
nullptr),
92 StringWithUTF8StringMethod(
nullptr),
93 ValueWithBytesObjCTypeMethod(
nullptr), NSArrayDecl(
nullptr),
94 ArrayWithObjectsMethod(
nullptr), NSDictionaryDecl(
nullptr),
95 DictionaryWithObjectsMethod(
nullptr), GlobalNewDeleteDeclared(
false),
96 TUKind(TUKind), NumSFINAEErrors(0), AccessCheckingSFINAE(
false),
97 InNonInstantiationSFINAEContext(
false), NonInstantiationEntries(0),
98 ArgumentPackSubstitutionIndex(-1), CurrentInstantiationScope(
nullptr),
99 DisableTypoCorrection(
false), TyposCorrected(0), AnalysisWarnings(*
this),
100 ThreadSafetyDeclCache(
nullptr), VarDataSharingAttributesStack(
nullptr),
101 CurScope(
nullptr), Ident_super(
nullptr), Ident___float128(
nullptr) {
104 LoadedExternalKnownNamespaces =
false;
106 NSNumberLiteralMethods[
I] =
nullptr;
108 if (getLangOpts().ObjC1)
117 ExprEvalContexts.emplace_back(
118 ExpressionEvaluationContext::PotentiallyEvaluated, 0,
CleanupInfo{},
124 InitDataSharingAttributesStack();
135 SC->InitializeSema(*
this);
140 ExternalSema->InitializeSema(*
this);
248 std::vector<QualType> Atomic64BitTypes;
249 Atomic64BitTypes.push_back(AtomicLongT);
250 Atomic64BitTypes.push_back(AtomicULongT);
251 Atomic64BitTypes.push_back(AtomicDoubleT);
253 Atomic64BitTypes.push_back(AtomicSizeT);
254 Atomic64BitTypes.push_back(AtomicIntPtrT);
255 Atomic64BitTypes.push_back(AtomicUIntPtrT);
256 Atomic64BitTypes.push_back(AtomicPtrDiffT);
258 for (
auto &
I : Atomic64BitTypes)
260 "cl_khr_int64_base_atomics cl_khr_int64_extended_atomics");
267 #define GENERIC_IMAGE_TYPE_EXT(Type, Id, Ext) \
268 setOpenCLExtensionForType(Context.Id, Ext);
269 #include "clang/Basic/OpenCLImageTypes.def"
298 ExternalSema->ForgetSema();
301 if (isMultiplexExternalSource)
302 delete ExternalSource;
307 DestroyDataSharingAttributesStack();
309 assert(DelayedTypos.empty() &&
"Uncorrected typos!");
317 UnavailableAttr::ImplicitReason reason) {
320 if (!fn)
return false;
331 if (fn->
hasAttr<UnavailableAttr>())
return true;
333 fn->
addAttr(UnavailableAttr::CreateImplicit(
Context,
"", reason, loc));
347 assert(E &&
"Cannot use with NULL ptr");
349 if (!ExternalSource) {
354 if (isMultiplexExternalSource)
358 isMultiplexExternalSource =
true;
364 llvm::errs() <<
"\n*** Semantic Analysis Stats:\n";
382 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
386 if (Kind != CK_NullToPointer && Kind != CK_NullToMemberPointer)
409 llvm_unreachable(
"can't implicitly cast lvalue to rvalue with this cast "
411 case CK_LValueToRValue:
412 case CK_ArrayToPointerDecay:
413 case CK_FunctionToPointerDecay:
427 if (ExprTy == TypeTy)
439 E = Materialized.
get();
443 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
445 ImpCast->setValueKind(VK);
478 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
482 for (
const auto *Spec : Template->specializations())
489 if (FD->hasBody(DeclToCheck))
495 if (DeclToCheck != FD)
499 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
505 if (VD->isReferenced() &&
506 VD->isUsableInConstantExpressions(SemaRef->
Context))
512 for (
const auto *Spec : Template->specializations())
525 if (DeclToCheck != VD)
543 if (ND->
hasAttr<WeakRefAttr>())
continue;
545 if (isa<CXXDeductionGuideDecl>(ND))
551 if (FD->isExternallyVisible() &&
552 !FD->getMostRecentDecl()->isInlined())
555 auto *VD = cast<VarDecl>(ND);
558 if (VD->isExternallyVisible() && !VD->getMostRecentDecl()->isInline())
562 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
574 if (Undefined.empty())
return;
576 for (
SmallVectorImpl<std::pair<NamedDecl *, SourceLocation> >::iterator
577 I = Undefined.begin(),
E = Undefined.end();
I !=
E; ++
I) {
580 if (ND->
hasAttr<DLLImportAttr>() || ND->
hasAttr<DLLExportAttr>()) {
589 << isa<VarDecl>(ND) << ND;
590 }
else if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
592 assert(FD->getMostRecentDecl()->isInlined() &&
593 "used object requires definition but isn't inline or internal?");
597 assert(cast<VarDecl>(ND)->getMostRecentDecl()->isInline() &&
598 "used var requires definition but isn't inline or internal?");
601 if (
I->second.isValid())
602 S.
Diag(
I->second, diag::note_used_here);
614 for (
auto &WeakID : WeakIDs)
628 RecordCompleteMap::iterator
Cache = MNCComplete.find(RD);
629 if (Cache != MNCComplete.end())
630 return Cache->second;
633 bool Complete =
true;
636 I !=
E && Complete; ++
I) {
638 Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M));
644 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
645 F->getTemplatedDecl()->isDefined();
647 if (R->isInjectedClassName())
649 if (R->hasDefinition())
656 MNCComplete[RD] = Complete;
670 RecordCompleteMap::iterator
Cache = RecordsComplete.find(RD);
671 if (Cache != RecordsComplete.end())
672 return Cache->second;
676 I !=
E && Complete; ++
I) {
680 if (
CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
687 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
688 Complete = FD->isDefined();
694 RecordsComplete[RD] = Complete;
703 if (TD->isReferenced())
705 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
706 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
708 UnusedLocalTypedefNameCandidates.clear();
728 &&
"reached end of translation unit with a pool attached?");
754 if (ExternalSource) {
758 for (
auto PII : Pending)
759 if (
auto Func = dyn_cast<FunctionDecl>(PII.first))
760 Func->setInstantiationIsPending(
true);
762 Pending.begin(), Pending.end());
803 if (WeakID.second.getUsed())
808 if (PrevDecl !=
nullptr &&
809 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
810 Diag(WeakID.second.getLocation(), diag::warn_attribute_wrong_decl_type)
813 Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared)
834 Stack.push_back(CurrentModule);
835 while (!Stack.empty()) {
836 Module *Mod = Stack.pop_back_val();
872 llvm::SmallSet<VarDecl *, 32> Seen;
873 for (TentativeDefinitionsType::iterator
895 diag::err_tentative_def_incomplete_type))
911 for (UnusedFileScopedDeclsType::iterator
919 if (!FD->hasBody(DiagD))
924 if (isa<CXXMethodDecl>(DiagD))
928 if (FD->getStorageClass() ==
SC_Static &&
929 !FD->isInlineSpecified() &&
933 diag::warn_unneeded_static_internal_decl)
940 if (FD->getDescribedFunctionTemplate())
945 isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
946 : diag::warn_unused_function)
952 DiagD = cast<VarDecl>(*I);
996 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first,
DeleteExprLoc.first,
1006 "Didn't unmark var as having its initializer parsed");
1021 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC)) {
1023 }
else if (isa<CXXMethodDecl>(DC) &&
1024 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
1025 cast<CXXRecordDecl>(DC->
getParent())->isLambda()) {
1044 while (isa<RecordDecl>(DC))
1051 if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
1052 return cast<NamedDecl>(DC);
1078 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1080 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1103 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1105 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1114 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1127 (*Info)->addSuppressedDiagnostic(DiagInfo.
getLocation(),
1219 pushOpenMPFunctionRegion();
1225 pushOpenMPFunctionRegion();
1230 BlockScope, Block));
1241 LSI->AutoTemplateParameterDepth =
Depth;
1245 "Remove assertion if intentionally called in a non-lambda context.");
1254 popOpenMPFunctionRegion(Scope);
1261 Diag(PUD.Loc, PUD.PD);
1273 assert(!CurFunction->
CompoundScopes.empty() &&
"mismatched push/pop");
1289 if (CurBSI && CurBSI->TheDecl &&
1304 if (IgnoreNonLambdaCapturingScope) {
1306 while (
I !=
E && isa<CapturingScopeInfo>(*
I) && !isa<LambdaScopeInfo>(*
I))
1312 if (CurLSI && CurLSI->Lambda &&
1325 return (LSI->AutoTemplateParams.size() ||
1326 LSI->GLTemplateParameterList) ? LSI :
nullptr;
1333 if (!
LangOpts.RetainCommentsFromSystemHeaders &&
1341 StringRef MagicMarkerText;
1344 MagicMarkerText =
"///<";
1347 MagicMarkerText =
"/**<";
1350 llvm_unreachable(
"if this is an almost Doxygen comment, "
1351 "it should be ordinary");
1353 Diag(Comment.
getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
1370 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}
1384 if (
auto *ND = dyn_cast_or_null<NamedDecl>(TheDecl)) {
1386 ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
true);
1407 OverloadSet.
clear();
1410 bool IsMemExpr =
false;
1424 bool Ambiguous =
false;
1428 DeclsEnd = Overloads->
decls_end(); it != DeclsEnd; ++it) {
1436 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
1437 if (OverloadDecl->getMinRequiredArguments() == 0) {
1438 if (!ZeroArgCallReturnTy.
isNull() && !Ambiguous) {
1442 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
1449 return !ZeroArgCallReturnTy.
isNull();
1469 if (
const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
1470 if (Fun->getMinRequiredArguments() == 0)
1471 ZeroArgCallReturnTy = Fun->getReturnType();
1487 dyn_cast_or_null<FunctionProtoType>(FunTy)) {
1488 if (FPT->getNumParams() == 0)
1509 int ShownOverloads = 0;
1510 int SuppressedOverloads = 0;
1512 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1516 ++SuppressedOverloads;
1525 if (SuppressedOverloads)
1526 S.
Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
1527 << SuppressedOverloads;
1532 bool (*IsPlausibleResult)(
QualType)) {
1533 if (!IsPlausibleResult)
1538 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1539 const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
1541 if (IsPlausibleResult(OverloadResultTy))
1542 PlausibleOverloads.
addDecl(It.getDecl());
1553 return (!isa<CStyleCastExpr>(E) &&
1554 !isa<UnaryOperator>(E) &&
1555 !isa<BinaryOperator>(E) &&
1556 !isa<CXXOperatorCallExpr>(E));
1561 bool (*IsPlausibleResult)(
QualType)) {
1568 !ZeroArgCallTy.
isNull() &&
1569 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
1589 if (!ForceComplain)
return false;
1591 Diag(Loc, PD) << 0 << Range;
1604 if (!Ident___float128)
1606 return Ident___float128;
1625 const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
1634 ExtStr.split(Exts,
" ", -1,
false);
1636 for (
auto &
I : Exts)
1637 OpenCLTypeExtMap[CanT].insert(
I.str());
1642 ExtStr.split(Exts,
" ", -1,
false);
1645 for (
auto &
I : Exts)
1646 OpenCLDeclExtMap[FD].insert(
I.str());
1650 if (CurrOpenCLExtension.empty())
1656 if (CurrOpenCLExtension.empty())
1662 auto Loc = OpenCLDeclExtMap.find(FD);
1663 if (Loc == OpenCLDeclExtMap.end())
1665 for (
auto &
I : Loc->second) {
1672 template <
typename T,
typename DiagLocT,
typename DiagInfoT,
typename MapT>
1673 bool Sema::checkOpenCLDisabledTypeOrDecl(T D, DiagLocT DiagLoc,
1674 DiagInfoT DiagInfo, MapT &
Map,
1677 auto Loc = Map.find(D);
1678 if (Loc == Map.end())
1680 bool Disabled =
false;
1681 for (
auto &
I : Loc->second) {
1683 Diag(DiagLoc, diag::err_opencl_requires_extension) << Selector << DiagInfo
1694 if (
auto TypedefT = dyn_cast<TypedefType>(QT.
getTypePtr()))
1695 Decl = TypedefT->getDecl();
1697 Decl = TagT->getDecl();
1699 if (checkOpenCLDisabledTypeOrDecl(Decl, Loc, QT, OpenCLDeclExtMap))
1704 QT, OpenCLTypeExtMap);
1709 return checkOpenCLDisabledTypeOrDecl(&D, E.
getLocStart(), FnName,
Defines the clang::ASTContext interface.
SourceLocation getEnd() const
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used...
FunctionDecl - An instance of this class is created to represent a function declaration or definition...
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
Scope * getCurScope() const
Retrieve the parser's current scope.
bool isNullPtrType() const
IdentifierInfo * getSuperIdentifier() const
Smart pointer class that efficiently represents Objective-C method names.
A (possibly-)qualified type.
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
TypedefDecl * getUInt128Decl() const
Retrieve the declaration for the 128-bit unsigned integer type.
void Initialize()
Perform initialization that occurs after the parser has been initialized but before it parses anythin...
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs...
DeclContext * getFunctionLevelDeclContext()
static const CastKind CK_Invalid
RecordDecl * buildImplicitRecord(StringRef Name, RecordDecl::TagKind TK=TTK_Struct) const
Create a new implicit TU-level CXXRecordDecl or RecordDecl declaration.
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc...
A class which encapsulates the logic for delaying diagnostics during parsing and other processing...
IdentifierInfo * getIdentifier() const
getIdentifier - Get the identifier that names this declaration, if there is one.
This declaration has an owning module, but is only visible to lookups that occur within that module...
const LangOptions & getLangOpts() const
void CheckCompleteVariableDeclaration(VarDecl *VD)
void getUndefinedButUsed(SmallVectorImpl< std::pair< NamedDecl *, SourceLocation > > &Undefined)
Obtain a sorted list of functions that are undefined but ODR-used.
submodule_iterator submodule_begin()
FunctionType - C99 6.7.5.3 - Function Declarators.
CXXFieldCollector - Used to keep track of CXXFieldDecls during parsing of C++ classes.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
static void notePlausibleOverloads(Sema &S, SourceLocation Loc, const UnresolvedSetImpl &Overloads, bool(*IsPlausibleResult)(QualType))
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Decl - This represents one declaration (or definition), e.g.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc)
BuildCallToMemberFunction - Build a call to a member function.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed...
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
The translation unit is a prefix to a translation unit, and is not complete.
bool hasErrorOccurred() const
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
virtual void updateOutOfDateSelector(Selector Sel)
Load the contents of the global method pool for a given selector if necessary.
virtual void ReadMethodPool(Selector Sel)
Load the contents of the global method pool for a given selector.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
Declaration of a variable template.
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
A container of type source information.
IdentifierInfo * getFloat128Identifier() const
The diagnostic should not be reported, but it should cause template argument deduction to fail...
void LoadExternalWeakUndeclaredIdentifiers()
Load weak undeclared identifiers from the external source.
bool resolveUses(Module *Mod, bool Complain)
Resolve all of the unresolved uses in the given module.
Retains information about a function, method, or block that is currently being parsed.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
VarDecl - An instance of this class is created to represent a variable declaration or definition...
TypedefDecl * getBuiltinVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_va_list type...
DiagnosticsEngine & Diags
virtual void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WI)
Read the set of weak, undeclared identifiers known to the external Sema source.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
ObjCMethodDecl - Represents an instance or class method declaration.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Expr * IgnoreImplicit() LLVM_READONLY
IgnoreImplicit - Skip past any implicit AST nodes which might surround this expression.
Describes how types, statements, expressions, and declarations should be printed. ...
decl_iterator decls_end() const
OpenCLOptions & getOpenCLOptions()
Defines the clang::Expr interface and subclasses for C++ expressions.
iterator begin(Source *source, bool LocalOnly=false)
iterator begin(DeclarationName Name)
begin - Returns an iterator for decls with the name 'Name'.
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
void threadSafetyCleanup(BeforeSet *Cache)
void CheckDelayedMemberExceptionSpecs()
RecordDecl - Represents a struct/union/class.
void FreeVisContext()
FreeVisContext - Deallocate and null out VisContext.
ObjCInterfaceDecl * getObjCProtocolDecl() const
Retrieve the Objective-C class declaration corresponding to the predefined Protocol class...
An iterator over the friend declarations of a class.
One of these records is kept for each identifier that is lexed.
virtual void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls)
Read the set of potentially unused typedefs known to the source.
void enableSupportedCore(unsigned CLVer)
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
bool resolveConflicts(Module *Mod, bool Complain)
Resolve all of the unresolved conflicts in the given module.
sema::LambdaScopeInfo * getCurGenericLambda()
Retrieve the current generic lambda info, if any.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
void setCurrentOpenCLExtensionForType(QualType T)
Set current OpenCL extensions for a type which can only be used when these OpenCL extensions are enab...
QualType getReturnType() const
FieldDecl - An instance of this class is created by Sema::ActOnField to represent a member of a struc...
void erase(iterator From, iterator To)
bool isCompleteDefinition() const
isCompleteDefinition - Return true if this decl has its body fully specified.
threadSafety::BeforeSet * ThreadSafetyDeclCache
bool isReferenced() const
Whether any declaration of this entity was referenced.
void ActOnEndOfTranslationUnit()
ActOnEndOfTranslationUnit - This is called at the very end of the translation unit when EOF is reache...
const MacroInfo * getMacroInfo(const IdentifierInfo *II) const
The iterator over UnresolvedSets.
const LangOptions & getLangOpts() const
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Represents a C++ member access expression for which lookup produced a set of overloaded functions...
void setPrintingPolicy(const clang::PrintingPolicy &Policy)
SourceLocation getTypeSpecTypeLoc() const
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
bool isOpenCLDisabledDecl(Decl *FD)
CanQualType OCLReserveIDTy
Describes a module or submodule.
llvm::BumpPtrAllocator BumpAlloc
static void noteOverloads(Sema &S, const UnresolvedSetImpl &Overloads, const SourceLocation FinalNoteLoc)
Give notes for a set of overloads.
bool AccessCheckingSFINAE
When true, access checking violations are treated as SFINAE failures rather than hard errors...
An r-value expression (a pr-value in the C++11 taxonomy) produces a temporary value.
Values of this type can be null.
iterator end()
end - Returns an iterator that has 'finished'.
DiagnosticErrorTrap ErrorTrap
Used to determine if errors occurred in this function or block.
An abstract interface that should be implemented by clients that read ASTs and then require further s...
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
static bool MethodsAndNestedClassesComplete(const CXXRecordDecl *RD, RecordCompleteMap &MNCComplete)
Returns true, if all methods and nested classes of the given CXXRecordDecl are defined in this transl...
friend_iterator friend_end() const
bool hasUnrecoverableErrorOccurred() const
Determine whether any unrecoverable errors have occurred since this object instance was created...
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
const TargetInfo & getTargetInfo() const
SourceLocation getLocWithOffset(int Offset) const
Return a source location with the specified offset from this SourceLocation.
const LangOptions & getLangOpts() const
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
bool HasFormOfMemberPointer
const SourceLocation & getLocation() const
unsigned getDiagID() const
bool checkOpenCLDisabledTypeDeclSpec(const DeclSpec &DS, QualType T)
Check if type T corresponding to declaration specifier DS is disabled due to required OpenCL extensio...
QualType getReturnType() const
std::pair< SourceLocation, bool > DeleteExprLoc
Delete-expressions to be analyzed at the end of translation unit.
HeaderSearch & getHeaderSearchInfo() const
void PerformPendingInstantiations(bool LocalOnly=false)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
A set of unresolved declarations.
void IssueWarnings(Policy P, FunctionScopeInfo *fscope, const Decl *D, const BlockExpr *blkExpr)
QualType getIntPtrType() const
Return a type compatible with "intptr_t" (C99 7.18.1.4), as defined by the target.
void CheckDelegatingCtorCycles()
TypedefDecl * getObjCIdDecl() const
Retrieve the typedef corresponding to the predefined id type in Objective-C.
CheckedConversionKind
The kind of conversion being performed.
~ExternalSemaSource() override
Values of this type can never be null.
void addExternalSource(ExternalSemaSource *E)
Registers an external source.
Scope - A scope is a transient data structure that is used while parsing the program.
static const unsigned NumNSNumberLiteralMethods
submodule_iterator submodule_end()
void emitAndClearUnusedLocalTypedefWarnings()
virtual ASTMutationListener * GetASTMutationListener()
If the consumer is interested in entities getting modified after their initial creation, it should return a pointer to an ASTMutationListener here.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
This represents the body of a CapturedStmt, and serves as its DeclContext.
decl_iterator decls_begin() const
detail::InMemoryDirectory::const_iterator I
TypedefDecl * getObjCClassDecl() const
Retrieve the typedef declaration corresponding to the predefined Objective-C 'Class' type...
const LangOptions & LangOpts
bool checkOpenCLDisabledDecl(const NamedDecl &D, const Expr &E)
Check if declaration D used by expression E is disabled due to required OpenCL extensions being disab...
Contains information about the compound statement currently being parsed.
bool EmitCurrentDiagnostic(bool Force=false)
Emit the current diagnostic and clear the diagnostic state.
void Emit(const DiagnosticBuilder &DB) const
static bool IsCallableWithAppend(Expr *E)
Determine whether the given expression can be called by just putting parentheses after it...
void setLastDiagnosticIgnored()
Pretend that the last diagnostic issued was ignored, so any subsequent notes will be suppressed...
Sema - This implements semantic analysis and AST building for C.
Represents a prototype with parameter type info, e.g.
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
const llvm::MapVector< FieldDecl *, DeleteLocs > & getMismatchingDeleteExpressions() const
Retrieves list of suspicious delete-expressions that will be checked at the end of translation unit...
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
Retains information about a captured region.
unsigned getCurrentDiagID() const
Represents a ValueDecl that came out of a declarator.
CastKind
CastKind - The kind of operation required for a conversion.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat)
virtual void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 >> &)
std::vector< bool > & Stack
QualType getAtomicType(QualType T) const
Return the uniqued reference to the atomic type for the specified type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee...
virtual void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces)
Load the set of namespaces that are known to the external source, which will be used during typo corr...
CommentOptions CommentOpts
Options for parsing comments.
Retains information about a block that is currently being parsed.
bool isDeleted() const
Whether this function has been deleted.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
An abstract interface that should be implemented by external AST sources that also provide informatio...
BlockDecl - This represents a block literal declaration, which is like an unnamed FunctionDecl...
static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D)
Used to prune the decls of Sema's UnusedFileScopedDecls vector.
Expr - This represents one expression.
void setOpenCLExtensionForDecl(Decl *FD, llvm::StringRef Exts)
Set OpenCL extensions for a declaration which can only be used when these OpenCL extensions are enabl...
Show just the "best" overload candidates.
static SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset, const SourceManager &SM, const LangOptions &LangOpts)
Computes the source location just past the end of the token at this source location.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
decls_iterator decls_end() const
friend_iterator friend_begin() const
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
void addImplicitTypedef(StringRef Name, QualType T)
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
TranslationUnitDecl * getTranslationUnitDecl() const
Defines the clang::Preprocessor interface.
llvm::MapVector< IdentifierInfo *, WeakInfo > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
DeclContext * getDeclContext()
void PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, const BlockExpr *blkExpr=nullptr)
bool resolveExports(Module *Mod, bool Complain)
Resolve all of the unresolved exports in the given module.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
bool RequireCompleteType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ASTMutationListener * getASTMutationListener() const
void Clear()
Clear out the current diagnostic.
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
PartialDiagnostic::StorageAllocator & getDiagAllocator()
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isExternallyVisible() const
unsigned Map[FirstTargetAddressSpace]
The type of a lookup table which maps from language-specific address spaces to target-specific ones...
DeclarationName getDeclName() const
getDeclName - Get the actual, stored name of the declaration, which may be a special name...
DiagnosticsEngine & getDiagnostics() const
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
sema::LambdaScopeInfo * PushLambdaScope()
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=NotForRedeclaration)
Look up a name, looking for a single declaration.
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
const clang::PrintingPolicy & getPrintingPolicy() const
llvm::DenseMap< const CXXRecordDecl *, bool > RecordCompleteMap
An abstract interface that should be implemented by external AST sources that also provide informatio...
decls_iterator decls_begin() const
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
unsigned Bool
Whether we can use 'bool' rather than '_Bool' (even if the language doesn't actually have 'bool'...
void PushBlockScope(Scope *BlockScope, BlockDecl *Block)
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr...
void print(raw_ostream &OS, const SourceManager &SM) const
Encodes a location in the source.
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
void setCurrentOpenCLExtensionForDecl(Decl *FD)
Set current OpenCL extensions for a declaration which can only be used when these OpenCL extensions a...
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
bool isValid() const
Return true if this is a valid SourceLocation object.
bool getSuppressAllDiagnostics() const
bool makeUnavailableInSystemHeader(SourceLocation loc, UnavailableAttr::ImplicitReason reason)
makeUnavailableInSystemHeader - There is an error in the current context.
Represents a static or instance method of a struct/union/class.
void DiagnoseUseOfUnimplementedSelectors()
ASTConsumer & getASTConsumer() const
void addDecl(NamedDecl *D)
virtual void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined)
Load the set of used but not defined functions or variables with internal linkage, or used but not defined internal functions.
void EmitCurrentDiagnostic(unsigned DiagID)
Cause the active diagnostic on the DiagosticsEngine to be emitted.
This declaration is only a declaration.
void addSupport(const OpenCLOptions &Opts)
bool hasBuiltinMSVaList() const
Returns whether or not type __builtin_ms_va_list type is available on this target.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
The diagnostic should be suppressed entirely.
SourceLocation getBegin() const
bool isTypeDependent() const
isTypeDependent - Determines whether this expression is type-dependent (C++ [temp.dep.expr]), which means that its type could change from one template instantiation to the next.
static bool IsRecordFullyDefined(const CXXRecordDecl *RD, RecordCompleteMap &RecordsComplete, RecordCompleteMap &MNCComplete)
Returns true, if the given CXXRecordDecl is fully defined in this translation unit, i.e.
FileID getMainFileID() const
Returns the FileID of the main source file.
TypedefDecl * getInt128Decl() const
Retrieve the declaration for the 128-bit signed integer type.
sema::FunctionScopeInfo * getCurFunction() const
sema::CapturedRegionScopeInfo * getCurCapturedRegion()
Retrieve the current captured region, if any.
static bool isBuiltinNote(unsigned DiagID)
Determine whether the given built-in diagnostic ID is a Note.
void ActOnStartOfTranslationUnit()
This is called before the very first declaration in the translation unit is parsed.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
void setOpenCLExtensionForType(QualType T, llvm::StringRef Exts)
Set OpenCL extensions for a type which can only be used when these OpenCL extensions are enabled...
decl_iterator - Iterates through the declarations stored within this context.
Base class for declarations which introduce a typedef-name.
Abstract interface for a consumer of code-completion information.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
bool isEnabled(llvm::StringRef Ext) const
LateTemplateParserCleanupCB * LateTemplateParserCleanup
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_RValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CCK_ImplicitConversion)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isInvalidDecl() const
void diagnoseZeroToNullptrConversion(CastKind Kind, const Expr *E)
Warn when implicitly casting 0 to nullptr.
void RecordParsingTemplateParameterDepth(unsigned Depth)
This is used to inform Sema what the current TemplateParameterDepth is during Parsing.
This is a scope that corresponds to the template parameters of a C++ template.
DeclarationName - The name of a declaration.
bool tryToRecoverWithCall(ExprResult &E, const PartialDiagnostic &PD, bool ForceComplain=false, bool(*IsPlausibleResult)(QualType)=nullptr)
Try to recover by turning the given expression into a call.
OverloadExpr * Expression
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required...
A set of unresolved declarations.
detail::InMemoryDirectory::const_iterator E
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
IdentifierResolver IdResolver
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i...
virtual bool hasInt128Type() const
Determine whether the __int128 type is supported on this target.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Abstract interface for a module loader.
NamedDecl * getCurFunctionOrMethodDecl()
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in...
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
void DiagnoseUnterminatedPragmaAttribute()
Encapsulates the data about a macro definition (e.g.
DeclarationName VAListTagName
VAListTagName - The declaration name corresponding to __va_list_tag.
void FormatASTNodeDiagnosticArgument(DiagnosticsEngine::ArgumentKind Kind, intptr_t Val, StringRef Modifier, StringRef Argument, ArrayRef< DiagnosticsEngine::ArgumentValue > PrevArgs, SmallVectorImpl< char > &Output, void *Cookie, ArrayRef< intptr_t > QualTypeVals)
DiagnosticsEngine argument formatting function for diagnostics that involve AST nodes.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
SourceManager & getSourceManager() const
const T * getAs() const
Member-template getAs<specific type>'.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy.
QualType getCanonicalType() const
CanQualType UnsignedLongTy
FunctionDecl * getCurFunctionDecl()
getCurFunctionDecl - If inside of a function body, this returns a pointer to the function decl for th...
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
void print(raw_ostream &OS) const override
CanQualType BoundMemberTy
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
void addComment(const RawComment &RC)
ImplicitParamDecl * getContextParam() const
Retrieve the parameter containing captured variables.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream...
This is a scope that can contain a declaration.
SourceManager & getSourceManager()
void ActOnTranslationUnitScope(Scope *S)
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
void setSuppressAllDiagnostics(bool Val=true)
Suppress all diagnostics, to silence the front end when we know that we don't want any more diagnosti...
void * VisContext
VisContext - Manages the stack for #pragma GCC visibility.
SmallVector< PossiblyUnreachableDiag, 4 > PossiblyUnreachableDiags
A list of PartialDiagnostics created but delayed within the current function scope.
Captures information about "declaration specifiers".
static SFINAEResponse getDiagnosticSFINAEResponse(unsigned DiagID)
Determines whether the given built-in diagnostic ID is for an error that is suppressed if it occurs d...
Represents a C++ struct/union/class.
BoundNodesTreeBuilder *const Builder
Represents a C array with an unspecified size.
Optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
OverloadsShown getShowOverloads() const
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
TranslationUnitKind
Describes the kind of translation unit being processed.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string...
TypedefDecl * getCFConstantStringDecl() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
bool tryExprAsCall(Expr &E, QualType &ZeroArgCallReturnTy, UnresolvedSetImpl &NonTemplateOverloads)
Figure out if an expression could be turned into a call.
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine) ...
TranslationUnitKind TUKind
The kind of translation unit we are processing.
Defines the clang::TargetInfo interface.
The diagnostic should be reported.
void PrintStats() const
Print out statistics about the semantic analysis.
void ActOnComment(SourceRange Comment)
virtual void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending)
Read the set of pending instantiations known to the external Sema source.
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
The diagnostic is an access-control diagnostic, which will be substitution failures in some contexts ...
A reference to a declared variable, function, enum, etc.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
NamedDecl * getMostRecentDecl()
QualType getUIntPtrType() const
Return a type compatible with "uintptr_t" (C99 7.18.1.4), as defined by the target.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, ArrayType::ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
SourceManager & SourceMgr
CapturedRegionKind
The different kinds of captured statement.
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
SourceLocation getCurrentDiagLoc() const
TypedefDecl * getObjCSelDecl() const
Retrieve the typedef corresponding to the predefined 'SEL' type in Objective-C.
TypedefDecl * getBuiltinMSVaListDecl() const
Retrieve the C type declaration corresponding to the predefined __builtin_ms_va_list type...
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound stamement scopes in the function.
virtual void CompleteTentativeDefinition(VarDecl *D)
CompleteTentativeDefinition - Callback invoked at the end of a translation unit to notify the consume...
A trivial tuple used to represent a source range.
SourceLocation getLocation() const
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one. ...
NamedDecl - This represents a decl with a name.
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K)
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID...
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
bool isConstQualified() const
Determine whether this type is const-qualified.
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
bool isNull() const
Return true if this QualType doesn't point to a type yet.
SourceLocation getLocStart() const LLVM_READONLY
void setType(QualType newType)
Optional< NullabilityKind > getNullability(const ASTContext &context) const
Determine the nullability of the given type.
static void checkUndefinedButUsed(Sema &S)
checkUndefinedButUsed - Check for undefined objects with internal linkage or that are inline...
SmallVector< std::pair< CXXMethodDecl *, const FunctionProtoType * >, 2 > DelayedDefaultedMemberExceptionSpecs
All the members seen during a class definition which were both explicitly defaulted and had explicitl...
This class handles loading and caching of source files into memory.
Preprocessor & getPreprocessor() const
OpenCLOptions & getSupportedOpenCLOpts()
Get supported OpenCL extensions and optional core features.
Declaration of a template function.
void PushFunctionScope()
Enter a new function scope.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
ScalarTypeKind getScalarTypeKind() const
Given that this is a scalar type, classify it.
CanQualType OCLClkEventTy
Helper class that creates diagnostics with optional template instantiation stacks.
Expr * IgnoreParens() LLVM_READONLY
IgnoreParens - Ignore parentheses.
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
CanQualType UnsignedIntTy
IdentifierInfo * getBoolName() const
Retrieve the identifier 'bool'.
The translation unit is a module.