40 #include "llvm/ADT/APFloat.h"
41 #include "llvm/ADT/DenseMap.h"
42 #include "llvm/ADT/SmallSet.h"
43 using namespace clang;
59 Policy.
Bool = BoolMacro->isObjectLike() &&
60 BoolMacro->getNumTokens() == 1 &&
61 BoolMacro->getReplacementToken(0).is(tok::kw__Bool);
76 : ExternalSource(nullptr),
77 isMultiplexExternalSource(
false), FPFeatures(pp.getLangOpts()),
78 LangOpts(pp.getLangOpts()), PP(pp),
Context(ctxt), Consumer(consumer),
79 Diags(PP.getDiagnostics()),
SourceMgr(PP.getSourceManager()),
80 CollectStats(
false), CodeCompleter(CodeCompleter),
81 CurContext(nullptr), OriginalLexicalContext(nullptr),
82 PackContext(nullptr), MSStructPragmaOn(
false),
83 MSPointerToMemberRepresentationMethod(
84 LangOpts.getMSPointerToMemberRepresentationMethod()),
85 VtorDispModeStack(1, MSVtorDispAttr::Mode(LangOpts.VtorDispMode)),
86 DataSegStack(nullptr), BSSSegStack(nullptr), ConstSegStack(nullptr),
87 CodeSegStack(nullptr), CurInitSeg(nullptr), VisContext(nullptr),
88 IsBuildingRecoveryCallExpr(
false),
89 ExprNeedsCleanups(
false), LateTemplateParser(nullptr),
90 LateTemplateParserCleanup(nullptr),
91 OpaqueParser(nullptr), IdResolver(pp), StdInitializerList(nullptr),
92 CXXTypeInfoDecl(nullptr), MSVCGuidDecl(nullptr),
93 NSNumberDecl(nullptr), NSValueDecl(nullptr),
94 NSStringDecl(nullptr), StringWithUTF8StringMethod(nullptr),
95 ValueWithBytesObjCTypeMethod(nullptr),
96 NSArrayDecl(nullptr), ArrayWithObjectsMethod(nullptr),
97 NSDictionaryDecl(nullptr), DictionaryWithObjectsMethod(nullptr),
98 MSAsmLabelNameCounter(0),
99 GlobalNewDeleteDeclared(
false),
102 CachedFakeTopLevelModule(nullptr),
103 AccessCheckingSFINAE(
false), InNonInstantiationSFINAEContext(
false),
104 NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
105 CurrentInstantiationScope(nullptr), DisableTypoCorrection(
false),
106 TyposCorrected(0), AnalysisWarnings(*this), ThreadSafetyDeclCache(nullptr),
107 VarDataSharingAttributesStack(nullptr), CurScope(nullptr),
108 Ident_super(nullptr), Ident___float128(nullptr)
112 LoadedExternalKnownNamespaces =
false;
130 InitDataSharingAttributesStack();
141 SC->InitializeSema(*
this);
146 ExternalSema->InitializeSema(*
this);
279 ExternalSema->ForgetSema();
282 if (isMultiplexExternalSource)
283 delete ExternalSource;
288 DestroyDataSharingAttributesStack();
290 assert(DelayedTypos.empty() &&
"Uncorrected typos!");
298 UnavailableAttr::ImplicitReason reason) {
301 if (!fn)
return false;
312 if (fn->
hasAttr<UnavailableAttr>())
return true;
314 fn->
addAttr(UnavailableAttr::CreateImplicit(
Context,
"", reason, loc));
328 assert(E &&
"Cannot use with NULL ptr");
330 if (!ExternalSource) {
335 if (isMultiplexExternalSource)
339 isMultiplexExternalSource =
true;
345 llvm::errs() <<
"\n*** Semantic Analysis Stats:\n";
363 Diag(Loc, diag::warn_nullability_lost) << SrcType << DstType;
377 llvm_unreachable(
"can't implicitly cast lvalue to rvalue with this cast "
394 if (ExprTy == TypeTy)
398 if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty())) {
399 ImpCast->setType(Ty);
400 ImpCast->setValueKind(VK);
433 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
437 if (FD->hasBody(DeclToCheck))
443 if (DeclToCheck != FD)
447 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
453 if (VD->isReferenced() &&
454 VD->isUsableInConstantExpressions(SemaRef->
Context))
466 if (DeclToCheck != VD)
485 if (ND->
hasAttr<WeakRefAttr>())
continue;
490 if (FD->isExternallyVisible() &&
491 !FD->getMostRecentDecl()->isInlined())
500 Undefined.push_back(std::make_pair(ND,
I->second));
506 std::sort(Undefined.begin(), Undefined.end(),
507 [&
SM](
const std::pair<NamedDecl *, SourceLocation> &l,
508 const std::pair<NamedDecl *, SourceLocation> &r) {
509 if (l.second.isValid() && !r.second.isValid())
511 if (!l.second.isValid() && r.second.isValid())
513 if (l.second != r.second)
516 r.first->getLocation());
528 if (Undefined.empty())
return;
531 I = Undefined.begin(),
E = Undefined.end();
I !=
E; ++
I) {
534 if (ND->
hasAttr<DLLImportAttr>() || ND->
hasAttr<DLLExportAttr>()) {
543 << isa<VarDecl>(ND) << ND;
545 assert(cast<FunctionDecl>(ND)->getMostRecentDecl()->isInlined() &&
546 "used object requires definition but isn't inline or internal?");
549 if (
I->second.isValid())
550 S.
Diag(
I->second, diag::note_used_here);
560 for (
auto &WeakID : WeakIDs)
575 if (Cache != MNCComplete.end())
576 return Cache->second;
579 bool Complete =
true;
582 I !=
E && Complete; ++
I) {
584 Complete = M->isDefined() || (M->isPure() && !isa<CXXDestructorDecl>(M));
590 Complete = !F->getTemplatedDecl()->isLateTemplateParsed() &&
591 F->getTemplatedDecl()->isDefined();
593 if (R->isInjectedClassName())
595 if (R->hasDefinition())
602 MNCComplete[RD] = Complete;
617 if (Cache != RecordsComplete.end())
618 return Cache->second;
622 I !=
E && Complete; ++
I) {
626 if (
CXXRecordDecl *FriendD = TSI->getType()->getAsCXXRecordDecl())
633 dyn_cast<FunctionDecl>((*I)->getFriendDecl()))
634 Complete = FD->isDefined();
640 RecordsComplete[RD] = Complete;
649 if (TD->isReferenced())
651 Diag(TD->getLocation(), diag::warn_unused_local_typedef)
652 << isa<TypeAliasDecl>(TD) << TD->getDeclName();
654 UnusedLocalTypedefNameCandidates.clear();
662 &&
"reached end of translation unit with a pool attached?");
688 if (ExternalSource) {
693 Pending.begin(), Pending.end());
729 if (WeakID.second.getUsed())
734 if (PrevDecl !=
nullptr &&
735 !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl)))
736 Diag(WeakID.second.getLocation(), diag::warn_attribute_wrong_decl_type)
739 Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared)
754 Stack.push_back(CurrentModule);
755 while (!Stack.empty()) {
756 Module *Mod = Stack.pop_back_val();
791 llvm::SmallSet<VarDecl *, 32> Seen;
814 diag::err_tentative_def_incomplete_type))
837 if (!FD->hasBody(DiagD))
842 if (isa<CXXMethodDecl>(DiagD))
846 if (FD->getStorageClass() ==
SC_Static &&
847 !FD->isInlineSpecified() &&
851 diag::warn_unneeded_static_internal_decl)
859 isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
860 : diag::warn_unused_function)
866 DiagD = cast<VarDecl>(*I);
907 AnalyzeDeleteExprMismatch(DeletedFieldInfo.first,
DeleteExprLoc.first,
917 "Didn't unmark var as having its initializer parsed");
931 if (isa<BlockDecl>(DC) || isa<EnumDecl>(DC) || isa<CapturedDecl>(DC)) {
933 }
else if (isa<CXXMethodDecl>(DC) &&
934 cast<CXXMethodDecl>(DC)->getOverloadedOperator() == OO_Call &&
935 cast<CXXRecordDecl>(DC->
getParent())->isLambda()) {
954 while (isa<RecordDecl>(DC))
961 if (isa<ObjCMethodDecl>(DC) || isa<FunctionDecl>(DC))
962 return cast<NamedDecl>(DC);
988 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
990 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1013 if (*Info && !(*Info)->hasSFINAEDiagnostic()) {
1015 (*Info)->addSFINAEDiagnostic(DiagInfo.
getLocation(),
1024 Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);
1037 (*Info)->addSuppressedDiagnostic(DiagInfo.
getLocation(),
1141 BlockScope, Block));
1152 LSI->AutoTemplateParameterDepth =
Depth;
1156 "Remove assertion if intentionally called in a non-lambda context.");
1169 Diag(PUD.Loc, PUD.PD);
1181 assert(!CurFunction->
CompoundScopes.empty() &&
"mismatched push/pop");
1197 if (CurBSI && CurBSI->TheDecl &&
1212 if (CurLSI && CurLSI->Lambda &&
1225 return (LSI->AutoTemplateParams.size() ||
1226 LSI->GLTemplateParameterList) ? LSI :
nullptr;
1233 if (!
LangOpts.RetainCommentsFromSystemHeaders &&
1241 StringRef MagicMarkerText;
1244 MagicMarkerText =
"///<";
1247 MagicMarkerText =
"/**<";
1250 llvm_unreachable(
"if this is an almost Doxygen comment, "
1251 "it should be ordinary");
1253 Diag(Comment.
getBegin(), diag::warn_not_a_doxygen_trailing_member_comment) <<
1269 llvm::DenseMap<NamedDecl *, SourceLocation> &Undefined) {
1284 if (TheDecl && isa<NamedDecl>(TheDecl)) {
1285 std::string
Name = cast<NamedDecl>(TheDecl)->getNameAsString();
1287 OS <<
" '" << Name <<
'\'';
1307 OverloadSet.
clear();
1310 bool IsMemExpr =
false;
1324 bool Ambiguous =
false;
1328 DeclsEnd = Overloads->
decls_end(); it != DeclsEnd; ++it) {
1336 = dyn_cast<FunctionDecl>((*it)->getUnderlyingDecl())) {
1337 if (OverloadDecl->getMinRequiredArguments() == 0) {
1338 if (!ZeroArgCallReturnTy.
isNull() && !Ambiguous) {
1342 ZeroArgCallReturnTy = OverloadDecl->getReturnType();
1349 return !ZeroArgCallReturnTy.
isNull();
1369 if (
const FunctionDecl *Fun = dyn_cast<FunctionDecl>(DeclRef->getDecl())) {
1370 if (Fun->getMinRequiredArguments() == 0)
1371 ZeroArgCallReturnTy = Fun->getReturnType();
1387 dyn_cast_or_null<FunctionProtoType>(FunTy)) {
1388 if (FPT->getNumParams() == 0)
1409 int ShownOverloads = 0;
1410 int SuppressedOverloads = 0;
1412 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1416 ++SuppressedOverloads;
1425 if (SuppressedOverloads)
1426 S.
Diag(FinalNoteLoc, diag::note_ovl_too_many_candidates)
1427 << SuppressedOverloads;
1432 bool (*IsPlausibleResult)(
QualType)) {
1433 if (!IsPlausibleResult)
1438 DeclsEnd = Overloads.
end(); It != DeclsEnd; ++It) {
1439 const FunctionDecl *OverloadDecl = cast<FunctionDecl>(*It);
1441 if (IsPlausibleResult(OverloadResultTy))
1442 PlausibleOverloads.
addDecl(It.getDecl());
1453 return (!isa<CStyleCastExpr>(E) &&
1454 !isa<UnaryOperator>(E) &&
1455 !isa<BinaryOperator>(E) &&
1456 !isa<CXXOperatorCallExpr>(E));
1461 bool (*IsPlausibleResult)(
QualType)) {
1468 !ZeroArgCallTy.
isNull() &&
1469 (!IsPlausibleResult || IsPlausibleResult(ZeroArgCallTy))) {
1489 if (!ForceComplain)
return false;
1491 Diag(Loc, PD) << 0 << Range;
1504 if (!Ident___float128)
1506 return Ident___float128;
1524 const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> &
void FreePackedContext()
FreePackedContext - Deallocate and null out PackContext.
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...
CK_LValueToRValue - A conversion which causes the extraction of an r-value from the operand gl-value...
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.
CanQualType OCLImage1dBufferTy
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()
CanQualType OCLImage2dMSAADepthTy
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.
The current expression is potentially evaluated at run time, which means that code may be generated t...
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
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
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.
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
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. ...
CanQualType OCLImage2dArrayMSAADepthTy
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 ...
CanQualType OCLImage2dArrayTy
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
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.
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...
Converts a floating point complex to bool by comparing against 0+0i.
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
CK_IntegralToBoolean - Integral to boolean.
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.
CK_FunctionToPointerDecay - Function to pointer decay.
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.
CK_PointerToBoolean - Pointer to boolean conversion.
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.
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
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
CanQualType OCLImage2dArrayMSAATy
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.
llvm::DenseMap< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
ASTMutationListener * getASTMutationListener() const
void Clear()
Clear out the current diagnostic.
CanQualType OCLImage2dMSAATy
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.
CanQualType OCLImage2dArrayDepthTy
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
CK_ArrayToPointerDecay - Array to pointer decay.
llvm::DenseMap< const CXXRecordDecl *, bool > RecordCompleteMap
An abstract interface that should be implemented by external AST sources that also provide informatio...
void * PackContext
PackContext - Manages the stack for #pragma pack.
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' (bec...
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)
void SetArgToStringFn(ArgToStringFnTy Fn, void *Cookie)
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.
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
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...
ObjCMethodDecl * NSNumberLiteralMethods[NSAPI::NumNSNumberLiteralMethods]
The Objective-C NSNumber methods used to create NSNumber literals.
Converts an integral complex to bool by comparing against 0+0i.
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 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 this declaration was used, meaning that a definition is required.
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 ...
CK_MemberPointerToBoolean - Member pointer to boolean.
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
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
void addComment(const RawComment &RC)
CanQualType OCLImage2dDepthTy
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.
virtual void ReadUndefinedButUsed(llvm::DenseMap< NamedDecl *, SourceLocation > &Undefined)
Load the set of used but not defined functions or variables with internal linkage, or used but not defined internal functions.
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
CanQualType OCLImage1dArrayTy
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...
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.
CK_NoOp - A conversion which does not affect the type other than (possibly) adding qualifiers...
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.
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...
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.
CK_ToVoid - Cast to void, discarding the computed value.
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
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
The translation unit is a module.
CK_FloatingToBoolean - Floating point to boolean.