40 #include "llvm/ADT/APFloat.h"
41 #include "llvm/ADT/DenseMap.h"
42 #include "llvm/ADT/SmallSet.h"
43 using namespace clang;
60 Policy.
Bool = BoolMacro->isObjectLike() &&
61 BoolMacro->getNumTokens() == 1 &&
62 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
77 : ExternalSource(nullptr),
78 isMultiplexExternalSource(
false), FPFeatures(pp.getLangOpts()),
79 LangOpts(pp.getLangOpts()), PP(pp),
Context(ctxt), Consumer(consumer),
80 Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
81 CollectStats(
false), CodeCompleter(CodeCompleter),
82 CurContext(nullptr), OriginalLexicalContext(nullptr),
83 MSStructPragmaOn(
false),
84 MSPointerToMemberRepresentationMethod(
85 LangOpts.getMSPointerToMemberRepresentationMethod()),
86 VtorDispStack(MSVtorDispAttr::Mode(LangOpts.VtorDispMode)),
87 PackStack(0), DataSegStack(nullptr), BSSSegStack(nullptr),
88 ConstSegStack(nullptr), CodeSegStack(nullptr), CurInitSeg(nullptr),
90 IsBuildingRecoveryCallExpr(
false),
91 Cleanup{}, LateTemplateParser(
nullptr),
92 LateTemplateParserCleanup(
nullptr),
93 OpaqueParser(
nullptr), IdResolver(pp), StdInitializerList(
nullptr),
94 CXXTypeInfoDecl(
nullptr), MSVCGuidDecl(
nullptr),
95 NSNumberDecl(
nullptr), NSValueDecl(
nullptr),
96 NSStringDecl(
nullptr), StringWithUTF8StringMethod(
nullptr),
97 ValueWithBytesObjCTypeMethod(
nullptr),
98 NSArrayDecl(
nullptr), ArrayWithObjectsMethod(
nullptr),
99 NSDictionaryDecl(
nullptr), DictionaryWithObjectsMethod(
nullptr),
100 MSAsmLabelNameCounter(0),
101 GlobalNewDeleteDeclared(
false),
104 CachedFakeTopLevelModule(
nullptr),
105 AccessCheckingSFINAE(
false), InNonInstantiationSFINAEContext(
false),
106 NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
107 CurrentInstantiationScope(
nullptr), DisableTypoCorrection(
false),
108 TyposCorrected(0), AnalysisWarnings(*
this), ThreadSafetyDeclCache(
nullptr),
109 VarDataSharingAttributesStack(
nullptr), CurScope(
nullptr),
110 Ident_super(
nullptr), Ident___float128(
nullptr)
114 LoadedExternalKnownNamespaces =
false;
116 NSNumberLiteralMethods[
I] =
nullptr;
118 if (getLangOpts().ObjC1)
127 ExprEvalContexts.emplace_back(PotentiallyEvaluated, 0,
CleanupInfo{},
nullptr,
133 InitDataSharingAttributesStack();
144 SC->InitializeSema(*
this);
149 ExternalSema->InitializeSema(*
this);
214 #define OPENCLEXT(Ext) \
215 if (Context.getTargetInfo().getSupportedOpenCLOpts().is_##Ext##_supported_core( \
216 getLangOpts().OpenCLVersion)) \
217 getOpenCLOptions().Ext = 1;
218 #include "clang/Basic/OpenCLExtensions.def"
278 ExternalSema->ForgetSema();
281 if (isMultiplexExternalSource)
282 delete ExternalSource;
287 DestroyDataSharingAttributesStack();
289 assert(DelayedTypos.empty() &&
"Uncorrected typos!");
297 UnavailableAttr::ImplicitReason reason) {
300 if (!fn)
return false;
311 if (fn->hasAttr<UnavailableAttr>())
return true;
313 fn->addAttr(UnavailableAttr::CreateImplicit(
Context,
"", reason, loc));
327 assert(E &&
"Cannot use with NULL ptr");
329 if (!ExternalSource) {
334 if (isMultiplexExternalSource)
338 isMultiplexExternalSource =
true;
344 llvm::errs() <<
"\n*** Semantic Analysis Stats:\n";
362 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
376 llvm_unreachable(
"can't implicitly cast lvalue to rvalue with this cast "
378 case CK_LValueToRValue:
379 case CK_ArrayToPointerDecay:
380 case CK_FunctionToPointerDecay:
393 if (ExprTy == TypeTy)
397 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
398 ImpCast->setType(Ty);
399 ImpCast->setValueKind(VK);
432 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
436 if (FD->hasBody(DeclToCheck))
442 if (DeclToCheck != FD)
446 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
452 if (VD->isReferenced() &&
453 VD->isUsableInConstantExpressions(SemaRef->
Context))
465 if (DeclToCheck != VD)
480 if (ND->isInvalidDecl())
continue;
483 if (ND->hasAttr<WeakRefAttr>())
continue;
488 if (FD->isExternallyVisible() &&
489 !FD->getMostRecentDecl()->isInlined())
492 auto *VD = cast<VarDecl>(ND);
495 if (VD->isExternallyVisible() && !VD->getMostRecentDecl()->isInline())
499 Undefined.push_back(std::make_pair(ND, UndefinedUse.second));
511 if (Undefined.empty())
return;
514 I = Undefined.begin(),
E = Undefined.end();
I !=
E; ++
I) {
517 if (ND->hasAttr<DLLImportAttr>() || ND->hasAttr<DLLExportAttr>()) {
525 S.
Diag(ND->getLocation(), diag::warn_undefined_internal)
526 << isa<VarDecl>(ND) << ND;
527 }
else if (
auto *FD = dyn_cast<FunctionDecl>(ND)) {
529 assert(FD->getMostRecentDecl()->isInlined() &&
530 "used object requires definition but isn't inline or internal?");
532 S.
Diag(ND->getLocation(), diag::warn_undefined_inline) << ND;
534 assert(cast<VarDecl>(ND)->getMostRecentDecl()->isInline() &&
535 "used var requires definition but isn't inline or internal?");
536 S.
Diag(ND->getLocation(), diag::err_undefined_inline_var) << ND;
538 if (
I->second.isValid())
539 S.
Diag(
I->second, diag::note_used_here);
551 for (
auto &WeakID : WeakIDs)
566 if (Cache != MNCComplete.end())
567 return Cache->second;
570 bool Complete =
true;
573 I !=
E && Complete; ++
I) {
575 Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M));
581 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
582 F->getTemplatedDecl()->isDefined();
584 if (R->isInjectedClassName())
586 if (R->hasDefinition())
593 MNCComplete[RD] = Complete;
608 if (Cache != RecordsComplete.end())
609 return Cache->second;
613 I !=
E && Complete; ++
I) {
617 if (
CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
624 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
625 Complete = FD->isDefined();
631 RecordsComplete[RD] = Complete;
640 if (TD->isReferenced())
642 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
643 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
645 UnusedLocalTypedefNameCandidates.clear();
653 &&
"reached end of translation unit with a pool attached?");
679 if (ExternalSource) {
684 Pending.begin(), Pending.end());
720 if (WeakID.second.getUsed())
725 if (PrevDecl !=
nullptr &&
726 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
727 Diag(WeakID.second.getLocation(), diag::warn_attribute_wrong_decl_type)
730 Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared)
751 Stack.push_back(CurrentModule);
752 while (!Stack.empty()) {
753 Module *Mod = Stack.pop_back_val();
788 llvm::SmallSet<VarDecl *, 32> Seen;
799 if (!VD || VD->isInvalidDecl() || !Seen.insert(VD).second)
805 Diag(VD->getLocation(), diag::warn_tentative_incomplete_array);
811 diag::err_tentative_def_incomplete_type))
812 VD->setInvalidDecl();
817 if (!VD->isInvalidDecl())
834 if (!FD->hasBody(DiagD))
838 if (DiagD->isReferenced()) {
839 if (isa<CXXMethodDecl>(DiagD))
840 Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
843 if (FD->getStorageClass() ==
SC_Static &&
844 !FD->isInlineSpecified() &&
847 Diag(DiagD->getLocation(),
848 diag::warn_unneeded_static_internal_decl)
851 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
855 Diag(DiagD->getLocation(),
856 isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
857 : diag::warn_unused_function)
863 DiagD = cast<VarDecl>(*I);
864 if (DiagD->isReferenced()) {
865 Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
868 Diag(DiagD->getLocation(), diag::warn_unused_const_variable)
871 Diag(DiagD->getLocation(), diag::warn_unused_variable)
889 Diag(D->getLocation(), diag::warn_unused_private_field)
900 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first,
DeleteExprLoc.first,
910 "Didn't unmark var as having its initializer parsed");
924 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC)) {
926 }
else if (isa<CXXMethodDecl>(DC) &&
927 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
928 cast<CXXRecordDecl>(DC->
getParent())->isLambda()) {
947 while (isa<RecordDecl>(DC))
954 if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
955 return cast<NamedDecl>(DC);
981 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
983 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1006 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1008 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1017 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1030 (*Info)->addSuppressedDiagnostic(DiagInfo.
getLocation(),
1134 BlockScope, Block));
1145 LSI->AutoTemplateParameterDepth =
Depth;
1149 "Remove assertion if intentionally called in a non-lambda context.");
1162 Diag(PUD.Loc, PUD.PD);
1174 assert(!CurFunction->
CompoundScopes.empty() &&
"mismatched push/pop");
1190 if (CurBSI && CurBSI->TheDecl &&
1205 if (CurLSI && CurLSI->Lambda &&
1218 return (LSI->AutoTemplateParams.size() ||
1219 LSI->GLTemplateParameterList) ? LSI :
nullptr;
1226 if (!
LangOpts.RetainCommentsFromSystemHeaders &&
1234 StringRef MagicMarkerText;
1237 MagicMarkerText =
"///<";
1240 MagicMarkerText =
"/**<";
1243 llvm_unreachable(
"if this is an almost Doxygen comment, "
1244 "it should be ordinary");
1246 Diag(Comment.
getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
1263 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {}
1270 if (!Loc.
isValid() && TheDecl) Loc = TheDecl->getLocation();
1277 if (
auto *ND = dyn_cast_or_null<NamedDecl>(TheDecl)) {
1279 ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
true);
1300 OverloadSet.
clear();
1303 bool IsMemExpr =
false;
1317 bool Ambiguous =
false;
1321 DeclsEnd = Overloads->
decls_end(); it != DeclsEnd; ++it) {
1329 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
1330 if (OverloadDecl->getMinRequiredArguments() == 0) {
1331 if (!ZeroArgCallReturnTy.
isNull() && !Ambiguous) {
1335 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
1342 return !ZeroArgCallReturnTy.
isNull();
1362 if (
const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
1363 if (Fun->getMinRequiredArguments() == 0)
1364 ZeroArgCallReturnTy = Fun->getReturnType();
1380 dyn_cast_or_null<FunctionProtoType>(FunTy)) {
1381 if (FPT->getNumParams() == 0)
1402 int ShownOverloads = 0;
1403 int SuppressedOverloads = 0;
1405 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1409 ++SuppressedOverloads;
1414 S.
Diag(Fn->getLocation(), diag::note_possible_target_of_call);
1418 if (SuppressedOverloads)
1419 S.
Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
1420 << SuppressedOverloads;
1425 bool (*IsPlausibleResult)(
QualType)) {
1426 if (!IsPlausibleResult)
1431 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1432 const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
1434 if (IsPlausibleResult(OverloadResultTy))
1435 PlausibleOverloads.
addDecl(It.getDecl());
1446 return (!isa<CStyleCastExpr>(E) &&
1447 !isa<UnaryOperator>(E) &&
1448 !isa<BinaryOperator>(E) &&
1449 !isa<CXXOperatorCallExpr>(E));
1454 bool (*IsPlausibleResult)(
QualType)) {
1461 !ZeroArgCallTy.
isNull() &&
1462 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
1482 if (!ForceComplain)
return false;
1484 Diag(Loc, PD) << 0 << Range;
1497 if (!Ident___float128)
1499 return Ident___float128;
1518 const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
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.
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...
LateParsedTemplateMapT LateParsedTemplateMap
DeclContext * getFunctionLevelDeclContext()
static const CastKind CK_Invalid
Defines the clang::FileManager interface and associated types.
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...
const LangOptions & getLangOpts() const
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.
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
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
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
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.
ActiveTemplateInstantiation LastTemplateInstantiationErrorContext
The last template from which a template instantiation error or warning was produced.
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.
void PrintInstantiationStack()
Prints the current instantiation stack through a series of notes.
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.
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
sema::DelayedDiagnosticPool * getCurrentPool() const
Returns the current delayed-diagnostics pool.
class LLVM_ALIGNAS(8) DependentTemplateSpecializationType const IdentifierInfo * Name
Represents a template specialization type whose template cannot be resolved, e.g. ...
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.
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
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.
Represents a C++ member access expression for which lookup produced a set of overloaded functions...
void setPrintingPolicy(const clang::PrintingPolicy &Policy)
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
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
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.
void CheckCompleteVariableDeclaration(VarDecl *var)
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
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...
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.
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.
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.
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.
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
SmallVector< ActiveTemplateInstantiation, 16 > ActiveTemplateInstantiations
List of active template instantiations.
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.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any...
const TemplateArgument * iterator
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.
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.
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.
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...
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.
sema::LambdaScopeInfo * getCurLambda()
Retrieve the current lambda scope info, if any.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
Represents a template argument.
TypedefDecl * buildImplicitTypedef(QualType T, StringRef Name) const
Create a new implicit TU-level typedef declaration.
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.
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
A set of unresolved declarations.
detail::InMemoryDirectory::const_iterator E
IdentifierResolver IdResolver
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
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.
CanQualType UnsignedLongTy
FunctionDecl * getCurFunctionDecl()
getCurFunctionDecl - If inside of a function body, this returns a pointer to the function decl for th...
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.
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
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.
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.
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...
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.
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...
Preprocessor & getPreprocessor() const
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.