61#include "llvm/ADT/ArrayRef.h"
62#include "llvm/ADT/STLForwardCompat.h"
63#include "llvm/ADT/ScopeExit.h"
64#include "llvm/ADT/SmallPtrSet.h"
65#include "llvm/ADT/SmallString.h"
66#include "llvm/ADT/StringExtras.h"
67#include "llvm/ADT/StringRef.h"
68#include "llvm/Support/SaveAndRestore.h"
69#include "llvm/TargetParser/Triple.h"
73#include <unordered_map>
80 Decl *Group[2] = { OwnedType, Ptr };
91 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
92 bool AllowTemplates =
false,
93 bool AllowNonTemplates =
true)
94 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
95 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
96 WantExpressionKeywords =
false;
97 WantCXXNamedCasts =
false;
98 WantRemainingKeywords =
false;
101 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
103 if (!AllowInvalidDecl && ND->isInvalidDecl())
107 return AllowTemplates;
113 if (AllowNonTemplates)
118 if (AllowTemplates) {
119 auto *RD = dyn_cast<CXXRecordDecl>(ND);
120 if (!RD || !RD->isInjectedClassName())
123 return RD->getDescribedClassTemplate() ||
130 return !WantClassName && candidate.
isKeyword();
133 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
134 return std::make_unique<TypeNameValidatorCCC>(*
this);
138 bool AllowInvalidDecl;
141 bool AllowNonTemplates;
148 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
149 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
151 FoundRD->isInjectedClassName() &&
155 ? diag::ext_out_of_line_qualified_id_type_names_constructor
156 : diag::err_out_of_line_qualified_id_type_names_constructor)
166enum class UnqualifiedTypeNameLookupResult {
177static UnqualifiedTypeNameLookupResult
182 return UnqualifiedTypeNameLookupResult::NotFound;
184 UnqualifiedTypeNameLookupResult FoundTypeDecl =
185 UnqualifiedTypeNameLookupResult::NotFound;
189 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
190 Base.getType().getCanonicalType())) {
193 if (!TST->isDependentType())
195 auto *TD = TST->getTemplateName().getAsTemplateDecl();
198 if (
auto *BasePrimaryTemplate =
199 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
201 BaseRD = BasePrimaryTemplate;
202 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
204 CTD->findPartialSpecialization(
Base.getType()))
213 return UnqualifiedTypeNameLookupResult::FoundNonType;
214 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
216 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
218 case UnqualifiedTypeNameLookupResult::FoundNonType:
219 return UnqualifiedTypeNameLookupResult::FoundNonType;
220 case UnqualifiedTypeNameLookupResult::FoundType:
221 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
223 case UnqualifiedTypeNameLookupResult::NotFound:
230 return FoundTypeDecl;
238 UnqualifiedTypeNameLookupResult FoundTypeDecl =
239 UnqualifiedTypeNameLookupResult::NotFound;
241 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
245 RD = dyn_cast<CXXRecordDecl>(DC);
249 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
255 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
275 bool HasTrailingDot,
ParsedType ObjectTypePtr,
276 bool IsCtorOrDtorName,
277 bool WantNontrivialTypeSourceInfo,
278 bool IsClassTemplateDeductionContext,
281 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
283 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
309 if (IsImplicitTypename) {
314 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
323 if (WantNontrivialTypeSourceInfo)
359 if (ObjectTypePtr &&
Result.empty()) {
383 switch (
Result.getResultKind()) {
386 TypeNameValidatorCCC CCC(
true, isClassName,
387 AllowDeducedTemplate);
393 bool MemberOfUnknownSpecialization;
402 if (Correction && (NNS || NewII != &II) &&
408 Template, MemberOfUnknownSpecialization))) {
410 isClassName, HasTrailingDot, ObjectTypePtr,
412 WantNontrivialTypeSourceInfo,
413 IsClassTemplateDeductionContext);
416 PDiag(diag::err_unknown_type_or_class_name_suggest)
417 <<
Result.getLookupName() << isClassName);
420 *CorrectedII = NewII;
425 Result.suppressDiagnostics();
441 Result.suppressDiagnostics();
451 Result.suppressDiagnostics();
457 Res != ResEnd; ++Res) {
466 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
478 Result.suppressDiagnostics();
489 IIDecl =
Result.getFoundDecl();
490 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
494 assert(IIDecl &&
"Didn't find decl");
497 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
503 if (FoundUsingShadow) {
507 if (!WantNontrivialTypeSourceInfo)
513 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
517 if (!WantNontrivialTypeSourceInfo)
523 TL.setNameLoc(NameLoc);
524 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
528 if (!WantNontrivialTypeSourceInfo)
534 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
538 if (!WantNontrivialTypeSourceInfo)
546 if (!WantNontrivialTypeSourceInfo)
557 if (!HasTrailingDot) {
560 if (!WantNontrivialTypeSourceInfo)
565 TL.setNameEndLoc(NameLoc);
568 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
572 }
else if (AllowDeducedTemplate) {
574 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
583 TL.setNameLoc(NameLoc);
591 Result.suppressDiagnostics();
600 auto *ND = dyn_cast<NamespaceDecl>(DC);
601 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
603 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
608 llvm_unreachable(
"something isn't in TU scope?");
619 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
620 if (MD->getParent()->hasAnyDependentBases())
628 bool IsTemplateTypeArg) {
629 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
632 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
641 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
650 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
681 switch (TD->getTagKind()) {
722 bool IsTemplateName) {
727 SuggestedType =
nullptr;
731 TypeNameValidatorCCC CCC(
false,
false,
738 bool CanRecover = !IsTemplateName;
739 if (Corrected.isKeyword()) {
742 PDiag(IsTemplateName ? diag::err_no_template_suggest
743 : diag::err_unknown_typename_suggest)
745 II = Corrected.getCorrectionAsIdentifierInfo();
748 if (!SS || !SS->
isSet()) {
750 PDiag(IsTemplateName ? diag::err_no_template_suggest
751 : diag::err_unknown_typename_suggest)
754 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
755 bool DroppedSpecifier =
756 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
759 ? diag::err_no_member_template_suggest
760 : diag::err_unknown_nested_typename_suggest)
761 << II << DC << DroppedSpecifier << SS->
getRange(),
764 llvm_unreachable(
"could not have corrected a typo here");
771 if (Corrected.getCorrectionSpecifier())
776 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
777 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
790 bool MemberOfUnknownSpecialization;
792 Name,
nullptr,
true, TemplateResult,
803 Diag(IILoc, IsTemplateName ? diag::err_no_template
804 : diag::err_unknown_typename)
807 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
808 : diag::err_typename_nested_not_found)
814 unsigned DiagID = diag::err_typename_missing;
816 DiagID = diag::ext_typename_missing;
827 "Invalid scope specifier has already been diagnosed");
835 NextToken.
is(tok::less);
855 StringRef FixItTagName;
856 switch (Tag->getTagKind()) {
858 FixItTagName =
"class ";
862 FixItTagName =
"enum ";
866 FixItTagName =
"struct ";
870 FixItTagName =
"__interface ";
874 FixItTagName =
"union ";
878 StringRef TagName = FixItTagName.drop_back();
879 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
880 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
885 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
900 const Token &NextToken,
905 assert(NextToken.
isNot(tok::coloncolon) &&
906 "parse nested name specifiers before calling ClassifyName");
947 bool SecondTry =
false;
948 bool IsFilteredTemplateName =
false;
951 switch (
Result.getResultKind()) {
955 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
1001 if (!SecondTry && CCC) {
1006 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1007 unsigned QualifiedDiag = diag::err_no_member_suggest;
1010 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1013 UnqualifiedDiag = diag::err_no_template_suggest;
1014 QualifiedDiag = diag::err_no_member_template_suggest;
1015 }
else if (UnderlyingFirstDecl &&
1019 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1020 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1026 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1027 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1028 Name->
getName() == CorrectedStr;
1031 << DroppedSpecifier << SS.
getRange());
1035 Name = Corrected.getCorrectionAsIdentifierInfo();
1038 if (Corrected.isKeyword())
1044 Result.setLookupName(Corrected.getCorrection());
1066 Result.suppressDiagnostics();
1108 if (!
Result.isAmbiguous()) {
1109 IsFilteredTemplateName =
true;
1119 (IsFilteredTemplateName ||
1135 if (!IsFilteredTemplateName)
1138 bool IsFunctionTemplate;
1142 IsFunctionTemplate =
true;
1145 }
else if (!
Result.empty()) {
1153 dyn_cast<UsingShadowDecl>(*
Result.begin());
1154 assert(!FoundUsingShadow ||
1163 IsFunctionTemplate =
true;
1167 if (IsFunctionTemplate) {
1171 Result.suppressDiagnostics();
1183 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1195 TTL.setNameLoc(NameLoc);
1222 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1223 Class = Alias->getClassInterface();
1229 if (NextToken.
is(tok::period)) {
1232 Result.suppressDiagnostics();
1242 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1248 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1261 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1262 if ((NextToken.
is(tok::identifier) ||
1264 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1276 if (
Result.isSingleResult() && !ADL &&
1281 Result.suppressDiagnostics();
1301 bool IsAddressOfOperand) {
1304 NameInfo, IsAddressOfOperand,
1311 const Token &NextToken) {
1313 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1329 if ((*ULE->decls_begin())->isCXXClassMember()) {
1331 SS.
Adopt(ULE->getQualifierLoc());
1336 Result.setNamingClass(ULE->getNamingClass());
1337 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1338 Result.addDecl(*I, I.getAccess());
1371 "The next DeclContext should be lexically contained in the current one.");
1377 assert(
CurContext &&
"DeclContext imbalance!");
1380 assert(
CurContext &&
"Popped translation unit!");
1390 assert(
CurContext &&
"skipping definition of undefined tag");
1418 assert(!S->
getEntity() &&
"scope already has entity");
1451 "expected to be initializing a template parameter scope");
1479 cast<Decl>(DC)->getDescribedTemplateParams()) {
1480 unsigned DCDepth = TPL->getDepth() + 1;
1481 if (DCDepth > ScopeDepth)
1483 if (ScopeDepth == DCDepth)
1502 "The next DeclContext should be lexically contained in the current one.");
1506 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1509 if (Param->getIdentifier()) {
1519 assert(
CurContext &&
"DeclContext imbalance!");
1521 assert(
CurContext &&
"Popped translation unit!");
1535 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1550 return ND->
hasAttr<OverloadableAttr>();
1553 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1588 for (; I != IEnd; ++I) {
1621 bool AllowInlineNamespace)
const {
1622 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1629 if (ScopeDC->getPrimaryContext() == TargetDC)
1641 bool ConsiderLinkage,
1642 bool AllowInlineNamespace) {
1660 if (
auto *VD = dyn_cast<VarDecl>(D))
1662 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1664 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1678 if (
New->getFriendObjectKind() &&
1719 if (NewIsModuleInterface || OldIsModuleInterface) {
1723 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1725 << NewIsModuleInterface
1727 << OldIsModuleInterface
1730 New->setInvalidDecl();
1743 if (!
New->getLexicalDeclContext()
1744 ->getNonTransparentContext()
1745 ->isFileContext() ||
1751 bool IsNewExported =
New->isInExportDeclContext();
1755 if (!IsNewExported && !IsOldExported)
1767 New->getOwningModule()->isImplicitGlobalModule())
1770 assert(IsNewExported);
1778 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1796 "New and Old are not the same definition, we should diagnostic it "
1797 "immediately instead of checking it.");
1800 "We shouldn't see unreachable definitions here.");
1848 return OldM == NewM;
1885 return CD->isCopyConstructor();
1892 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1893 if (!RD->hasNameForLinkage())
1922 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1928 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1931 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1936 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1940 if (FD->doesThisDeclarationHaveABody() &&
1941 Context.DeclMustBeEmitted(FD))
1943 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1950 if (
Context.DeclMustBeEmitted(VD))
1953 if (VD->isStaticDataMember() &&
1956 if (VD->isStaticDataMember() &&
1958 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1961 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1970 return mightHaveNonExternalLinkage(D);
1977 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1983 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1998 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2002 bool IsAllIgnored =
true;
2003 for (
const auto *BD : DD->bindings()) {
2004 if (BD->isReferenced())
2006 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2007 BD->hasAttr<UnusedAttr>());
2020 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2030 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2033 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2034 if (!WithinFunction)
2045 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2048 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2049 Init = Cleanups->getSubExpr();
2051 const auto *Ty = VD->getType().getTypePtr();
2056 if (TT->getDecl()->hasAttr<UnusedAttr>())
2062 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2063 MTE && MTE->getExtendingDecl()) {
2064 Ty = VD->getType().getNonReferenceType().getTypePtr();
2065 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2070 if (Ty->isIncompleteType() || Ty->isDependentType())
2075 Ty = Ty->getBaseElementTypeUnsafe();
2077 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2078 if (Tag->hasAttr<UnusedAttr>())
2081 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2082 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2086 const auto *Construct =
2087 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2088 if (Construct && !Construct->isElidable()) {
2090 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2091 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2097 if (
Init->isTypeDependent()) {
2099 if (!Ctor->isTrivial())
2140 for (
auto *TmpD : D->
decls()) {
2141 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2143 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2157 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2169 DiagID = diag::warn_unused_exception_param;
2171 DiagID = diag::warn_unused_label;
2173 DiagID = diag::warn_unused_variable;
2192 if (Ty->isReferenceType() || Ty->isDependentType())
2195 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2196 if (Tag->hasAttr<UnusedAttr>())
2200 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2201 RD && !RD->hasAttr<WarnUnusedAttr>())
2208 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2214 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2221 assert(iter->getSecond() >= 0 &&
2222 "Found a negative number of references to a VarDecl");
2223 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2233 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2234 if (!UnusedCXXCondDecl)
2238 unsigned DiagID =
isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2239 : diag::warn_unused_but_set_variable;
2249 bool Diagnose =
false;
2253 Diagnose = L->
getStmt() ==
nullptr;
2264 "Scope shouldn't contain decls!");
2271 std::optional<SourceLocation> PreviousDeclLoc;
2276 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2281 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2284 for (
auto *TmpD : S->
decls()) {
2285 assert(TmpD &&
"This decl didn't get pushed??");
2293 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2295 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2304 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2315 auto ShadowI = ShadowingDecls.find(D);
2316 if (ShadowI != ShadowingDecls.end()) {
2317 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2318 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2319 PDiag(diag::warn_ctor_parm_shadows_field)
2320 << D << FD << FD->getParent());
2322 ShadowingDecls.erase(ShadowI);
2326 llvm::sort(DeclDiags,
2327 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2332 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2334 for (
const LocAndDiag &D : DeclDiags) {
2336 if (D.PreviousDeclLoc)
2337 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2361 return "ucontext.h";
2363 llvm_unreachable(
"unhandled error kind");
2374 Parent->
addDecl(CLinkageDecl);
2375 Parent = CLinkageDecl;
2379 if (
Context.BuiltinInfo.isImmediate(ID)) {
2381 "consteval builtins should only be available in C++20 mode");
2390 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2396 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2399 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2401 Params.push_back(parm);
2403 New->setParams(Params);
2411 Scope *S,
bool ForRedeclaration,
2418 if (!ForRedeclaration)
2424 Context.BuiltinInfo.allowTypeMismatch(ID))
2430 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2431 <<
Context.BuiltinInfo.getName(ID);
2437 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2439 <<
Context.BuiltinInfo.getName(ID);
2443 if (!ForRedeclaration &&
2444 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2445 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2446 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2447 : diag::ext_implicit_lib_function_decl)
2448 <<
Context.BuiltinInfo.getName(ID) << R;
2449 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2450 Diag(Loc, diag::note_include_header_or_declare)
2451 << Header <<
Context.BuiltinInfo.getName(ID);
2487 while (Filter.hasNext()) {
2496 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2498 Decl->getUnderlyingType()))
2503 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2504 Decl->getAnonDeclWithTypedefName())
2516 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2517 OldType = OldTypedef->getUnderlyingType();
2519 OldType =
Context.getTypeDeclType(Old);
2525 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2529 New->setInvalidDecl();
2533 if (OldType != NewType &&
2536 !
Context.hasSameType(OldType, NewType)) {
2538 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2539 << Kind << NewType << OldType;
2542 New->setInvalidDecl();
2552 if (
New->isInvalidDecl())
return;
2558 switch (TypeID->getLength()) {
2562 if (!TypeID->isStr(
"id"))
2565 if (!
T->isPointerType())
2567 if (!
T->isVoidPointerType()) {
2572 Context.setObjCIdRedefinitionType(
T);
2574 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2579 if (!TypeID->isStr(
"Class"))
2581 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2583 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2587 if (!TypeID->isStr(
"SEL"))
2589 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2591 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2601 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2602 <<
New->getDeclName();
2608 return New->setInvalidDecl();
2613 return New->setInvalidDecl();
2615 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2616 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2617 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2620 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2624 if (OldTD->isModed())
2625 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2626 OldTD->getUnderlyingType());
2628 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2684 Diag(
New->getLocation(), diag::err_redefinition)
2685 <<
New->getDeclName();
2687 return New->setInvalidDecl();
2702 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2705 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2706 <<
New->getDeclName();
2713 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2715 for (
auto *ECD : ED->enumerators()) {
2726 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2727 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2728 for (
const auto *i : D->
attrs())
2729 if (i->getKind() == A->
getKind()) {
2745 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2746 return VD->isThisDeclarationADefinition();
2747 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2748 return TD->isCompleteDefinition() || TD->isBeingDefined();
2759 AlignedAttr *OldAlignasAttr =
nullptr;
2760 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2761 unsigned OldAlign = 0;
2769 if (I->isAlignmentDependent())
2775 unsigned Align = I->getAlignment(S.
Context);
2776 if (Align > OldAlign) {
2778 OldStrictestAlignAttr = I;
2783 AlignedAttr *NewAlignasAttr =
nullptr;
2784 unsigned NewAlign = 0;
2785 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2786 if (I->isAlignmentDependent())
2792 unsigned Align = I->getAlignment(S.
Context);
2793 if (Align > NewAlign)
2797 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2805 if (OldAlign == 0 || NewAlign == 0) {
2818 if (OldAlign != NewAlign) {
2819 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2822 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2835 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2837 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2841 bool AnyAdded =
false;
2844 if (OldAlign > NewAlign) {
2845 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2846 Clone->setInherited(
true);
2847 New->addAttr(Clone);
2852 if (OldAlignasAttr && !NewAlignasAttr &&
2853 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2854 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2855 Clone->setInherited(
true);
2856 New->addAttr(Clone);
2863#define WANT_DECL_MERGE_LOGIC
2864#include "clang/Sema/AttrParsedAttrImpl.inc"
2865#undef WANT_DECL_MERGE_LOGIC
2872 if (!DiagnoseMutualExclusions(S, D,
Attr))
2883 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2885 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2886 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2887 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2888 AA->getPriority(), AA->getEnvironment());
2889 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2891 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2893 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2895 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2897 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2899 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2900 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2902 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2904 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2905 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2907 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2909 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2911 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2913 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2915 IA->getInheritanceModel());
2916 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2925 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2927 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2929 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2931 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2942 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2943 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2944 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2946 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2948 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2950 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2952 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2954 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2957 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2960 WS->getSpelledArgsCount());
2961 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2963 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2968 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2985 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
2986 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
2990 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2996 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2998 if (FD->isDefined(Def,
true))
3005 for (
const auto *Attribute : D->
attrs())
3006 if (Attribute->getKind() == Kind)
3014 if (!
New->hasAttrs())
3018 if (!Def || Def ==
New)
3022 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3023 Attr *NewAttribute = NewAttributes[I];
3032 NewAttributes.erase(NewAttributes.begin() + I);
3040 ? diag::err_alias_after_tentative
3041 : diag::err_redefinition;
3043 if (
Diag == diag::err_redefinition)
3053 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3089 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3090 if (AA->isAlignas()) {
3101 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3103 NewAttributes.erase(NewAttributes.begin() + I);
3113 diag::err_loader_uninitialized_redeclaration);
3115 NewAttributes.erase(NewAttributes.begin() + I);
3138 diag::err_sycl_entry_point_after_definition)
3151 diag::warn_attribute_precede_definition);
3153 NewAttributes.erase(NewAttributes.begin() + I);
3159 const ConstInitAttr *CIAttr,
3160 bool AttrBeforeInit) {
3167 std::string SuitableSpelling;
3169 SuitableSpelling = std::string(
3171 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3173 InsertLoc, {tok::l_square, tok::l_square,
3174 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3175 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3176 tok::r_square, tok::r_square}));
3177 if (SuitableSpelling.empty())
3179 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3180 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3181 tok::r_paren, tok::r_paren}));
3182 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3183 SuitableSpelling =
"constinit";
3184 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3185 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3186 if (SuitableSpelling.empty())
3187 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3188 SuitableSpelling +=
" ";
3190 if (AttrBeforeInit) {
3193 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3196 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3200 S.
Diag(CIAttr->getLocation(),
3201 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3202 : diag::warn_require_const_init_added_too_late)
3205 << CIAttr->isConstinit()
3213 UsedAttr *NewAttr = OldAttr->clone(
Context);
3214 NewAttr->setInherited(
true);
3215 New->addAttr(NewAttr);
3218 RetainAttr *NewAttr = OldAttr->clone(
Context);
3219 NewAttr->setInherited(
true);
3220 New->addAttr(NewAttr);
3229 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3230 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3231 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3239 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3242 if (InitDecl == NewVD) {
3246 if (OldConstInit && OldConstInit->isConstinit())
3249 }
else if (NewConstInit) {
3253 if (InitDecl && InitDecl != NewVD) {
3256 NewVD->dropAttr<ConstInitAttr>();
3264 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3265 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3266 if (!OldA->isEquivalent(NewA)) {
3268 Diag(
New->getLocation(), diag::err_different_asm_label);
3269 Diag(OldA->getLocation(), diag::note_previous_declaration);
3271 }
else if (Old->
isUsed()) {
3274 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3280 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3281 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3282 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3283 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3284 Diag(NewAbiTagAttr->getLocation(),
3285 diag::err_new_abi_tag_on_redeclaration)
3287 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3291 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3297 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3298 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3300 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3307 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3308 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3310 Diag(
New->getLocation(), diag::warn_mismatched_section)
3318 bool foundAny =
New->hasAttrs();
3348 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3361 if (!foundAny)
New->dropAttrs();
3366 checkAttrIsTypeDependent(D, A);
3377 newAttr->setInherited(
true);
3399 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3414 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3415 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3416 S.
Diag(CDA->getLocation(),
3417 diag::err_carries_dependency_missing_on_first_decl) << 1;
3425 diag::note_carries_dependency_missing_first_decl) << 1;
3444 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3445 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3453 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3485 if (*Oldnullability != *Newnullability) {
3486 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3503 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3504 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3505 if (OldParamDT && NewParamDT &&
3506 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3507 QualType OldParamOT = OldParamDT->getOriginalType();
3508 QualType NewParamOT = NewParamDT->getOriginalType();
3511 << NewParam << NewParamOT;
3522struct GNUCompatibleParamWarning {
3523 ParmVarDecl *OldParm;
3524 ParmVarDecl *NewParm;
3525 QualType PromotedType;
3532template <
typename T>
3533static std::pair<diag::kind, SourceLocation>
3537 if (Old->isThisDeclarationADefinition())
3538 PrevDiag = diag::note_previous_definition;
3539 else if (Old->isImplicit()) {
3540 PrevDiag = diag::note_previous_implicit_declaration;
3541 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3542 if (FD->getBuiltinID())
3543 PrevDiag = diag::note_previous_builtin_declaration;
3546 OldLocation =
New->getLocation();
3548 PrevDiag = diag::note_previous_declaration;
3549 return std::make_pair(PrevDiag, OldLocation);
3557 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3558 !LangOpts.CPlusPlus &&
3564 const AttributedType *AT =
T->getAs<AttributedType>();
3565 while (AT && !AT->isCallingConv())
3566 AT = AT->getModifiedType()->getAs<AttributedType>();
3570template <
typename T>
3584template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3591template<
typename ExpectedDecl>
3613 !Old->getDeclContext()->getRedeclContext()->Equals(
3614 New->getDeclContext()->getRedeclContext()) &&
3619 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3632 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3633 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3636 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3637 AttrA->isDynamic() == AttrB->isDynamic();
3663 if (NamedDC->Equals(SemaDC))
3666 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3668 "unexpected context for redeclaration");
3679 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3680 FixSemaDC(FD->getDescribedFunctionTemplate());
3681 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3682 FixSemaDC(VD->getDescribedVarTemplate());
3686 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3694 Diag(
New->getLocation(), diag::err_using_decl_friend);
3695 Diag(Shadow->getTargetDecl()->getLocation(),
3696 diag::note_using_decl_target);
3697 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3705 New->getDescribedFunctionTemplate()) {
3717 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3718 <<
New->getDeclName();
3742 std::tie(PrevDiag, OldLocation) =
3752 !
New->getTemplateSpecializationInfo() &&
3755 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3756 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3758 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3759 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3764 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3765 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3766 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3769 New->dropAttr<InternalLinkageAttr>();
3772 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3773 if (!Old->
hasAttr<ErrorAttr>()) {
3774 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3776 New->dropAttr<ErrorAttr>();
3784 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3785 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3786 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3795 const Decl *DiagOld = Old;
3797 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3798 const auto *A = D->getAttr<OverloadableAttr>();
3799 return A && !A->isImplicit();
3808 diag::note_attribute_overloadable_prev_overload)
3812 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3814 New->dropAttr<OverloadableAttr>();
3821 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3823 Diag(OldLocation, diag::note_previous_declaration);
3846 bool RequiresAdjustment =
false;
3848 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3854 if (!NewCCExplicit) {
3858 RequiresAdjustment =
true;
3866 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3870 RequiresAdjustment =
true;
3874 Diag(
New->getLocation(), diag::err_cconv_change)
3877 << (!FirstCCExplicit ?
"" :
3881 Diag(
First->getLocation(), diag::note_previous_declaration);
3889 RequiresAdjustment =
true;
3901 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3902 FPT2->getParamTypes(), EPI2);
3904 New->setType(NewQType);
3913 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3916 Diag(OldLocation, diag::note_previous_declaration);
3921 RequiresAdjustment =
true;
3927 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3928 <<
"'ns_returns_retained'";
3929 Diag(OldLocation, diag::note_previous_declaration);
3934 RequiresAdjustment =
true;
3940 AnyX86NoCallerSavedRegistersAttr *
Attr =
3941 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3942 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3943 Diag(OldLocation, diag::note_previous_declaration);
3948 RequiresAdjustment =
true;
3951 if (RequiresAdjustment) {
3955 NewQType =
Context.getCanonicalType(
New->getType());
3960 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3968 if (
New->hasAttr<GNUInlineAttr>() &&
3977 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
3978 <<
New->getDeclName();
3979 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3983 QualType OldQTypeForComparison = OldQType;
3984 if (
Context.hasAnyFunctionEffects()) {
3986 const auto NewFX =
New->getFunctionEffects();
3987 if (OldFX != NewFX) {
3989 for (
const auto &Diff : Diffs) {
3990 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
3992 diag::warn_mismatched_func_effect_redeclaration)
3993 << Diff.effectName();
4004 if (!MergeErrs.empty())
4011 NewFPT->getParamTypes(), EPI);
4013 New->setType(ModQT);
4014 NewQType =
New->getType();
4019 EPI = OldFPT->getExtProtoInfo();
4021 OldQTypeForComparison =
Context.getFunctionType(
4022 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4024 if (OldFX.empty()) {
4035 NewQType =
Context.getCanonicalType(
New->getType());
4043 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4044 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4046 OldDeclaredReturnType)) {
4051 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4053 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4054 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4055 <<
New <<
New->getReturnTypeSourceRange();
4057 !Old->
hasAttr<OverloadableAttr>() &&
4058 !
New->hasAttr<OverloadableAttr>())
4059 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4061 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4062 <<
New->getReturnTypeSourceRange();
4063 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4073 if (OldReturnType != NewReturnType) {
4077 if (OldAT && OldAT->isDeduced()) {
4078 QualType DT = OldAT->getDeducedType();
4089 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4091 if (OldMethod && NewMethod) {
4098 bool IsClassScopeExplicitSpecialization =
4104 !IsClassScopeExplicitSpecialization) {
4109 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4110 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4121 NewDiag = diag::err_constructor_redeclared;
4123 NewDiag = diag::err_destructor_redeclared;
4125 NewDiag = diag::err_conv_function_redeclared;
4127 NewDiag = diag::err_member_redeclared;
4129 Diag(
New->getLocation(), NewDiag);
4131 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4132 <<
New <<
New->getType();
4134 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4147 diag::err_definition_of_implicitly_declared_member)
4153 diag::err_definition_of_explicitly_defaulted_member)
4176 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4177 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4178 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4187 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4188 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4189 Diag(CDA->getLocation(),
4190 diag::err_carries_dependency_missing_on_first_decl) << 0;
4192 diag::note_carries_dependency_missing_first_decl) << 0;
4200 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4201 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4202 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4217 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4231 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4232 Diag(OldLocation, PrevDiag);
4234 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4235 Diag(OldLocation, PrevDiag);
4242 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4250 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4260 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4288 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4292 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4310 if (
New->hasWrittenPrototype()) {
4322 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4323 if (WithoutProto ==
New)
4324 IsWithoutProtoADef = NewDeclIsDefn;
4326 IsWithProtoADef = NewDeclIsDefn;
4328 diag::warn_non_prototype_changes_behavior)
4329 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4330 << (WithoutProto == Old) << IsWithProtoADef;
4340 !IsWithoutProtoADef)
4346 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4351 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4354 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4355 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4356 OldProto->getParamTypes(),
4357 OldProto->getExtProtoInfo());
4358 New->setType(NewQType);
4359 New->setHasInheritedPrototype();
4363 for (
const auto &ParamType : OldProto->param_types()) {
4366 ParamType,
nullptr,
SC_None,
nullptr);
4367 Param->setScopeInfo(0, Params.size());
4368 Param->setImplicit();
4369 Params.push_back(Param);
4372 New->setParams(Params);
4381 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4408 NewProto->getReturnType());
4409 bool LooseCompatible = !MergedReturn.isNull();
4411 LooseCompatible && Idx != End; ++Idx) {
4415 NewProto->getParamType(Idx))) {
4416 ArgTypes.push_back(NewParm->
getType());
4420 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4421 NewProto->getParamType(Idx) };
4422 Warnings.push_back(Warn);
4423 ArgTypes.push_back(NewParm->
getType());
4425 LooseCompatible =
false;
4428 if (LooseCompatible) {
4429 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4430 Diag(Warnings[Warn].NewParm->getLocation(),
4431 diag::ext_param_promoted_not_compatible_with_prototype)
4432 << Warnings[Warn].PromotedType
4433 << Warnings[Warn].OldParm->getType();
4434 if (Warnings[Warn].OldParm->getLocation().isValid())
4435 Diag(Warnings[Warn].OldParm->getLocation(),
4436 diag::note_previous_declaration);
4439 if (MergeTypeWithOld)
4440 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4457 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4458 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4459 Diag(OldLocation, diag::note_previous_builtin_declaration)
4464 PrevDiag = diag::note_previous_builtin_declaration;
4467 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4468 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4473 Scope *S,
bool MergeTypeWithOld) {
4479 New->setIsPureVirtual();
4488 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4502 if (!Merged.isNull() && MergeTypeWithOld)
4503 New->setType(Merged);
4527 ni != ne && oi != oe; ++ni, ++oi)
4536 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4537 ? diag::err_redefinition_different_type
4538 : diag::err_redeclaration_different_type)
4543 std::tie(PrevDiag, OldLocation)
4545 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4546 New->setInvalidDecl();
4550 bool MergeTypeWithOld) {
4556 if (
New->getType()->isUndeducedType()) {
4578 QualType PrevVDTy = PrevVD->getType();
4582 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4590 MergedT =
New->getType();
4601 else if (
New->getType()->isObjCObjectPointerType() &&
4603 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4618 if ((
New->getType()->isDependentType() ||
4623 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4632 if (MergeTypeWithOld)
4633 New->setType(MergedT);
4667 if (
New->isInvalidDecl())
4680 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4684 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4686 return New->setInvalidDecl();
4688 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4691 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4693 return New->setInvalidDecl();
4697 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4698 <<
New->getDeclName();
4700 New->getLocation());
4701 return New->setInvalidDecl();
4713 return New->setInvalidDecl();
4720 Diag(
New->getLocation(), diag::err_duplicate_member)
4721 <<
New->getIdentifier();
4723 New->setInvalidDecl();
4729 if (
New->hasAttr<WeakImportAttr>())
4732 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4735 New->dropAttr<WeakImportAttr>();
4740 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4741 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4742 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4745 New->dropAttr<InternalLinkageAttr>();
4750 if (MostRecent != Old) {
4753 if (
New->isInvalidDecl())
4758 if (
New->isInvalidDecl())
4763 std::tie(PrevDiag, OldLocation) =
4768 !
New->isStaticDataMember() &&
4771 Diag(
New->getLocation(), diag::ext_static_non_static)
4772 <<
New->getDeclName();
4773 Diag(OldLocation, PrevDiag);
4775 Diag(
New->getLocation(), diag::err_static_non_static)
4776 <<
New->getDeclName();
4777 Diag(OldLocation, PrevDiag);
4778 return New->setInvalidDecl();
4792 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4793 !
New->isStaticDataMember() &&
4795 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4796 Diag(OldLocation, PrevDiag);
4797 return New->setInvalidDecl();
4801 if (
New->hasExternalStorage() &&
4803 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4804 Diag(OldLocation, PrevDiag);
4805 return New->setInvalidDecl();
4808 !
New->hasExternalStorage()) {
4809 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4810 Diag(OldLocation, PrevDiag);
4811 return New->setInvalidDecl();
4821 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4824 !
New->getLexicalDeclContext()->isRecord())) {
4825 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4826 Diag(OldLocation, PrevDiag);
4827 return New->setInvalidDecl();
4835 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4836 Diag(Def->getLocation(), diag::note_previous_definition);
4850 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4851 Diag(OldLocation, PrevDiag);
4852 }
else if (!
New->getTLSKind()) {
4853 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4854 Diag(OldLocation, PrevDiag);
4860 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4862 Diag(OldLocation, PrevDiag);
4872 diag::warn_deprecated_redundant_constexpr_static_def);
4885 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4892 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4893 Diag(OldLocation, PrevDiag);
4894 New->setInvalidDecl();
4903 New->setPreviousDecl(Old);
4913 New->setImplicitlyInline();
4918 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4920 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4921 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4922 auto &HSI =
PP.getHeaderSearchInfo();
4923 StringRef HdrFilename =
4926 auto noteFromModuleOrInclude = [&](
Module *Mod,
4932 if (IncLoc.isValid()) {
4934 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4940 Diag(IncLoc, diag::note_redefinition_include_same_file)
4941 << HdrFilename.str();
4951 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4959 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4975 New->getDescribedVarTemplate() ||
New->getNumTemplateParameterLists() ||
4976 New->getDeclContext()->isDependentContext() ||
4977 New->hasAttr<SelectAnyAttr>())) {
4980 New->demoteThisDefinitionToDeclaration();
4988 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
4990 New->setInvalidDecl();
5016 if (!
Context.getLangOpts().CPlusPlus)
5022 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5025 Context.getManglingNumberContext(Tag->getParent());
5034 Decl *ManglingContextDecl;
5035 std::tie(MCtx, ManglingContextDecl) =
5045struct NonCLikeKind {
5057 explicit operator bool() {
return Kind !=
None; }
5065 return {NonCLikeKind::Invalid, {}};
5072 return {NonCLikeKind::BaseClass,
5084 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5085 if (FD->hasInClassInitializer()) {
5086 auto *
Init = FD->getInClassInitializer();
5087 return {NonCLikeKind::DefaultMemberInit,
5103 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5111 if (MemberRD->isLambda())
5112 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5116 if (MemberRD->isThisDeclarationADefinition()) {
5122 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5139 Context.getCanonicalTagType(TagFromDeclSpec))) {
5141 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5152 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5156 if (NonCLike || ChangesLinkage) {
5157 if (NonCLike.Kind == NonCLikeKind::Invalid)
5160 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5161 if (ChangesLinkage) {
5163 if (NonCLike.Kind == NonCLikeKind::None)
5164 DiagID = diag::err_typedef_changes_linkage;
5166 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5172 TextToInsert +=
' ';
5175 Diag(FixitLoc, DiagID)
5178 if (NonCLike.Kind != NonCLikeKind::None) {
5179 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5180 << NonCLike.Kind - 1 << NonCLike.Range;
5183 << NewTD << isa<TypeAliasDecl>(NewTD);
5208 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5209 if (ED->isScopedUsingClassTag())
5216 llvm_unreachable(
"unexpected type specifier");
5224 bool IsExplicitInstantiation,
5227 Decl *TagD =
nullptr;
5245 Tag = CTD->getTemplatedDecl();
5250 Tag->setFreeStanding();
5251 if (Tag->isInvalidDecl())
5260 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5297 "Friend ellipsis but not friend-specified?");
5300 bool DeclaresAnything =
true;
5304 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5307 Record->getDeclContext()->isRecord()) {
5321 DeclaresAnything =
false;
5340 if ((Tag && Tag->getDeclName()) ||
5350 DeclaresAnything =
false;
5362 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5363 !
Enum->isInvalidDecl())
5364 DeclaresAnything =
false;
5372 DeclaresAnything =
false;
5376 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5378 << Tag->getTagKind()
5391 if (!DeclaresAnything) {
5394 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5395 ? diag::err_no_declarators
5396 : diag::ext_no_declarators)
5409 unsigned DiagID = diag::warn_standalone_specifier;
5411 DiagID = diag::ext_standalone_specifier;
5452 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5453 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5455 DiagnosticId = diag::warn_attribute_ignored;
5456 else if (AL.isRegularKeywordAttribute())
5457 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5459 DiagnosticId = diag::warn_declspec_attribute_ignored;
5460 Diag(AL.getLoc(), DiagnosticId)
5464 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5465 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5489 assert(PrevDecl &&
"Expected a non-null Decl");
5502 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5504 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5510 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5520 if (
Record->isAnonymousStructOrUnion())
5525 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5559 for (
auto *D : AnonRecord->
decls()) {
5582 unsigned OldChainingSize = Chaining.size();
5584 Chaining.append(IF->chain_begin(), IF->chain_end());
5586 Chaining.push_back(VD);
5588 assert(Chaining.size() >= 2);
5591 for (
unsigned i = 0; i < Chaining.size(); i++)
5592 NamedChain[i] = Chaining[i];
5596 VD->
getType(), {NamedChain, Chaining.size()});
5610 Chaining.resize(OldChainingSize);
5624 "Parser allowed 'typedef' as storage class VarDecl.");
5625 switch (StorageClassSpec) {
5639 llvm_unreachable(
"unknown storage class specifier");
5643 assert(
Record->hasInClassInitializer());
5645 for (
const auto *I :
Record->decls()) {
5646 const auto *FD = dyn_cast<FieldDecl>(I);
5647 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5648 FD = IFD->getAnonField();
5649 if (FD && FD->hasInClassInitializer())
5650 return FD->getLocation();
5653 llvm_unreachable(
"couldn't find in-class initializer");
5661 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5681 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5683 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5685 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5691 const char *PrevSpec =
nullptr;
5703 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5708 PrevSpec, DiagID, Policy);
5716 diag::err_anonymous_union_with_storage_spec)
5722 PrevSpec, DiagID,
Context.getPrintingPolicy());
5730 <<
Record->isUnion() <<
"const"
5734 diag::ext_anonymous_struct_union_qualified)
5735 <<
Record->isUnion() <<
"volatile"
5739 diag::ext_anonymous_struct_union_qualified)
5740 <<
Record->isUnion() <<
"restrict"
5744 diag::ext_anonymous_struct_union_qualified)
5745 <<
Record->isUnion() <<
"_Atomic"
5749 diag::ext_anonymous_struct_union_qualified)
5750 <<
Record->isUnion() <<
"__unaligned"
5760 for (
auto *Mem :
Record->decls()) {
5762 if (Mem->isInvalidDecl())
5765 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5769 assert(FD->getAccess() !=
AS_none);
5771 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5783 }
else if (Mem->isImplicit()) {
5790 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5791 if (!MemRecord->isAnonymousStructOrUnion() &&
5792 MemRecord->getDeclName()) {
5795 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5799 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5807 Diag(MemRecord->getLocation(),
5808 diag::ext_anonymous_record_with_anonymous_type)
5818 unsigned DK = diag::err_anonymous_record_bad_member;
5820 DK = diag::err_anonymous_record_with_type;
5822 DK = diag::err_anonymous_record_with_function;
5824 DK = diag::err_anonymous_record_with_static;
5828 DK == diag::err_anonymous_record_with_type)
5829 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5832 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5848 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5869 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5873 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5889 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5895 Record->getLocation(),
nullptr,
5911 Record->setAnonymousStructOrUnion(
true);
5922 Chain.push_back(Anon);
5928 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5931 Decl *ManglingContextDecl;
5932 std::tie(MCtx, ManglingContextDecl) =
5951 assert(
Record &&
"expected a record!");
5956 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5964 nullptr, RecTy, TInfo,
5976 Chain.push_back(Anon);
5980 diag::err_field_incomplete_or_sizeless) ||
5985 ParentDecl->setInvalidDecl();
6022 diag::err_deduction_guide_name_not_class_template)
6042 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6052 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6053 Context.getCanonicalType(Ty)));
6064 Context.getCanonicalType(Ty)));
6085 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6097 Context.getCanonicalType(Ty)));
6105 return Context.getNameForTemplate(TName, TNameLoc);
6110 llvm_unreachable(
"Unknown name kind");
6138 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6143 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6151 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6152 (DeclTyName && DeclTyName == DefTyName))
6153 Params.push_back(Idx);
6180#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6181#include "clang/Basic/TransformTypeTraits.def"
6186 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6196 if (!TSI)
return true;
6209 if (Result.isInvalid())
return true;
6254 << D << static_cast<int>(Status);
6265 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6266 llvm::omp::TraitProperty::
6267 implementation_extension_bind_to_declaration))
6292 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6303 bool IsMemberSpecialization) {
6304 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6305 "without nested-name-specifier");
6321 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6322 : diag::err_member_extra_qualification)
6326 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6334 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6336 Diag(Loc, diag::err_member_qualification)
6339 Diag(Loc, diag::err_invalid_declarator_global_scope)
6342 Diag(Loc, diag::err_invalid_declarator_in_function)
6345 Diag(Loc, diag::err_invalid_declarator_in_block)
6349 Diag(Loc, diag::err_export_non_namespace_scope_name)
6356 Diag(Loc, diag::err_invalid_declarator_scope)
6364 Diag(Loc, diag::err_member_qualification)
6391 Diag(Loc, diag::ext_template_after_declarative_nns)
6396 TL = std::exchange(NextTL,
TypeLoc())) {
6398 switch (TL.getTypeLocClass()) {
6399 case TypeLoc::TemplateSpecialization: {
6401 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6402 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6403 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6404 << TST.getLocalSourceRange();
6407 case TypeLoc::Decltype:
6408 case TypeLoc::PackIndexing: {
6409 const Type *
T = TL.getTypePtr();
6416 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6417 <<
T->isDecltypeType() << TL.getSourceRange();
6420 case TypeLoc::DependentName:
6427 if (TemplateKeywordLoc.
isValid())
6428 Diag(Loc, diag::ext_template_after_declarative_nns)
6469 diag::err_template_qualified_declarator_no_match)
6476 if (!IsDependentContext &&
6483 diag::err_member_def_undefined_record)
6504 if (EnteringContext && IsDependentContext &&
6505 TemplateParamLists.size() != 0) {
6524 bool IsLinkageLookup =
false;
6525 bool CreateBuiltins =
false;
6539 IsLinkageLookup =
true;
6541 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6542 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6544 CreateBuiltins =
true;
6546 if (IsLinkageLookup) {
6588 bool AllowForCompatibility =
false;
6591 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6592 TemplateParamParent->isDeclScope(TPD);
6595 AllowForCompatibility);
6625 bool AddToScope =
true;
6627 if (TemplateParamLists.size()) {
6649 if (
New->getDeclName() && AddToScope)
6652 if (
OpenMP().isInOpenMPDeclareTargetContext())
6663 bool &SizeIsNegative,
6664 llvm::APSInt &Oversized) {
6669 SizeIsNegative =
false;
6672 if (
T->isDependentType())
6678 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6683 if (FixedType.
isNull())
return FixedType;
6684 FixedType = Context.getPointerType(FixedType);
6685 return Qs.
apply(Context, FixedType);
6687 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6688 QualType Inner = PTy->getInnerType();
6692 if (FixedType.
isNull())
return FixedType;
6693 FixedType = Context.getParenType(FixedType);
6694 return Qs.
apply(Context, FixedType);
6704 SizeIsNegative, Oversized);
6714 llvm::APSInt Res = Result.Val.getInt();
6717 if (Res.isSigned() && Res.isNegative()) {
6718 SizeIsNegative =
true;
6723 unsigned ActiveSizeBits =
6727 : Res.getActiveBits();
6733 QualType FoldedArrayType = Context.getConstantArrayType(
6735 return Qs.
apply(Context, FoldedArrayType);
6760 TypeLoc DstElemTL = DstATL.getElementLoc();
6779 bool &SizeIsNegative,
6780 llvm::APSInt &Oversized) {
6783 SizeIsNegative, Oversized);
6786 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6794 unsigned FailedFoldDiagID) {
6795 bool SizeIsNegative;
6796 llvm::APSInt Oversized;
6798 TInfo,
Context, SizeIsNegative, Oversized);
6800 Diag(Loc, diag::ext_vla_folded_to_constant);
6807 Diag(Loc, diag::err_typecheck_negative_array_size);
6808 else if (Oversized.getBoolValue())
6810 Oversized, 10, Oversized.isSigned(),
false,
6812 else if (FailedFoldDiagID)
6813 Diag(Loc, FailedFoldDiagID);
6825 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6830 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6839 diag::err_virtual_non_function);
6843 diag::err_explicit_non_function);
6847 diag::err_noreturn_non_function);
6868 ? diag::warn_ms_inline_non_function
6869 : diag::err_inline_non_function)
6873 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6878 diag::err_deduction_guide_invalid_specifier)
6887 if (!NewTD)
return nullptr;
6908 if (
T->isVariablyModifiedType()) {
6912 bool SizeIsNegative;
6913 llvm::APSInt Oversized;
6924 else if (
T->isVariableArrayType())
6926 else if (Oversized.getBoolValue())
6963 switch (II->getNotableIdentifierID()) {
6964 case tok::NotableIdentifierKind::FILE:
6967 case tok::NotableIdentifierKind::jmp_buf:
6968 Context.setjmp_bufDecl(NewTD);
6970 case tok::NotableIdentifierKind::sigjmp_buf:
6971 Context.setsigjmp_bufDecl(NewTD);
6973 case tok::NotableIdentifierKind::ucontext_t:
6974 Context.setucontext_tDecl(NewTD);
6976 case tok::NotableIdentifierKind::float_t:
6977 case tok::NotableIdentifierKind::double_t:
6978 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7015 if (Context.getLangOpts().CPlusPlus) {
7039 if (!OuterContext->
Equals(PrevOuterContext))
7048 if (!SS.
isSet())
return;
7053 if (
Decl->getType().hasAddressSpace())
7055 if (
Decl->getType()->isDependentType())
7067 Var->hasGlobalStorage())
7071 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
7072 auto OrigTy = DT->getOriginalType();
7073 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
7076 OrigTy =
Context.getAddrSpaceQualType(OrigTy, ImplAS);
7104 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7113 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7114 if (VD->hasInit()) {
7115 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7116 assert(VD->isThisDeclarationADefinition() &&
7117 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7119 VD->dropAttr<AliasAttr>();
7128 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7131 diag::err_attribute_selectany_non_extern_data);
7138 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7141 diag::warn_attribute_hybrid_patchable_non_extern);
7147 auto *VD = dyn_cast<VarDecl>(&ND);
7148 bool IsAnonymousNS =
false;
7151 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7152 while (NS && !IsAnonymousNS) {
7154 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7161 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7163 (!AnonNSInMicrosoftMode &&
7174 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7175 FD = FD->getMostRecentDecl();
7180 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7186 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7187 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7188 int NoImplicitObjectError = -1;
7190 NoImplicitObjectError = 0;
7191 else if (MD->isStatic())
7192 NoImplicitObjectError = 1;
7193 else if (MD->isExplicitObjectMemberFunction())
7194 NoImplicitObjectError = 2;
7195 if (NoImplicitObjectError != -1) {
7196 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7197 << NoImplicitObjectError << A->getRange();
7199 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7201 }
else if (MD->getReturnType()->isVoidType()) {
7205 err_lifetimebound_implicit_object_parameter_void_return_type);
7210 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7215 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7217 S.
Diag(A->getLocation(),
7218 diag::err_lifetimebound_parameter_void_return_type);
7226 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7227 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7247 bool IsSpecialization,
7248 bool IsDefinition) {
7252 bool IsTemplate =
false;
7253 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7254 OldDecl = OldTD->getTemplatedDecl();
7256 if (!IsSpecialization)
7257 IsDefinition =
false;
7259 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7260 NewDecl = NewTD->getTemplatedDecl();
7264 if (!OldDecl || !NewDecl)
7267 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7268 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7269 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7270 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7274 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7275 (NewExportAttr && !NewExportAttr->isInherited());
7281 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7283 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7285 bool JustWarn =
false;
7287 auto *VD = dyn_cast<VarDecl>(OldDecl);
7288 if (VD && !VD->getDescribedVarTemplate())
7290 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7302 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7303 : diag::err_attribute_dll_redeclaration;
7306 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7319 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7321 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7324 IsStaticDataMember = VD->isStaticDataMember();
7325 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7327 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7328 IsInline = FD->isInlined();
7329 IsQualifiedFriend = FD->getQualifier() &&
7333 if (OldImportAttr && !HasNewAttr &&
7334 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7336 if (IsMicrosoftABI && IsDefinition) {
7337 if (IsSpecialization) {
7340 diag::err_attribute_dllimport_function_specialization_definition);
7341 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7342 NewDecl->
dropAttr<DLLImportAttr>();
7345 diag::warn_redeclaration_without_import_attribute)
7348 NewDecl->
dropAttr<DLLImportAttr>();
7349 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7350 S.
Context, NewImportAttr->getRange()));
7352 }
else if (IsMicrosoftABI && IsSpecialization) {
7353 assert(!IsDefinition);
7357 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7358 << NewDecl << OldImportAttr;
7360 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7361 OldDecl->
dropAttr<DLLImportAttr>();
7362 NewDecl->
dropAttr<DLLImportAttr>();
7364 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7367 OldDecl->
dropAttr<DLLImportAttr>();
7368 NewDecl->
dropAttr<DLLImportAttr>();
7370 diag::warn_dllimport_dropped_from_inline_function)
7371 << NewDecl << OldImportAttr;
7378 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7380 !NewImportAttr && !NewExportAttr) {
7381 if (
const DLLExportAttr *ParentExportAttr =
7382 MD->getParent()->getAttr<DLLExportAttr>()) {
7383 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7384 NewAttr->setInherited(
true);
7436 return D->isExternC();
7453 llvm_unreachable(
"Unexpected context");
7463 llvm_unreachable(
"Unexpected context");
7508 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7509 return FD->isExternC();
7510 if (
const auto *VD = dyn_cast<VarDecl>(D))
7511 return VD->isExternC();
7513 llvm_unreachable(
"Unknown type of decl!");
7526 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7540 diag::err_invalid_type_for_program_scope_var)
7569 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7602 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7612template <
typename AttrTy>
7615 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7616 AttrTy *Clone = Attribute->clone(S.
Context);
7617 Clone->setInherited(
true);
7645 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7647 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7657 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7671 QualType R = TInfo->
getType();
7676 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7680 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7682 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7692 const auto &TI =
Context.getTargetInfo();
7693 bool HasSizeMismatch;
7695 if (!TI.isValidGCCRegisterName(Label))
7696 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7697 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7699 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7700 else if (HasSizeMismatch)
7701 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7706 diag::err_asm_unsupported_register_type)
7721 bool IsPlaceholderVariable =
false;
7727 if (!Decomp.bindings().empty()) {
7728 II = Decomp.bindings()[0].Name;
7742 IsPlaceholderVariable =
true;
7750 if (IsPlaceholderVariable)
7764 bool IsLocalExternDecl = SC ==
SC_Extern &&
7783 : diag::warn_deprecated_register)
7806 const AutoType *AT = TL.getTypePtr();
7810 bool IsMemberSpecialization =
false;
7811 bool IsVariableTemplateSpecialization =
false;
7813 bool IsVariableTemplate =
false;
7842 false, IsMemberSpecialization,
Invalid);
7844 if (TemplateParams) {
7851 if (!TemplateParams->
size() &&
7856 diag::err_template_variable_noparams)
7860 TemplateParams =
nullptr;
7868 IsVariableTemplateSpecialization =
true;
7872 IsVariableTemplate =
true;
7880 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7885 "should have a 'template<>' for this decl");
7888 bool IsExplicitSpecialization =
7899 (IsExplicitSpecialization || IsMemberSpecialization)) {
7901 diag::ext_explicit_specialization_storage_class)
7907 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7913 if (Ctxt->isFunctionOrMethod()) {
7914 FunctionOrMethod = Ctxt;
7917 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7919 AnonStruct = ParentDecl;
7923 if (FunctionOrMethod) {
7927 diag::err_static_data_member_not_allowed_in_local_class)
7928 << Name << RD->getDeclName() << RD->getTagKind();
7929 }
else if (AnonStruct) {
7934 diag::err_static_data_member_not_allowed_in_anon_struct)
7937 }
else if (RD->isUnion()) {
7941 diag_compat::static_data_member_in_union)
7959 diag::err_static_out_of_line)
7972 diag::err_storage_class_for_static_member)
7977 llvm_unreachable(
"C storage class in c++!");
7981 if (IsVariableTemplateSpecialization) {
7983 TemplateParamLists.size() > 0
7984 ? TemplateParamLists[0]->getTemplateLoc()
7987 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8002 if (IsVariableTemplate) {
8005 TemplateParams, NewVD);
8026 unsigned VDTemplateParamLists =
8027 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8028 if (TemplateParamLists.size() > VDTemplateParamLists)
8030 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8037 }
else if (
CurContext->isFunctionOrMethod()) {
8040 diag::err_inline_declaration_block_scope) << Name
8045 : diag::compat_pre_cxx17_inline_variable);
8056 if (IsLocalExternDecl) {
8059 B->setLocalExternDecl();
8064 bool EmitTLSUnsupportedError =
false;
8077 diag::err_thread_non_global)
8079 else if (!
Context.getTargetInfo().isTLSSupported()) {
8084 EmitTLSUnsupportedError =
true;
8091 diag::err_thread_unsupported);
8102 diag::err_constexpr_wrong_decl_kind)
8103 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8113 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8120 diag::err_constinit_local_variable);
8124 ConstInitAttr::Keyword_constinit));
8142 diag::warn_static_local_in_extern_inline);
8148 if (IsVariableTemplateSpecialization)
8153 else if (IsMemberSpecialization)
8168 B->setModulePrivate();
8178 diag::err_opencl_unknown_type_specifier)
8188 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8189 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8205 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8235 if (EmitTLSUnsupportedError &&
8238 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8240 diag::err_thread_unsupported);
8242 if (EmitTLSUnsupportedError &&
8249 (NewVD->
hasAttr<CUDASharedAttr>() ||
8250 NewVD->
hasAttr<CUDAConstantAttr>())) {
8258 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8259 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8264 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8271 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8283 IsMemberSpecialization ||
8284 IsVariableTemplateSpecialization);
8298 if (IsMemberSpecialization && !IsVariableTemplate &&
8299 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8316 !IsVariableTemplateSpecialization) {
8324 if (!IsPlaceholderVariable)
8355 if (PrevVarTemplate &&
8375 Decl *ManglingContextDecl;
8376 std::tie(MCtx, ManglingContextDecl) =
8512 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8513 if (
const auto *MD =
8517 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8523 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8526 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8531 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8532 if (shadowedVar->isExternC()) {
8535 for (
auto *I : shadowedVar->redecls())
8536 if (I->isFileVarDecl()) {
8544 unsigned WarningDiag = diag::warn_decl_shadow;
8547 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8553 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8559 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8565 ->ShadowingDecls.push_back({D, VD});
8576 ->ShadowingDecls.push_back({D, ShadowedDecl});
8582 bool HasLocalStorage =
false;
8583 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8584 HasLocalStorage = VD->hasLocalStorage();
8585 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8589 if (HasLocalStorage) {
8594 ParentDC && !ParentDC->
Equals(OldDC);
8637 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8644 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8650 Diag(Shadow.VD->getLocation(),
8651 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8652 : diag::warn_decl_shadow)
8653 << Shadow.VD->getDeclName()
8656 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8657 << Shadow.VD->getDeclName() << 0;
8660 Diag(Shadow.VD->getLocation(),
8662 : diag::warn_decl_shadow_uncaptured_local)
8663 << Shadow.VD->getDeclName()
8689 auto *DRE = dyn_cast<DeclRefExpr>(E);
8693 auto I = ShadowingDecls.find(D);
8694 if (I == ShadowingDecls.end())
8696 const NamedDecl *ShadowedDecl = I->second;
8698 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8703 ShadowingDecls.erase(I);
8711 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8770 assert(Prev &&
"should have found a previous declaration to diagnose");
8772 Prev = FD->getFirstDecl();
8776 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8798 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8810 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8830 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8840 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8848 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8864 if (
T->isUndeducedType())
8870 if (
T->isObjCObjectType()) {
8873 T =
Context.getObjCObjectPointerType(
T);
8904 if (NewVD->
hasAttr<BlocksAttr>()) {
8909 if (
T->isBlockPointerType()) {
8912 if (!
T.isConstQualified()) {
8913 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8919 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8928 if (!
T->isSamplerT() && !
T->isDependentType() &&
8935 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8936 <<
Scope <<
"global or constant";
8938 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8939 <<
Scope <<
"constant";
8955 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
8967 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
8992 && !NewVD->
hasAttr<BlocksAttr>()) {
9003 if (
T->isWebAssemblyTableType()) {
9014 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
9015 if (!ATy || ATy->getZExtSize() != 0) {
9017 diag::err_typecheck_wasm_table_must_have_zero_length);
9027 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9030 ArrayT && ArrayT->isZeroSize()) {
9036 bool isVM =
T->isVariablyModifiedType();
9037 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9043 bool SizeIsNegative;
9044 llvm::APSInt Oversized;
9049 FixedT = FixedTInfo->
getType();
9050 else if (FixedTInfo) {
9056 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9089 if (
T->isVoidType()) {
9107 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9113 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9126 !
T->isDependentType() &&
9128 diag::err_constexpr_var_non_literal)) {
9134 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9144 llvm::StringMap<bool> CallerFeatureMap;
9145 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9147 CallerFeatureMap)) {
9155 llvm::StringMap<bool> CallerFeatureMap;
9156 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9189 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9194 Name =
Context.DeclarationNames.getCXXDestructorName(
9195 Context.getCanonicalTagType(BaseRecord));
9200 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9207 if (Overridden.insert(BaseMD).second) {
9224 return !Overridden.empty();
9230 struct ActOnFDArgs {
9244 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9245 CXXRecordDecl *Parent)
9246 : Context(Context), OriginalFD(TypoFD),
9249 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9253 SmallVector<unsigned, 1> MismatchedParams;
9255 CDeclEnd = candidate.
end();
9256 CDecl != CDeclEnd; ++CDecl) {
9257 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9261 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9262 CXXRecordDecl *Parent = MD->getParent();
9265 }
else if (!ExpectedParent) {
9274 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9275 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9279 ASTContext &Context;
9280 FunctionDecl *OriginalFD;
9281 CXXRecordDecl *ExpectedParent;
9301 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9309 IsLocalFriend ? diag::err_no_matching_local_friend :
9311 diag::err_member_decl_does_not_match;
9323 "Cannot have an ambiguity in previous-declaration lookup");
9325 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9327 if (!Prev.
empty()) {
9336 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9337 NearMatches.push_back(std::make_pair(FD, ParamNum));
9345 IsLocalFriend ?
nullptr : NewDC))) {
9352 CDeclEnd = Correction.
end();
9353 CDecl != CDeclEnd; ++CDecl) {
9373 ExtraArgs.S, ExtraArgs.D,
9376 ExtraArgs.AddToScope);
9387 if ((*I)->getCanonicalDecl() == Canonical)
9394 SemaRef.
PDiag(IsLocalFriend
9395 ? diag::err_no_matching_local_friend_suggest
9396 : diag::err_member_decl_does_not_match_suggest)
9397 << Name << NewDC << IsDefinition);
9410 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9413 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9419 bool NewFDisConst = NewMD && NewMD->
isConst();
9422 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9423 NearMatch != NearMatchEnd; ++NearMatch) {
9426 bool FDisConst = MD && MD->
isConst();
9427 bool IsMember = MD || !IsLocalFriend;
9430 if (
unsigned Idx = NearMatch->second) {
9434 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9435 : diag::note_local_decl_close_param_match)
9438 }
else if (FDisConst != NewFDisConst) {
9440 diag::note_member_def_close_const_match)
9445 else if (FTI.hasMethodTypeQualifiers() &&
9446 FTI.getConstQualifierLoc().isValid())
9450 IsMember ? diag::note_member_def_close_match
9451 : diag::note_local_decl_close_match);
9459 default: llvm_unreachable(
"Unknown storage class!");
9464 diag::err_typecheck_sclass_func);
9481 diag::err_static_block_func);
9497 bool &IsVirtualOkay) {
9511 diag::err_c23_constexpr_not_variable);
9514 diag::err_constexpr_wrong_decl_kind)
9515 <<
static_cast<int>(ConstexprKind);
9539 "Strict prototypes are required");
9560 "Constructors can only be declared in a member context");
9566 isInline,
false, ConstexprKind,
9577 false, ConstexprKind,
9578 TrailingRequiresClause);
9581 if (
Record->isBeingDefined())
9590 IsVirtualOkay =
true;
9602 true, ConstexprKind, TrailingRequiresClause);
9608 diag::err_conv_function_not_member);
9616 IsVirtualOkay =
true;
9621 TrailingRequiresClause);
9648 IsVirtualOkay = !Ret->isStatic();
9662 true , ConstexprKind, TrailingRequiresClause);
9679 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9687 if (Names.end() !=
Match)
9692 }
while (DesugaredTy != Ty);
9731 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9733 bool IsStandardLayoutType =
true;
9739 if (!CXXRec->hasDefinition())
9740 CXXRec = CXXRec->getTemplateInstantiationPattern();
9741 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9742 IsStandardLayoutType =
false;
9745 !IsStandardLayoutType)
9793 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9807 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9820 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9829 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9846 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9854 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9855 PT = Typedef->desugar();
9877 HistoryStack.push_back(
nullptr);
9882 VisitStack.push_back(PD);
9883 assert(VisitStack.back() &&
"First decl null?");
9886 const Decl *
Next = VisitStack.pop_back_val();
9888 assert(!HistoryStack.empty());
9890 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9891 ValidTypes.insert(Hist->getType().getTypePtr());
9900 HistoryStack.push_back(Field);
9902 QualType FieldTy = Field->getType();
9906 "Unexpected type.");
9915 VisitStack.push_back(
nullptr);
9917 for (
const auto *FD : RD->
fields()) {
9928 VisitStack.push_back(FD);
9939 S.
Diag(Param->getLocation(),
9940 diag::err_record_with_pointers_kernel_param)
9944 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9947 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
9948 << PD->getDeclName();
9953 I = HistoryStack.begin() + 1,
9954 E = HistoryStack.end();
9967 }
while (!VisitStack.empty());
9984 (LangOpts.CPlusPlus &&
9994 unsigned BuiltinID) {
9995 switch (BuiltinID) {
9996 case Builtin::BI__GetExceptionInfo:
10000 case Builtin::BIaddressof:
10001 case Builtin::BI__addressof:
10002 case Builtin::BIforward:
10003 case Builtin::BIforward_like:
10004 case Builtin::BImove:
10005 case Builtin::BImove_if_noexcept:
10006 case Builtin::BIas_const: {
10011 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10023 bool &AddToScope) {
10031 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10033 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10034 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10035 TemplateParamLists.back() = Invented;
10037 TemplateParamLists.push_back(Invented);
10047 diag::err_invalid_thread)
10055 bool isFriend =
false;
10057 bool isMemberSpecialization =
false;
10058 bool isFunctionTemplateSpecialization =
false;
10060 bool HasExplicitTemplateArgs =
false;
10063 bool isVirtualOkay =
false;
10070 if (!NewFD)
return nullptr;
10080 if (IsLocalExternDecl)
10090 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10118 if (isVirtual && Parent->isUnion()) {
10122 if ((Parent->isClass() || Parent->isStruct()) &&
10123 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10126 if (
auto *Def = Parent->getDefinition())
10127 Def->setInitMethod(
true);
10132 isMemberSpecialization =
false;
10133 isFunctionTemplateSpecialization =
false;
10148 isMemberSpecialization,
Invalid);
10149 if (TemplateParams) {
10154 if (TemplateParams->
size() > 0) {
10162 }
else if (TemplateId) {
10179 Name, TemplateParams,
10185 if (TemplateParamLists.size() > 1) {
10192 isFunctionTemplateSpecialization =
true;
10194 if (TemplateParamLists.size() > 0)
10214 << Name << RemoveRange
10220 HasExplicitTemplateArgs =
true;
10227 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10233 if (TemplateParamLists.size() > 0)
10238 if (isFriend && TemplateId)
10239 isFunctionTemplateSpecialization =
true;
10245 if (isFunctionTemplateSpecialization && TemplateId) {
10246 HasExplicitTemplateArgs =
true;
10277 if (!isVirtualOkay) {
10279 diag::err_virtual_non_function);
10283 diag::err_virtual_out_of_class)
10289 diag::err_virtual_member_function_template)
10308 diag::err_inline_declaration_block_scope) << Name
10322 diag::err_explicit_out_of_class)
10329 diag::err_explicit_non_ctor_or_conv_function)
10347 <<
static_cast<int>(ConstexprKind);
10358 diag::err_invalid_consteval_decl_kind)
10366 if (isFunctionTemplateSpecialization) {
10369 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10415 if (!isFriend && SC !=
SC_None) {
10423 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10425 diag::ext_explicit_specialization_storage_class)
10432 "Out-of-line member function should be a CXXMethodDecl");
10449 ? diag::ext_static_out_of_line
10450 : diag::err_static_out_of_line)
10475 PendingInlineFuncDecls.insert(NewFD);
10482 isMemberSpecialization ||
10483 isFunctionTemplateSpecialization);
10492 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10517 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10519 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10520 Param->setDeclContext(NewFD);
10521 Params.push_back(Param);
10523 if (Param->isInvalidDecl())
10536 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10541 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10546 DeclContext *TagDC = TD->getLexicalDeclContext();
10550 TD->setDeclContext(NewFD);
10558 if (TagDC != PrototypeTagContext)
10559 TD->setLexicalDeclContext(TagDC);
10573 for (
const auto &AI : FT->param_types()) {
10576 Param->setScopeInfo(0, Params.size());
10577 Params.push_back(Param);
10581 "Should not need args for typedef of non-prototype fn");
10585 NewFD->setParams(Params);
10610 !NewFD->
hasAttr<SectionAttr>())
10611 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10617 !NewFD->
hasAttr<SectionAttr>()) {
10618 NewFD->
addAttr(SectionAttr::CreateImplicit(
10620 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10631 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10632 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10637 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10646 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10647 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10648 !NewTVA->isDefaultVersion() &&
10649 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10651 AddToScope =
false;
10663 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10678 isMemberSpecialization,
10685 "previous declaration set still overloaded");
10697 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10720 diag::ext_operator_new_delete_declared_inline)
10747 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10759 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10767 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10771 Diag(TRC->getBeginLoc(),
10772 diag::err_constrained_non_templated_function);
10789 if (isFunctionTemplateSpecialization) {
10790 bool isDependentSpecialization =
false;
10795 isDependentSpecialization =
10797 (HasExplicitTemplateArgs &&
10798 TemplateSpecializationType::
10799 anyInstantiationDependentTemplateArguments(
10801 assert((!isDependentSpecialization ||
10802 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10803 "dependent friend function specialization without template "
10809 isDependentSpecialization =
10814 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10815 if (isDependentSpecialization) {
10822 NewFD, ExplicitTemplateArgs,
Previous))
10843 isMemberSpecialization,
10852 "previous declaration set still overloaded");
10893 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10939 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10940 AddToScope = ExtraArgs.AddToScope;
10949 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10950 AddToScope = ExtraArgs.AddToScope;
10956 !isFriend && !isFunctionTemplateSpecialization &&
10957 !isMemberSpecialization) {
10975 if (NewFD->
hasAttr<HLSLShaderAttr>())
10983 if (
unsigned BuiltinID = II->getBuiltinID()) {
10984 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
10985 if (!InStdNamespace &&
10990 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
10991 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10998 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11000 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11005 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11016 if (NewFD->
hasAttr<OverloadableAttr>() &&
11019 diag::err_attribute_overloadable_no_prototype)
11021 NewFD->
dropAttr<OverloadableAttr>();
11054 isMemberSpecialization ||
11055 isFunctionTemplateSpecialization,
11066 Context.setcudaConfigureCallDecl(NewFD);
11068 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11074 Context.setcudaGetParameterBufferDecl(NewFD);
11076 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11082 Context.setcudaLaunchDeviceDecl(NewFD);
11133 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11153 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11155 QualType ElemTy = PipeTy->getElementType();
11157 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11163 if (
Context.getTargetInfo().getTriple().isWasm()) {
11165 Diag(Param->getTypeSpecStartLoc(),
11166 diag::err_wasm_table_as_function_parameter);
11174 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11175 if (NewFD->
hasAttr<ConstructorAttr>()) {
11176 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11178 NewFD->
dropAttr<AvailabilityAttr>();
11180 if (NewFD->
hasAttr<DestructorAttr>()) {
11181 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11183 NewFD->
dropAttr<AvailabilityAttr>();
11194 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11198 Diag(NBA->getLocation(),
11199 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11200 << NBA->getSpelling();
11203 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11204 << NBA->getSpelling();
11213 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11237 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11241 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11252 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11253 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11263 bool IsDefinition) {
11266 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11268 return SectionAttr::CreateImplicit(
11270 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11318 auto *VD = dyn_cast<ValueDecl>(D);
11319 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11320 return !VD || !PrevVD ||
11322 PrevVD->getType());
11330 const auto *TA = FD->
getAttr<TargetAttr>();
11331 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11333 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11346 for (
const auto &Feat : ParseInfo.
Features) {
11347 auto BareFeat = StringRef{Feat}.substr(1);
11348 if (Feat[0] ==
'-') {
11350 <<
Feature << (
"no-" + BareFeat).str();
11370 for (
auto &Feat : ParseInfo.
Features)
11371 Feats.push_back(StringRef{Feat}.substr(1));
11374 TVA->getFeatures(Feats);
11376 for (
const auto &Feat : Feats) {
11396 case attr::ArmLocallyStreaming:
11401 case attr::NonNull:
11402 case attr::NoThrow:
11411 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11412 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11413 <<
static_cast<unsigned>(MVKind) << A;
11415 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11420 switch (A->getKind()) {
11421 case attr::CPUDispatch:
11422 case attr::CPUSpecific:
11425 return Diagnose(S, A);
11429 return Diagnose(S, A);
11431 case attr::TargetVersion:
11434 return Diagnose(S, A);
11436 case attr::TargetClones:
11439 return Diagnose(S, A);
11443 return Diagnose(S, A);
11456 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11457 enum DoesntSupport {
11464 DefaultedFuncs = 6,
11465 ConstexprFuncs = 7,
11466 ConstevalFuncs = 8,
11478 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11481 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11489 if (!TemplatesSupported &&
11491 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11494 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11495 if (NewCXXFD->isVirtual())
11496 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11500 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11504 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11509 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11513 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11517 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11518 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11522 QualType NewReturnType = NewType->getReturnType();
11525 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11538 bool ArmStreamingCCMismatched =
false;
11539 if (OldFPT && NewFPT) {
11546 ArmStreamingCCMismatched =
true;
11549 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11552 QualType OldReturnType = OldType->getReturnType();
11554 if (OldReturnType != NewReturnType)
11555 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11558 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11561 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11564 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11587 bool IsCPUSpecificCPUDispatchMVKind =
11591 if (CausesMV && OldFD &&
11599 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11606 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11608 S.
PDiag(diag::note_multiversioning_caused_here)),
11610 S.
PDiag(diag::err_multiversion_doesnt_support)
11611 <<
static_cast<unsigned>(MVKind)),
11613 S.
PDiag(diag::err_multiversion_diff)),
11615 !IsCPUSpecificCPUDispatchMVKind,
11628 "Function lacks multiversion attribute");
11629 const auto *TA = FD->
getAttr<TargetAttr>();
11630 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11633 if (TA && !TA->isDefaultVersion())
11670 To->
addAttr(TargetVersionAttr::CreateImplicit(
11681 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11682 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11683 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11684 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11686 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11695 if (NewTA && !NewTA->isDefaultVersion() &&
11696 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11713 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11714 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11723 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11731 OldTA->getFeaturesStr());
11735 NewTA->getFeaturesStr());
11738 if (OldParsed == NewParsed) {
11746 for (
const auto *FD : OldFD->
redecls()) {
11747 const auto *CurTA = FD->
getAttr<TargetAttr>();
11748 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11752 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11753 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11755 << (NewTA ? 0 : 2);
11756 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11803 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11819 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11820 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11827 NewTA->getFeaturesStr());
11832 NewTVA->getFeatures(NewFeats);
11833 llvm::sort(NewFeats);
11836 bool UseMemberUsingDeclRules =
11839 bool MayNeedOverloadableChecks =
11848 if (MayNeedOverloadableChecks &&
11849 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11852 switch (NewMVKind) {
11855 "Only target_clones can be omitted in subsequent declarations");
11858 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11859 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11868 CurTA->getFeaturesStr());
11870 if (CurParsed == NewParsed) {
11879 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11880 if (CurTVA->getName() == NewTVA->getName()) {
11887 CurTVA->getFeatures(CurFeats);
11888 llvm::sort(CurFeats);
11890 if (CurFeats == NewFeats) {
11896 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11898 if (NewFeats.empty())
11901 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11903 CurClones->getFeatures(CurFeats, I);
11904 llvm::sort(CurFeats);
11906 if (CurFeats == NewFeats) {
11917 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11918 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11919 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11920 !std::equal(CurClones->featuresStrs_begin(),
11921 CurClones->featuresStrs_end(),
11922 NewClones->featuresStrs_begin())) {
11928 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11930 CurTVA->getFeatures(CurFeats);
11931 llvm::sort(CurFeats);
11934 if (CurFeats.empty())
11937 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11939 NewClones->getFeatures(NewFeats, I);
11940 llvm::sort(NewFeats);
11942 if (CurFeats == NewFeats) {
11958 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
11959 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
11964 CurFD->
hasAttr<CPUDispatchAttr>()) {
11965 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
11967 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
11968 NewCPUDisp->cpus_begin(),
11970 return Cur->getName() == New->getName();
11985 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
11987 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
11988 NewCPUSpec->cpus_begin(),
11990 return Cur->getName() == New->getName();
12001 if (CurII == NewII) {
12071 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12072 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12073 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12074 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12075 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12085 NewTVA->isDefaultVersion())) {
12086 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12094 if (NewTA && TI.
getTriple().isAArch64())
12121 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12134 if (OldFD->
isUsed(
false)) {
12136 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12158 bool IsPure = NewFD->
hasAttr<PureAttr>();
12159 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12162 if (!IsPure && !IsConst)
12169 if (IsPure && IsConst) {
12179 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12185 bool IsMemberSpecialization,
12188 "Variably modified return types are not handled here");
12193 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12198 bool MayNeedOverloadableChecks =
false;
12210 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12212 OldDecl = Candidate;
12215 MayNeedOverloadableChecks =
true;
12240 OldDecl =
Previous.getFoundDecl();
12241 MergeTypeWithPrevious =
false;
12244 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12245 NewFD->
hasAttr<OverloadableAttr>()) {
12247 MayNeedOverloadableChecks =
true;
12259 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12310 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12311 if (!OldMD || !OldMD->
isStatic()) {
12346 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12347 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12350 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12359 NewFD->
setAccess(OldTemplateDecl->getAccess());
12360 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12365 if (IsMemberSpecialization &&
12368 assert(OldTemplateDecl->isMemberSpecialization());
12371 if (OldFD->isDeleted()) {
12373 assert(OldFD->getCanonicalDecl() == OldFD);
12375 OldFD->setDeletedAsWritten(
false);
12389 !NewFD->
getAttr<OverloadableAttr>()) {
12393 return ND->hasAttr<OverloadableAttr>();
12395 "Non-redecls shouldn't happen without overloadable present");
12398 const auto *FD = dyn_cast<FunctionDecl>(ND);
12399 return FD && !FD->
hasAttr<OverloadableAttr>();
12402 if (OtherUnmarkedIter !=
Previous.end()) {
12404 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12405 Diag((*OtherUnmarkedIter)->getLocation(),
12406 diag::note_attribute_overloadable_prev_overload)
12416 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12419 if (NewFD->
hasAttr<SYCLExternalAttr>())
12429 dyn_cast<CXXDestructorDecl>(NewFD)) {
12437 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12442 Context.DeclarationNames.getCXXDestructorName(ClassType);
12449 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12450 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12456 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12462 if (!
Method->isFunctionTemplateSpecialization() &&
12463 !
Method->getDescribedFunctionTemplate() &&
12464 Method->isCanonicalDecl()) {
12471 diag::err_constrained_virtual_method);
12511 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12524 auto HasNoexcept = [&](
QualType T) ->
bool {
12529 T = RT->getPointeeType();
12530 else if (
T->isAnyPointerType())
12531 T =
T->getPointeeType();
12533 T = MPT->getPointeeType();
12535 if (FPT->isNothrow())
12541 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12543 AnyNoexcept |= HasNoexcept(
T);
12546 diag::warn_cxx17_compat_exception_spec_in_signature)
12551 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12553 if (!Parm->getType()->isDependentType() &&
12554 Parm->hasAttr<CUDAGridConstantAttr>() &&
12555 !(IsKernel && Parm->getType().isConstQualified()))
12556 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12557 diag::err_cuda_grid_constant_not_allowed);
12563 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12573 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12584 ? diag::err_static_main : diag::warn_static_main)
12592 Diag(NoreturnLoc, diag::ext_noreturn_main);
12593 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12605 << FD->
hasAttr<DeviceKernelAttr>();
12610 if (FD->
hasAttr<SYCLExternalAttr>()) {
12612 << FD->
getAttr<SYCLExternalAttr>();
12623 assert(
T->isFunctionType() &&
"function decl is not of function type");
12645 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12670 Diag(start, diag::warn_main_in_named_module)
12682 bool HasExtraParameters = (nparams > 3);
12693 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12694 HasExtraParameters =
false;
12696 if (HasExtraParameters) {
12709 for (
unsigned i = 0; i < nparams; ++i) {
12712 bool mismatch =
true;
12729 mismatch = !qs.
empty();
12758 if (
T.isOSCygMing())
12763 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12771 assert(
T->isFunctionType() &&
"function decl is not of function type");
12780 if (FD->
getName() !=
"DllMain")
12787 FT =
Context.adjustFunctionType(
12792 FT =
Context.adjustFunctionType(FT,
12814 if (
Init->isValueDependent()) {
12815 assert(
Init->containsErrors() &&
12816 "Dependent code should only occur in error-recovery path.");
12819 const Expr *Culprit;
12820 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12829 class SelfReferenceChecker
12835 bool isReferenceType;
12836 bool isInCXXOperatorCall;
12844 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12845 S(S), OrigDecl(OrigDecl) {
12848 isReferenceType =
false;
12849 isInCXXOperatorCall =
false;
12850 isInitList =
false;
12851 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12852 isPODType = VD->getType().isPODType(S.
Context);
12854 isReferenceType = VD->getType()->isReferenceType();
12861 void CheckExpr(Expr *E) {
12862 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12870 InitFieldIndex.push_back(0);
12871 for (
auto *Child : InitList->
children()) {
12873 ++InitFieldIndex.back();
12875 InitFieldIndex.pop_back();
12880 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12881 llvm::SmallVector<FieldDecl*, 4> Fields;
12883 bool ReferenceField =
false;
12886 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12887 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12890 Fields.push_back(FD);
12892 ReferenceField =
true;
12893 Base = ME->getBase()->IgnoreParenImpCasts();
12897 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12898 if (!DRE || DRE->
getDecl() != OrigDecl)
12902 if (CheckReference && !ReferenceField)
12906 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12907 for (
const FieldDecl *I : llvm::reverse(Fields))
12908 UsedFieldIndex.push_back(I->getFieldIndex());
12913 for (
auto UsedIter = UsedFieldIndex.begin(),
12914 UsedEnd = UsedFieldIndex.end(),
12915 OrigIter = InitFieldIndex.begin(),
12916 OrigEnd = InitFieldIndex.end();
12917 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12918 if (*UsedIter < *OrigIter)
12920 if (*UsedIter > *OrigIter)
12925 HandleDeclRefExpr(DRE);
12932 void HandleValue(Expr *E) {
12934 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12935 HandleDeclRefExpr(DRE);
12939 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12940 Visit(CO->getCond());
12941 HandleValue(CO->getTrueExpr());
12942 HandleValue(CO->getFalseExpr());
12946 if (BinaryConditionalOperator *BCO =
12947 dyn_cast<BinaryConditionalOperator>(E)) {
12948 Visit(BCO->getCond());
12949 HandleValue(BCO->getFalseExpr());
12953 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
12954 if (Expr *SE = OVE->getSourceExpr())
12959 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
12960 if (BO->getOpcode() == BO_Comma) {
12961 Visit(BO->getLHS());
12962 HandleValue(BO->getRHS());
12975 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12979 Base = ME->getBase()->IgnoreParenImpCasts();
12981 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
12982 HandleDeclRefExpr(DRE);
12991 void VisitDeclRefExpr(DeclRefExpr *E) {
12992 if (isReferenceType)
12993 HandleDeclRefExpr(E);
12996 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13002 Inherited::VisitImplicitCastExpr(E);
13005 void VisitMemberExpr(MemberExpr *E) {
13007 if (CheckInitListMemberExpr(E,
true ))
13016 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13017 bool Warn = (MD && !MD->
isStatic());
13019 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13022 Base = ME->getBase()->IgnoreParenImpCasts();
13025 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13027 HandleDeclRefExpr(DRE);
13036 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13037 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13041 return Inherited::VisitCXXOperatorCallExpr(E);
13045 HandleValue(Arg->IgnoreParenImpCasts());
13049 if (!isInCXXOperatorCall) {
13050 Inherited::VisitLambdaExpr(E);
13055 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13056 HandleDeclRefExpr(DRE);
13061 void VisitUnaryOperator(UnaryOperator *E) {
13075 Inherited::VisitUnaryOperator(E);
13078 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13080 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13082 Expr *ArgExpr = E->
getArg(0);
13083 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13084 if (ILE->getNumInits() == 1)
13085 ArgExpr = ILE->getInit(0);
13086 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13087 if (ICE->getCastKind() == CK_NoOp)
13088 ArgExpr = ICE->getSubExpr();
13089 HandleValue(ArgExpr);
13092 Inherited::VisitCXXConstructExpr(E);
13095 void VisitCallExpr(CallExpr *E) {
13098 HandleValue(E->
getArg(0));
13102 Inherited::VisitCallExpr(E);
13105 void VisitBinaryOperator(BinaryOperator *E) {
13107 HandleValue(E->
getLHS());
13112 Inherited::VisitBinaryOperator(E);
13118 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13123 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13125 if (OrigDecl != ReferenceDecl)
return;
13127 if (isReferenceType) {
13128 diag = diag::warn_uninit_self_reference_in_reference_init;
13130 diag = diag::warn_static_self_reference_in_init;
13134 diag = diag::warn_uninit_self_reference_in_init;
13148 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13158 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13159 VD && VD->isConstexpr() && VD->isFileVarDecl())
13167 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13168 if (ICE->getCastKind() == CK_LValueToRValue)
13169 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13170 if (DRE->
getDecl() == OrigDecl)
13173 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13180 struct VarDeclOrName {
13182 DeclarationName Name;
13184 friend const Sema::SemaDiagnosticBuilder &
13185 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13186 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13196 bool IsInitCapture = !VDecl;
13198 "init captures are expected to be deduced prior to initialization");
13200 VarDeclOrName VN{VDecl, Name};
13203 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13207 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13208 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13209 << (int)Deduced->getContainedAutoType()->getKeyword()
13216 assert(VDecl &&
"no init for init capture deduction?");
13231 DeduceInits =
Init;
13233 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13235 DeduceInits = PL->exprs();
13238 assert(VDecl &&
"non-auto type for init capture deduction?");
13249 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13250 DeduceInits = IL->inits();
13254 if (DeduceInits.empty()) {
13257 Diag(
Init->getBeginLoc(), IsInitCapture
13258 ? diag::err_init_capture_no_expression
13259 : diag::err_auto_var_init_no_expression)
13260 << VN <<
Type << Range;
13264 if (DeduceInits.size() > 1) {
13265 Diag(DeduceInits[1]->getBeginLoc(),
13266 IsInitCapture ? diag::err_init_capture_multiple_expressions
13267 : diag::err_auto_var_init_multiple_expressions)
13268 << VN <<
Type << Range;
13272 Expr *DeduceInit = DeduceInits[0];
13274 Diag(
Init->getBeginLoc(), IsInitCapture
13275 ? diag::err_init_capture_paren_braces
13276 : diag::err_auto_var_init_paren_braces)
13282 bool DefaultedAnyToId =
false;
13284 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13286 if (
Result.isInvalid()) {
13290 DefaultedAnyToId =
true;
13300 Type.getQualifiers());
13308 if (!IsInitCapture)
13311 Diag(Range.getBegin(),
13312 diag::err_init_capture_deduction_failure_from_init_list)
13318 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13333 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13336 return DeducedType;
13341 assert(!
Init || !
Init->containsErrors());
13345 if (DeducedType.
isNull()) {
13354 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13378 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13379 Init = EWC->getSubExpr();
13381 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13382 Init = CE->getSubExpr();
13387 "shouldn't be called if type doesn't have a non-trivial C struct");
13388 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13389 for (
auto *I : ILE->inits()) {
13390 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13391 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13417bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13423 return FD->
hasAttr<UnavailableAttr>();
13426struct DiagNonTrivalCUnionDefaultInitializeVisitor
13433 DiagNonTrivalCUnionDefaultInitializeVisitor(
13436 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13439 const FieldDecl *FD,
bool InNonTrivialUnion) {
13442 InNonTrivialUnion);
13443 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13446 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13447 bool InNonTrivialUnion) {
13448 if (InNonTrivialUnion)
13450 << 1 << 0 << QT << FD->
getName();
13453 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13454 if (InNonTrivialUnion)
13456 << 1 << 0 << QT << FD->
getName();
13459 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13461 if (RD->isUnion()) {
13462 if (OrigLoc.isValid()) {
13463 bool IsUnion =
false;
13464 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13465 IsUnion = OrigRD->isUnion();
13466 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13467 << 0 << OrigTy << IsUnion << UseContext;
13469 OrigLoc = SourceLocation();
13471 InNonTrivialUnion =
true;
13474 if (InNonTrivialUnion)
13475 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13478 for (
const FieldDecl *FD : RD->fields())
13479 if (!shouldIgnoreForRecordTriviality(FD))
13480 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13483 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13488 SourceLocation OrigLoc;
13493struct DiagNonTrivalCUnionDestructedTypeVisitor
13496 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13498 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13499 SourceLocation OrigLoc,
13502 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13505 const FieldDecl *FD,
bool InNonTrivialUnion) {
13508 InNonTrivialUnion);
13509 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13512 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13513 bool InNonTrivialUnion) {
13514 if (InNonTrivialUnion)
13516 << 1 << 1 << QT << FD->
getName();
13519 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13520 if (InNonTrivialUnion)
13522 << 1 << 1 << QT << FD->
getName();
13525 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13527 if (RD->isUnion()) {
13528 if (OrigLoc.isValid()) {
13529 bool IsUnion =
false;
13530 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13531 IsUnion = OrigRD->isUnion();
13532 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13533 << 1 << OrigTy << IsUnion << UseContext;
13535 OrigLoc = SourceLocation();
13537 InNonTrivialUnion =
true;
13540 if (InNonTrivialUnion)
13541 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13544 for (
const FieldDecl *FD : RD->fields())
13545 if (!shouldIgnoreForRecordTriviality(FD))
13546 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13549 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13550 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13551 bool InNonTrivialUnion) {}
13556 SourceLocation OrigLoc;
13561struct DiagNonTrivalCUnionCopyVisitor
13563 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13565 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13567 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13570 const FieldDecl *FD,
bool InNonTrivialUnion) {
13573 InNonTrivialUnion);
13574 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13577 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13578 bool InNonTrivialUnion) {
13579 if (InNonTrivialUnion)
13581 << 1 << 2 << QT << FD->
getName();
13584 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13585 if (InNonTrivialUnion)
13587 << 1 << 2 << QT << FD->
getName();
13590 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13592 if (RD->isUnion()) {
13593 if (OrigLoc.isValid()) {
13594 bool IsUnion =
false;
13595 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13596 IsUnion = OrigRD->isUnion();
13597 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13598 << 2 << OrigTy << IsUnion << UseContext;
13600 OrigLoc = SourceLocation();
13602 InNonTrivialUnion =
true;
13605 if (InNonTrivialUnion)
13606 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13609 for (
const FieldDecl *FD : RD->fields())
13610 if (!shouldIgnoreForRecordTriviality(FD))
13611 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13614 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13615 if (InNonTrivialUnion)
13617 << 1 << 2 << QT << FD->
getName();
13621 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13622 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13623 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13624 bool InNonTrivialUnion) {}
13629 SourceLocation OrigLoc;
13638 unsigned NonTrivialKind) {
13642 "shouldn't be called if type doesn't have a non-trivial C union");
13646 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13647 .visit(QT,
nullptr,
false);
13650 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13651 .visit(QT,
nullptr,
false);
13653 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13654 .visit(QT,
nullptr,
false);
13678 bool TargetIsInline = Dcl->
isInline();
13679 bool TargetWasTemplated =
13696 TargetWasTemplated =
13706 if (!TargetIsInline || TargetWasTemplated)
13716 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13717 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13723 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13724 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13746 T =
T.getNonReferenceType();
13747 if (
T->isFunctionType())
13749 if (!
T.isConstant(Ctx))
13751 if (
T->isPointerType())
13769 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13770 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13782 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13783 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13789 auto ResetDeclForInitializer = llvm::make_scope_exit([
this]() {
13800 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13801 if (!
Method->isInvalidDecl()) {
13803 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13804 <<
Method->getDeclName() <<
Init->getSourceRange();
13805 Method->setInvalidDecl();
13810 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13812 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13821 if (
Expr *E = Recovery.
get())
13827 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13828 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13835 if (
Init->containsErrors()) {
13850 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13870 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13871 BaseDeclType = Array->getElementType();
13873 diag::err_typecheck_decl_incomplete_type)) {
13880 diag::err_abstract_type_in_decl,
13898 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
13907 if (Def != VDecl &&
13927 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13930 diag::note_previous_initializer)
13955 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
13956 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
13962 if (!
HLSL().handleInitialization(VDecl,
Init))
13974 if (!
Result.isUsable()) {
13982 bool InitializedFromParenListExpr =
false;
13983 bool IsParenListInit =
false;
13990 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
13992 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
13993 InitializedFromParenListExpr =
true;
13994 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
13995 Args = CXXDirectInit->getInitExprs();
13996 InitializedFromParenListExpr =
true;
14003 if (!
Result.isUsable()) {
14023 IsParenListInit = !InitSeq.
steps().empty() &&
14027 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14029 Context.getAsIncompleteArrayType(VDeclType) &&
14030 Context.getAsIncompleteArrayType(
Init->getType())) {
14059 if (VDecl->
hasAttr<BlocksAttr>())
14072 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14073 Init->getBeginLoc()))
14074 FSI->markSafeWeakUse(
Init);
14091 if (!
Result.isUsable()) {
14128 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14129 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14131 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14166 <<
Init->getSourceRange();
14182 diag::ext_in_class_initializer_float_type_cxx11)
14183 << DclT <<
Init->getSourceRange();
14185 diag::note_in_class_initializer_float_type_cxx11)
14188 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14189 << DclT <<
Init->getSourceRange();
14192 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14193 <<
Init->getSourceRange();
14200 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14201 << DclT <<
Init->getSourceRange()
14207 << DclT <<
Init->getSourceRange();
14220 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14228 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14241 if (!InitType.
isNull() &&
14259 if (InitializedFromParenListExpr) {
14260 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14283 VarDecl *VD = dyn_cast<VarDecl>(D);
14287 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14288 for (
auto *BD : DD->bindings())
14289 BD->setInvalidDecl();
14302 Context.getBaseElementType(Ty),
14303 diag::err_typecheck_decl_incomplete_type)) {
14310 diag::err_abstract_type_in_decl,
14325 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14330 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14331 Var->setInvalidDecl();
14347 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14348 !Var->isThisDeclarationADemotedDefinition()) {
14349 if (Var->isStaticDataMember()) {
14353 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14354 Diag(Var->getLocation(),
14355 diag::err_constexpr_static_mem_var_requires_init)
14357 Var->setInvalidDecl();
14361 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14362 Var->setInvalidDecl();
14369 if (!Var->isInvalidDecl() &&
14371 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14372 bool HasConstExprDefaultConstructor =
false;
14373 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14374 for (
auto *Ctor : RD->ctors()) {
14375 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14376 Ctor->getMethodQualifiers().getAddressSpace() ==
14378 HasConstExprDefaultConstructor =
true;
14382 if (!HasConstExprDefaultConstructor) {
14383 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14384 Var->setInvalidDecl();
14390 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14391 Diag(Var->getLocation(), diag::err_specialization_const);
14392 Var->setInvalidDecl();
14396 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14397 if (Var->getStorageClass() ==
SC_Extern) {
14398 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14400 Var->setInvalidDecl();
14404 diag::err_typecheck_decl_incomplete_type)) {
14405 Var->setInvalidDecl();
14408 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14409 if (!RD->hasTrivialDefaultConstructor()) {
14410 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14411 Var->setInvalidDecl();
14421 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14428 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14444 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14446 diag::err_typecheck_decl_incomplete_type))
14447 Var->setInvalidDecl();
14452 diag::err_abstract_type_in_decl,
14454 Var->setInvalidDecl();
14457 Diag(Var->getLocation(), diag::warn_private_extern);
14458 Diag(Var->getLocation(), diag::note_private_extern);
14461 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14462 !Var->isInvalidDecl())
14473 if (!Var->isInvalidDecl()) {
14477 Var->getLocation(), ArrayT->getElementType(),
14478 diag::err_array_incomplete_or_sizeless_type))
14479 Var->setInvalidDecl();
14481 if (Var->getStorageClass() ==
SC_Static) {
14491 if (Var->isFirstDecl())
14493 diag::ext_typecheck_decl_incomplete_type,
14499 if (!Var->isInvalidDecl())
14510 if (Var->isConstexpr())
14511 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14514 Diag(Var->getLocation(),
14515 diag::err_typecheck_incomplete_array_needs_initializer);
14516 Var->setInvalidDecl();
14523 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14524 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14533 if (Var->isInvalidDecl())
14536 if (!Var->hasAttr<AliasAttr>()) {
14539 diag::err_typecheck_decl_incomplete_type)) {
14540 Var->setInvalidDecl();
14549 diag::err_abstract_type_in_decl,
14551 Var->setInvalidDecl();
14558 unsigned DiagID = diag::warn_default_init_const_unsafe;
14559 if (Var->getStorageDuration() ==
SD_Static ||
14560 Var->getStorageDuration() ==
SD_Thread)
14561 DiagID = diag::warn_default_init_const;
14563 bool EmitCppCompat = !
Diags.isIgnored(
14564 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14565 Var->getLocation());
14567 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14581 if (
const auto *CXXRecord =
14582 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14586 if (!CXXRecord->isPOD())
14631 }
else if (
Init.isInvalid()) {
14649 VarDecl *VD = dyn_cast<VarDecl>(D);
14708 const char *PrevSpec;
14728 if (var->isInvalidDecl())
return;
14735 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14737 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14739 var->setInvalidDecl();
14747 var->hasLocalStorage()) {
14748 switch (var->getType().getObjCLifetime()) {
14761 if (var->hasLocalStorage() &&
14770 if (var->isThisDeclarationADefinition() &&
14771 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14772 var->isExternallyVisible() && var->hasLinkage() &&
14773 !var->isInline() && !var->getDescribedVarTemplate() &&
14777 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14778 var->getLocation())) {
14780 VarDecl *prev = var->getPreviousDecl();
14785 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14786 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14792 std::optional<bool> CacheHasConstInit;
14793 const Expr *CacheCulprit =
nullptr;
14794 auto checkConstInit = [&]()
mutable {
14795 const Expr *
Init = var->getInit();
14796 if (
Init->isInstantiationDependent())
14799 if (!CacheHasConstInit)
14800 CacheHasConstInit = var->getInit()->isConstantInitializer(
14801 Context, var->getType()->isReferenceType(), &CacheCulprit);
14802 return *CacheHasConstInit;
14806 if (var->getType().isDestructedType()) {
14810 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14812 Diag(var->getLocation(), diag::note_use_thread_local);
14814 if (!checkConstInit()) {
14822 Diag(var->getLocation(), diag::note_use_thread_local);
14828 if (!var->getType()->isStructureType() && var->hasInit() &&
14831 unsigned NumInits = ILE->getNumInits();
14833 for (
unsigned I = 0; I < NumInits; ++I) {
14834 const auto *
Init = ILE->getInit(I);
14837 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14841 unsigned NumConcat = SL->getNumConcatenated();
14845 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14846 bool OnlyOneMissingComma =
true;
14847 for (
unsigned J = I + 1; J < NumInits; ++J) {
14848 const auto *
Init = ILE->getInit(J);
14851 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14852 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14853 OnlyOneMissingComma =
false;
14858 if (OnlyOneMissingComma) {
14860 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14862 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
14864 Diag(SL->getStrTokenLoc(1),
14865 diag::warn_concatenated_literal_array_init)
14867 Diag(SL->getBeginLoc(),
14868 diag::note_concatenated_string_literal_silence);
14879 if (var->hasAttr<BlocksAttr>())
14883 bool GlobalStorage = var->hasGlobalStorage();
14884 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14886 bool HasConstInit =
true;
14889 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14894 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14895 (GlobalStorage || var->isConstexpr() ||
14896 var->mightBeUsableInConstantExpressions(
Context))) {
14908 HasConstInit = checkConstInit();
14912 if (HasConstInit) {
14913 if (var->isStaticDataMember() && !var->isInline() &&
14914 var->getLexicalDeclContext()->isRecord() &&
14915 type->isIntegralOrEnumerationType()) {
14920 diag::ext_in_class_initializer_non_constant)
14921 <<
Init->getSourceRange();
14924 (void)var->checkForConstantInitialization(Notes);
14926 }
else if (CacheCulprit) {
14927 Notes.emplace_back(CacheCulprit->
getExprLoc(),
14928 PDiag(diag::note_invalid_subexpr_in_const_expr));
14933 HasConstInit = var->checkForConstantInitialization(Notes);
14936 if (HasConstInit) {
14938 }
else if (var->isConstexpr()) {
14942 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
14943 diag::note_invalid_subexpr_in_const_expr) {
14944 DiagLoc = Notes[0].first;
14947 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
14948 << var <<
Init->getSourceRange();
14949 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
14950 Diag(Notes[I].first, Notes[I].second);
14951 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
14952 auto *
Attr = var->getAttr<ConstInitAttr>();
14953 Diag(var->getLocation(), diag::err_require_constant_init_failed)
14954 <<
Init->getSourceRange();
14957 for (
auto &it : Notes)
14958 Diag(it.first, it.second);
14959 }
else if (var->isStaticDataMember() && !var->isInline() &&
14960 var->getLexicalDeclContext()->isRecord()) {
14961 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
14962 <<
Init->getSourceRange();
14963 for (
auto &it : Notes)
14964 Diag(it.first, it.second);
14965 var->setInvalidDecl();
14966 }
else if (IsGlobal &&
14968 var->getLocation())) {
14977 if (!checkConstInit())
14978 Diag(var->getLocation(), diag::warn_global_constructor)
14979 <<
Init->getSourceRange();
14985 if (GlobalStorage && var->isThisDeclarationADefinition() &&
14990 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
14991 std::optional<QualType::NonConstantStorageReason> Reason;
14992 if (HasConstInit &&
14993 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
14999 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15006 var->getType().isConstQualified()) {
15008 NonConstNonReferenceType) &&
15009 "This case should've already been handled elsewhere");
15010 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15011 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15017 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15019 SectionAttr::Declspec_allocate));
15021 var->dropAttr<SectionAttr>();
15036 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15037 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15044 if (!
type->isDependentType())
15050 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15051 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15054 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15065 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15066 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15076 NewAttr->setInherited(
true);
15078 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15079 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15080 NewAttr->setInherited(
true);
15085 if (!FD->
hasAttr<DLLExportAttr>())
15088 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15089 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15090 NewAttr->setInherited(
true);
15101 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15106 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15119 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15131 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15135 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15139 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15143 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15148 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15149 for (
auto *BD : DD->bindings()) {
15154 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15177 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15184 bool IsClassTemplateMember =
15186 Context->getDescribedClassTemplate();
15189 IsClassTemplateMember
15190 ? diag::warn_attribute_dllimport_static_field_definition
15191 : diag::err_attribute_dllimport_static_field_definition);
15192 Diag(IA->getLocation(), diag::note_attribute);
15193 if (!IsClassTemplateMember)
15221 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15241 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15245 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15247 if (!MagicValueExpr) {
15250 std::optional<llvm::APSInt> MagicValueInt;
15252 Diag(I->getRange().getBegin(),
15253 diag::err_type_tag_for_datatype_not_ice)
15257 if (MagicValueInt->getActiveBits() > 64) {
15258 Diag(I->getRange().getBegin(),
15259 diag::err_type_tag_for_datatype_too_large)
15263 uint64_t MagicValue = MagicValueInt->getZExtValue();
15266 I->getMatchingCType(),
15267 I->getLayoutCompatible(),
15268 I->getMustBeNull());
15273 auto *VD = dyn_cast<VarDecl>(DD);
15274 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15286 bool DiagnosedMultipleDecomps =
false;
15288 bool DiagnosedNonDeducedAuto =
false;
15290 for (
Decl *D : Group) {
15295 if (
auto *VD = dyn_cast<VarDecl>(D);
15296 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15297 VD->hasGlobalStorage())
15301 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15302 if (!FirstDeclaratorInGroup)
15303 FirstDeclaratorInGroup = DD;
15304 if (!FirstDecompDeclaratorInGroup)
15305 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15308 FirstNonDeducedAutoInGroup = DD;
15310 if (FirstDeclaratorInGroup != DD) {
15313 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15315 diag::err_decomp_decl_not_alone)
15317 << DD->getSourceRange();
15318 DiagnosedMultipleDecomps =
true;
15324 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15326 diag::err_auto_non_deduced_not_alone)
15327 << FirstNonDeducedAutoInGroup->
getType()
15330 << DD->getSourceRange();
15331 DiagnosedNonDeducedAuto =
true;
15336 Decls.push_back(D);
15342 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15344 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15356 if (Group.size() > 1) {
15358 VarDecl *DeducedDecl =
nullptr;
15359 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15360 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15364 if (!DT || DT->getDeducedType().isNull())
15367 Deduced = DT->getDeducedType();
15369 }
else if (!
Context.hasSameType(DT->getDeducedType(), Deduced)) {
15370 auto *AT = dyn_cast<AutoType>(DT);
15372 diag::err_auto_different_deductions)
15373 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
15374 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15398 if (Group.empty() || !Group[0])
15401 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15402 Group[0]->getLocation()) &&
15403 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15404 Group[0]->getLocation()))
15407 if (Group.size() >= 2) {
15415 Decl *MaybeTagDecl = Group[0];
15417 Group = Group.slice(1);
15470 const auto *VD = dyn_cast<ValueDecl>(D);
15484 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15486 Diag(TD->getLocation(), diag::note_declared_at);
15492 if (!ExplicitThisLoc.
isValid())
15495 "explicit parameter in non-cplusplus mode");
15497 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15509 LSI->ExplicitObjectParameter = P;
15532 ? diag::ext_register_storage_class
15533 : diag::warn_deprecated_register)
15539 diag::err_invalid_storage_class_in_func_decl)
15548 diag::err_invalid_storage_class_in_func_decl);
15560 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15581 PrevDecl =
nullptr;
15598 diag::err_hlsl_incomplete_resource_array_in_function_param);
15610 New->setInvalidDecl();
15629 Diag(
New->getLocation(), diag::err_module_private_local)
15633 if (
New->hasAttr<BlocksAttr>()) {
15634 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15650 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
15652 Param->setImplicit();
15665 !
Parameter->getIdentifier()->isPlaceholder()) {
15666 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15674 if (
LangOpts.NumLargeByValueCopy == 0)
15680 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15681 if (Size >
LangOpts.NumLargeByValueCopy)
15689 if (
T->isDependentType() || !
T.isPODType(
Context))
15691 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
15692 if (Size >
LangOpts.NumLargeByValueCopy)
15705 T->isObjCLifetimeType()) {
15712 if (
T->isArrayType()) {
15713 if (!
T.isConstQualified()) {
15717 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15719 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15724 lifetime =
T->getObjCARCImplicitLifetime();
15726 T =
Context.getLifetimeQualifiedType(
T, lifetime);
15730 Context.getAdjustedParameterType(
T),
15731 TSInfo, SC,
nullptr);
15736 if (
New->isParameterPack())
15738 CSI->LocalPacks.push_back(
New);
15740 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15741 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15748 if (
T->isObjCObjectType()) {
15752 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15754 T =
Context.getObjCObjectPointerType(
T);
15759 if (
T.getPointerAuth()) {
15760 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
15761 New->setInvalidDecl();
15775 !(
T->isFunctionPointerType() &&
15777 Diag(NameLoc, diag::err_arg_with_address_space);
15778 New->setInvalidDecl();
15782 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15783 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15784 New->setInvalidDecl();
15805 for (
int i = FTI.
NumParams; i != 0; ) {
15810 llvm::raw_svector_ostream(Code)
15821 const char* PrevSpec;
15824 DiagID,
Context.getPrintingPolicy());
15853 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15855 ParentScope, D, TemplateParameterLists, Bases);
15861 if (!Bases.empty())
15869 Consumer.HandleInlineFunctionDefinition(D);
15878 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15881 PossiblePrototype = Prev;
15905 if (II->isStr(
"main") || II->isStr(
"efi_main"))
15924 if (FD->
hasAttr<DeviceKernelAttr>())
15973 bool DefinitionVisible =
false;
15977 Definition->getNumTemplateParameterLists())) {
15980 if (!DefinitionVisible) {
15981 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
15995 Diag(
Definition->getLocation(), diag::note_previous_definition);
16004 LSI->
Lambda = LambdaClass;
16043 for (
const auto &
C : LambdaClass->
captures()) {
16044 if (
C.capturesVariable()) {
16048 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16050 true,
C.getLocation(),
16051 C.isPackExpansion()
16053 I->getType(),
false);
16055 }
else if (
C.capturesThis()) {
16081 FD = FunTmpl->getTemplatedDecl();
16092 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16097 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16102 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16103 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16104 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16105 !
Attr->isDefaultVersion()) {
16114 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16116 Ctor->isDefaultConstructor() &&
16117 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16159 "There should be an active template instantiation on the stack "
16160 "when instantiating a generic lambda!");
16170 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16171 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16186 diag::err_func_def_incomplete_result) ||
16188 diag::err_abstract_type_in_decl,
16204 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16208 "parameters should not be in newly created FD yet");
16211 if (NonParmDecl->getDeclName())
16216 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16217 for (
auto *EI : ED->enumerators())
16225 Param->setOwningFunction(FD);
16228 if (Param->getIdentifier() && FnBodyScope) {
16265 assert(!FD->
hasAttr<DLLExportAttr>());
16266 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16291 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16292 FD = TD->getTemplatedDecl();
16293 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16305 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16306 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16307 if (!NRVOCandidate->isNRVOVariable()) {
16308 Diag(Returns[I]->getRetValue()->getExprLoc(),
16309 diag::warn_not_eliding_copy_on_return);
16329 Outer.Fun.hasTrailingReturnType()) {
16347 if (FD->isConstexpr())
16352 if (FD->getReturnType()->getContainedDeducedType())
16355 return Consumer.shouldSkipFunctionBody(D);
16362 FD->setHasSkippedBody();
16375 S.PopExpressionEvaluationContext();
16380 bool IsLambda =
false;
16384 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16386 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16387 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16401 return It->second = R;
16406 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16408 if (IsOrNestedInEscapingBlock(P.second))
16409 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16424 methodHasName(FD,
"get_return_object_on_allocation_failure");
16434 if (!FD->
hasAttr<CoroWrapperAttr>())
16439 bool RetainFunctionScopeInfo) {
16466 SYCLKernelEntryPointAttr *SKEPAttr =
16467 FD->
getAttr<SYCLKernelEntryPointAttr>();
16469 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16471 SKEPAttr->setInvalidAttr();
16473 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16475 SKEPAttr->setInvalidAttr();
16477 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16479 SKEPAttr->setInvalidAttr();
16481 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16483 SKEPAttr->setInvalidAttr();
16486 if (Body && !FD->
isTemplated() && !SKEPAttr->isInvalidAttr()) {
16496 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16498 Diag(SEAttr->getLocation(),
16499 diag::err_sycl_external_invalid_deleted_function)
16529 Expr *Dummy =
nullptr;
16540 if (LSI->HasImplicitReturnType) {
16547 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16551 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16552 Proto->getExtProtoInfo()));
16585 dyn_cast<CXXDestructorDecl>(FD))
16605 if (PossiblePrototype) {
16609 TypeLoc TL = TI->getTypeLoc();
16612 diag::note_declaration_not_a_prototype)
16615 FTL.getRParenLoc(),
"void")
16623 if (LocInfo.first.isInvalid())
16627 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16631 if (LocInfo.second > Buffer.size())
16634 const char *LexStart = Buffer.data() + LocInfo.second;
16635 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16637 return StartTok.consume_front(
"const") &&
16639 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16642 auto findBeginLoc = [&]() {
16658 diag::note_static_for_internal_linkage)
16669 if (!PossiblePrototype)
16715 if (PossiblePrototype)
16717 diag::warn_non_prototype_changes_behavior)
16724 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16725 if (!CmpndBody->body_empty())
16726 Diag(CmpndBody->body_front()->getBeginLoc(),
16727 diag::warn_dispatch_body_ignored);
16729 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16737 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16738 Context.setNonKeyFunction(MD);
16754 "Function parsing confused");
16755 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16767 << MD->getSelector().getAsString();
16772 bool isDesignated =
16773 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16774 assert(isDesignated && InitMethod);
16775 (void)isDesignated;
16778 auto IFace = MD->getClassInterface();
16781 auto SuperD = IFace->getSuperClass();
16791 diag::warn_objc_designated_init_missing_super_call);
16793 diag::note_objc_designated_init_marked_here);
16801 diag::warn_objc_secondary_init_missing_init_call);
16817 "This should only be set for ObjC methods, which should have been "
16818 "handled in the block above.");
16833 if (!
Destructor->getParent()->isDependentType())
16851 ActivePolicy = &WP;
16854 if (!IsInstantiation && FD &&
16860 if (FD && FD->
hasAttr<NakedAttr>()) {
16864 bool RegisterVariables =
false;
16865 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
16866 for (
const auto *
Decl : DS->decls()) {
16867 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
16868 RegisterVariables =
16869 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16870 if (!RegisterVariables)
16875 if (RegisterVariables)
16878 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16879 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16888 "Leftover temporaries in function");
16889 assert(!
Cleanup.exprNeedsCleanups() &&
16890 "Unaccounted cleanups in function");
16892 "Leftover expressions for odr-use checking");
16901 if (!IsInstantiation)
16904 if (!RetainFunctionScopeInfo)
16933 D = TD->getTemplatedDecl();
16945 assert(
LangOpts.implicitFunctionsAllowed() &&
16946 "Implicit function declarations aren't allowed in this language mode");
16953 Scope *BlockScope = S;
16961 Scope *ContextScope = BlockScope;
16965 ContextScope = ContextScope->
getParent();
16985 Diag(Loc, diag::ext_use_out_of_scope_declaration)
16988 return ExternCPrev;
16994 if (II.
getName().starts_with(
"__builtin_"))
16995 diag_id = diag::warn_builtin_unknown;
16998 diag_id = diag::ext_implicit_function_decl_c99;
17000 diag_id = diag::warn_implicit_function_decl;
17008 if (S && !ExternCPrev &&
17015 Diag(Loc, diag_id) << &II;
17031 return ExternCPrev;
17039 Context.getPrintingPolicy());
17041 assert(!
Error &&
"Error setting up implicit decl!");
17084 bool IsNothrow =
false;
17096 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17114 if (!FD->
hasAttr<AllocSizeAttr>()) {
17115 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17126 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17127 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17151 unsigned FormatIdx;
17153 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17154 if (!FD->
hasAttr<FormatAttr>()) {
17155 const char *fmt =
"printf";
17157 if (FormatIdx < NumParams &&
17163 HasVAListArg ? 0 : FormatIdx+2,
17167 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17169 if (!FD->
hasAttr<FormatAttr>())
17171 &
Context.Idents.get(
"scanf"),
17173 HasVAListArg ? 0 : FormatIdx+2,
17179 if (!FD->
hasAttr<CallbackAttr>() &&
17180 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17181 FD->
addAttr(CallbackAttr::CreateImplicit(
17187 bool NoExceptions =
17189 bool ConstWithoutErrnoAndExceptions =
17190 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17191 bool ConstWithoutExceptions =
17192 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17193 if (!FD->
hasAttr<ConstAttr>() &&
17194 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17195 (!ConstWithoutErrnoAndExceptions ||
17197 (!ConstWithoutExceptions || NoExceptions))
17203 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17204 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17206 switch (BuiltinID) {
17207 case Builtin::BI__builtin_fma:
17208 case Builtin::BI__builtin_fmaf:
17209 case Builtin::BI__builtin_fmal:
17210 case Builtin::BIfma:
17211 case Builtin::BIfmaf:
17212 case Builtin::BIfmal:
17222 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17223 !FD->
hasAttr<NonNullAttr>()) {
17225 for (
int I : Indxs) {
17228 T =
Context.getAttributedType(attr::TypeNonNull,
T,
T);
17233 for (
int I : Indxs)
17234 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17235 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17236 ParamIndxs.size()));
17239 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17240 !FD->
hasAttr<ReturnsTwiceAttr>())
17243 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17245 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17247 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17250 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17255 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17262 switch (BuiltinID) {
17263 case Builtin::BImemalign:
17264 case Builtin::BIaligned_alloc:
17265 if (!FD->
hasAttr<AllocAlignAttr>())
17274 switch (BuiltinID) {
17275 case Builtin::BIcalloc:
17276 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17279 case Builtin::BImemalign:
17280 case Builtin::BIaligned_alloc:
17281 case Builtin::BIrealloc:
17285 case Builtin::BImalloc:
17305 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17321 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17324 if (!FD->
hasAttr<FormatAttr>())
17326 &
Context.Idents.get(
"printf"), 2,
17327 Name->
isStr(
"vasprintf") ? 0 : 3,
17331 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17334 if (!FD->
hasAttr<FormatArgAttr>())
17342 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17343 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17346 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17347 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17400 if (
T->isDependentType())
17410 if (
T->isAtomicType())
17411 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17414 std::optional<unsigned> QualSelect;
17416 QualSelect = diag::CVQualList::Both;
17418 QualSelect = diag::CVQualList::Const;
17420 QualSelect = diag::CVQualList::Volatile;
17423 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17425 T =
T.getAtomicUnqualifiedType();
17430 if (BT->isInteger())
17433 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17434 <<
T <<
T->isBitIntType();
17438 QualType EnumUnderlyingTy,
bool IsFixed,
17440 if (IsScoped != Prev->
isScoped()) {
17441 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17447 if (IsFixed && Prev->
isFixed()) {
17450 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17453 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17459 }
else if (IsFixed != Prev->
isFixed()) {
17460 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17482 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17518 llvm_unreachable(
"invalid TTK");
17557 if (IsIgnoredLoc(NewTagLoc))
17560 auto IsIgnored = [&](
const TagDecl *Tag) {
17561 return IsIgnoredLoc(Tag->getLocation());
17578 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17586 if (isDefinition) {
17594 bool previousMismatch =
false;
17596 if (I->getTagKind() !=
NewTag) {
17601 if (!previousMismatch) {
17602 previousMismatch =
true;
17603 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17607 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17620 if (PrevDef && IsIgnored(PrevDef))
17624 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17631 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17661 if (!Namespace || Namespace->isAnonymousNamespace())
17664 Namespaces.push_back(II);
17667 if (Lookup == Namespace)
17674 llvm::raw_svector_ostream OS(Insertion);
17677 std::reverse(Namespaces.begin(), Namespaces.end());
17678 for (
auto *II : Namespaces)
17679 OS << II->getName() <<
"::";
17692 if (OldDC->
Equals(NewDC))
17711 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17712 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17717 "Nameless record must be a definition!");
17722 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17725 bool isMemberSpecialization =
false;
17726 bool IsInjectedClassName =
false;
17732 if (TemplateParameterLists.size() > 0 ||
17736 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17753 !isMemberSpecialization)
17754 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17757 if (TemplateParams) {
17759 Diag(KWLoc, diag::err_enum_template);
17763 if (TemplateParams->
size() > 0) {
17772 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17773 AS, ModulePrivateLoc,
17775 TemplateParameterLists.data(), SkipBody);
17781 isMemberSpecialization =
true;
17785 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17804 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17805 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17806 Diag(KWLoc, diag::note_enum_friend)
17807 << (ScopedEnum + ScopedEnumUsesClassTag);
17813 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17814 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17817 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17820 EnumUnderlying =
Context.IntTy.getTypePtr();
17821 }
else if (UnderlyingType.
get()) {
17829 EnumUnderlying = TI;
17833 EnumUnderlying =
Context.IntTy.getTypePtr();
17837 EnumUnderlying =
Context.IntTy.getTypePtr();
17847 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
17848 TI && TI->
getType()->isAtomicType())
17851 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
17857 EnumUnderlying =
Context.IntTy.getTypePtr();
17863 bool isStdBadAlloc =
false;
17864 bool isStdAlignValT =
false;
17873 auto createTagFromNewDecl = [&]() ->
TagDecl * {
17883 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17887 if (EnumUnderlying) {
17889 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
17895 ?
Context.getPromotedIntegerType(EnumTy)
17916 RD->addAttr(PackedAttr::CreateImplicit(
Context));
17932 goto CreateNewDecl;
17940 IsDependent =
true;
17969 if (
Previous.wasNotFoundInCurrentInstantiation() &&
17971 IsDependent =
true;
17976 Diag(NameLoc, diag::err_not_tag_in_scope)
17977 << Kind << Name << DC << SS.
getRange();
17980 goto CreateNewDecl;
18028 bool FriendSawTagOutsideEnclosingNamespace =
false;
18035 FriendSawTagOutsideEnclosingNamespace =
true;
18044 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18046 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18077 Previous.getFoundDecl()->isTemplateParameter()) {
18086 if (Name->
isStr(
"bad_alloc")) {
18088 isStdBadAlloc =
true;
18095 }
else if (Name->
isStr(
"align_val_t")) {
18096 isStdAlignValT =
true;
18108 IsTemplateParamOrArg)) {
18109 if (
Invalid)
goto CreateNewDecl;
18192 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18193 if (Tag->getDeclName() == Name &&
18194 Tag->getDeclContext()->getRedeclContext()
18195 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18202 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18204 RD->isInjectedClassName()) {
18211 IsInjectedClassName =
true;
18218 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18219 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18222 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18224 *
this, OldTag->getDeclContext(), SearchDC))) {
18225 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18226 Diag(Shadow->getTargetDecl()->getLocation(),
18227 diag::note_using_decl_target);
18228 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18232 goto CreateNewDecl;
18236 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18242 SS.
isNotEmpty() || isMemberSpecialization)) {
18248 bool SafeToContinue =
18251 if (SafeToContinue)
18252 Diag(KWLoc, diag::err_use_with_wrong_tag)
18255 PrevTagDecl->getKindName());
18257 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18258 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18260 if (SafeToContinue)
18261 Kind = PrevTagDecl->getTagKind();
18274 return PrevTagDecl;
18278 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18279 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18280 else if (
const Type *
T =
18281 dyn_cast_if_present<const Type *>(EnumUnderlying))
18288 ScopedEnum, EnumUnderlyingTy,
18289 IsFixed, PrevEnum))
18299 Diag(NameLoc, diag::ext_member_redeclared);
18300 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18307 if (!Attrs.
empty()) {
18311 (PrevTagDecl->getFriendObjectKind() ==
18324 return PrevTagDecl;
18329 return PrevTagDecl;
18338 if (Def->isBeingDefined()) {
18339 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18340 Diag(PrevTagDecl->getLocation(),
18341 diag::note_previous_definition);
18349 bool IsExplicitSpecializationAfterInstantiation =
false;
18350 if (isMemberSpecialization) {
18352 IsExplicitSpecializationAfterInstantiation =
18353 RD->getTemplateSpecializationKind() !=
18355 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18356 IsExplicitSpecializationAfterInstantiation =
18357 ED->getTemplateSpecializationKind() !=
18366 bool HiddenDefVisible =
false;
18380 SkipBody->
New = createTagFromNewDecl();
18389 if (!HiddenDefVisible && Hidden)
18394 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18399 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18402 Diag(NameLoc, diag::err_redefinition) << Name;
18404 NameLoc.
isValid() ? NameLoc : KWLoc);
18423 SearchDC = PrevTagDecl->getDeclContext();
18451 Diag(NameLoc, diag::err_tag_reference_non_tag)
18452 << PrevDecl << NTK << Kind;
18458 SS.
isNotEmpty() || isMemberSpecialization)) {
18464 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18470 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18473 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18474 << Name << Kind << TND->getUnderlyingType();
18482 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18514 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18515 ScopedEnumUsesClassTag, IsFixed);
18519 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18527 if (IsFixed && ED->
isFixed()) {
18530 }
else if (PrevDecl &&
18532 Diag(Loc, diag::ext_forward_ref_enum_def)
18536 unsigned DiagID = diag::ext_forward_ref_enum;
18538 DiagID = diag::ext_ms_forward_ref_enum;
18540 DiagID = diag::err_forward_ref_enum;
18545 if (EnumUnderlying) {
18547 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18553 ?
Context.getPromotedIntegerType(EnumTy)
18555 assert(ED->
isComplete() &&
"enum with type should be complete");
18565 cast_or_null<CXXRecordDecl>(PrevDecl));
18571 cast_or_null<RecordDecl>(PrevDecl));
18577 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18583 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18585 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18592 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18605 isMemberSpecialization))
18609 if (TemplateParameterLists.size() > 0) {
18610 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18629 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18635 if (ModulePrivateLoc.
isValid()) {
18636 if (isMemberSpecialization)
18637 Diag(
New->getLocation(), diag::err_module_private_specialization)
18644 New->setModulePrivate();
18664 Diag(Loc, diag::err_type_defined_in_param_type)
18670 }
else if (!PrevDecl) {
18674 Diag(Loc, diag::warn_decl_in_param_list)
18680 New->setInvalidDecl();
18702 New->startDefinition();
18704 New->setCompleteDefinition();
18705 New->demoteThisDefinitionToDeclaration();
18733 if (!
New->isInvalidDecl() &&
18734 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18741 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18754 if (isMemberSpecialization && !
New->isInvalidDecl())
18761 if (
New->isBeingDefined())
18762 if (
auto RD = dyn_cast<RecordDecl>(
New))
18763 RD->completeDefinition();
18765 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18806 if (!
Record->getIdentifier())
18814 IsFinalSpelledSealed
18815 ? FinalAttr::Keyword_sealed
18816 : FinalAttr::Keyword_final));
18819 if (TriviallyRelocatable.
isValid())
18821 TriviallyRelocatableAttr::Create(
Context, TriviallyRelocatable));
18824 Record->addAttr(ReplaceableAttr::Create(
Context, Replaceable));
18841 "Broken injected-class-name");
18848 Tag->setBraceRange(BraceRange);
18851 if (Tag->isBeingDefined()) {
18852 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18853 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18854 RD->completeDefinition();
18857 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18859 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
18860 auto *Def = RD->getDefinition();
18861 assert(Def &&
"The record is expected to have a completed definition");
18862 unsigned NumInitMethods = 0;
18863 for (
auto *
Method : Def->methods()) {
18864 if (!
Method->getIdentifier())
18866 if (
Method->getName() ==
"__init")
18869 if (NumInitMethods > 1 || !Def->hasInitMethod())
18870 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
18888 Tag->setTopLevelDeclInObjCContainer();
18891 if (!Tag->isInvalidDecl())
18892 Consumer.HandleTagDeclDefinition(Tag);
18896 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
18902 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18906 if (llvm::any_of(RD->
fields(),
18907 [](
const FieldDecl *FD) { return FD->isBitField(); }))
18908 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
18915 Tag->setInvalidDecl();
18918 if (Tag->isBeingDefined()) {
18919 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18920 RD->completeDefinition();
18933 QualType FieldTy,
bool IsMsStruct,
18944 diag::err_field_incomplete_or_sizeless))
18947 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
18949 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
18959 llvm::APSInt
Value;
18964 BitWidth = ICE.
get();
18967 if (
Value == 0 && FieldName)
18968 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
18971 if (
Value.isSigned() &&
Value.isNegative()) {
18973 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
18975 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
18982 return Diag(FieldLoc, diag::err_bitfield_too_wide)
18987 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
18988 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
18989 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
18993 bool CStdConstraintViolation =
18995 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
18996 if (CStdConstraintViolation || MSBitfieldViolation) {
18997 unsigned DiagWidth =
18998 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
18999 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19001 << !CStdConstraintViolation << DiagWidth;
19007 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19008 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19051 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19062 diag::err_invalid_thread)
19070 switch (
Previous.getResultKind()) {
19077 PrevDecl =
Previous.getRepresentativeDecl();
19091 PrevDecl =
nullptr;
19095 PrevDecl =
nullptr;
19102 TSSL, AS, PrevDecl, &D);
19105 Record->setInvalidDecl();
19124 bool Mutable,
Expr *BitWidth,
19130 bool InvalidDecl =
false;
19135 if (
T.isNull() ||
T->containsErrors()) {
19136 InvalidDecl =
true;
19142 bool isIncomplete =
19146 diag::err_field_incomplete_or_sizeless);
19147 if (isIncomplete) {
19149 Record->setInvalidDecl();
19150 InvalidDecl =
true;
19155 Record->setInvalidDecl();
19156 InvalidDecl =
true;
19162 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19163 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19164 Diag(Loc, diag::err_field_with_address_space);
19165 Record->setInvalidDecl();
19166 InvalidDecl =
true;
19172 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19173 T->isBlockPointerType()) {
19174 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19175 Record->setInvalidDecl();
19176 InvalidDecl =
true;
19181 "__cl_clang_bitfields",
LangOpts)) {
19182 Diag(Loc, diag::err_opencl_bitfields);
19183 InvalidDecl =
true;
19189 T.hasQualifiers()) {
19190 InvalidDecl =
true;
19191 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19196 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19198 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19199 InvalidDecl =
true;
19204 diag::err_abstract_type_in_decl,
19206 InvalidDecl =
true;
19209 BitWidth =
nullptr;
19215 InvalidDecl =
true;
19216 BitWidth =
nullptr;
19221 if (!InvalidDecl && Mutable) {
19222 unsigned DiagID = 0;
19223 if (
T->isReferenceType())
19224 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19225 : diag::err_mutable_reference;
19226 else if (
T.isConstQualified())
19227 DiagID = diag::err_mutable_const;
19233 Diag(ErrLoc, DiagID);
19234 if (DiagID != diag::ext_mutable_reference) {
19236 InvalidDecl =
true;
19248 BitWidth, Mutable, InitStyle);
19257 Diag(Loc, diag::err_duplicate_member) << II;
19263 if (
Record->isUnion()) {
19265 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19280 const bool HaveMSExt =
19285 HaveMSExt ? diag::ext_union_member_of_reference_type
19286 : diag::err_union_member_of_reference_type)
19306 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19309 if (
T.isObjCGCWeak())
19310 Diag(Loc, diag::warn_attribute_weak_on_field);
19313 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19330 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19341 if (RDecl->hasNonTrivialCopyConstructor())
19343 else if (!RDecl->hasTrivialDefaultConstructor())
19345 else if (RDecl->hasNonTrivialCopyAssignment())
19347 else if (RDecl->hasNonTrivialDestructor())
19352 RDecl->hasObjectMember()) {
19360 if (!FD->
hasAttr<UnavailableAttr>())
19361 FD->
addAttr(UnavailableAttr::CreateImplicit(
19362 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19369 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19370 : diag::err_illegal_union_or_anon_struct_member)
19382 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19385 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19393 if (!CD->IsClassExtension())
19410 AllIvarDecls.push_back(Ivar);
19422 if (!
Record->hasUserDeclaredDestructor()) {
19430 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19431 if (DD->isInvalidDecl())
19435 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19449 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19453 Msg = diag::err_ambiguous_destructor;
19458 Msg = diag::err_no_viable_destructor;
19469 Record->setInvalidDecl();
19476 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19520 if (!Method->getTrailingRequiresClause())
19521 SatisfactionStatus.push_back(
true);
19525 SatisfactionStatus.push_back(
false);
19527 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19531 for (
size_t i = 0; i < Methods.size(); i++) {
19532 if (!SatisfactionStatus[i])
19540 bool AnotherMethodIsMoreConstrained =
false;
19541 for (
size_t j = 0; j < Methods.size(); j++) {
19542 if (i == j || !SatisfactionStatus[j])
19556 AnotherMethodIsMoreConstrained =
true;
19560 AnotherMethodIsMoreConstrained)) {
19563 AnotherMethodIsMoreConstrained =
true;
19565 if (AnotherMethodIsMoreConstrained)
19570 if (!AnotherMethodIsMoreConstrained) {
19571 Method->setIneligibleOrNotSelected(
false);
19572 Record->addedEligibleSpecialMemberFunction(Method,
19573 1 << llvm::to_underlying(CSM));
19587 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19589 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19591 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19595 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19596 if (CD->isInvalidDecl())
19598 if (CD->isDefaultConstructor())
19599 DefaultConstructors.push_back(MD);
19600 else if (CD->isCopyConstructor())
19601 CopyConstructors.push_back(MD);
19602 else if (CD->isMoveConstructor())
19603 MoveConstructors.push_back(MD);
19605 CopyAssignmentOperators.push_back(MD);
19607 MoveAssignmentOperators.push_back(MD);
19625 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19626 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19639 if (
const auto *TD = dyn_cast<TagDecl>(D))
19640 return !TD->isCompleteDefinition();
19655 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19662 assert(EnclosingDecl &&
"missing record or interface decl");
19671 case Decl::ObjCCategory:
19674 case Decl::ObjCImplementation:
19682 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19686 unsigned NumNamedMembers = 0;
19688 for (
const auto *I :
Record->decls()) {
19689 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19690 if (IFD->getDeclName())
19697 const FieldDecl *PreviousField =
nullptr;
19707 RecFields.push_back(FD);
19727 bool IsLastField = (i + 1 == Fields.end());
19742 unsigned DiagID = 0;
19743 if (!
Record->isUnion() && !IsLastField) {
19746 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19750 }
else if (
Record->isUnion())
19752 ? diag::ext_flexible_array_union_ms
19753 : diag::ext_flexible_array_union_gnu;
19754 else if (NumNamedMembers < 1)
19756 ? diag::ext_flexible_array_empty_aggregate_ms
19757 : diag::ext_flexible_array_empty_aggregate_gnu;
19767 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19781 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19788 Record->setHasFlexibleArrayMember(
true);
19797 diag::err_incomplete_type)
19800 diag::err_field_incomplete_or_sizeless))) {
19806 if (
Record && RD->hasFlexibleArrayMember()) {
19809 Record->setHasFlexibleArrayMember(
true);
19810 if (!
Record->isUnion()) {
19827 diag::err_abstract_type_in_decl,
19832 if (
Record && RD->hasObjectMember())
19833 Record->setHasObjectMember(
true);
19834 if (
Record && RD->hasVolatileMember())
19835 Record->setHasVolatileMember(
true);
19854 FD->
addAttr(UnavailableAttr::CreateImplicit(
19855 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19859 !
Record->hasObjectMember()) {
19862 Record->setHasObjectMember(
true);
19865 if (
const auto *RD = BaseType->getAsRecordDecl();
19866 RD && RD->hasObjectMember())
19867 Record->setHasObjectMember(
true);
19868 else if (BaseType->isObjCObjectPointerType() ||
19869 BaseType.isObjCGCStrong())
19870 Record->setHasObjectMember(
true);
19875 !shouldIgnoreForRecordTriviality(FD)) {
19878 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
19881 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
19885 Record->setNonTrivialToPrimitiveCopy(
true);
19887 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
19889 if (FD->
hasAttr<ExplicitInitAttr>())
19890 Record->setHasUninitializedExplicitInitFields(
true);
19892 Record->setNonTrivialToPrimitiveDestroy(
true);
19893 Record->setParamDestroyedInCallee(
true);
19895 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
19899 if (RD->getArgPassingRestrictions() ==
19901 Record->setArgPassingRestrictions(
19904 Record->setArgPassingRestrictions(
19908 Record->setArgPassingRestrictions(
19910 Record->setNonTrivialToPrimitiveCopy(
true);
19915 Record->setHasVolatileMember(
true);
19916 bool ReportMSBitfieldStoragePacking =
19917 Record && PreviousField &&
19918 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
19920 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
19924 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
19925 IsNonDependentBitField(PreviousField)) {
19929 if (FDStorageSize != PreviousFieldStorageSize) {
19931 diag::warn_ms_bitfield_mismatched_storage_packing)
19935 diag::note_ms_bitfield_mismatched_storage_size_previous)
19936 << PreviousField << PreviousField->
getType();
19946 bool Completed =
false;
19951 Record->setInvalidDecl();
19955 if (!CXXRecord->isInvalidDecl()) {
19958 I = CXXRecord->conversion_begin(),
19959 E = CXXRecord->conversion_end(); I != E; ++I)
19960 I.setAccess((*I)->getAccess());
19966 if (!CXXRecord->isDependentType()) {
19967 if (!CXXRecord->isInvalidDecl()) {
19971 if (CXXRecord->getNumVBases()) {
19973 CXXRecord->getFinalOverriders(FinalOverriders);
19975 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
19976 MEnd = FinalOverriders.end();
19979 SOEnd = M->second.end();
19980 SO != SOEnd; ++SO) {
19981 assert(SO->second.size() > 0 &&
19982 "Virtual function without overriding functions?");
19983 if (SO->second.size() == 1)
19990 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
19992 Diag(M->first->getLocation(),
19993 diag::note_overridden_virtual_function);
19995 OM = SO->second.begin(),
19996 OMEnd = SO->second.end();
19998 Diag(OM->Method->getLocation(), diag::note_final_overrider)
19999 << (
const NamedDecl *)M->first << OM->Method->getParent();
20001 Record->setInvalidDecl();
20004 CXXRecord->completeDefinition(&FinalOverriders);
20014 Record->completeDefinition();
20023 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20024 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20025 EntirelyFunctionPointers(
Record)))) {
20029 Record->reorderDecls(NewDeclOrdering);
20034 auto *Dtor = CXXRecord->getDestructor();
20035 if (Dtor && Dtor->isImplicit() &&
20037 CXXRecord->setImplicitDestructorIsDeleted();
20042 if (
Record->hasAttrs()) {
20045 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20047 IA->getRange(), IA->getBestCase(),
20048 IA->getInheritanceModel());
20054 bool CheckForZeroSize;
20056 CheckForZeroSize =
true;
20061 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20063 CXXRecord->isCLike();
20065 if (CheckForZeroSize) {
20066 bool ZeroSize =
true;
20067 bool IsEmpty =
true;
20068 unsigned NonBitFields = 0;
20070 E =
Record->field_end();
20071 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20073 if (I->isUnnamedBitField()) {
20074 if (!I->isZeroLengthBitField())
20078 QualType FieldType = I->getType();
20080 !
Context.getTypeSizeInChars(FieldType).isZero())
20090 diag::warn_zero_size_struct_union_in_extern_c :
20091 diag::warn_zero_size_struct_union_compat)
20092 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20099 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20100 : diag::ext_no_named_members_in_struct_union)
20108 ID->setEndOfDefinitionLoc(RBrac);
20110 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20112 ID->addDecl(ClsFields[i]);
20116 if (ID->getSuperClass())
20119 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20120 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20121 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20127 IMPDecl->setIvarLBraceLoc(LBrac);
20128 IMPDecl->setIvarRBraceLoc(RBrac);
20130 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20138 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20142 Diag(ClsFields[i]->getLocation(),
20143 diag::err_duplicate_ivar_declaration);
20144 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20150 Diag(ClsFields[i]->getLocation(),
20151 diag::err_duplicate_ivar_declaration);
20152 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20158 CDecl->addDecl(ClsFields[i]);
20160 CDecl->setIvarLBraceLoc(LBrac);
20161 CDecl->setIvarRBraceLoc(RBrac);
20172 assert((
T->isIntegralType(Context) ||
20173 T->isEnumeralType()) &&
"Integral type required!");
20174 const unsigned NumTypes = 4;
20175 QualType SignedIntegralTypes[NumTypes] = {
20176 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20178 QualType UnsignedIntegralTypes[NumTypes] = {
20179 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20180 Context.UnsignedLongLongTy
20183 unsigned BitWidth = Context.getTypeSize(
T);
20184 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20185 : UnsignedIntegralTypes;
20186 for (
unsigned I = 0; I != NumTypes; ++I)
20187 if (Context.getTypeSize(Types[I]) > BitWidth)
20198 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20199 llvm::APSInt EnumVal(IntWidth);
20219 EltTy =
Enum->getIntegerType();
20225 Val = Converted.
get();
20232 if (
Enum->isComplete()) {
20233 EltTy =
Enum->getIntegerType();
20239 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20242 .isWindowsMSVCEnvironment()) {
20243 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20245 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20268 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20270 ? diag::warn_c17_compat_enum_value_not_int
20271 : diag::ext_c23_enum_value_not_int)
20273 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20285 if (
Enum->isDependentType())
20287 else if (!LastEnumConst) {
20296 if (
Enum->isFixed()) {
20297 EltTy =
Enum->getIntegerType();
20306 EltTy = LastEnumConst->
getType();
20309 if (EnumVal < LastEnumConst->getInitVal()) {
20321 if (
T.isNull() ||
Enum->isFixed()) {
20325 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20327 if (
Enum->isFixed())
20329 Diag(IdLoc, diag::err_enumerator_wrapped)
20333 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20344 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20356 ? diag::warn_c17_compat_enum_value_not_int
20357 : diag::ext_c23_enum_value_not_int)
20358 << 1 <<
toString(EnumVal, 10) << 1;
20360 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20363 : diag::ext_c23_enum_value_not_int)
20364 << 1 <<
toString(EnumVal, 10) << 1;
20372 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20391 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20399 Skip.Previous = Hidden;
20413 cast_or_null<EnumConstantDecl>(lastEnumConst);
20430 PrevDecl =
nullptr;
20457 "Received TagDecl when not in C++!");
20460 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20462 Diag(IdLoc, diag::err_redefinition) << Id;
20495 if (!BO->isAdditiveOp())
20503 InitExpr = BO->getLHS();
20507 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20527 if (!
Enum->getIdentifier())
20531 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20540 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20543 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20547 llvm::APSInt Val = D->getInitVal();
20548 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20551 DuplicatesVector DupVector;
20552 ValueToVectorMap EnumMap;
20556 for (
auto *Element : Elements) {
20570 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20573 if (EnumMap.size() == 0)
20577 for (
auto *Element : Elements) {
20583 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20584 if (Iter == EnumMap.end())
20587 DeclOrVector& Entry = Iter->second;
20594 auto Vec = std::make_unique<ECDVector>();
20596 Vec->push_back(ECD);
20603 DupVector.emplace_back(std::move(Vec));
20609 if (*Vec->begin() == ECD)
20612 Vec->push_back(ECD);
20616 for (
const auto &Vec : DupVector) {
20617 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20620 auto *FirstECD = Vec->front();
20621 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20622 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20623 << FirstECD->getSourceRange();
20627 for (
auto *ECD : llvm::drop_begin(*Vec))
20628 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20629 << ECD <<
toString(ECD->getInitVal(), 10)
20630 << ECD->getSourceRange();
20635 bool AllowMask)
const {
20636 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20640 llvm::APInt &FlagBits = R.first->second;
20644 const auto &EVal = E->getInitVal();
20646 if (EVal.isPowerOf2())
20647 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20659 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20660 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20667 bool HasBitwiseOp =
false;
20672 for (
const auto *ECD :
Enum->enumerators()) {
20673 const Expr *InitExpr = ECD->getInitExpr();
20679 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20683 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20684 HasBitwiseOp =
true;
20685 }
else if (Op == BO_LT || Op == BO_GT) {
20688 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20690 if (IntLiteral->getValue() == 1)
20691 SuspiciousCompares.push_back(BinOp);
20699 if (HasBitwiseOp) {
20700 for (
const auto *BinOp : SuspiciousCompares) {
20701 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20706 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20707 << BinOp->getOpcodeStr() << SuggestedOp;
20709 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20725 if (
Enum->isDependentType()) {
20726 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20728 cast_or_null<EnumConstantDecl>(Elements[i]);
20729 if (!ECD)
continue;
20740 unsigned NumNegativeBits = 0;
20741 unsigned NumPositiveBits = 0;
20742 bool MembersRepresentableByInt =
20743 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20747 unsigned BestWidth;
20768 if (
Enum->isComplete()) {
20769 BestType =
Enum->getIntegerType();
20770 if (
Context.isPromotableIntegerType(BestType))
20771 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20773 BestPromotionType = BestType;
20775 BestWidth =
Context.getIntWidth(BestType);
20777 bool EnumTooLarge =
Context.computeBestEnumTypes(
20778 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20779 BestWidth =
Context.getIntWidth(BestType);
20781 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20786 for (
auto *D : Elements) {
20787 auto *ECD = cast_or_null<EnumConstantDecl>(D);
20788 if (!ECD)
continue;
20797 llvm::APSInt InitVal = ECD->getInitVal();
20805 MembersRepresentableByInt) {
20813 NewWidth =
Context.getTargetInfo().getIntWidth();
20815 }
else if (ECD->getType() == BestType) {
20821 ECD->setType(EnumType);
20825 NewWidth = BestWidth;
20830 InitVal = InitVal.extOrTrunc(NewWidth);
20831 InitVal.setIsSigned(NewSign);
20832 ECD->setInitVal(
Context, InitVal);
20835 if (ECD->getInitExpr() &&
20836 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20838 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20844 ECD->setType(EnumType);
20846 ECD->setType(NewTy);
20849 Enum->completeDefinition(BestType, BestPromotionType,
20850 NumPositiveBits, NumNegativeBits);
20855 if (
Enum->isClosedFlag()) {
20856 for (
Decl *D : Elements) {
20858 if (!ECD)
continue;
20861 if (InitVal != 0 && !InitVal.isPowerOf2() &&
20869 if (
Enum->hasAttrs())
20908 AsmLabelAttr *
Attr =
20909 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
20919 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
20932 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
20948 if (!PrevDecl->
hasAttr<AliasAttr>())
20949 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
20958 assert(FD &&
"Expected non-null FunctionDecl");
20970 auto IsEmittedForExternalSymbol = [
this, FD]() {
20982 if (
LangOpts.OpenMPIsTargetDevice) {
20985 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20992 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
20996 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
20997 if (IsEmittedForExternalSymbol())
21003 }
else if (
LangOpts.OpenMP > 45) {
21007 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21010 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21029 if (IsEmittedForExternalSymbol())
21034 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
21036 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
21039 Spec->getTemplateSpecializationKind();
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static bool isDeclExternC(const T &D)
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
static const Decl * getCanonicalDecl(const Decl *D)
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Architecture Architecture
llvm::MachO::Record Record
static bool isExternC(const NamedDecl *ND)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to ARM.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static void diagnoseImplicitlyRetainedSelf(Sema &S)
static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D)
static UnqualifiedTypeNameLookupResult lookupUnqualifiedTypeNameInBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc, const CXXRecordDecl *RD)
Tries to perform unqualified lookup of the type decls in bases for dependent class.
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool isMainVar(DeclarationName Name, VarDecl *VD)
static bool PreviousDeclsHaveMultiVersionAttribute(const FunctionDecl *FD)
static ParsedType recoverFromTypeInKnownDependentBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc)
static void mergeParamDeclTypes(ParmVarDecl *NewParam, const ParmVarDecl *OldParam, Sema &S)
static void checkHybridPatchableAttr(Sema &S, NamedDecl &ND)
static void adjustDeclContextForDeclaratorDecl(DeclaratorDecl *NewD, DeclaratorDecl *OldD)
If necessary, adjust the semantic declaration context for a qualified declaration to name the correct...
static bool isResultTypeOrTemplate(LookupResult &R, const Token &NextToken)
Determine whether the given result set contains either a type name or.
static void FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL)
static bool AllowOverloadingOfFunction(const LookupResult &Previous, ASTContext &Context, const FunctionDecl *New)
Determine whether overloading is allowed for a new function declaration considering prior declaration...
static TypeSourceInfo * TryToFixInvalidVariablyModifiedTypeSourceInfo(TypeSourceInfo *TInfo, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID, ASTContext::GetBuiltinTypeError Error)
static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D)
static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS, ExpectedDecl *New)
Check whether a redeclaration of an entity introduced by a using-declaration is valid,...
static ShadowedDeclKind computeShadowedDeclKind(const NamedDecl *ShadowedDecl, const DeclContext *OldDC)
Determine what kind of declaration we're shadowing.
static void checkIsValidOpenCLKernelParameter(Sema &S, Declarator &D, ParmVarDecl *Param, llvm::SmallPtrSetImpl< const Type * > &ValidTypes)
static void mergeParamDeclAttributes(ParmVarDecl *newDecl, const ParmVarDecl *oldDecl, Sema &S)
mergeParamDeclAttributes - Copy attributes from the old parameter to the new one.
static bool CheckC23ConstexprVarType(Sema &SemaRef, SourceLocation VarLoc, QualType T)
static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a mulitversion function declaration.
static bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old)
Merge alignment attributes from Old to New, taking into account the special semantics of C11's _Align...
static bool mergeTypeWithPrevious(Sema &S, VarDecl *NewVD, VarDecl *OldVD, LookupResult &Previous)
static void CheckConstPureAttributesUsage(Sema &S, FunctionDecl *NewFD)
static bool FindPossiblePrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool MultiVersionTypesCompatible(FunctionDecl *Old, FunctionDecl *New)
static NestedNameSpecifier synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC)
static void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx, FixItHint &Hint)
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P, SourceLocation ExplicitThisLoc)
static void checkLifetimeBoundAttr(Sema &S, NamedDecl &ND)
static void patchDefaultTargetVersion(FunctionDecl *From, FunctionDecl *To)
static bool isFunctionDefinitionDiscarded(Sema &S, FunctionDecl *FD)
Given that we are within the definition of the given function, will that definition behave like C99's...
static void CheckForDuplicateEnumValues(Sema &S, ArrayRef< Decl * > Elements, EnumDecl *Enum, QualType EnumType)
static unsigned GetDiagnosticTypeSpecifierID(const DeclSpec &DS)
static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old)
checkNewAttributesAfterDef - If we already have a definition, check that there are no new attributes ...
static bool isClassCompatTagKind(TagTypeKind Tag)
Determine if tag kind is a class-key compatible with class for redeclaration (class,...
static bool hasIdenticalPassObjectSizeAttrs(const FunctionDecl *A, const FunctionDecl *B)
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND)
static bool hasSimilarParameters(ASTContext &Context, FunctionDecl *Declaration, FunctionDecl *Definition, SmallVectorImpl< unsigned > &Params)
hasSimilarParameters - Determine whether the C++ functions Declaration and Definition have "nearly" m...
static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD)
Determine whether a class is C-like, according to the rules of C++ [dcl.typedef] for anonymous classe...
static unsigned propagateAttribute(ParmVarDecl *To, const ParmVarDecl *From, Sema &S)
static FunctionDecl * CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, DeclContext *DC, QualType &R, TypeSourceInfo *TInfo, StorageClass SC, bool &IsVirtualOkay)
static Scope * getTagInjectionScope(Scope *S, const LangOptions &LangOpts)
Find the Scope in which a tag is implicitly declared if we see an elaborated type specifier in the sp...
static bool methodHasName(const FunctionDecl *FD, StringRef Name)
static std::pair< diag::kind, SourceLocation > getNoteDiagForInvalidRedeclaration(const T *Old, const T *New)
static bool checkForConflictWithNonVisibleExternC(Sema &S, const T *ND, LookupResult &Previous)
Apply special rules for handling extern "C" declarations.
static bool DeclHasAttr(const Decl *D, const Attr *A)
DeclhasAttr - returns true if decl Declaration already has the target attribute.
static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty)
static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit)
static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags, const LookupResult &R)
static FixItHint createFriendTagNNSFixIt(Sema &SemaRef, NamedDecl *ND, Scope *S, SourceLocation NameLoc)
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
static bool CheckAnonMemberRedeclaration(Sema &SemaRef, Scope *S, DeclContext *Owner, DeclarationName Name, SourceLocation NameLoc, bool IsUnion, StorageClass SC)
We are trying to inject an anonymous member into the given scope; check if there's an existing declar...
static bool checkGlobalOrExternCConflict(Sema &S, const T *ND, bool IsGlobal, LookupResult &Previous)
Check for conflict between this global or extern "C" declaration and previous global or extern "C" de...
static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts, const NamedDecl *D)
static bool isStdBuiltin(ASTContext &Ctx, FunctionDecl *FD, unsigned BuiltinID)
Determine whether a declaration matches a known function in namespace std.
static bool InjectAnonymousStructOrUnionMembers(Sema &SemaRef, Scope *S, DeclContext *Owner, RecordDecl *AnonRecord, AccessSpecifier AS, StorageClass SC, SmallVectorImpl< NamedDecl * > &Chaining)
InjectAnonymousStructOrUnionMembers - Inject the members of the anonymous struct or union AnonRecord ...
@ InvalidAddrSpacePtrKernelParam
static bool isFromSystemHeader(SourceManager &SM, const Decl *D)
Returns true if the declaration is declared in a system header or from a system macro.
static SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const ValueDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context, CXXMethodDecl *M1, CXXMethodDecl *M2, CXXSpecialMemberKind CSM)
[class.mem.special]p5 Two special member functions are of the same kind if:
static const CXXRecordDecl * findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC)
Find the parent class with dependent bases of the innermost enclosing method context.
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record)
[class.dtor]p4: At the end of the definition of a class, overload resolution is performed among the p...
static bool shouldConsiderLinkage(const VarDecl *VD)
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record)
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD, const FunctionDecl *NewFD, bool CausesMV, MultiVersionKind MVKind)
static DeclContext * getTagInjectionContext(DeclContext *DC)
Find the DeclContext in which a tag is implicitly declared if we see an elaborated type specifier in ...
static bool EquivalentArrayTypes(QualType Old, QualType New, const ASTContext &Ctx)
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New)
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for redeclaration diagnostic message.
static void checkInheritableAttr(Sema &S, NamedDecl &ND)
static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver)
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl *Old)
static NamedDecl * DiagnoseInvalidRedeclaration(Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD, ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S)
Generate diagnostics for an invalid function redeclaration.
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, DeclarationName Name)
RebuildDeclaratorInCurrentInstantiation - Checks whether the given declarator needs to be rebuilt in ...
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record, ArrayRef< CXXMethodDecl * > Methods, CXXSpecialMemberKind CSM)
[class.mem.special]p6: An eligible special member function is a special member function for which:
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc)
static bool hasParsedAttr(Scope *S, const Declarator &PD, ParsedAttr::Kind Kind)
ShadowedDeclKind
Enum describing the select options in diag::warn_decl_shadow.
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S)
static void CheckForComparisonInEnumInitializer(SemaBase &Sema, const EnumDecl *Enum)
static void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
static bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
static void checkWeakAttr(Sema &S, NamedDecl &ND)
static void checkModularFormatAttr(Sema &S, NamedDecl &ND)
static void checkSelectAnyAttr(Sema &S, NamedDecl &ND)
static bool isImplicitInstantiation(NamedDecl *D)
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT)
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent, SourceLocation DefaultInitLoc)
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S)
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD)
Returns true if there hasn't been any invalid type diagnosed.
static void RemoveUsingDecls(LookupResult &R)
Removes using shadow declarations not at class scope from the lookup results.
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S, CXXRecordDecl *Record)
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind, MultiVersionKind MVKind)
static bool looksMutable(QualType T, const ASTContext &Ctx)
static bool isUsingDeclNotAtClassScope(NamedDecl *D)
static void propagateAttributes(ParmVarDecl *To, const ParmVarDecl *From, F &&propagator)
static const NamedDecl * getDefinition(const Decl *D)
static QualType TryToFixInvalidVariablyModifiedType(QualType T, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static bool hasDeducedAuto(DeclaratorDecl *DD)
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT)
static QualType getCoreType(QualType Ty)
static bool isMainFileLoc(const Sema &S, SourceLocation Loc)
static bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, AvailabilityMergeKind AMK)
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD)
Check the target or target_version attribute of the function for MultiVersion validity.
static bool isOutOfScopePreviousDeclaration(NamedDecl *, DeclContext *, ASTContext &)
Determines whether the given declaration is an out-of-scope previous declaration.
static StorageClass StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS)
StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to a VarDecl::StorageClass.
static bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a new function declaration being added to an existing multiversioned declaratio...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void checkAliasAttr(Sema &S, NamedDecl &ND)
static void filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl, LookupResult &Previous)
Typedef declarations don't have linkage, but they still denote the same entity if their types are the...
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum)
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T)
static void checkWeakRefAttr(Sema &S, NamedDecl &ND)
static bool isIncompleteDeclExternC(Sema &S, const T *D)
Determine whether a variable is extern "C" prior to attaching an initializer.
static bool isAttributeTargetADefinition(Decl *D)
static Attr * getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD)
Return a CodeSegAttr from a containing class.
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D)
Check for this common pattern:
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC, DeclContext *NewDC)
Determine whether a tag originally declared in context OldDC can be redeclared with an unqualified na...
static bool isRecordType(QualType T)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
static CharSourceRange getRange(const CharSourceRange &EditRange, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeMacroExpansion)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
@ GE_Missing_type
Missing a type.
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
TypeLoc getElementLoc() const
SourceLocation getRBracketLoc() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
@ AS_Declspec
__declspec(...)
SourceRange getRange() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
AttributeFactory & getFactory() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
A builtin binary operation expression such as "x + y" or "x <= y".
StringRef getOpcodeStr() const
static bool isCompoundAssignmentOp(Opcode Opc)
A binding in a decomposition declaration.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool doesNotEscape() const
This class is used for builtin types like 'int'.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
const char * getHeaderName(unsigned ID) const
If this is a library function that comes from a specific header, retrieve that header name.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, const AssociatedConstraint &TrailingRequiresClause={}, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
A mapping from each virtual member function to its set of final overriders.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
void addOverriddenMethod(const CXXMethodDecl *MD)
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
base_class_iterator bases_end()
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
base_class_iterator bases_begin()
capture_const_range captures() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool hasDefinition() const
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
UnresolvedSetIterator conversion_iterator
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
char * location_data() const
Retrieve the data associated with the source-location information.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool isCallToStdMove() const
CastKind getCastKind() const
static CharSourceRange getCharRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
llvm::APInt getSize() const
Return the constant array size as an APInt.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclListNode::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
SourceLocation getBeginLoc() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
static const TST TST_typeof_unqualType
bool hasAutoTypeSpec() const
static const TST TST_typename
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
void ClearStorageClassSpecs()
bool isNoreturnSpecified() const
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
static const TST TST_interface
static const TST TST_typeofExpr
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
void SetRangeStart(SourceLocation Loc)
SourceLocation getNoreturnSpecLoc() const
bool isExternInLinkageSpec() const
static const TST TST_union
SCS
storage-class-specifier
SourceLocation getExplicitSpecLoc() const
SourceLocation getModulePrivateSpecLoc() const
bool isMissingDeclaratorOk()
Checks if this DeclSpec can stand alone, without a Declarator.
ParsedType getRepAsType() const
void UpdateTypeRep(ParsedType Rep)
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
void ClearTypeQualifiers()
Clear out all of the type qualifiers.
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
static const TST TST_enum
static const TST TST_decltype
static bool isDeclRep(TST T)
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
static const TST TST_typeof_unqualExpr
static const TST TST_class
static const TST TST_void
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
static const TST TST_atomic
SourceLocation getThreadStorageClassSpecLoc() const
Decl * getRepAsDecl() const
static const TST TST_unspecified
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void UpdateExprRep(Expr *Rep)
static const TSCS TSCS_thread_local
static const TST TST_error
ExplicitSpecifier getExplicitSpecifier() const
bool isTypeSpecOwned() const
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_typeofType
static const TST TST_auto
ConstexprSpecKind getConstexprSpecifier() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setAttrs(const AttrVec &Attrs)
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
bool isInNamedModule() const
Whether this declaration comes from a named module.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void setTopLevelDeclInObjCContainer(bool V=true)
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
@ FOK_Declared
A friend of a previously-declared entity.
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
bool isReferenced() const
Whether any declaration of this entity was referenced.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
bool isAnyOperatorDelete() const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Expr * getAsmLabel() const
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
void setRedeclaration(bool Val)
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
void takeAttributesAppending(ParsedAttributes &attrs)
takeAttributesAppending - Takes attributes from the given ParsedAttributes set and add them to this d...
void setInvalidType(bool Val=true)
TemplateParameterList * getInventedTemplateParameterList() const
The template parameter list generated from the explicit template parameters along with any invented t...
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
const ParsedAttributesView & getDeclarationAttributes() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool hasInitializer() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
const Expr * getInitExpr() const
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
bool isComplete() const
Returns true if this can be considered a complete type.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
void setEnumKeyRange(SourceRange Range)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
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.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withRegParm(unsigned RegParm) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
bool getCmseNSCallAttr() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
iterator - Iterate over the decls of a specified declaration name.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
step_iterator step_begin() const
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
Describes an entity that is being initialized.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
bool isResolvedMSAsmLabel() const
LabelStmt * getStmt() const
bool isMSAsmLabel() const
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i....
bool isCompatibleWithMSVC() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static SourceLocation findLocationAfterToken(SourceLocation loc, tok::TokenKind TKind, const SourceManager &SM, const LangOptions &LangOpts, bool SkipTrailingWhitespaceAndNewLine)
Checks that the given token is the first token that occurs after the given location (this excludes co...
Visibility getVisibility() const
Linkage getLinkage() const
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
Sema & getSema() const
Get the Sema object that this lookup result is searching with.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
LookupResultKind getResultKind() const
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
virtual unsigned getStaticLocalNumber(const VarDecl *VD)=0
Static locals are numbered by source order.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
SourceLocation DefinitionLoc
The location of the module definition.
Module * Parent
The parent of this module.
bool isPrivateModule() const
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
bool isModuleImplementation() const
Is this a module implementation.
bool isModulePartition() const
Is this a module partition.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isLinkageValid() const
True if the computed linkage is valid.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
bool isPlaceholderVar(const LangOptions &LangOpts) const
Visibility getVisibility() const
Determines the visibility of this entity.
bool hasLinkageBeenComputed() const
True if something has required us to compute the linkage of this declaration.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool declarationReplaces(const NamedDecl *OldD, bool IsKnownNewer=true) const
Determine whether this declaration, if known to be well-formed within its context,...
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
bool hasLinkage() const
Determine whether this declaration has linkage.
bool isExternallyVisible() const
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
TypeLoc getAsTypeLoc() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
static constexpr NestedNameSpecifier getGlobal()
bool containsErrors() const
Whether this nested name specifier contains an error.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Type
A type, stored as a Type*.
ObjCCategoryDecl - Represents a category declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
ObjCContainerDecl - Represents a container for method declarations.
ObjCIvarDecl * getIvarDecl(IdentifierInfo *Id) const
getIvarDecl - This method looks up an ivar in this ContextDecl.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
known_extensions_range known_extensions() const
Wrapper for source info for ObjC interfaces.
void setNameLoc(SourceLocation Loc)
ObjCIvarDecl - Represents an ObjC instance variable.
static ObjCIvarDecl * Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, AccessControl ac, Expr *BW=nullptr, bool synthesized=false)
ObjCMethodDecl - Represents an instance or class method declaration.
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
ParmVarDecl *const * param_iterator
ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...
static OpaquePtr make(DeclGroupRef P)
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
MapType::iterator iterator
SmallVectorImpl< UniqueVirtualMethod >::iterator overriding_iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
void setRParenLoc(SourceLocation Loc)
TypeLoc getInnerLoc() const
void setLParenLoc(SourceLocation Loc)
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
ObjCDeclQualifier getObjCDeclQualifier() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setExplicitObjectParameterLoc(SourceLocation Loc)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
static const ParsedAttributesView & none()
bool hasAttribute(ParsedAttr::Kind K) const
ParsedAttributes - A collection of parsed attributes.
AttributePool & getPool() const
unsigned getDiagID() const
Pointer-authentication qualifiers.
bool isAddressDiscriminated() const
TypeLoc getPointeeLoc() const
Wrapper for source info for pointers.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
PrimitiveDefaultInitializeKind
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
QualType withoutLocalFastQualifiers() const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
bool isConstQualified() const
Determine whether this type is const-qualified.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
The collection of all-type qualifiers we support.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
ObjCLifetime getObjCLifetime() const
Represents a struct/union/class.
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
void setMemberSpecialization()
Note that this member template is a specialization.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
void setNRVOCandidate(const VarDecl *Var)
Set the variable that might be used for the named return value optimization.
Scope - A scope is a transient data structure that is used while parsing the program.
void setEntity(DeclContext *E)
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
unsigned getDepth() const
Returns the depth of this scope. The translation-unit has scope depth 0.
unsigned getNextFunctionPrototypeIndex()
Return the number of parameters declared in this function prototype, increasing it by one for the nex...
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isTypeAliasScope() const
Determine whether this scope is a type alias scope.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
void setLookupEntity(DeclContext *E)
unsigned getMSLastManglingNumber() const
DeclContext * getEntity() const
Get the entity corresponding to this scope.
unsigned getMSCurManglingNumber() const
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
unsigned getFunctionPrototypeDepth() const
Returns the number of function prototype scopes in this scope chain.
bool isCompoundStmtScope() const
Determine whether this scope is a compound statement scope.
bool containedInPrototypeScope() const
containedInPrototypeScope - Return true if this or a parent scope is a FunctionPrototypeScope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
bool isFunctionPrototypeScope() const
isFunctionPrototypeScope - Return true if this scope is a function prototype scope.
bool hasUnrecoverableErrorOccurred() const
Determine whether any unrecoverable errors have occurred within this scope.
Scope * getTemplateParamParent()
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
@ DeclScope
This is a scope that can contain a declaration.
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void CheckEntryPoint(FunctionDecl *FD)
HLSLVkConstantIdAttr * mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, int Id)
HLSLNumThreadsAttr * mergeNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z)
void deduceAddressSpace(VarDecl *Decl)
void ActOnTopLevelFunction(FunctionDecl *FD)
HLSLShaderAttr * mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType)
HLSLWaveSizeAttr * mergeWaveSizeAttr(Decl *D, const AttributeCommonInfo &AL, int Min, int Max, int Preferred, int SpelledArgsCount)
void ActOnVariableDeclarator(VarDecl *VD)
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID)
DiagnoseDuplicateIvars - Check for duplicate ivars in the entire class at the start of @implementatio...
void CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden)
Check whether the given new method is a valid override of the given overridden method,...
DeclResult LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S, IdentifierInfo *II)
The parser has read a name in, and Sema has detected that we're currently inside an ObjC method.
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
ExprResult BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV)
void AddCFAuditedAttribute(Decl *D)
AddCFAuditedAttribute - Check whether we're currently within '#pragma clang arc_cf_code_audited' and,...
void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl, ObjCIvarDecl **Fields, unsigned nIvars, SourceLocation Loc)
CheckImplementationIvars - This routine checks if the instance variables listed in the implelementati...
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void ActOnVariableDeclarator(VarDecl *VD)
Function called when a variable declarator is created, which lets us implement the 'routine' 'functio...
OpenACCRoutineDeclAttr * mergeRoutineDeclAttr(const OpenACCRoutineDeclAttr &Old)
void ActOnFunctionDeclarator(FunctionDecl *FD)
Called when a function decl is created, which lets us implement the 'routine' 'doesn't match next thi...
void ActOnVariableInit(VarDecl *VD, QualType InitType)
Called when a variable is initialized, so we can implement the 'routine 'doesn't match the next thing...
void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D)
Act on D, a function definition inside of an omp [begin/end] assumes.
void ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(Decl *D, SmallVectorImpl< FunctionDecl * > &Bases)
Register D as specialization of all base functions in Bases in the current omp begin/end declare vari...
void ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, SmallVectorImpl< FunctionDecl * > &Bases)
The declarator D defines a function in the scope S which is nested in an omp begin/end declare varian...
void ActOnOpenMPDeclareTargetInitializer(Decl *D)
Adds OMPDeclareTargetDeclAttr to referenced variables in declare target directive.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, const llvm::StringMap< bool > &FeatureMap)
void CheckSYCLExternalFunctionDecl(FunctionDecl *FD)
StmtResult BuildSYCLKernelCallStmt(FunctionDecl *FD, CompoundStmt *Body)
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
SwiftNameAttr * mergeNameAttr(Decl *D, const SwiftNameAttr &SNA, StringRef Name)
WebAssemblyImportNameAttr * mergeImportNameAttr(Decl *D, const WebAssemblyImportNameAttr &AL)
WebAssemblyImportModuleAttr * mergeImportModuleAttr(Decl *D, const WebAssemblyImportModuleAttr &AL)
Mode getAlignMode() const
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
static NameClassification DependentNonType()
static NameClassification VarTemplate(TemplateName Name)
static NameClassification Unknown()
static NameClassification OverloadSet(ExprResult E)
static NameClassification UndeclaredTemplate(TemplateName Name)
static NameClassification FunctionTemplate(TemplateName Name)
static NameClassification NonType(NamedDecl *D)
static NameClassification Concept(TemplateName Name)
static NameClassification UndeclaredNonType()
static NameClassification TypeTemplate(TemplateName Name)
static NameClassification Error()
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Scope * getCurScope() const
Retrieve the parser's current scope.
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn)
MergeFunctionDecl - We just parsed a function 'New' from declarator D which has the same name and sco...
void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind, uint64_t MagicValue, QualType Type, bool LayoutCompatible, bool MustBeNull)
Register a magic integral constant to be used as a type tag.
NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)
Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val, SkipBodyInfo *SkipBody=nullptr)
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
PragmaClangSection PragmaClangRodataSection
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Preprocessor & getPreprocessor() const
void deduceOpenCLAddressSpace(ValueDecl *decl)
PragmaStack< FPOptionsOverride > FpPragmaStack
PragmaStack< StringLiteral * > CodeSegStack
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
static NamedDecl * getAsTemplateNameDecl(NamedDecl *D, bool AllowFunctionTemplates=true, bool AllowDependent=true)
Try to interpret the lookup result D as a template-name.
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
void AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
ErrorAttr * mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic)
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
void CheckMain(FunctionDecl *FD, const DeclSpec &D)
void AddKnownFunctionAttributes(FunctionDecl *FD)
Adds any function attributes that we know a priori based on the declaration of this function.
void DiagnoseUnusedButSetDecl(const VarDecl *VD, DiagReceiverTy DiagReceiver)
If VD is set but not otherwise used, diagnose, for a parameter or a variable.
@ Delete
deleted-function-body
ExprResult VerifyBitField(SourceLocation FieldLoc, const IdentifierInfo *FieldName, QualType FieldTy, bool IsMsStruct, Expr *BitWidth)
VerifyBitField - verifies that a bit field expression is an ICE and has the correct width,...
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
void ActOnReenterFunctionContext(Scope *S, Decl *D)
Push the parameters of D, which must be a function, into scope.
sema::LambdaScopeInfo * RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator)
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
TypeSpecifierType isTagName(IdentifierInfo &II, Scope *S)
isTagName() - This method is called for error recovery purposes only to determine if the specified na...
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
void * SkippedDefinitionContext
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
PragmaStack< bool > StrictGuardStackCheckStack
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void CheckCoroutineWrapper(FunctionDecl *FD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
PragmaStack< StringLiteral * > ConstSegStack
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn)
We've just determined that Old and New both appear to be definitions of the same variable.
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
void ProcessPragmaWeak(Scope *S, Decl *D)
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Decl * BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy)
BuildAnonymousStructOrUnion - Handle the declaration of an anonymous structure or union.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)
Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...
void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
void CheckAttributesOnDeducedType(Decl *D)
CheckAttributesOnDeducedType - Calls Sema functions for attributes that requires the type to be deduc...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
void PushFunctionScope()
Enter a new function scope.
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
sema::LambdaScopeInfo * PushLambdaScope()
SkipBodyInfo shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II, SourceLocation IILoc)
Determine whether the body of an anonymous enumeration should be skipped.
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
@ UPPC_EnumeratorValue
The enumerator value.
@ UPPC_Initializer
An initializer.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_ExplicitSpecialization
Explicit specialization.
@ UPPC_DeclarationQualifier
A declaration qualifier.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_BitFieldWidth
The size of a bit-field.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool RebuildTemplateParamsInCurrentInstantiation(TemplateParameterList *Params)
Rebuild the template parameters now that we know we're in a current instantiation.
void DiagnoseInvalidJumps(Stmt *Body)
SourceLocation CurInitSegLoc
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
NamedDecl * findLocallyScopedExternCDecl(DeclarationName Name)
Look for a locally scoped extern "C" declaration by the given name.
bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old)
We've determined that New is a redeclaration of Old.
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
FieldDecl * CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D=nullptr)
Build a new FieldDecl and check its well-formedness.
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
PragmaClangSection PragmaClangRelroSection
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT)
Deduce the return type for a function from a returned expression, per C++1y [dcl.spec....
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS)
checkUnsafeAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained type.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
void AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based n...
PragmaStack< AlignPackInfo > AlignPackStack
bool canDelayFunctionBody(const Declarator &D)
Determine whether we can delay parsing the body of a function or function template until it is used,...
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
PragmaStack< StringLiteral * > BSSSegStack
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
DeclContext * getCurLexicalContext() const
bool CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous)
Perform semantic analysis for the given dependent function template specialization.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
bool hasExplicitCallingConv(QualType T)
NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc, const Token &NextToken, CorrectionCandidateCallback *CCC=nullptr)
Perform name lookup on the given name, classifying it based on the results of name lookup and the fol...
void ExitDeclaratorContext(Scope *S)
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
sema::FunctionScopeInfo * getCurFunction() const
void PushCompoundScope(bool IsStmtExpr)
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
FunctionDecl * CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID, SourceLocation Loc)
Scope * getNonFieldDeclScope(Scope *S)
getNonFieldDeclScope - Retrieves the innermost scope, starting from S, where a non-field would be dec...
void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc)
ActOnPragmaWeakID - Called on well formed #pragma weak ident.
bool CheckNontrivialField(FieldDecl *FD)
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
ExprResult DefaultLvalueConversion(Expr *E)
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD)
AddOverriddenMethods - See if a method overrides any in the base classes, and if so,...
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
PragmaClangSection PragmaClangTextSection
PragmaClangSection PragmaClangDataSection
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)
ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name, SourceLocation NameLoc)
Act on the result of classifying a name as an undeclared (ADL-only) non-type declaration.
void ActOnPragmaRedefineExtname(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaRedefineExtname - Called on well formed #pragma redefine_extname oldname newname.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
MaybeODRUseExprSet MaybeODRUseExprs
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
TopLevelStmtDecl * ActOnStartTopLevelStmtDecl(Scope *S)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
@ FirstDecl
Parsing the first decl in a TU.
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
Decl * ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, RecordDecl *&AnonRecord)
ParsedFreeStandingDeclSpec - This method is invoked when a declspec with no declarator (e....
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context)
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC pragma optimize in scope, consider changing t...
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
static bool CanBeGetReturnObject(const FunctionDecl *FD)
NamespaceDecl * getStdNamespace() const
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
PragmaStack< StringLiteral * > DataSegStack
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
@ TPC_FriendFunctionTemplate
@ TPC_ClassTemplateMember
@ TPC_FriendFunctionTemplateDefinition
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
friend class InitializationSequence
bool GloballyUniqueObjectMightBeAccidentallyDuplicated(const VarDecl *Dcl)
Certain globally-unique variables might be accidentally duplicated if built into multiple shared libr...
void DiagnoseUnusedDecl(const NamedDecl *ND)
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void ActOnUninitializedDecl(Decl *dcl)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
Decl * ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth)
ActOnField - Each field of a C struct/union is passed into this in order to create a FieldDecl object...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
PragmaClangSection PragmaClangBSSSection
Decl * ActOnDeclarator(Scope *S, Declarator &D)
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
void CheckVariableDeclarationType(VarDecl *NewVD)
OpaquePtr< TemplateName > TemplateTy
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
llvm::SmallPtrSet< const NamedDecl *, 4 > TypoCorrectedFunctionDefinitions
The function definitions which were renamed as part of typo-correction to match their respective decl...
void AddSectionMSAllocText(FunctionDecl *FD)
Only called on function definitions; if there is a #pragma alloc_text that decides which code section...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
IdentifierResolver IdResolver
bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val, bool AllowMask) const
IsValueInFlagEnum - Determine if a value is allowed as part of a flag enum.
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
TemplateNameKindForDiagnostics
Describes the detailed kind of a template name. Used in diagnostics.
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation TriviallyRelocatable, SourceLocation Replaceable, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
static TagDecl * castFromDeclContext(const DeclContext *DC)
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
SourceLocation getInnerLocStart() const
Return SourceLocation representing start of source range ignoring outer template declarations.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Exposes information about the current target.
virtual bool validateCpuIs(StringRef Name) const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
virtual bool validateCpuSupports(StringRef Name) const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
bool supportsMultiVersioning() const
Identify whether this target supports multiversioning of functions, which requires support for cpu_su...
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getRAngleLoc() const
SourceLocation getTemplateLoc() const
Token - This structure provides full information about a lexed token.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isOneOf(Ts... Ks) const
bool isNot(tok::TokenKind K) const
A declaration that models statements at global scope.
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Represents a declaration of a type.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isStructureType() const
bool isDependentSizedArrayType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isIncompleteArrayType() const
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isOpenCLSpecificType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
RecordDecl * castAsRecordDecl() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool containsErrors() const
Whether this type is an error type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isFunctionProtoType() const
bool isObjCIdType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjCObjectType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
const T * getAsAdjusted() const
Member-template getAsAdjusted<specific type>.
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isMemberFunctionPointerType() const
bool isFloatingType() const
bool isAnyPointerType() const
bool hasAutoForTrailingReturnType() const
Determine whether this type was written with a leading 'auto' corresponding to a trailing return type...
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isFunctionNoProtoType() const
bool isReserveIDT() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
void setTypeSourceInfo(TypeSourceInfo *newType)
Wrapper for source info for typedefs.
TypedefNameDecl * getDecl() const
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SmallVectorImpl< NamedDecl * >::const_iterator const_decl_iterator
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
unsigned getEditDistance(bool Normalized=true) const
Gets the "edit distance" of the typo correction from the typo.
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setCorrectionDecl(NamedDecl *CDecl)
Clears the list of NamedDecls before adding the new one.
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
Represents a C++ unqualified-id that has been parsed.
struct OFI OperatorFunctionId
When Kind == IK_OperatorFunctionId, the overloaded operator that we parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
UnionParsedType ConstructorName
When Kind == IK_ConstructorName, the class-name of the type whose constructor is being referenced.
SourceLocation EndLocation
The location of the last token that describes this unqualified-id.
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Wrapper for source info for unresolved typename using decls.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Wrapper for source info for types used via transparent aliases.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setCXXForRangeDecl(bool FRD)
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isCXXCondDecl() const
@ ListInit
Direct list-initialization (C++11)
@ ParenListInit
Parenthesized list-initialization (C++20)
@ CallInit
Call-style initialization (C++98)
void setStorageClass(StorageClass SC)
void setPreviousDeclInSameBlockScope(bool Same)
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
void setConstexpr(bool IC)
@ TLS_Static
TLS with a known-constant initializer.
@ TLS_Dynamic
TLS with a dynamic initializer.
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
@ TentativeDefinition
This declaration is a tentative definition.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
VarTemplateDecl * getInstantiatedFromMemberTemplate() const
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Captures information about a #pragma weak directive.
void disableCheckFallThrough()
ValueDecl * getVariable() const
bool isVariableCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
void addVLATypeCapture(SourceLocation Loc, const VariableArrayType *VLAType, QualType CaptureType)
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
void addThisCapture(bool isNested, SourceLocation Loc, QualType CaptureType, bool ByCopy)
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Retains information about a function, method, or block that is currently being parsed.
bool UsesFPIntrin
Whether this function uses constrained floating point intrinsics.
void addByrefBlockVar(VarDecl *VD)
bool NeedsScopeChecking() const
bool ObjCShouldCallSuper
A flag that is set when parsing a method that must call super's implementation, such as -dealloc,...
bool ObjCWarnForNoInitDelegation
This starts true for a secondary initializer method and will be set to false if there is an invocatio...
bool HasPotentialAvailabilityViolations
Whether we make reference to a declaration that could be unavailable.
bool ObjCWarnForNoDesignatedInitChain
This starts true for a method marked as designated initializer and will be set to false if there is a...
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
TemplateParameterList * GLTemplateParameterList
If this is a generic lambda, and the template parameter list has been created (from the TemplateParam...
ParmVarDecl * ExplicitObjectParameter
llvm::SmallVector< ShadowedOuterDecl, 4 > ShadowingDecls
CXXRecordDecl * Lambda
The class that describes the lambda.
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
bool Mutable
Whether this is a mutable lambda.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
Public enums and private classes that are part of the SourceManager implementation.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool randomizeStructureLayout(const ASTContext &Context, RecordDecl *RD, llvm::SmallVectorImpl< Decl * > &FinalOrdering)
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ GVA_AvailableExternally
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
int hasAttribute(AttributeCommonInfo::Syntax Syntax, llvm::StringRef ScopeName, llvm::StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts, bool CheckPlugins)
Return the version number associated with the attribute if we recognize and implement the attribute s...
ConstexprSpecKind
Define the kind of constexpr specifier.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
std::pair< FileID, unsigned > FileIDAndOffset
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ TemplateTemplateArgument
@ DefaultInitializedObject
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool DeclAttrsMatchCUDAMode(const LangOptions &LangOpts, Decl *D)
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
const FunctionProtoType * T
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
bool isDiscardableGVALinkage(GVALinkage L)
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Complete
The translation unit is a complete translation unit.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
bool isExternalFormalLinkage(Linkage L)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Enumerator
Enumerator value with fixed underlying type.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ArrayRef< NamedDecl * > getDeclsInPrototype() const
Get the non-parameter decls defined within this function prototype.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
const IdentifierInfo * Ident
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
EvalResult is a struct with detailed info about an evaluated expression.
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const
SourceLocation SymbolLocations[3]
The source locations of the individual tokens that name the operator, e.g., the "new",...
OverloadedOperatorKind Operator
The kind of overloaded operator.