64#include "llvm/ADT/ArrayRef.h"
65#include "llvm/ADT/STLForwardCompat.h"
66#include "llvm/ADT/ScopeExit.h"
67#include "llvm/ADT/SmallPtrSet.h"
68#include "llvm/ADT/SmallString.h"
69#include "llvm/ADT/StringExtras.h"
70#include "llvm/ADT/StringRef.h"
71#include "llvm/Support/SaveAndRestore.h"
72#include "llvm/TargetParser/Triple.h"
76#include <unordered_map>
83 Decl *Group[2] = { OwnedType, Ptr };
94 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
95 bool AllowTemplates =
false,
96 bool AllowNonTemplates =
true)
97 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
98 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
99 WantExpressionKeywords =
false;
100 WantCXXNamedCasts =
false;
101 WantRemainingKeywords =
false;
104 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
106 if (!AllowInvalidDecl && ND->isInvalidDecl())
110 return AllowTemplates;
116 if (AllowNonTemplates)
121 if (AllowTemplates) {
122 auto *RD = dyn_cast<CXXRecordDecl>(ND);
123 if (!RD || !RD->isInjectedClassName())
126 return RD->getDescribedClassTemplate() ||
133 return !WantClassName && candidate.
isKeyword();
136 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
137 return std::make_unique<TypeNameValidatorCCC>(*
this);
141 bool AllowInvalidDecl;
144 bool AllowNonTemplates;
151 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
152 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
154 FoundRD->isInjectedClassName() &&
158 ? diag::ext_out_of_line_qualified_id_type_names_constructor
159 : diag::err_out_of_line_qualified_id_type_names_constructor)
169enum class UnqualifiedTypeNameLookupResult {
180static UnqualifiedTypeNameLookupResult
185 return UnqualifiedTypeNameLookupResult::NotFound;
187 UnqualifiedTypeNameLookupResult FoundTypeDecl =
188 UnqualifiedTypeNameLookupResult::NotFound;
192 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
193 Base.getType().getCanonicalType())) {
196 if (!TST->isDependentType())
198 auto *TD = TST->getTemplateName().getAsTemplateDecl();
201 if (
auto *BasePrimaryTemplate =
202 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
204 BaseRD = BasePrimaryTemplate;
205 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
207 CTD->findPartialSpecialization(
Base.getType()))
216 return UnqualifiedTypeNameLookupResult::FoundNonType;
217 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
219 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
221 case UnqualifiedTypeNameLookupResult::FoundNonType:
222 return UnqualifiedTypeNameLookupResult::FoundNonType;
223 case UnqualifiedTypeNameLookupResult::FoundType:
224 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
226 case UnqualifiedTypeNameLookupResult::NotFound:
233 return FoundTypeDecl;
241 UnqualifiedTypeNameLookupResult FoundTypeDecl =
242 UnqualifiedTypeNameLookupResult::NotFound;
244 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
248 RD = dyn_cast<CXXRecordDecl>(DC);
252 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
258 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
278 bool HasTrailingDot,
ParsedType ObjectTypePtr,
279 bool IsCtorOrDtorName,
280 bool WantNontrivialTypeSourceInfo,
281 bool IsClassTemplateDeductionContext,
284 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
286 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
312 if (IsImplicitTypename) {
317 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
326 if (WantNontrivialTypeSourceInfo)
362 if (ObjectTypePtr &&
Result.empty()) {
386 switch (
Result.getResultKind()) {
389 TypeNameValidatorCCC CCC(
true, isClassName,
390 AllowDeducedTemplate);
396 bool MemberOfUnknownSpecialization;
405 if (Correction && (NNS || NewII != &II) &&
411 Template, MemberOfUnknownSpecialization))) {
413 isClassName, HasTrailingDot, ObjectTypePtr,
415 WantNontrivialTypeSourceInfo,
416 IsClassTemplateDeductionContext);
419 PDiag(diag::err_unknown_type_or_class_name_suggest)
420 <<
Result.getLookupName() << isClassName);
423 *CorrectedII = NewII;
428 Result.suppressDiagnostics();
444 Result.suppressDiagnostics();
454 Result.suppressDiagnostics();
460 Res != ResEnd; ++Res) {
469 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
481 Result.suppressDiagnostics();
492 IIDecl =
Result.getFoundDecl();
493 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
497 assert(IIDecl &&
"Didn't find decl");
500 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
506 if (FoundUsingShadow) {
510 if (!WantNontrivialTypeSourceInfo)
516 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
520 if (!WantNontrivialTypeSourceInfo)
526 TL.setNameLoc(NameLoc);
527 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
531 if (!WantNontrivialTypeSourceInfo)
537 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
541 if (!WantNontrivialTypeSourceInfo)
549 if (!WantNontrivialTypeSourceInfo)
560 if (
auto *TD = dyn_cast_or_null<TemplateDecl>(
564 if (!ShorthandTy.
isNull())
571 if (!HasTrailingDot) {
574 if (!WantNontrivialTypeSourceInfo)
579 TL.setNameEndLoc(NameLoc);
582 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
586 }
else if (AllowDeducedTemplate) {
588 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
598 TL.setNameLoc(NameLoc);
606 Result.suppressDiagnostics();
615 auto *ND = dyn_cast<NamespaceDecl>(DC);
616 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
618 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
623 llvm_unreachable(
"something isn't in TU scope?");
634 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
635 if (MD->getParent()->hasAnyDependentBases())
643 bool IsTemplateTypeArg) {
644 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
647 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
656 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
665 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
693 R.suppressDiagnostics();
696 switch (TD->getTagKind()) {
737 bool IsTemplateName) {
742 SuggestedType =
nullptr;
746 TypeNameValidatorCCC CCC(
false,
false,
753 bool CanRecover = !IsTemplateName;
754 if (Corrected.isKeyword()) {
757 PDiag(IsTemplateName ? diag::err_no_template_suggest
758 : diag::err_unknown_typename_suggest)
760 II = Corrected.getCorrectionAsIdentifierInfo();
763 if (!SS || !SS->
isSet()) {
765 PDiag(IsTemplateName ? diag::err_no_template_suggest
766 : diag::err_unknown_typename_suggest)
769 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
770 bool DroppedSpecifier =
771 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
774 ? diag::err_no_member_template_suggest
775 : diag::err_unknown_nested_typename_suggest)
776 << II << DC << DroppedSpecifier << SS->
getRange(),
779 llvm_unreachable(
"could not have corrected a typo here");
786 if (Corrected.getCorrectionSpecifier())
791 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
792 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
805 bool MemberOfUnknownSpecialization;
807 Name,
nullptr,
true, TemplateResult,
818 Diag(IILoc, IsTemplateName ? diag::err_no_template
819 : diag::err_unknown_typename)
822 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
823 : diag::err_typename_nested_not_found)
829 unsigned DiagID = diag::err_typename_missing;
831 DiagID = diag::ext_typename_missing;
842 "Invalid scope specifier has already been diagnosed");
849 bool CheckTemplate = R.getSema().getLangOpts().CPlusPlus &&
850 NextToken.
is(tok::less);
870 StringRef FixItTagName;
871 switch (Tag->getTagKind()) {
873 FixItTagName =
"class ";
877 FixItTagName =
"enum ";
881 FixItTagName =
"struct ";
885 FixItTagName =
"__interface ";
889 FixItTagName =
"union ";
893 StringRef TagName = FixItTagName.drop_back();
894 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
895 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
900 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
915 const Token &NextToken,
920 assert(NextToken.
isNot(tok::coloncolon) &&
921 "parse nested name specifiers before calling ClassifyName");
962 bool SecondTry =
false;
963 bool IsFilteredTemplateName =
false;
966 switch (
Result.getResultKind()) {
970 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
1016 if (!SecondTry && CCC) {
1021 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1022 unsigned QualifiedDiag = diag::err_no_member_suggest;
1025 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1028 UnqualifiedDiag = diag::err_no_template_suggest;
1029 QualifiedDiag = diag::err_no_member_template_suggest;
1030 }
else if (UnderlyingFirstDecl &&
1034 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1035 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1041 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1042 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1043 Name->
getName() == CorrectedStr;
1046 << DroppedSpecifier << SS.
getRange());
1050 Name = Corrected.getCorrectionAsIdentifierInfo();
1053 if (Corrected.isKeyword())
1059 Result.setLookupName(Corrected.getCorrection());
1081 Result.suppressDiagnostics();
1123 if (!
Result.isAmbiguous()) {
1124 IsFilteredTemplateName =
true;
1134 (IsFilteredTemplateName ||
1150 if (!IsFilteredTemplateName)
1153 bool IsFunctionTemplate;
1157 IsFunctionTemplate =
true;
1160 }
else if (!
Result.empty()) {
1168 dyn_cast<UsingShadowDecl>(*
Result.begin());
1169 assert(!FoundUsingShadow ||
1178 IsFunctionTemplate =
true;
1182 if (IsFunctionTemplate) {
1186 Result.suppressDiagnostics();
1198 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1210 TTL.setNameLoc(NameLoc);
1237 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1238 Class = Alias->getClassInterface();
1244 if (NextToken.
is(tok::period)) {
1247 Result.suppressDiagnostics();
1257 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1263 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1276 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1277 if ((NextToken.
is(tok::identifier) ||
1279 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1291 if (
Result.isSingleResult() && !ADL &&
1296 Result.suppressDiagnostics();
1316 bool IsAddressOfOperand) {
1319 NameInfo, IsAddressOfOperand,
1326 const Token &NextToken) {
1328 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1344 if ((*ULE->decls_begin())->isCXXClassMember()) {
1346 SS.
Adopt(ULE->getQualifierLoc());
1351 Result.setNamingClass(ULE->getNamingClass());
1352 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1353 Result.addDecl(*I, I.getAccess());
1386 "The next DeclContext should be lexically contained in the current one.");
1393 assert(
CurContext &&
"DeclContext imbalance!");
1396 assert(
CurContext &&
"Popped translation unit!");
1406 assert(
CurContext &&
"skipping definition of undefined tag");
1434 assert(!S->
getEntity() &&
"scope already has entity");
1467 "expected to be initializing a template parameter scope");
1495 cast<Decl>(DC)->getDescribedTemplateParams()) {
1496 unsigned DCDepth = TPL->getDepth() + 1;
1497 if (DCDepth > ScopeDepth)
1499 if (ScopeDepth == DCDepth)
1511 if (Param->getIdentifier()) {
1521 if (Param->getIdentifier()) {
1537 "The next DeclContext should be lexically contained in the current one.");
1547 assert(
CurContext &&
"DeclContext imbalance!");
1549 assert(
CurContext &&
"Popped translation unit!");
1563 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1578 return ND->
hasAttr<OverloadableAttr>();
1581 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1636 for (; I != IEnd; ++I) {
1669 bool AllowInlineNamespace)
const {
1670 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1674 bool AllowInlineNamespace)
const {
1678 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(D))
1679 return isDeclInScope(Shadow->getTargetDecl(), Ctx, S, AllowInlineNamespace);
1688 if (ScopeDC->getPrimaryContext() == TargetDC)
1700 bool ConsiderLinkage,
1701 bool AllowInlineNamespace) {
1719 if (
auto *VD = dyn_cast<VarDecl>(D))
1721 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1723 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1737 if (
New->getFriendObjectKind() &&
1778 if (NewIsModuleInterface || OldIsModuleInterface) {
1782 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1784 << NewIsModuleInterface
1786 << OldIsModuleInterface
1789 New->setInvalidDecl();
1802 if (!
New->getLexicalDeclContext()
1803 ->getNonTransparentContext()
1804 ->isFileContext() ||
1810 bool IsNewExported =
New->isInExportDeclContext();
1814 if (!IsNewExported && !IsOldExported)
1826 New->getOwningModule()->isImplicitGlobalModule())
1829 assert(IsNewExported);
1837 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1855 "New and Old are not the same definition, we should diagnostic it "
1856 "immediately instead of checking it.");
1859 "We shouldn't see unreachable definitions here.");
1907 return OldM == NewM;
1944 return CD->isCopyConstructor();
1951 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1952 if (!RD->hasNameForLinkage())
1973 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1979 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1982 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1991 if (FD->doesThisDeclarationHaveABody() &&
1992 Context.DeclMustBeEmitted(FD))
1994 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2001 if (
Context.DeclMustBeEmitted(VD))
2004 if (VD->isStaticDataMember() &&
2007 if (VD->isStaticDataMember() &&
2009 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
2021 return mightHaveNonExternalLinkage(D);
2028 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2034 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2049 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2053 bool IsAllIgnored =
true;
2054 for (
const auto *BD : DD->bindings()) {
2055 if (BD->isReferenced())
2057 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2058 BD->hasAttr<UnusedAttr>());
2071 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2081 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2084 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2085 if (!WithinFunction)
2096 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2099 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2100 Init = Cleanups->getSubExpr();
2102 const auto *Ty = VD->getType().getTypePtr();
2107 if (TT->getDecl()->hasAttr<UnusedAttr>())
2113 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2114 MTE && MTE->getExtendingDecl()) {
2115 Ty = VD->getType().getNonReferenceType().getTypePtr();
2116 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2121 if (Ty->isIncompleteType() || Ty->isDependentType())
2126 Ty = Ty->getBaseElementTypeUnsafe();
2128 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2129 if (Tag->hasAttr<UnusedAttr>())
2132 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2133 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2137 const auto *Construct =
2138 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2139 if (Construct && !Construct->isElidable()) {
2141 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2142 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2148 if (
Init->isTypeDependent()) {
2150 if (!Ctor->isTrivial())
2191 for (
auto *TmpD : D->
decls()) {
2192 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2194 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2208 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2220 DiagID = diag::warn_unused_exception_param;
2222 DiagID = diag::warn_unused_label;
2224 DiagID = diag::warn_unused_variable;
2243 if (Ty->isReferenceType() || Ty->isDependentType())
2246 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2247 if (Tag->hasAttr<UnusedAttr>())
2251 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2252 RD && !RD->hasAttr<WarnUnusedAttr>())
2264 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2270 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2277 assert(iter->getSecond() >= 0 &&
2278 "Found a negative number of references to a VarDecl");
2279 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2289 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2290 if (!UnusedCXXCondDecl)
2296 DiagID = diag::warn_unused_but_set_parameter;
2298 DiagID = diag::warn_unused_but_set_global;
2300 DiagID = diag::warn_unused_but_set_variable;
2310 bool Diagnose =
false;
2314 Diagnose = L->
getStmt() ==
nullptr;
2325 "Scope shouldn't contain decls!");
2332 std::optional<SourceLocation> PreviousDeclLoc;
2337 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2342 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2345 for (
auto *TmpD : S->
decls()) {
2346 assert(TmpD &&
"This decl didn't get pushed??");
2354 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2357 if (
auto *VD = dyn_cast<VarDecl>(D);
2358 VD && !VD->isInternalLinkageFileVar()) {
2367 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2378 auto ShadowI = ShadowingDecls.find(D);
2379 if (ShadowI != ShadowingDecls.end()) {
2380 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2381 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2382 PDiag(diag::warn_ctor_parm_shadows_field)
2383 << D << FD << FD->getParent());
2385 ShadowingDecls.erase(ShadowI);
2389 llvm::sort(DeclDiags,
2390 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2395 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2397 for (
const LocAndDiag &D : DeclDiags) {
2399 if (D.PreviousDeclLoc)
2400 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2424 return "ucontext.h";
2426 llvm_unreachable(
"unhandled error kind");
2437 Parent->
addDecl(CLinkageDecl);
2438 Parent = CLinkageDecl;
2442 if (
Context.BuiltinInfo.isImmediate(ID)) {
2444 "consteval builtins should only be available in C++20 mode");
2453 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2459 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2462 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2464 Params.push_back(parm);
2466 New->setParams(Params);
2474 Scope *S,
bool ForRedeclaration,
2481 if (!ForRedeclaration)
2487 Context.BuiltinInfo.allowTypeMismatch(ID))
2493 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2494 <<
Context.BuiltinInfo.getName(ID);
2500 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2502 <<
Context.BuiltinInfo.getName(ID);
2506 if (!ForRedeclaration &&
2507 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2508 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2509 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2510 : diag::ext_implicit_lib_function_decl)
2511 <<
Context.BuiltinInfo.getName(ID) << R;
2512 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2513 Diag(Loc, diag::note_include_header_or_declare)
2514 << Header <<
Context.BuiltinInfo.getName(ID);
2550 while (Filter.hasNext()) {
2559 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2561 Decl->getUnderlyingType()))
2566 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2567 Decl->getAnonDeclWithTypedefName())
2579 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2580 OldType = OldTypedef->getUnderlyingType();
2582 OldType =
Context.getTypeDeclType(Old);
2588 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2592 New->setInvalidDecl();
2596 if (OldType != NewType &&
2599 !
Context.hasSameType(OldType, NewType)) {
2601 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2602 << Kind << NewType << OldType;
2605 New->setInvalidDecl();
2615 if (
New->isInvalidDecl())
return;
2621 switch (TypeID->getLength()) {
2625 if (!TypeID->isStr(
"id"))
2628 if (!
T->isPointerType())
2630 if (!
T->isVoidPointerType()) {
2635 Context.setObjCIdRedefinitionType(
T);
2637 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2642 if (!TypeID->isStr(
"Class"))
2644 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2646 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2650 if (!TypeID->isStr(
"SEL"))
2652 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2654 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2664 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2665 <<
New->getDeclName();
2671 return New->setInvalidDecl();
2676 return New->setInvalidDecl();
2678 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2679 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2680 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2683 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2687 if (OldTD->isModed())
2688 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2689 OldTD->getUnderlyingType());
2691 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2704 if (
auto *NewEnum = dyn_cast<EnumDecl>(
NewTag)) {
2705 if (
auto *OldEnum = dyn_cast<EnumDecl>(OldTag)) {
2706 NewEnum->setPreviousDecl(OldEnum);
2708 for (
auto *ECD : NewEnum->enumerators())
2709 ECD->setType(EnumType);
2768 Diag(
New->getLocation(), diag::err_redefinition)
2769 <<
New->getDeclName();
2771 return New->setInvalidDecl();
2786 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2789 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2790 <<
New->getDeclName();
2797 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2799 for (
auto *ECD : ED->enumerators()) {
2810 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2811 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2812 for (
const auto *i : D->
attrs())
2813 if (i->getKind() == A->
getKind()) {
2829 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2830 return VD->isThisDeclarationADefinition();
2831 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2832 return TD->isCompleteDefinition() || TD->isBeingDefined();
2843 AlignedAttr *OldAlignasAttr =
nullptr;
2844 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2845 unsigned OldAlign = 0;
2853 if (I->isAlignmentDependent())
2859 unsigned Align = I->getAlignment(S.
Context);
2860 if (Align > OldAlign) {
2862 OldStrictestAlignAttr = I;
2867 AlignedAttr *NewAlignasAttr =
nullptr;
2868 unsigned NewAlign = 0;
2869 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2870 if (I->isAlignmentDependent())
2876 unsigned Align = I->getAlignment(S.
Context);
2877 if (Align > NewAlign)
2881 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2889 if (OldAlign == 0 || NewAlign == 0) {
2902 if (OldAlign != NewAlign) {
2903 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2906 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2919 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2921 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2925 bool AnyAdded =
false;
2928 if (OldAlign > NewAlign) {
2929 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2930 Clone->setInherited(
true);
2931 New->addAttr(Clone);
2936 if (OldAlignasAttr && !NewAlignasAttr &&
2937 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2938 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2939 Clone->setInherited(
true);
2940 New->addAttr(Clone);
2947#define WANT_DECL_MERGE_LOGIC
2948#include "clang/Sema/AttrParsedAttrImpl.inc"
2949#undef WANT_DECL_MERGE_LOGIC
2956 if (!DiagnoseMutualExclusions(S, D,
Attr))
2967 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr)) {
2969 if (AvailabilityAttr *
Inf = AA->getInferredAttrAs())
2970 InferredPlatformII =
Inf->getPlatform();
2972 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2973 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2974 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2975 AA->getPriority(), AA->getEnvironment(), InferredPlatformII);
2976 }
else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2978 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2980 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2982 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2984 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2986 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2987 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2989 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2991 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2992 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2994 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2996 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2998 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
3000 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
3002 IA->getInheritanceModel());
3003 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
3012 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
3014 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
3016 else if (
const auto *SAA = dyn_cast<SwiftAttrAttr>(
Attr))
3018 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
3020 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
3031 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
3032 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
3033 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
3035 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
3037 else if (
const auto *ENA = dyn_cast<WebAssemblyExportNameAttr>(
Attr))
3039 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
3041 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
3043 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
3045 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
3048 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
3051 WS->getSpelledArgsCount());
3052 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
3054 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
3059 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
3063 else if (
const auto *PA = dyn_cast<PersonalityAttr>(
Attr))
3078 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
3079 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
3083 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3089 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
3091 if (FD->isDefined(Def,
true))
3098 for (
const auto *Attribute : D->
attrs())
3099 if (Attribute->getKind() == Kind)
3107 if (!
New->hasAttrs())
3111 if (!Def || Def ==
New)
3115 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3116 Attr *NewAttribute = NewAttributes[I];
3125 NewAttributes.erase(NewAttributes.begin() + I);
3133 ? diag::err_alias_after_tentative
3134 : diag::err_redefinition;
3136 if (
Diag == diag::err_redefinition)
3146 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3193 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3194 if (AA->isAlignas()) {
3205 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3207 NewAttributes.erase(NewAttributes.begin() + I);
3217 diag::err_loader_uninitialized_redeclaration);
3219 NewAttributes.erase(NewAttributes.begin() + I);
3242 diag::err_sycl_entry_point_after_definition)
3255 diag::warn_attribute_precede_definition);
3257 NewAttributes.erase(NewAttributes.begin() + I);
3263 const ConstInitAttr *CIAttr,
3264 bool AttrBeforeInit) {
3271 std::string SuitableSpelling;
3273 SuitableSpelling = std::string(
3275 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3277 InsertLoc, {tok::l_square, tok::l_square,
3278 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3279 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3280 tok::r_square, tok::r_square}));
3281 if (SuitableSpelling.empty())
3283 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3284 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3285 tok::r_paren, tok::r_paren}));
3286 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3287 SuitableSpelling =
"constinit";
3288 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3289 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3290 if (SuitableSpelling.empty())
3291 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3292 SuitableSpelling +=
" ";
3294 if (AttrBeforeInit) {
3297 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3300 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3304 S.
Diag(CIAttr->getLocation(),
3305 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3306 : diag::warn_require_const_init_added_too_late)
3309 << CIAttr->isConstinit()
3317 UsedAttr *NewAttr = OldAttr->clone(
Context);
3318 NewAttr->setInherited(
true);
3319 New->addAttr(NewAttr);
3322 RetainAttr *NewAttr = OldAttr->clone(
Context);
3323 NewAttr->setInherited(
true);
3324 New->addAttr(NewAttr);
3333 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3334 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3335 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3343 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3346 if (InitDecl == NewVD) {
3350 if (OldConstInit && OldConstInit->isConstinit())
3353 }
else if (NewConstInit) {
3357 if (InitDecl && InitDecl != NewVD) {
3360 NewVD->dropAttr<ConstInitAttr>();
3368 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3369 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3370 if (!OldA->isEquivalent(NewA)) {
3372 Diag(
New->getLocation(), diag::err_different_asm_label);
3373 Diag(OldA->getLocation(), diag::note_previous_declaration);
3375 }
else if (Old->
isUsed()) {
3378 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3384 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3385 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3386 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3387 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3388 Diag(NewAbiTagAttr->getLocation(),
3389 diag::err_new_abi_tag_on_redeclaration)
3391 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3395 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3401 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3402 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3404 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3411 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3412 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3414 Diag(
New->getLocation(), diag::warn_mismatched_section)
3422 bool foundAny =
New->hasAttrs();
3455 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3468 if (!foundAny)
New->dropAttrs();
3473 checkAttrIsTypeDependent(D, A);
3484 newAttr->setInherited(
true);
3506 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3532 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3533 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3541 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3573 if (*Oldnullability != *Newnullability) {
3574 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3591 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3592 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3593 if (OldParamDT && NewParamDT &&
3594 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3595 QualType OldParamOT = OldParamDT->getOriginalType();
3596 QualType NewParamOT = NewParamDT->getOriginalType();
3599 << NewParam << NewParamOT;
3610struct GNUCompatibleParamWarning {
3611 ParmVarDecl *OldParm;
3612 ParmVarDecl *NewParm;
3613 QualType PromotedType;
3620template <
typename T>
3621static std::pair<diag::kind, SourceLocation>
3625 if (Old->isThisDeclarationADefinition())
3626 PrevDiag = diag::note_previous_definition;
3627 else if (Old->isImplicit()) {
3628 PrevDiag = diag::note_previous_implicit_declaration;
3629 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3630 if (FD->getBuiltinID())
3631 PrevDiag = diag::note_previous_builtin_declaration;
3634 OldLocation =
New->getLocation();
3636 PrevDiag = diag::note_previous_declaration;
3637 return std::make_pair(PrevDiag, OldLocation);
3645 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3646 !LangOpts.CPlusPlus &&
3652 const AttributedType *AT =
T->getAs<AttributedType>();
3653 while (AT && !AT->isCallingConv())
3654 AT = AT->getModifiedType()->getAs<AttributedType>();
3658template <
typename T>
3672template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3679template<
typename ExpectedDecl>
3701 !Old->getDeclContext()->getRedeclContext()->Equals(
3702 New->getDeclContext()->getRedeclContext()) &&
3707 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3720 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3721 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3724 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3725 AttrA->isDynamic() == AttrB->isDynamic();
3751 if (NamedDC->Equals(SemaDC))
3754 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3756 "unexpected context for redeclaration");
3767 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3768 FixSemaDC(FD->getDescribedFunctionTemplate());
3769 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3770 FixSemaDC(VD->getDescribedVarTemplate());
3774 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3782 Diag(
New->getLocation(), diag::err_using_decl_friend);
3783 Diag(Shadow->getTargetDecl()->getLocation(),
3784 diag::note_using_decl_target);
3785 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3793 New->getDescribedFunctionTemplate()) {
3805 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3806 <<
New->getDeclName();
3830 std::tie(PrevDiag, OldLocation) =
3840 !
New->getTemplateSpecializationInfo() &&
3843 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3844 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3846 Diag(
New->getLocation(), diag::err_static_non_static)
3848 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3853 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3854 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3855 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3858 New->dropAttr<InternalLinkageAttr>();
3861 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3862 if (!Old->
hasAttr<ErrorAttr>()) {
3863 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3865 New->dropAttr<ErrorAttr>();
3873 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3874 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3875 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3884 const Decl *DiagOld = Old;
3886 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3887 const auto *A = D->getAttr<OverloadableAttr>();
3888 return A && !A->isImplicit();
3897 diag::note_attribute_overloadable_prev_overload)
3901 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3903 New->dropAttr<OverloadableAttr>();
3910 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3912 Diag(OldLocation, diag::note_previous_declaration);
3935 bool RequiresAdjustment =
false;
3937 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3943 if (!NewCCExplicit) {
3947 RequiresAdjustment =
true;
3955 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3959 RequiresAdjustment =
true;
3963 Diag(
New->getLocation(), diag::err_cconv_change)
3966 << (!FirstCCExplicit ?
"" :
3970 Diag(
First->getLocation(), diag::note_previous_declaration);
3978 RequiresAdjustment =
true;
3990 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3991 FPT2->getParamTypes(), EPI2);
3993 New->setType(NewQType);
4002 Diag(
New->getLocation(), diag::err_regparm_mismatch)
4005 Diag(OldLocation, diag::note_previous_declaration);
4010 RequiresAdjustment =
true;
4016 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
4017 <<
"'ns_returns_retained'";
4018 Diag(OldLocation, diag::note_previous_declaration);
4023 RequiresAdjustment =
true;
4029 AnyX86NoCallerSavedRegistersAttr *
Attr =
4030 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
4031 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
4032 Diag(OldLocation, diag::note_previous_declaration);
4037 RequiresAdjustment =
true;
4040 if (RequiresAdjustment) {
4044 NewQType =
Context.getCanonicalType(
New->getType());
4049 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
4057 if (
New->hasAttr<GNUInlineAttr>() &&
4066 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
4067 <<
New->getDeclName();
4068 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4072 QualType OldQTypeForComparison = OldQType;
4073 if (
Context.hasAnyFunctionEffects()) {
4075 const auto NewFX =
New->getFunctionEffects();
4076 if (OldFX != NewFX) {
4078 for (
const auto &Diff : Diffs) {
4079 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
4081 diag::warn_mismatched_func_effect_redeclaration)
4082 << Diff.effectName();
4093 if (!MergeErrs.empty())
4100 NewFPT->getParamTypes(), EPI);
4102 New->setType(ModQT);
4103 NewQType =
New->getType();
4108 EPI = OldFPT->getExtProtoInfo();
4110 OldQTypeForComparison =
Context.getFunctionType(
4111 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4113 if (OldFX.empty()) {
4124 NewQType =
Context.getCanonicalType(
New->getType());
4132 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4133 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4135 OldDeclaredReturnType)) {
4140 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4142 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4143 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4144 <<
New <<
New->getReturnTypeSourceRange();
4146 !Old->
hasAttr<OverloadableAttr>() &&
4147 !
New->hasAttr<OverloadableAttr>())
4148 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4150 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4151 <<
New->getReturnTypeSourceRange();
4152 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4162 if (OldReturnType != NewReturnType) {
4166 if (OldAT && OldAT->isDeduced()) {
4167 QualType DT = OldAT->getDeducedType();
4178 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4180 if (OldMethod && NewMethod) {
4187 bool IsClassScopeExplicitSpecialization =
4193 !IsClassScopeExplicitSpecialization) {
4198 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4199 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4210 NewDiag = diag::err_constructor_redeclared;
4212 NewDiag = diag::err_destructor_redeclared;
4214 NewDiag = diag::err_conv_function_redeclared;
4216 NewDiag = diag::err_member_redeclared;
4218 Diag(
New->getLocation(), NewDiag);
4220 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4221 <<
New <<
New->getType();
4223 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4236 diag::err_definition_of_implicitly_declared_member)
4242 diag::err_definition_of_explicitly_defaulted_member)
4265 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4266 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4267 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4277 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4278 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4279 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4294 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4308 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4309 Diag(OldLocation, PrevDiag);
4311 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4312 Diag(OldLocation, PrevDiag);
4319 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4327 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4337 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4365 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4369 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4387 if (
New->hasWrittenPrototype()) {
4399 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4400 if (WithoutProto ==
New)
4401 IsWithoutProtoADef = NewDeclIsDefn;
4403 IsWithProtoADef = NewDeclIsDefn;
4405 diag::warn_non_prototype_changes_behavior)
4406 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4407 << (WithoutProto == Old) << IsWithProtoADef;
4417 !IsWithoutProtoADef)
4423 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4428 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4431 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4432 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4433 OldProto->getParamTypes(),
4434 OldProto->getExtProtoInfo());
4435 New->setType(NewQType);
4436 New->setHasInheritedPrototype();
4440 for (
const auto &ParamType : OldProto->param_types()) {
4443 ParamType,
nullptr,
SC_None,
nullptr);
4444 Param->setScopeInfo(0, Params.size());
4445 Param->setImplicit();
4446 Params.push_back(Param);
4449 New->setParams(Params);
4458 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4485 NewProto->getReturnType());
4486 bool LooseCompatible = !MergedReturn.isNull();
4488 LooseCompatible && Idx != End; ++Idx) {
4492 NewProto->getParamType(Idx))) {
4493 ArgTypes.push_back(NewParm->
getType());
4497 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4498 NewProto->getParamType(Idx) };
4499 Warnings.push_back(Warn);
4500 ArgTypes.push_back(NewParm->
getType());
4502 LooseCompatible =
false;
4505 if (LooseCompatible) {
4506 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4507 Diag(Warnings[Warn].NewParm->getLocation(),
4508 diag::ext_param_promoted_not_compatible_with_prototype)
4509 << Warnings[Warn].PromotedType
4510 << Warnings[Warn].OldParm->getType();
4511 if (Warnings[Warn].OldParm->getLocation().isValid())
4512 Diag(Warnings[Warn].OldParm->getLocation(),
4513 diag::note_previous_declaration);
4516 if (MergeTypeWithOld)
4517 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4534 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4535 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4536 Diag(OldLocation, diag::note_previous_builtin_declaration)
4541 PrevDiag = diag::note_previous_builtin_declaration;
4544 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4545 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4550 Scope *S,
bool MergeTypeWithOld) {
4556 New->setIsPureVirtual();
4565 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4579 if (!Merged.isNull() && MergeTypeWithOld)
4580 New->setType(Merged);
4604 ni != ne && oi != oe; ++ni, ++oi)
4613 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4614 ? diag::err_redefinition_different_type
4615 : diag::err_redeclaration_different_type)
4620 std::tie(PrevDiag, OldLocation)
4622 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4623 New->setInvalidDecl();
4627 bool MergeTypeWithOld) {
4633 if (
New->getType()->isUndeducedType()) {
4655 QualType PrevVDTy = PrevVD->getType();
4659 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4667 MergedT =
New->getType();
4678 else if (
New->getType()->isObjCObjectPointerType() &&
4680 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4695 if ((
New->getType()->isDependentType() ||
4700 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4709 if (MergeTypeWithOld)
4710 New->setType(MergedT);
4744 if (
New->isInvalidDecl())
4757 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4761 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4763 return New->setInvalidDecl();
4765 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4768 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4770 return New->setInvalidDecl();
4774 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4775 <<
New->getDeclName();
4777 New->getLocation());
4778 return New->setInvalidDecl();
4790 return New->setInvalidDecl();
4797 Diag(
New->getLocation(), diag::err_duplicate_member)
4798 <<
New->getIdentifier();
4800 New->setInvalidDecl();
4803 if (NewTemplate && OldTemplate)
4810 if (
New->hasAttr<WeakImportAttr>())
4813 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4816 New->dropAttr<WeakImportAttr>();
4821 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4822 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4823 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4826 New->dropAttr<InternalLinkageAttr>();
4831 if (MostRecent != Old) {
4834 if (
New->isInvalidDecl())
4839 if (
New->isInvalidDecl())
4844 std::tie(PrevDiag, OldLocation) =
4849 !
New->isStaticDataMember() &&
4852 Diag(
New->getLocation(), diag::ext_static_non_static)
4853 <<
New->getDeclName();
4854 Diag(OldLocation, PrevDiag);
4859 Diag(
New->getLocation(), diag::err_static_non_static)
4860 <<
New->getDeclName()
4862 Diag(OldLocation, PrevDiag);
4863 return New->setInvalidDecl();
4879 New->hasExternalStorage() &&
Previous.isShadowed() &&
4881 Diag(
New->getLocation(), diag::err_internal_extern_mismatch)
4883 Diag(OldLocation, diag::note_previous_declaration);
4884 return New->setInvalidDecl();
4898 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4899 !
New->isStaticDataMember() &&
4901 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4902 Diag(OldLocation, PrevDiag);
4903 return New->setInvalidDecl();
4907 if (
New->hasExternalStorage() &&
4909 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4910 Diag(OldLocation, PrevDiag);
4911 return New->setInvalidDecl();
4914 !
New->hasExternalStorage()) {
4915 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4916 Diag(OldLocation, PrevDiag);
4917 return New->setInvalidDecl();
4927 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4930 !
New->getLexicalDeclContext()->isRecord())) {
4931 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4932 Diag(OldLocation, PrevDiag);
4933 return New->setInvalidDecl();
4941 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4942 Diag(Def->getLocation(), diag::note_previous_definition);
4956 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4957 Diag(OldLocation, PrevDiag);
4958 }
else if (!
New->getTLSKind()) {
4959 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4960 Diag(OldLocation, PrevDiag);
4966 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4968 Diag(OldLocation, PrevDiag);
4978 diag::warn_deprecated_redundant_constexpr_static_def);
4984 New->setInvalidDecl();
4999 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
5006 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
5007 Diag(OldLocation, PrevDiag);
5008 New->setInvalidDecl();
5017 New->setPreviousDecl(Old);
5027 New->setImplicitlyInline();
5032 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
5034 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
5035 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
5036 auto &HSI =
PP.getHeaderSearchInfo();
5037 StringRef HdrFilename =
5040 auto noteFromModuleOrInclude = [&](
Module *Mod,
5046 if (IncLoc.isValid()) {
5048 Diag(IncLoc, diag::note_redefinition_modules_same_file)
5054 Diag(IncLoc, diag::note_redefinition_include_same_file)
5055 << HdrFilename.str();
5065 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
5073 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
5090 New->getDescribedVarTemplate() ||
5091 !
New->getTemplateParameterLists().empty() ||
5092 New->getDeclContext()->isDependentContext() ||
5093 New->hasAttr<SelectAnyAttr>())) {
5096 New->demoteThisDefinitionToDeclaration();
5104 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
5106 New->setInvalidDecl();
5132 if (!
Context.getLangOpts().CPlusPlus)
5138 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5141 Context.getManglingNumberContext(Tag->getParent());
5150 Decl *ManglingContextDecl;
5151 std::tie(MCtx, ManglingContextDecl) =
5161struct NonCLikeKind {
5173 explicit operator bool() {
return Kind !=
None; }
5181 return {NonCLikeKind::Invalid, {}};
5188 return {NonCLikeKind::BaseClass,
5200 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5201 if (FD->hasInClassInitializer()) {
5202 auto *
Init = FD->getInClassInitializer();
5203 return {NonCLikeKind::DefaultMemberInit,
5219 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5227 if (MemberRD->isLambda())
5228 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5232 if (MemberRD->isThisDeclarationADefinition()) {
5238 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5255 Context.getCanonicalTagType(TagFromDeclSpec))) {
5257 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5268 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5272 if (NonCLike || ChangesLinkage) {
5273 if (NonCLike.Kind == NonCLikeKind::Invalid)
5276 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5277 if (ChangesLinkage) {
5279 if (NonCLike.Kind == NonCLikeKind::None)
5280 DiagID = diag::err_typedef_changes_linkage;
5282 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5288 TextToInsert +=
' ';
5291 Diag(FixitLoc, DiagID)
5294 if (NonCLike.Kind != NonCLikeKind::None) {
5295 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5296 << NonCLike.Kind - 1 << NonCLike.Range;
5299 << NewTD << isa<TypeAliasDecl>(NewTD);
5324 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5325 if (ED->isScopedUsingClassTag())
5332 llvm_unreachable(
"unexpected type specifier");
5340 bool IsExplicitInstantiation,
5343 Decl *TagD =
nullptr;
5361 Tag = CTD->getTemplatedDecl();
5366 Tag->setFreeStanding();
5367 if (Tag->isInvalidDecl())
5376 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5413 "Friend ellipsis but not friend-specified?");
5416 bool DeclaresAnything =
true;
5420 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5423 Record->getDeclContext()->isRecord()) {
5437 DeclaresAnything =
false;
5456 if ((Tag && Tag->getDeclName()) ||
5466 DeclaresAnything =
false;
5478 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5479 !
Enum->isInvalidDecl())
5480 DeclaresAnything =
false;
5488 DeclaresAnything =
false;
5492 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5494 << Tag->getTagKind()
5507 if (!DeclaresAnything) {
5510 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5511 ? diag::err_no_declarators
5512 : diag::ext_no_declarators)
5525 unsigned DiagID = diag::warn_standalone_specifier;
5527 DiagID = diag::ext_standalone_specifier;
5568 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5569 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5571 DiagnosticId = diag::warn_attribute_ignored;
5572 else if (AL.isRegularKeywordAttribute())
5573 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5575 DiagnosticId = diag::warn_declspec_attribute_ignored;
5576 Diag(AL.getLoc(), DiagnosticId)
5580 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5581 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5604 NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5605 assert(PrevDecl &&
"Expected a non-null Decl");
5618 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5620 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5626 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5636 if (
Record->isAnonymousStructOrUnion())
5641 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5675 for (
auto *D : AnonRecord->
decls()) {
5698 unsigned OldChainingSize = Chaining.size();
5700 Chaining.append(IF->chain_begin(), IF->chain_end());
5702 Chaining.push_back(VD);
5704 assert(Chaining.size() >= 2);
5707 for (
unsigned i = 0; i < Chaining.size(); i++)
5708 NamedChain[i] = Chaining[i];
5712 VD->
getType(), {NamedChain, Chaining.size()});
5726 Chaining.resize(OldChainingSize);
5740 "Parser allowed 'typedef' as storage class VarDecl.");
5741 switch (StorageClassSpec) {
5755 llvm_unreachable(
"unknown storage class specifier");
5759 assert(
Record->hasInClassInitializer());
5761 for (
const auto *I :
Record->decls()) {
5762 const auto *FD = dyn_cast<FieldDecl>(I);
5763 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5764 FD = IFD->getAnonField();
5765 if (FD && FD->hasInClassInitializer())
5766 return FD->getLocation();
5769 llvm_unreachable(
"couldn't find in-class initializer");
5777 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5797 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5799 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5801 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5807 const char *PrevSpec =
nullptr;
5819 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5824 PrevSpec, DiagID, Policy);
5832 diag::err_anonymous_union_with_storage_spec)
5838 PrevSpec, DiagID,
Context.getPrintingPolicy());
5846 <<
Record->isUnion() <<
"const"
5850 diag::ext_anonymous_struct_union_qualified)
5851 <<
Record->isUnion() <<
"volatile"
5855 diag::ext_anonymous_struct_union_qualified)
5856 <<
Record->isUnion() <<
"restrict"
5860 diag::ext_anonymous_struct_union_qualified)
5861 <<
Record->isUnion() <<
"_Atomic"
5865 diag::ext_anonymous_struct_union_qualified)
5866 <<
Record->isUnion() <<
"__unaligned"
5876 for (
auto *Mem :
Record->decls()) {
5878 if (Mem->isInvalidDecl())
5881 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5885 assert(FD->getAccess() !=
AS_none);
5887 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5899 }
else if (Mem->isImplicit()) {
5906 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5907 if (!MemRecord->isAnonymousStructOrUnion() &&
5908 MemRecord->getDeclName()) {
5911 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5915 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5923 Diag(MemRecord->getLocation(),
5924 diag::ext_anonymous_record_with_anonymous_type)
5934 unsigned DK = diag::err_anonymous_record_bad_member;
5936 DK = diag::err_anonymous_record_with_type;
5938 DK = diag::err_anonymous_record_with_function;
5940 DK = diag::err_anonymous_record_with_static;
5944 DK == diag::err_anonymous_record_with_type)
5945 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5948 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5964 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5985 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5989 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
6005 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
6011 Record->getLocation(),
nullptr,
6027 Record->setAnonymousStructOrUnion(
true);
6038 Chain.push_back(Anon);
6044 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
6047 Decl *ManglingContextDecl;
6048 std::tie(MCtx, ManglingContextDecl) =
6067 assert(
Record &&
"expected a record!");
6072 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
6080 nullptr, RecTy, TInfo,
6092 Chain.push_back(Anon);
6096 diag::err_field_incomplete_or_sizeless) ||
6101 ParentDecl->setInvalidDecl();
6138 diag::err_deduction_guide_name_not_class_template)
6158 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6168 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6169 Context.getCanonicalType(Ty)));
6180 Context.getCanonicalType(Ty)));
6201 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6213 Context.getCanonicalType(Ty)));
6221 return Context.getNameForTemplate(TName, TNameLoc);
6226 llvm_unreachable(
"Unknown name kind");
6254 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6259 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6267 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6268 (DeclTyName && DeclTyName == DefTyName))
6269 Params.push_back(Idx);
6296#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6297#include "clang/Basic/BuiltinTraits.inc"
6302 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6312 if (!TSI)
return true;
6325 if (
Result.isInvalid())
return true;
6370 << D << static_cast<int>(Status);
6381 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6382 llvm::omp::TraitProperty::
6383 implementation_extension_bind_to_declaration))
6408 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6419 bool IsMemberSpecialization) {
6420 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6421 "without nested-name-specifier");
6437 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6438 : diag::err_member_extra_qualification)
6442 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6450 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6453 Diag(Loc, diag::err_member_qualification)
6456 Diag(Loc, diag::err_invalid_declarator_global_scope)
6459 Diag(Loc, diag::err_invalid_declarator_in_function)
6462 Diag(Loc, diag::err_invalid_declarator_in_block)
6466 Diag(Loc, diag::err_export_non_namespace_scope_name)
6473 Diag(Loc, diag::err_invalid_declarator_scope)
6483 if (IsMemberSpecialization)
6487 Diag(Loc, diag::err_member_qualification)
6514 Diag(Loc, diag::ext_template_after_declarative_nns)
6519 TL = std::exchange(NextTL,
TypeLoc())) {
6521 switch (TL.getTypeLocClass()) {
6522 case TypeLoc::TemplateSpecialization: {
6524 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6525 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6526 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6527 << TST.getLocalSourceRange();
6530 case TypeLoc::Decltype:
6531 case TypeLoc::PackIndexing: {
6532 const Type *
T = TL.getTypePtr();
6539 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6540 <<
T->isDecltypeType() << TL.getSourceRange();
6543 case TypeLoc::DependentName:
6550 if (TemplateKeywordLoc.
isValid())
6551 Diag(Loc, diag::ext_template_after_declarative_nns)
6592 diag::err_template_qualified_declarator_no_match)
6599 if (!IsDependentContext &&
6606 diag::err_member_def_undefined_record)
6629 if (EnteringContext && IsDependentContext &&
6630 TemplateParamLists.size() != 0) {
6649 bool IsLinkageLookup =
false;
6650 bool CreateBuiltins =
false;
6663 R->isFunctionType())) {
6664 IsLinkageLookup =
true;
6666 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6667 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6669 CreateBuiltins =
true;
6671 if (IsLinkageLookup) {
6713 bool AllowForCompatibility =
false;
6716 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6717 TemplateParamParent->isDeclScope(TPD);
6720 AllowForCompatibility);
6737 (TemplateParamLists.size() == 0 || R->isFunctionType()))
6750 bool AddToScope =
true;
6752 if (TemplateParamLists.size()) {
6758 }
else if (R->isFunctionType()) {
6774 if (
New->getDeclName() && AddToScope)
6777 if (
OpenMP().isInOpenMPDeclareTargetContext())
6788 bool &SizeIsNegative,
6789 llvm::APSInt &Oversized) {
6794 SizeIsNegative =
false;
6797 if (
T->isDependentType())
6803 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6808 if (FixedType.
isNull())
return FixedType;
6809 FixedType = Context.getPointerType(FixedType);
6810 return Qs.
apply(Context, FixedType);
6812 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6813 QualType Inner = PTy->getInnerType();
6817 if (FixedType.
isNull())
return FixedType;
6818 FixedType = Context.getParenType(FixedType);
6819 return Qs.
apply(Context, FixedType);
6829 SizeIsNegative, Oversized);
6839 llvm::APSInt Res =
Result.Val.getInt();
6842 if (Res.isSigned() && Res.isNegative()) {
6843 SizeIsNegative =
true;
6848 unsigned ActiveSizeBits =
6852 : Res.getActiveBits();
6854 Oversized = std::move(Res);
6858 QualType FoldedArrayType = Context.getConstantArrayType(
6860 return Qs.
apply(Context, FoldedArrayType);
6885 TypeLoc DstElemTL = DstATL.getElementLoc();
6904 bool &SizeIsNegative,
6905 llvm::APSInt &Oversized) {
6908 SizeIsNegative, Oversized);
6911 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6919 unsigned FailedFoldDiagID) {
6920 bool SizeIsNegative;
6921 llvm::APSInt Oversized;
6923 TInfo,
Context, SizeIsNegative, Oversized);
6925 Diag(Loc, diag::ext_vla_folded_to_constant);
6932 Diag(Loc, diag::err_typecheck_negative_array_size);
6933 else if (Oversized.getBoolValue())
6935 Oversized, 10, Oversized.isSigned(),
false,
6937 else if (FailedFoldDiagID)
6938 Diag(Loc, FailedFoldDiagID);
6950 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6955 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6964 diag::err_virtual_non_function);
6968 diag::err_explicit_non_function);
6972 diag::err_noreturn_non_function);
6993 ? diag::warn_ms_inline_non_function
6994 : diag::err_inline_non_function)
6998 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
7003 diag::err_deduction_guide_invalid_specifier)
7012 if (!NewTD)
return nullptr;
7033 if (
T->isVariablyModifiedType()) {
7037 bool SizeIsNegative;
7038 llvm::APSInt Oversized;
7049 else if (
T->isVariableArrayType())
7051 else if (Oversized.getBoolValue())
7088 switch (II->getNotableIdentifierID()) {
7089 case tok::NotableIdentifierKind::FILE:
7092 case tok::NotableIdentifierKind::jmp_buf:
7093 Context.setjmp_bufDecl(NewTD);
7095 case tok::NotableIdentifierKind::sigjmp_buf:
7096 Context.setsigjmp_bufDecl(NewTD);
7098 case tok::NotableIdentifierKind::ucontext_t:
7099 Context.setucontext_tDecl(NewTD);
7101 case tok::NotableIdentifierKind::float_t:
7102 case tok::NotableIdentifierKind::double_t:
7103 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7140 if (Context.getLangOpts().CPlusPlus) {
7164 if (!OuterContext->
Equals(PrevOuterContext))
7173 if (!SS.
isSet())
return;
7190 const WeakAttr &
Attr) {
7194 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND))
7197 return DiagnoseMutualExclusions(S, D, &
Attr);
7215 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7224 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7225 if (VD->hasInit()) {
7226 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7227 assert(VD->isThisDeclarationADefinition() &&
7228 "Broken AliasAttr handled late!");
7230 VD->dropAttr<AliasAttr>();
7239 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7242 diag::err_attribute_selectany_non_extern_data);
7249 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7252 diag::warn_attribute_hybrid_patchable_non_extern);
7258 auto *VD = dyn_cast<VarDecl>(&ND);
7259 bool IsAnonymousNS =
false;
7262 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7263 while (NS && !IsAnonymousNS) {
7265 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7272 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7274 (!AnonNSInMicrosoftMode &&
7285 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7286 FD = FD->getMostRecentDecl();
7291 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7297 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7298 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7299 int NoImplicitObjectError = -1;
7301 NoImplicitObjectError = 0;
7302 else if (MD->isStatic())
7303 NoImplicitObjectError = 1;
7304 else if (MD->isExplicitObjectMemberFunction())
7305 NoImplicitObjectError = 2;
7306 if (NoImplicitObjectError != -1) {
7307 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7308 << NoImplicitObjectError << A->getRange();
7310 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7312 }
else if (MD->getReturnType()->isVoidType()) {
7316 err_lifetimebound_implicit_object_parameter_void_return_type);
7321 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7326 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7328 S.
Diag(A->getLocation(),
7329 diag::err_lifetimebound_parameter_void_return_type);
7337 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7338 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7357 bool IsSpecialization,
7358 bool IsDefinition) {
7362 bool IsTemplate =
false;
7363 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7364 OldDecl = OldTD->getTemplatedDecl();
7366 if (!IsSpecialization)
7367 IsDefinition =
false;
7369 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7370 NewDecl = NewTD->getTemplatedDecl();
7374 if (!OldDecl || !NewDecl)
7377 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7378 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7379 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7380 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7384 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7385 (NewExportAttr && !NewExportAttr->isInherited());
7391 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7393 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7395 bool JustWarn =
false;
7397 auto *VD = dyn_cast<VarDecl>(OldDecl);
7398 if (VD && !VD->getDescribedVarTemplate())
7400 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7412 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7413 : diag::err_attribute_dll_redeclaration;
7416 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7429 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7431 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7434 IsStaticDataMember = VD->isStaticDataMember();
7435 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7437 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7438 IsInline = FD->isInlined();
7439 IsQualifiedFriend = FD->getQualifier() &&
7443 if (OldImportAttr && !HasNewAttr &&
7444 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7446 if (IsMicrosoftABI && IsDefinition) {
7447 if (IsSpecialization) {
7450 diag::err_attribute_dllimport_function_specialization_definition);
7451 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7452 NewDecl->
dropAttr<DLLImportAttr>();
7455 diag::warn_redeclaration_without_import_attribute)
7458 NewDecl->
dropAttr<DLLImportAttr>();
7459 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7460 S.
Context, NewImportAttr->getRange()));
7462 }
else if (IsMicrosoftABI && IsSpecialization) {
7463 assert(!IsDefinition);
7467 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7468 << NewDecl << OldImportAttr;
7470 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7471 OldDecl->
dropAttr<DLLImportAttr>();
7472 NewDecl->
dropAttr<DLLImportAttr>();
7474 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7477 OldDecl->
dropAttr<DLLImportAttr>();
7478 NewDecl->
dropAttr<DLLImportAttr>();
7480 diag::warn_dllimport_dropped_from_inline_function)
7481 << NewDecl << OldImportAttr;
7488 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7490 !NewImportAttr && !NewExportAttr) {
7491 if (
const DLLExportAttr *ParentExportAttr =
7492 MD->getParent()->getAttr<DLLExportAttr>()) {
7493 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7494 NewAttr->setInherited(
true);
7546 return D->isExternC();
7563 llvm_unreachable(
"Unexpected context");
7573 llvm_unreachable(
"Unexpected context");
7618 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7619 return FD->isExternC();
7620 if (
const auto *VD = dyn_cast<VarDecl>(D))
7621 return VD->isExternC();
7623 llvm_unreachable(
"Unknown type of decl!");
7634 if (R->isImageType() || R->isPipeType()) {
7636 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7648 if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7650 diag::err_invalid_type_for_program_scope_var)
7660 QualType NR = R.getCanonicalType();
7679 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7688 if (R->isEventT()) {
7696 if (R->isSamplerT()) {
7711 R.isConstQualified())) {
7712 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7722template <
typename AttrTy>
7725 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7726 AttrTy *Clone = Attribute->clone(S.
Context);
7727 Clone->setInherited(
true);
7755 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7757 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7764 "NewD is not a function or variable");
7773 if (IdentName ==
nullptr)
7777 auto &Label = PendingName->second;
7783 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7793 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7808 if (
R->isIncompleteType())
7814 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7819 const auto &TI =
Context.getTargetInfo();
7820 if (!TI.isValidGCCRegisterName(Label))
7821 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7822 else if (!TI.validateLocalRegisterVariable(
7823 TI.getNormalizedGCCRegisterName(Label,
7825 Diag(E->
getExprLoc(), diag::err_asm_invalid_local_var_reg) << Label;
7836 const auto &TI =
Context.getTargetInfo();
7837 bool HasSizeMismatch;
7839 if (!TI.isValidGCCRegisterName(Label))
7840 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7841 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7843 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7844 else if (HasSizeMismatch)
7845 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7848 if (!
R->isIntegralType(
Context) && !
R->isPointerType()) {
7850 diag::err_asm_unsupported_register_type)
7865 bool IsPlaceholderVariable =
false;
7871 if (!Decomp.bindings().empty()) {
7872 II = Decomp.bindings()[0].Name;
7886 IsPlaceholderVariable =
true;
7894 if (IsPlaceholderVariable)
7908 bool IsLocalExternDecl = SC ==
SC_Extern &&
7927 : diag::warn_deprecated_register)
7950 const AutoType *AT = TL.getTypePtr();
7954 bool IsMemberSpecialization =
false;
7955 bool IsVariableTemplateSpecialization =
false;
7957 bool IsVariableTemplate =
false;
7965 if (R->getContainedDeducedType())
7986 false, IsMemberSpecialization,
Invalid);
7988 if (TemplateParams) {
7995 if (!TemplateParams->
size() &&
8000 diag::err_template_variable_noparams)
8004 TemplateParams =
nullptr;
8012 IsVariableTemplateSpecialization =
true;
8016 IsVariableTemplate =
true;
8024 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
8029 "should have a 'template<>' for this decl");
8032 bool IsExplicitSpecialization =
8043 (IsExplicitSpecialization || IsMemberSpecialization)) {
8045 diag::ext_explicit_specialization_storage_class)
8051 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
8057 if (Ctxt->isFunctionOrMethod()) {
8058 FunctionOrMethod = Ctxt;
8061 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
8063 AnonStruct = ParentDecl;
8067 if (FunctionOrMethod) {
8071 diag::err_static_data_member_not_allowed_in_local_class)
8072 << Name << RD->getDeclName() << RD->getTagKind();
8074 }
else if (AnonStruct) {
8079 diag::err_static_data_member_not_allowed_in_anon_struct)
8082 }
else if (RD->isUnion()) {
8086 diag_compat::static_data_member_in_union)
8104 diag::err_static_out_of_line)
8117 diag::err_storage_class_for_static_member)
8122 llvm_unreachable(
"C storage class in c++!");
8126 if (IsVariableTemplateSpecialization) {
8128 TemplateParamLists.size() > 0
8129 ? TemplateParamLists[0]->getTemplateLoc()
8132 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8147 if (IsVariableTemplate) {
8150 TemplateParams, NewVD);
8156 if (R->getContainedDeducedType())
8171 unsigned VDTemplateParamLists =
8172 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8173 if (TemplateParamLists.size() > VDTemplateParamLists)
8175 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8182 }
else if (
CurContext->isFunctionOrMethod()) {
8185 diag::err_inline_declaration_block_scope) << Name
8190 : diag::compat_pre_cxx17_inline_variable);
8201 if (IsLocalExternDecl) {
8204 B->setLocalExternDecl();
8209 bool EmitTLSUnsupportedError =
false;
8222 diag::err_thread_non_global)
8224 else if (!
Context.getTargetInfo().isTLSSupported()) {
8229 EmitTLSUnsupportedError =
true;
8236 diag::err_thread_unsupported);
8247 diag::err_constexpr_wrong_decl_kind)
8248 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8258 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8265 diag::err_constinit_local_variable);
8269 ConstInitAttr::Keyword_constinit));
8287 diag::warn_static_local_in_extern_inline);
8293 if (IsVariableTemplateSpecialization)
8298 else if (IsMemberSpecialization)
8313 B->setModulePrivate();
8323 diag::err_opencl_unknown_type_specifier)
8333 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8334 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8352 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8379 if (R->isFunctionPointerType())
8384 if (EmitTLSUnsupportedError &&
8387 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8389 diag::err_thread_unsupported);
8391 if (EmitTLSUnsupportedError &&
8398 (NewVD->
hasAttr<CUDASharedAttr>() ||
8399 NewVD->
hasAttr<CUDAConstantAttr>())) {
8407 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8408 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8413 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8420 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8432 IsMemberSpecialization ||
8433 IsVariableTemplateSpecialization);
8447 if (IsMemberSpecialization && !IsVariableTemplate &&
8448 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8465 !IsVariableTemplateSpecialization) {
8476 if (NewTemplate && IsMemberSpecialization) {
8488 if (!IsPlaceholderVariable)
8519 if (IsMemberSpecialization) {
8524 ->setMemberSpecialization();
8543 Decl *ManglingContextDecl;
8544 std::tie(MCtx, ManglingContextDecl) =
8636 return !Diags.
isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8648 NamedDecl *ShadowedDecl = R.getFoundDecl();
8662 NamedDecl *ShadowedDecl = R.getFoundDecl();
8671 NamedDecl *ShadowedDecl = R.getFoundDecl();
8680 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8682 if (
const auto *MD = dyn_cast<CXXMethodDecl>(FnDC)) {
8685 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8697 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8700 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8705 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8706 if (shadowedVar->isExternC()) {
8709 for (
auto *I : shadowedVar->redecls())
8710 if (I->isFileVarDecl()) {
8718 unsigned WarningDiag = diag::warn_decl_shadow;
8721 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8727 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8733 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8739 ->ShadowingDecls.push_back({D, VD});
8750 ->ShadowingDecls.push_back({D, ShadowedDecl});
8756 bool HasLocalStorage =
false;
8757 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8758 HasLocalStorage = VD->hasLocalStorage();
8759 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8763 if (HasLocalStorage) {
8768 ParentDC && !ParentDC->
Equals(OldDC);
8809 Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8811 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8818 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8824 Diag(Shadow.VD->getLocation(),
8825 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8826 : diag::warn_decl_shadow)
8827 << Shadow.VD->getDeclName()
8830 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8831 << Shadow.VD->getDeclName() << 0;
8834 Diag(Shadow.VD->getLocation(),
8836 : diag::warn_decl_shadow_uncaptured_local)
8837 << Shadow.VD->getDeclName()
8863 auto *DRE = dyn_cast<DeclRefExpr>(E);
8867 auto I = ShadowingDecls.find(D);
8868 if (I == ShadowingDecls.end())
8870 const NamedDecl *ShadowedDecl = I->second;
8872 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8877 ShadowingDecls.erase(I);
8885 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8944 assert(Prev &&
"should have found a previous declaration to diagnose");
8946 Prev = FD->getFirstDecl();
8950 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8972 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8984 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
9004 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
9014 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
9022 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
9042 if (
T->isUndeducedType())
9048 if (
T->isObjCObjectType()) {
9051 T =
Context.getObjCObjectPointerType(
T);
9060 Diag(NewVD->
getLocation(), diag::err_sycl_address_space_qualified_object)
9094 if (NewVD->
hasAttr<BlocksAttr>()) {
9099 if (
T->isBlockPointerType()) {
9102 if (!
T.isConstQualified()) {
9103 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
9109 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
9118 if (!
T->isSamplerT() && !
T->isDependentType() &&
9125 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
9126 <<
Scope <<
"global or constant";
9128 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
9129 <<
Scope <<
"constant";
9143 bool AllowFunctionScopeLocalVariables =
9146 "__cl_clang_function_scope_local_variables",
getLangOpts());
9147 if (AllowFunctionScopeLocalVariables) {
9154 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9166 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9191 && !NewVD->
hasAttr<BlocksAttr>()) {
9202 if (
T->isWebAssemblyTableType()) {
9213 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
9214 if (!ATy || ATy->getZExtSize() != 0) {
9216 diag::err_typecheck_wasm_table_must_have_zero_length);
9226 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9229 ArrayT && ArrayT->isZeroSize()) {
9235 bool isVM =
T->isVariablyModifiedType();
9236 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9242 bool SizeIsNegative;
9243 llvm::APSInt Oversized;
9248 FixedT = FixedTInfo->
getType();
9249 else if (FixedTInfo) {
9255 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9288 if (
T->isVoidType()) {
9300 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9306 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9308 << diag::NotAllowedBlockVarReason::VariablyModifiedType;
9320 !
T->isDependentType() &&
9322 diag::err_constexpr_var_non_literal)) {
9328 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9338 llvm::StringMap<bool> CallerFeatureMap;
9339 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9341 CallerFeatureMap)) {
9349 llvm::StringMap<bool> CallerFeatureMap;
9350 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9355 if (
Context.getTargetInfo().hasAMDGPUTypes()) {
9362 if (
T.hasAddressSpace() &&
9396 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9401 Name =
Context.DeclarationNames.getCXXDestructorName(
9402 Context.getCanonicalTagType(BaseRecord));
9407 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9414 if (Overridden.insert(BaseMD).second) {
9431 return !Overridden.empty();
9437 struct ActOnFDArgs {
9451 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9452 CXXRecordDecl *Parent)
9453 : Context(Context), OriginalFD(TypoFD),
9456 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9460 SmallVector<unsigned, 1> MismatchedParams;
9462 CDeclEnd = candidate.
end();
9463 CDecl != CDeclEnd; ++CDecl) {
9464 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9468 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9469 CXXRecordDecl *Parent = MD->getParent();
9472 }
else if (!ExpectedParent) {
9481 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9482 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9486 ASTContext &Context;
9487 FunctionDecl *OriginalFD;
9488 CXXRecordDecl *ExpectedParent;
9508 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9516 IsLocalFriend ? diag::err_no_matching_local_friend :
9518 diag::err_member_decl_does_not_match;
9530 "Cannot have an ambiguity in previous-declaration lookup");
9532 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9534 if (!Prev.
empty()) {
9543 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9544 NearMatches.push_back(std::make_pair(FD, ParamNum));
9552 IsLocalFriend ?
nullptr : NewDC))) {
9559 CDeclEnd = Correction.
end();
9560 CDecl != CDeclEnd; ++CDecl) {
9580 ExtraArgs.S, ExtraArgs.D,
9583 ExtraArgs.AddToScope);
9591 Decl *Canonical =
Result->getCanonicalDecl();
9594 if ((*I)->getCanonicalDecl() == Canonical)
9601 SemaRef.
PDiag(IsLocalFriend
9602 ? diag::err_no_matching_local_friend_suggest
9603 : diag::err_member_decl_does_not_match_suggest)
9604 << Name << NewDC << IsDefinition);
9617 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9620 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9626 bool NewFDisConst = NewMD && NewMD->
isConst();
9629 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9630 NearMatch != NearMatchEnd; ++NearMatch) {
9633 bool FDisConst = MD && MD->
isConst();
9634 bool IsMember = MD || !IsLocalFriend;
9637 if (
unsigned Idx = NearMatch->second) {
9641 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9642 : diag::note_local_decl_close_param_match)
9645 }
else if (FDisConst != NewFDisConst) {
9647 diag::note_member_def_close_const_match)
9652 else if (FTI.hasMethodTypeQualifiers() &&
9653 FTI.getConstQualifierLoc().isValid())
9657 IsMember ? diag::note_member_def_close_match
9658 : diag::note_local_decl_close_match);
9666 default: llvm_unreachable(
"Unknown storage class!");
9671 diag::err_typecheck_sclass_func);
9688 diag::err_static_block_func);
9704 bool &IsVirtualOkay) {
9718 diag::err_c23_constexpr_not_variable);
9721 diag::err_constexpr_wrong_decl_kind)
9722 <<
static_cast<int>(ConstexprKind);
9743 (!R->getAsAdjusted<
FunctionType>() && R->isFunctionProtoType());
9746 "Strict prototypes are required");
9767 "Constructors can only be declared in a member context");
9773 isInline,
false, ConstexprKind,
9784 false, ConstexprKind,
9785 TrailingRequiresClause);
9788 if (
Record->isBeingDefined())
9797 IsVirtualOkay =
true;
9809 true, ConstexprKind, TrailingRequiresClause);
9815 diag::err_conv_function_not_member);
9823 IsVirtualOkay =
true;
9828 TrailingRequiresClause);
9855 IsVirtualOkay = !Ret->isStatic();
9869 true , ConstexprKind, TrailingRequiresClause);
9886 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9894 if (Names.end() !=
Match)
9899 }
while (DesugaredTy != Ty);
9938 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9940 bool IsStandardLayoutType =
true;
9946 if (!CXXRec->hasDefinition())
9947 CXXRec = CXXRec->getTemplateInstantiationPattern();
9948 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9949 IsStandardLayoutType =
false;
9952 !IsStandardLayoutType)
10000 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
10014 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
10027 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
10036 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
10053 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
10061 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
10062 PT = Typedef->desugar();
10084 HistoryStack.push_back(
nullptr);
10089 VisitStack.push_back(PD);
10090 assert(VisitStack.back() &&
"First decl null?");
10093 const Decl *
Next = VisitStack.pop_back_val();
10095 assert(!HistoryStack.empty());
10097 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
10098 ValidTypes.insert(Hist->getType().getTypePtr());
10107 HistoryStack.push_back(Field);
10109 QualType FieldTy = Field->getType();
10113 "Unexpected type.");
10122 VisitStack.push_back(
nullptr);
10124 for (
const auto *FD : RD->
fields()) {
10135 VisitStack.push_back(FD);
10146 S.
Diag(Param->getLocation(),
10147 diag::err_record_with_pointers_kernel_param)
10151 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
10154 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
10155 << PD->getDeclName();
10160 I = HistoryStack.begin() + 1,
10161 E = HistoryStack.end();
10174 }
while (!VisitStack.empty());
10191 (LangOpts.CPlusPlus &&
10201 unsigned BuiltinID) {
10202 switch (BuiltinID) {
10203 case Builtin::BI__GetExceptionInfo:
10207 case Builtin::BIaddressof:
10208 case Builtin::BI__addressof:
10209 case Builtin::BIforward:
10210 case Builtin::BIforward_like:
10211 case Builtin::BImove:
10212 case Builtin::BImove_if_noexcept:
10213 case Builtin::BIas_const: {
10218 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10232 switch (FT->getCallConv()) {
10233#define CC_VLS_CASE(ABI_VLEN) \
10234 case CC_RISCVVLSCall_##ABI_VLEN: \
10235 Tag = "riscv_vls_cc_" #ABI_VLEN; \
10255 AbiTagAttr *Old = Existing.empty() ?
nullptr : Existing.front();
10259 llvm::append_range(Tags, Old->tags());
10260 if (llvm::is_contained(Tags, Tag))
10262 Tags.push_back(Tag);
10264 AbiTagAttr *Merged =
10265 Old ? AbiTagAttr::Create(
Context, Tags.data(), Tags.size(), *Old)
10266 : AbiTagAttr::CreateImplicit(
Context, Tags.data(), Tags.size(),
10270 for (
size_t I = 1, E = Existing.size(); I < E; ++I)
10278 bool &AddToScope) {
10281 assert(R->isFunctionType());
10286 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10288 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10289 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10290 TemplateParamLists.back() = Invented;
10292 TemplateParamLists.push_back(Invented);
10302 diag::err_invalid_thread)
10310 bool isFriend =
false;
10312 bool isMemberSpecialization =
false;
10313 bool isFunctionTemplateSpecialization =
false;
10315 bool HasExplicitTemplateArgs =
false;
10318 bool isVirtualOkay =
false;
10325 if (!NewFD)
return nullptr;
10335 if (IsLocalExternDecl)
10345 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10373 if (isVirtual && Parent->isUnion()) {
10377 if ((Parent->isClass() || Parent->isStruct()) &&
10378 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10381 if (
auto *Def = Parent->getDefinition())
10382 Def->setInitMethod(
true);
10387 isMemberSpecialization =
false;
10388 isFunctionTemplateSpecialization =
false;
10403 isMemberSpecialization,
Invalid);
10404 if (TemplateParams) {
10409 if (TemplateParams->
size() > 0) {
10417 }
else if (TemplateId) {
10434 Name, TemplateParams,
10440 if (TemplateParamLists.size() > 1) {
10447 isFunctionTemplateSpecialization =
true;
10449 if (TemplateParamLists.size() > 0)
10469 << Name << RemoveRange
10475 HasExplicitTemplateArgs =
true;
10482 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10488 if (TemplateParamLists.size() > 0)
10493 if (isFriend && TemplateId)
10494 isFunctionTemplateSpecialization =
true;
10500 if (isFunctionTemplateSpecialization && TemplateId) {
10501 HasExplicitTemplateArgs =
true;
10532 if (!isVirtualOkay) {
10534 diag::err_virtual_non_function);
10538 diag::err_virtual_out_of_class)
10544 diag::err_virtual_member_function_template)
10563 diag::err_inline_declaration_block_scope) << Name
10577 diag::err_explicit_out_of_class)
10584 diag::err_explicit_non_ctor_or_conv_function)
10602 <<
static_cast<int>(ConstexprKind);
10613 diag::err_invalid_consteval_decl_kind)
10621 if (isFunctionTemplateSpecialization) {
10624 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10670 if (!isFriend && SC !=
SC_None) {
10678 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10680 diag::ext_explicit_specialization_storage_class)
10687 "Out-of-line member function should be a CXXMethodDecl");
10704 ? diag::ext_static_out_of_line
10705 : diag::err_static_out_of_line)
10730 PendingInlineFuncDecls.insert(NewFD);
10737 isMemberSpecialization ||
10738 isFunctionTemplateSpecialization);
10749 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
10776 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10778 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10779 Param->setDeclContext(NewFD);
10780 Params.push_back(Param);
10782 if (Param->isInvalidDecl())
10795 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10800 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10805 DeclContext *TagDC = TD->getLexicalDeclContext();
10809 TD->setDeclContext(NewFD);
10817 if (TagDC != PrototypeTagContext)
10818 TD->setLexicalDeclContext(TagDC);
10832 for (
const auto &AI : FT->param_types()) {
10835 Param->setScopeInfo(0, Params.size());
10836 Params.push_back(Param);
10839 assert(R->isFunctionNoProtoType() && NewFD->
getNumParams() == 0 &&
10840 "Should not need args for typedef of non-prototype fn");
10844 NewFD->setParams(Params);
10869 !NewFD->
hasAttr<SectionAttr>())
10870 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10876 !NewFD->
hasAttr<SectionAttr>()) {
10877 NewFD->
addAttr(SectionAttr::CreateImplicit(
10879 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10890 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10891 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10896 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10906 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10907 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10908 !NewTVA->isDefaultVersion() &&
10909 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10911 AddToScope =
false;
10923 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10938 isMemberSpecialization,
10945 "previous declaration set still overloaded");
10957 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10980 diag::ext_operator_new_delete_declared_inline)
11007 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
11019 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
11027 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
11031 Diag(TRC->getBeginLoc(),
11032 diag::err_constrained_non_templated_function);
11049 if (isFunctionTemplateSpecialization) {
11050 bool isDependentSpecialization =
false;
11056 isDependentSpecialization =
11059 (HasExplicitTemplateArgs &&
11060 TemplateSpecializationType::
11061 anyInstantiationDependentTemplateArguments(
11063 assert((!isDependentSpecialization ||
11064 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
11065 "dependent friend function specialization without template "
11071 isDependentSpecialization =
11076 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
11077 if (isDependentSpecialization) {
11084 NewFD, ExplicitTemplateArgs,
Previous))
11105 isMemberSpecialization,
11114 "previous declaration set still overloaded");
11155 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
11201 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
11202 AddToScope = ExtraArgs.AddToScope;
11211 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
11212 AddToScope = ExtraArgs.AddToScope;
11218 !isFriend && !isFunctionTemplateSpecialization &&
11219 !isMemberSpecialization) {
11237 if (NewFD->
hasAttr<HLSLShaderAttr>())
11241 if (
const NoInlineAttr *NoInline = NewFD->
getAttr<NoInlineAttr>()) {
11243 QualType ParamTy = PVD->getType().getNonReferenceType();
11251 Diag(PVD->getLocation(),
11252 diag::err_hlsl_resource_param_in_noinline_function)
11254 Diag(NoInline->getLocation(), diag::note_attribute);
11264 if (
unsigned BuiltinID = II->getBuiltinID()) {
11265 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11266 if (!InStdNamespace &&
11271 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11272 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11279 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11281 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11286 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11302 if (NewFD->
hasAttr<OverloadableAttr>() &&
11305 diag::err_attribute_overloadable_no_prototype)
11307 NewFD->
dropAttr<OverloadableAttr>();
11340 isMemberSpecialization ||
11341 isFunctionTemplateSpecialization,
11352 Context.setcudaConfigureCallDecl(NewFD);
11354 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11360 Context.setcudaGetParameterBufferDecl(NewFD);
11362 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11368 Context.setcudaLaunchDeviceDecl(NewFD);
11419 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11438 if (
Context.getTargetInfo().getTriple().isWasm()) {
11440 Diag(Param->getTypeSpecStartLoc(),
11441 diag::err_wasm_table_as_function_parameter);
11449 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11450 if (NewFD->
hasAttr<ConstructorAttr>()) {
11451 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11453 NewFD->
dropAttr<AvailabilityAttr>();
11455 if (NewFD->
hasAttr<DestructorAttr>()) {
11456 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11458 NewFD->
dropAttr<AvailabilityAttr>();
11469 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11473 Diag(NBA->getLocation(),
11474 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11475 << NBA->getSpelling();
11478 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11479 << NBA->getSpelling();
11488 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11512 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11516 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11527 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11528 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11538 bool IsDefinition) {
11541 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11543 return SectionAttr::CreateImplicit(
11545 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11593 auto *VD = dyn_cast<ValueDecl>(D);
11594 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11595 return !VD || !PrevVD ||
11597 PrevVD->getType());
11605 const auto *TA = FD->
getAttr<TargetAttr>();
11606 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11608 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11621 for (
const auto &Feat : ParseInfo.
Features) {
11622 auto BareFeat = StringRef{Feat}.substr(1);
11623 if (Feat[0] ==
'-') {
11625 <<
Feature << (
"no-" + BareFeat);
11645 for (
auto &Feat : ParseInfo.
Features)
11646 Feats.push_back(StringRef{Feat}.substr(1));
11649 TVA->getFeatures(Feats);
11651 for (
const auto &Feat : Feats) {
11671 case attr::ArmLocallyStreaming:
11676 case attr::NonNull:
11677 case attr::NoThrow:
11686 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11687 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11688 <<
static_cast<unsigned>(MVKind) << A;
11690 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11695 switch (A->getKind()) {
11696 case attr::CPUDispatch:
11697 case attr::CPUSpecific:
11700 return Diagnose(S, A);
11704 return Diagnose(S, A);
11706 case attr::TargetVersion:
11709 return Diagnose(S, A);
11711 case attr::TargetClones:
11714 return Diagnose(S, A);
11718 return Diagnose(S, A);
11731 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11732 enum DoesntSupport {
11739 DefaultedFuncs = 6,
11740 ConstexprFuncs = 7,
11741 ConstevalFuncs = 8,
11753 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11756 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11764 if (!TemplatesSupported &&
11766 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11769 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11770 if (NewCXXFD->isVirtual())
11771 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11775 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11779 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11784 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11788 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11792 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11793 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11797 QualType NewReturnType = NewType->getReturnType();
11800 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11813 bool ArmStreamingCCMismatched =
false;
11814 if (OldFPT && NewFPT) {
11821 ArmStreamingCCMismatched =
true;
11824 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11827 QualType OldReturnType = OldType->getReturnType();
11829 if (OldReturnType != NewReturnType)
11830 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11833 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11836 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11839 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11862 bool IsCPUSpecificCPUDispatchMVKind =
11866 if (CausesMV && OldFD &&
11874 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11881 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11883 S.
PDiag(diag::note_multiversioning_caused_here)),
11885 S.
PDiag(diag::err_multiversion_doesnt_support)
11886 <<
static_cast<unsigned>(MVKind)),
11888 S.
PDiag(diag::err_multiversion_diff)),
11890 !IsCPUSpecificCPUDispatchMVKind,
11903 "Function lacks multiversion attribute");
11904 const auto *TA = FD->
getAttr<TargetAttr>();
11905 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11908 if (TA && !TA->isDefaultVersion())
11945 To->
addAttr(TargetVersionAttr::CreateImplicit(
11956 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11957 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11958 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11959 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11961 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11970 if (NewTA && !NewTA->isDefaultVersion() &&
11971 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11988 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11989 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11998 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
12006 OldTA->getFeaturesStr());
12010 NewTA->getFeaturesStr());
12013 if (OldParsed == NewParsed) {
12021 for (
const auto *FD : OldFD->
redecls()) {
12022 const auto *CurTA = FD->
getAttr<TargetAttr>();
12023 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
12027 ((NewTA && (!CurTA || CurTA->isInherited())) ||
12028 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
12030 << (NewTA ? 0 : 2);
12031 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
12078 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
12094 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12095 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12102 NewTA->getFeaturesStr());
12107 NewTVA->getFeatures(NewFeats);
12108 llvm::sort(NewFeats);
12111 bool UseMemberUsingDeclRules =
12114 bool MayNeedOverloadableChecks =
12123 if (MayNeedOverloadableChecks &&
12124 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
12127 switch (NewMVKind) {
12130 "Only target_clones can be omitted in subsequent declarations");
12133 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
12134 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
12143 CurTA->getFeaturesStr());
12145 if (CurParsed == NewParsed) {
12154 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
12155 if (CurTVA->getName() == NewTVA->getName()) {
12162 CurTVA->getFeatures(CurFeats);
12163 llvm::sort(CurFeats);
12165 if (CurFeats == NewFeats) {
12171 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
12173 if (NewFeats.empty())
12176 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
12178 CurClones->getFeatures(CurFeats, I);
12179 llvm::sort(CurFeats);
12181 if (CurFeats == NewFeats) {
12192 assert(NewClones &&
"MultiVersionKind does not match attribute type");
12193 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
12194 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
12195 !std::equal(CurClones->featuresStrs_begin(),
12196 CurClones->featuresStrs_end(),
12197 NewClones->featuresStrs_begin())) {
12203 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
12205 CurTVA->getFeatures(CurFeats);
12206 llvm::sort(CurFeats);
12209 if (CurFeats.empty())
12212 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
12214 NewClones->getFeatures(NewFeats, I);
12215 llvm::sort(NewFeats);
12217 if (CurFeats == NewFeats) {
12233 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
12234 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12239 CurFD->
hasAttr<CPUDispatchAttr>()) {
12240 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12242 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12243 NewCPUDisp->cpus_begin(),
12245 return Cur->getName() == New->getName();
12260 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12262 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12263 NewCPUSpec->cpus_begin(),
12265 return Cur->getName() == New->getName();
12276 if (CurII == NewII) {
12346 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12347 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12348 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12349 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12350 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12360 NewTVA->isDefaultVersion())) {
12361 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12369 if (NewTA && TI.
getTriple().isAArch64())
12396 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12409 if (OldFD->
isUsed(
false)) {
12411 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12433 bool IsPure = NewFD->
hasAttr<PureAttr>();
12434 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12437 if (!IsPure && !IsConst)
12444 if (IsPure && IsConst) {
12454 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12460 bool IsMemberSpecialization,
12463 "Variably modified return types are not handled here");
12468 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12473 bool MayNeedOverloadableChecks =
false;
12485 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12487 OldDecl = Candidate;
12490 MayNeedOverloadableChecks =
true;
12515 OldDecl =
Previous.getFoundDecl();
12516 MergeTypeWithPrevious =
false;
12519 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12520 NewFD->
hasAttr<OverloadableAttr>()) {
12522 MayNeedOverloadableChecks =
true;
12534 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12585 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12586 if (!OldMD || !OldMD->
isStatic()) {
12621 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12622 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12625 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12634 NewFD->
setAccess(OldTemplateDecl->getAccess());
12635 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12640 if (IsMemberSpecialization &&
12643 assert(OldTemplateDecl->isMemberSpecialization());
12646 if (OldFD->isDeleted()) {
12648 assert(OldFD->getCanonicalDecl() == OldFD);
12650 OldFD->setDeletedAsWritten(
false);
12664 !NewFD->
getAttr<OverloadableAttr>()) {
12668 return ND->hasAttr<OverloadableAttr>();
12670 "Non-redecls shouldn't happen without overloadable present");
12673 const auto *FD = dyn_cast<FunctionDecl>(ND);
12674 return FD && !FD->
hasAttr<OverloadableAttr>();
12677 if (OtherUnmarkedIter !=
Previous.end()) {
12679 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12680 Diag((*OtherUnmarkedIter)->getLocation(),
12681 diag::note_attribute_overloadable_prev_overload)
12691 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12694 if (NewFD->
hasAttr<SYCLExternalAttr>())
12704 dyn_cast<CXXDestructorDecl>(NewFD)) {
12712 (!
Destructor->getFunctionObjectParameterType()->isDependentType() &&
12713 !
Destructor->getDeclName().isDependentName())) {
12718 Context.DeclarationNames.getCXXDestructorName(ClassType);
12725 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12726 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12732 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12738 if (!
Method->isFunctionTemplateSpecialization() &&
12739 !
Method->getDescribedFunctionTemplate() &&
12740 Method->isCanonicalDecl()) {
12747 diag::err_constrained_virtual_method);
12782 if (R->isIncompleteType() && !R->isVoidType())
12785 else if (!R.isPODType(
Context) && !R->isVoidType() &&
12786 !R->isObjCObjectPointerType())
12787 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12800 auto HasNoexcept = [&](
QualType T) ->
bool {
12805 T = RT->getPointeeType();
12806 else if (
T->isAnyPointerType())
12807 T =
T->getPointeeType();
12809 T = MPT->getPointeeType();
12811 if (FPT->isNothrow())
12817 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12819 AnyNoexcept |= HasNoexcept(
T);
12822 diag::warn_cxx17_compat_exception_spec_in_signature)
12827 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12829 if (!Parm->getType()->isDependentType() &&
12830 Parm->hasAttr<CUDAGridConstantAttr>() &&
12831 !(IsKernel && Parm->getType().isConstQualified()))
12832 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12833 diag::err_cuda_grid_constant_not_allowed);
12839 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12849 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12860 ? diag::err_static_main : diag::warn_static_main)
12868 Diag(NoreturnLoc, diag::ext_noreturn_main);
12869 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12881 << FD->
hasAttr<DeviceKernelAttr>();
12886 if (FD->
hasAttr<SYCLExternalAttr>()) {
12888 << FD->
getAttr<SYCLExternalAttr>();
12899 assert(
T->isFunctionType() &&
"function decl is not of function type");
12921 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12946 Diag(start, diag::warn_main_in_named_module)
12958 bool HasExtraParameters = (nparams > 3);
12969 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12970 HasExtraParameters =
false;
12972 if (HasExtraParameters) {
12985 for (
unsigned i = 0; i < nparams; ++i) {
12988 bool mismatch =
true;
13005 mismatch = !qs.
empty();
13034 if (
T.isOSCygMing())
13039 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
13047 assert(
T->isFunctionType() &&
"function decl is not of function type");
13056 if (FD->
getName() !=
"DllMain")
13063 FT =
Context.adjustFunctionType(
13068 FT =
Context.adjustFunctionType(FT,
13090 if (
Init->isValueDependent()) {
13091 assert(
Init->containsErrors() &&
13092 "Dependent code should only occur in error-recovery path.");
13095 const Expr *Culprit;
13096 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
13120 if (
const auto *ALE = dyn_cast<ObjCArrayLiteral>(CulpritLiteral)) {
13121 for (
const Expr *Elm : ALE->elements()) {
13123 !Elm->isConstantInitializer(
Context)) {
13124 Diag(Elm->getExprLoc(),
13125 diag::err_objc_literal_nonconstant_at_file_scope)
13132 if (
const auto *DLE = dyn_cast<ObjCDictionaryLiteral>(CulpritLiteral)) {
13133 for (
size_t I = 0, N = DLE->getNumElements(); I != N; ++I) {
13140 diag::err_objc_literal_nonconstant_at_file_scope)
13149 diag::err_objc_literal_nonconstant_at_file_scope)
13157 diag::err_objc_literal_nonconstant_at_file_scope)
13169 class SelfReferenceChecker
13175 bool isReferenceType;
13176 bool isInCXXOperatorCall;
13184 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
13185 S(S), OrigDecl(OrigDecl) {
13188 isReferenceType =
false;
13189 isInCXXOperatorCall =
false;
13190 isInitList =
false;
13191 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
13192 isPODType = VD->getType().isPODType(S.
Context);
13194 isReferenceType = VD->getType()->isReferenceType();
13201 void CheckExpr(Expr *E) {
13202 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
13210 InitFieldIndex.push_back(0);
13211 for (
auto *Child : InitList->
children()) {
13213 ++InitFieldIndex.back();
13215 InitFieldIndex.pop_back();
13220 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
13221 llvm::SmallVector<FieldDecl*, 4> Fields;
13223 bool ReferenceField =
false;
13226 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13227 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
13230 Fields.push_back(FD);
13232 ReferenceField =
true;
13233 Base = ME->getBase()->IgnoreParenImpCasts();
13237 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
13238 if (!DRE || DRE->
getDecl() != OrigDecl)
13242 if (CheckReference && !ReferenceField)
13246 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
13247 for (
const FieldDecl *I : llvm::reverse(Fields))
13248 UsedFieldIndex.push_back(I->getFieldIndex());
13253 for (
auto UsedIter = UsedFieldIndex.begin(),
13254 UsedEnd = UsedFieldIndex.end(),
13255 OrigIter = InitFieldIndex.begin(),
13256 OrigEnd = InitFieldIndex.end();
13257 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
13258 if (*UsedIter < *OrigIter)
13260 if (*UsedIter > *OrigIter)
13265 HandleDeclRefExpr(DRE);
13272 void HandleValue(Expr *E) {
13274 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
13275 HandleDeclRefExpr(DRE);
13279 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
13280 Visit(CO->getCond());
13281 HandleValue(CO->getTrueExpr());
13282 HandleValue(CO->getFalseExpr());
13286 if (BinaryConditionalOperator *BCO =
13287 dyn_cast<BinaryConditionalOperator>(E)) {
13288 Visit(BCO->getCond());
13289 HandleValue(BCO->getFalseExpr());
13293 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
13294 if (Expr *SE = OVE->getSourceExpr())
13299 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
13300 if (BO->getOpcode() == BO_Comma) {
13301 Visit(BO->getLHS());
13302 HandleValue(BO->getRHS());
13315 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13319 Base = ME->getBase()->IgnoreParenImpCasts();
13321 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13322 HandleDeclRefExpr(DRE);
13331 void VisitDeclRefExpr(DeclRefExpr *E) {
13332 if (isReferenceType)
13333 HandleDeclRefExpr(E);
13336 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13342 Inherited::VisitImplicitCastExpr(E);
13345 void VisitMemberExpr(MemberExpr *E) {
13347 if (CheckInitListMemberExpr(E,
true ))
13356 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13357 bool Warn = (MD && !MD->
isStatic());
13359 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13362 Base = ME->getBase()->IgnoreParenImpCasts();
13365 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13367 HandleDeclRefExpr(DRE);
13376 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13377 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13381 return Inherited::VisitCXXOperatorCallExpr(E);
13385 HandleValue(Arg->IgnoreParenImpCasts());
13389 if (!isInCXXOperatorCall) {
13390 Inherited::VisitLambdaExpr(E);
13395 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13396 HandleDeclRefExpr(DRE);
13401 void VisitUnaryOperator(UnaryOperator *E) {
13415 Inherited::VisitUnaryOperator(E);
13418 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13420 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13422 Expr *ArgExpr = E->
getArg(0);
13423 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13424 if (ILE->getNumInits() == 1)
13425 ArgExpr = ILE->getInit(0);
13426 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13427 if (ICE->getCastKind() == CK_NoOp)
13428 ArgExpr = ICE->getSubExpr();
13429 HandleValue(ArgExpr);
13432 Inherited::VisitCXXConstructExpr(E);
13435 void VisitCallExpr(CallExpr *E) {
13438 HandleValue(E->
getArg(0));
13442 Inherited::VisitCallExpr(E);
13445 void VisitBinaryOperator(BinaryOperator *E) {
13447 HandleValue(E->
getLHS());
13452 Inherited::VisitBinaryOperator(E);
13458 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13463 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13465 if (OrigDecl != ReferenceDecl)
return;
13467 if (isReferenceType) {
13468 diag = diag::warn_uninit_self_reference_in_reference_init;
13470 diag = diag::warn_static_self_reference_in_init;
13474 diag = diag::warn_uninit_self_reference_in_init;
13488 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13498 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13499 VD && VD->isConstexpr() && VD->isFileVarDecl())
13507 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13508 if (ICE->getCastKind() == CK_LValueToRValue)
13509 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13510 if (DRE->
getDecl() == OrigDecl)
13513 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13520 struct VarDeclOrName {
13522 DeclarationName Name;
13524 friend const Sema::SemaDiagnosticBuilder &
13525 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13526 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13536 bool IsInitCapture = !VDecl;
13538 "init captures are expected to be deduced prior to initialization");
13540 VarDeclOrName VN{VDecl, Name};
13543 assert(
Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13547 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13548 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13549 << (int)
Deduced->getContainedAutoType()->getKeyword()
13556 assert(VDecl &&
"no init for init capture deduction?");
13571 DeduceInits =
Init;
13573 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13575 DeduceInits = PL->exprs();
13578 assert(VDecl &&
"non-auto type for init capture deduction?");
13589 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13590 DeduceInits = IL->inits();
13594 if (DeduceInits.empty()) {
13597 Diag(
Init->getBeginLoc(), IsInitCapture
13598 ? diag::err_init_capture_no_expression
13599 : diag::err_auto_var_init_no_expression)
13600 << VN <<
Type << Range;
13604 if (DeduceInits.size() > 1) {
13605 Diag(DeduceInits[1]->getBeginLoc(),
13606 IsInitCapture ? diag::err_init_capture_multiple_expressions
13607 : diag::err_auto_var_init_multiple_expressions)
13608 << VN <<
Type << Range;
13612 Expr *DeduceInit = DeduceInits[0];
13614 Diag(
Init->getBeginLoc(), IsInitCapture
13615 ? diag::err_init_capture_paren_braces
13616 : diag::err_auto_var_init_paren_braces)
13622 bool DefaultedAnyToId =
false;
13624 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13626 if (
Result.isInvalid()) {
13630 DefaultedAnyToId =
true;
13640 Type.getQualifiers());
13648 if (!IsInitCapture)
13651 Diag(Range.getBegin(),
13652 diag::err_init_capture_deduction_failure_from_init_list)
13658 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13673 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13676 return DeducedType;
13681 assert(!
Init || !
Init->containsErrors());
13685 if (DeducedType.
isNull()) {
13694 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13718 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13719 Init = EWC->getSubExpr();
13721 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13722 Init = CE->getSubExpr();
13727 "shouldn't be called if type doesn't have a non-trivial C struct");
13728 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13729 for (
auto *I : ILE->inits()) {
13730 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13731 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13757bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13763 return FD->
hasAttr<UnavailableAttr>();
13766struct DiagNonTrivalCUnionDefaultInitializeVisitor
13773 DiagNonTrivalCUnionDefaultInitializeVisitor(
13776 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13779 const FieldDecl *FD,
bool InNonTrivialUnion) {
13782 InNonTrivialUnion);
13783 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13786 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13787 bool InNonTrivialUnion) {
13788 if (InNonTrivialUnion)
13790 << 1 << 0 << QT << FD->
getName();
13793 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13794 if (InNonTrivialUnion)
13796 << 1 << 0 << QT << FD->
getName();
13799 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13801 if (RD->isUnion()) {
13802 if (OrigLoc.isValid()) {
13803 bool IsUnion =
false;
13804 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13805 IsUnion = OrigRD->isUnion();
13806 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13807 << 0 << OrigTy << IsUnion << UseContext;
13809 OrigLoc = SourceLocation();
13811 InNonTrivialUnion =
true;
13814 if (InNonTrivialUnion)
13815 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13818 for (
const FieldDecl *FD : RD->fields())
13819 if (!shouldIgnoreForRecordTriviality(FD))
13820 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13823 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13828 SourceLocation OrigLoc;
13833struct DiagNonTrivalCUnionDestructedTypeVisitor
13836 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13838 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13839 SourceLocation OrigLoc,
13842 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13845 const FieldDecl *FD,
bool InNonTrivialUnion) {
13848 InNonTrivialUnion);
13849 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13852 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13853 bool InNonTrivialUnion) {
13854 if (InNonTrivialUnion)
13856 << 1 << 1 << QT << FD->
getName();
13859 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13860 if (InNonTrivialUnion)
13862 << 1 << 1 << QT << FD->
getName();
13865 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13867 if (RD->isUnion()) {
13868 if (OrigLoc.isValid()) {
13869 bool IsUnion =
false;
13870 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13871 IsUnion = OrigRD->isUnion();
13872 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13873 << 1 << OrigTy << IsUnion << UseContext;
13875 OrigLoc = SourceLocation();
13877 InNonTrivialUnion =
true;
13880 if (InNonTrivialUnion)
13881 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13884 for (
const FieldDecl *FD : RD->fields())
13885 if (!shouldIgnoreForRecordTriviality(FD))
13886 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13889 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13890 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13891 bool InNonTrivialUnion) {}
13896 SourceLocation OrigLoc;
13901struct DiagNonTrivalCUnionCopyVisitor
13903 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13905 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13907 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13910 const FieldDecl *FD,
bool InNonTrivialUnion) {
13913 InNonTrivialUnion);
13914 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13917 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13918 bool InNonTrivialUnion) {
13919 if (InNonTrivialUnion)
13921 << 1 << 2 << QT << FD->
getName();
13924 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13925 if (InNonTrivialUnion)
13927 << 1 << 2 << QT << FD->
getName();
13930 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13932 if (RD->isUnion()) {
13933 if (OrigLoc.isValid()) {
13934 bool IsUnion =
false;
13935 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13936 IsUnion = OrigRD->isUnion();
13937 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13938 << 2 << OrigTy << IsUnion << UseContext;
13940 OrigLoc = SourceLocation();
13942 InNonTrivialUnion =
true;
13945 if (InNonTrivialUnion)
13946 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13949 for (
const FieldDecl *FD : RD->fields())
13950 if (!shouldIgnoreForRecordTriviality(FD))
13951 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13954 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13955 if (InNonTrivialUnion)
13957 << 1 << 2 << QT << FD->
getName();
13961 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13962 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13963 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13964 bool InNonTrivialUnion) {}
13969 SourceLocation OrigLoc;
13978 unsigned NonTrivialKind) {
13982 "shouldn't be called if type doesn't have a non-trivial C union");
13986 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13987 .visit(QT,
nullptr,
false);
13990 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13991 .visit(QT,
nullptr,
false);
13993 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13994 .visit(QT,
nullptr,
false);
14018 bool TargetIsInline = Dcl->
isInline();
14019 bool TargetWasTemplated =
14036 TargetWasTemplated =
14046 if (!TargetIsInline || TargetWasTemplated)
14056 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
14057 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
14063 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
14064 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
14086 T =
T.getNonReferenceType();
14087 if (
T->isFunctionType())
14089 if (!
T.isConstant(Ctx))
14091 if (
T->isPointerType())
14109 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
14110 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
14122 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
14123 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
14129 llvm::scope_exit ResetDeclForInitializer([
this]() {
14140 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
14141 if (!
Method->isInvalidDecl()) {
14143 Diag(
Method->getLocation(), diag::err_member_function_initialization)
14144 <<
Method->getDeclName() <<
Init->getSourceRange();
14145 Method->setInvalidDecl();
14150 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
14152 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
14161 if (
Expr *E = Recovery.
get())
14168 Context.AMDGPUFeaturePredicateTy) {
14170 diag::err_amdgcn_predicate_type_is_not_constructible)
14177 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
14178 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
14185 if (
Init->containsErrors()) {
14194 "decl should be invalidated when deduce fails");
14206 if (VDecl->
hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
14213 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
14233 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
14234 BaseDeclType = Array->getElementType();
14236 diag::err_typecheck_decl_incomplete_type)) {
14243 diag::err_abstract_type_in_decl,
14261 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
14270 if (Def != VDecl &&
14290 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
14293 diag::note_previous_initializer)
14318 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14319 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14325 if (!
HLSL().handleInitialization(VDecl,
Init))
14337 if (!
Result.isUsable()) {
14345 bool InitializedFromParenListExpr =
false;
14346 bool IsParenListInit =
false;
14353 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14355 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14356 InitializedFromParenListExpr =
true;
14357 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14358 Args = CXXDirectInit->getInitExprs();
14359 InitializedFromParenListExpr =
true;
14366 if (!
Result.isUsable()) {
14386 IsParenListInit = !InitSeq.
steps().empty() &&
14390 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14392 Context.getAsIncompleteArrayType(VDeclType) &&
14393 Context.getAsIncompleteArrayType(
Init->getType())) {
14422 if (VDecl->
hasAttr<BlocksAttr>())
14435 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14436 Init->getBeginLoc()))
14437 FSI->markSafeWeakUse(
Init);
14458 if (!
Result.isUsable()) {
14498 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14499 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14501 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14536 <<
Init->getSourceRange();
14552 diag::ext_in_class_initializer_float_type_cxx11)
14553 << DclT <<
Init->getSourceRange();
14555 diag::note_in_class_initializer_float_type_cxx11)
14558 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14559 << DclT <<
Init->getSourceRange();
14562 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14563 <<
Init->getSourceRange();
14570 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14571 << DclT <<
Init->getSourceRange()
14577 << DclT <<
Init->getSourceRange();
14590 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14598 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14611 if (!InitType.
isNull() &&
14629 if (InitializedFromParenListExpr) {
14630 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14653 VarDecl *VD = dyn_cast<VarDecl>(D);
14657 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14658 for (
auto *BD : DD->bindings())
14659 BD->setInvalidDecl();
14672 Context.getBaseElementType(Ty),
14673 diag::err_typecheck_decl_incomplete_type)) {
14680 diag::err_abstract_type_in_decl,
14695 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14699 Diag(Var->getLocation(),
14700 diag::err_amdgcn_predicate_type_is_not_constructible)
14702 Var->setInvalidDecl();
14711 dyn_cast<DecompositionDecl>(RealDecl)->getRSquareLoc();
14713 RSquareLoc,
PP.getSourceManager(),
PP.getLangOpts()))
14714 Loc =
Next->getLocation();
14715 Diag(Loc, diag::err_decomp_decl_requires_init) << Var;
14716 Var->setInvalidDecl();
14732 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14733 !Var->isThisDeclarationADemotedDefinition()) {
14734 if (Var->isStaticDataMember()) {
14738 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14739 Diag(Var->getLocation(),
14740 diag::err_constexpr_static_mem_var_requires_init)
14742 Var->setInvalidDecl();
14746 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14747 Var->setInvalidDecl();
14754 if (!Var->isInvalidDecl() &&
14756 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14757 bool HasConstExprDefaultConstructor =
false;
14758 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14759 for (
auto *Ctor : RD->ctors()) {
14760 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14761 Ctor->getMethodQualifiers().getAddressSpace() ==
14763 HasConstExprDefaultConstructor =
true;
14767 if (!HasConstExprDefaultConstructor) {
14768 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14769 Var->setInvalidDecl();
14775 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14776 Diag(Var->getLocation(), diag::err_specialization_const);
14777 Var->setInvalidDecl();
14781 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14782 if (Var->getStorageClass() ==
SC_Extern) {
14783 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14785 Var->setInvalidDecl();
14789 diag::err_typecheck_decl_incomplete_type)) {
14790 Var->setInvalidDecl();
14793 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14794 if (!RD->hasTrivialDefaultConstructor()) {
14795 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14796 Var->setInvalidDecl();
14806 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14813 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14829 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14831 diag::err_typecheck_decl_incomplete_type))
14832 Var->setInvalidDecl();
14837 diag::err_abstract_type_in_decl,
14839 Var->setInvalidDecl();
14842 Diag(Var->getLocation(), diag::warn_private_extern);
14843 Diag(Var->getLocation(), diag::note_private_extern);
14846 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14847 !Var->isInvalidDecl())
14858 if (!Var->isInvalidDecl()) {
14862 Var->getLocation(), ArrayT->getElementType(),
14863 diag::err_array_incomplete_or_sizeless_type))
14864 Var->setInvalidDecl();
14866 if (Var->getStorageClass() ==
SC_Static) {
14876 if (Var->isFirstDecl())
14878 diag::ext_typecheck_decl_incomplete_type,
14884 if (!Var->isInvalidDecl())
14895 if (Var->isConstexpr())
14896 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14899 Diag(Var->getLocation(),
14900 diag::err_typecheck_incomplete_array_needs_initializer);
14901 Var->setInvalidDecl();
14908 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14909 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14918 if (Var->isInvalidDecl())
14921 if (!Var->hasAttr<AliasAttr>()) {
14924 diag::err_typecheck_decl_incomplete_type)) {
14925 Var->setInvalidDecl();
14934 diag::err_abstract_type_in_decl,
14936 Var->setInvalidDecl();
14943 unsigned DiagID = diag::warn_default_init_const_unsafe;
14944 if (Var->getStorageDuration() ==
SD_Static ||
14945 Var->getStorageDuration() ==
SD_Thread)
14946 DiagID = diag::warn_default_init_const;
14948 bool EmitCppCompat = !
Diags.isIgnored(
14949 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14950 Var->getLocation());
14952 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14966 if (
const auto *CXXRecord =
14967 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14971 if (!CXXRecord->isPOD())
15016 }
else if (
Init.isInvalid()) {
15034 VarDecl *VD = dyn_cast<VarDecl>(D);
15037 << InExpansionStmt;
15079 << InExpansionStmt << VD <<
Error;
15094 const char *PrevSpec;
15119 Context.getAttributedType(
Attr, MethodType, MethodType);
15140 for (
unsigned I = 0, E = MD->
getNumParams(); I != E; ++I)
15145 if (var->isInvalidDecl())
return;
15152 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
15154 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
15156 var->setInvalidDecl();
15164 var->hasLocalStorage()) {
15165 switch (var->getType().getObjCLifetime()) {
15178 if (var->hasLocalStorage() &&
15187 if (var->isThisDeclarationADefinition() &&
15188 var->getDeclContext()->getRedeclContext()->isFileContext() &&
15189 var->isExternallyVisible() && var->hasLinkage() &&
15190 !var->isInline() && !var->getDescribedVarTemplate() &&
15194 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
15195 var->getLocation())) {
15197 VarDecl *prev = var->getPreviousDecl();
15202 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
15203 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
15209 std::optional<bool> CacheHasConstInit;
15210 const Expr *CacheCulprit =
nullptr;
15211 auto checkConstInit = [&]()
mutable {
15212 const Expr *
Init = var->getInit();
15213 if (
Init->isInstantiationDependent())
15216 if (!CacheHasConstInit)
15217 CacheHasConstInit = var->getInit()->isConstantInitializer(
15218 Context, var->getType()->isReferenceType(), &CacheCulprit);
15219 return *CacheHasConstInit;
15223 if (var->getType().isDestructedType()) {
15227 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
15229 Diag(var->getLocation(), diag::note_use_thread_local);
15231 if (!checkConstInit()) {
15239 Diag(var->getLocation(), diag::note_use_thread_local);
15245 if (!var->getType()->isStructureType() && var->hasInit() &&
15248 unsigned NumInits = ILE->getNumInits();
15250 for (
unsigned I = 0; I < NumInits; ++I) {
15251 const auto *
Init = ILE->getInit(I);
15254 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15258 unsigned NumConcat = SL->getNumConcatenated();
15262 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
15263 bool OnlyOneMissingComma =
true;
15264 for (
unsigned J = I + 1; J < NumInits; ++J) {
15265 const auto *
Init = ILE->getInit(J);
15268 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15269 if (!SLJ || SLJ->getNumConcatenated() > 1) {
15270 OnlyOneMissingComma =
false;
15275 if (OnlyOneMissingComma) {
15277 for (
unsigned i = 0; i < NumConcat - 1; ++i)
15279 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
15281 Diag(SL->getStrTokenLoc(1),
15282 diag::warn_concatenated_literal_array_init)
15284 Diag(SL->getBeginLoc(),
15285 diag::note_concatenated_string_literal_silence);
15296 if (var->hasAttr<BlocksAttr>())
15300 bool GlobalStorage = var->hasGlobalStorage();
15301 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
15303 bool HasConstInit =
true;
15306 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
15311 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
15312 (GlobalStorage || var->isConstexpr() ||
15313 var->mightBeUsableInConstantExpressions(
Context))) {
15325 HasConstInit = checkConstInit();
15329 if (HasConstInit) {
15330 if (var->isStaticDataMember() && !var->isInline() &&
15331 var->getLexicalDeclContext()->isRecord() &&
15332 type->isIntegralOrEnumerationType()) {
15337 diag::ext_in_class_initializer_non_constant)
15338 <<
Init->getSourceRange();
15342 (void)var->checkForConstantInitialization(Notes, SProxy);
15344 }
else if (CacheCulprit) {
15345 Notes.emplace_back(CacheCulprit->
getExprLoc(),
15346 PDiag(diag::note_invalid_subexpr_in_const_expr));
15352 HasConstInit = var->checkForConstantInitialization(Notes, SProxy);
15355 if (HasConstInit) {
15357 }
else if (var->isConstexpr()) {
15361 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15362 diag::note_invalid_subexpr_in_const_expr) {
15363 DiagLoc = Notes[0].first;
15366 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15367 << var <<
Init->getSourceRange();
15368 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15369 Diag(Notes[I].first, Notes[I].second);
15370 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15371 auto *
Attr = var->getAttr<ConstInitAttr>();
15372 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15373 <<
Init->getSourceRange();
15376 for (
auto &it : Notes)
15377 Diag(it.first, it.second);
15378 }
else if (var->isStaticDataMember() && !var->isInline() &&
15379 var->getLexicalDeclContext()->isRecord()) {
15380 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15381 <<
Init->getSourceRange();
15382 for (
auto &it : Notes)
15383 Diag(it.first, it.second);
15384 var->setInvalidDecl();
15385 }
else if (IsGlobal &&
15387 var->getLocation())) {
15396 if (!checkConstInit())
15397 Diag(var->getLocation(), diag::warn_global_constructor)
15398 <<
Init->getSourceRange();
15404 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15409 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15410 std::optional<QualType::NonConstantStorageReason> Reason;
15411 if (HasConstInit &&
15412 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15418 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15425 var->getType().isConstQualified()) {
15427 NonConstNonReferenceType) &&
15428 "This case should've already been handled elsewhere");
15429 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15430 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15436 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15438 SectionAttr::Declspec_allocate));
15440 var->dropAttr<SectionAttr>();
15447 var->addAttr(InitSegAttr::CreateImplicit(
15456 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15457 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15464 if (!
type->isDependentType())
15473 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty()) {
15475 if (ModuleScopes.back().Module->isHeaderLikeModule() ||
15478 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15482 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15493 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15494 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15504 NewAttr->setInherited(
true);
15506 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15507 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15508 NewAttr->setInherited(
true);
15513 if (!FD->
hasAttr<DLLExportAttr>())
15516 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15517 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15518 NewAttr->setInherited(
true);
15529 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15534 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15547 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15559 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15563 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15567 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15571 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15576 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15577 for (
auto *BD : DD->bindings()) {
15582 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15605 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15612 bool IsClassTemplateMember =
15614 Context->getDescribedClassTemplate();
15617 IsClassTemplateMember
15618 ? diag::warn_attribute_dllimport_static_field_definition
15619 : diag::err_attribute_dllimport_static_field_definition);
15620 Diag(IA->getLocation(), diag::note_attribute);
15621 if (!IsClassTemplateMember)
15650 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15671 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15675 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15677 if (!MagicValueExpr) {
15680 std::optional<llvm::APSInt> MagicValueInt;
15682 Diag(I->getRange().getBegin(),
15683 diag::err_type_tag_for_datatype_not_ice)
15687 if (MagicValueInt->getActiveBits() > 64) {
15688 Diag(I->getRange().getBegin(),
15689 diag::err_type_tag_for_datatype_too_large)
15693 uint64_t MagicValue = MagicValueInt->getZExtValue();
15696 I->getMatchingCType(),
15697 I->getLayoutCompatible(),
15698 I->getMustBeNull());
15703 auto *VD = dyn_cast<VarDecl>(DD);
15704 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15716 bool DiagnosedMultipleDecomps =
false;
15718 bool DiagnosedNonDeducedAuto =
false;
15720 for (
Decl *D : Group) {
15725 if (
auto *VD = dyn_cast<VarDecl>(D);
15726 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15727 VD->hasGlobalStorage())
15731 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15732 if (!FirstDeclaratorInGroup)
15733 FirstDeclaratorInGroup = DD;
15734 if (!FirstDecompDeclaratorInGroup)
15735 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15738 FirstNonDeducedAutoInGroup = DD;
15740 if (FirstDeclaratorInGroup != DD) {
15743 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15745 diag::err_decomp_decl_not_alone)
15747 << DD->getSourceRange();
15748 DiagnosedMultipleDecomps =
true;
15754 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15756 diag::err_auto_non_deduced_not_alone)
15757 << FirstNonDeducedAutoInGroup->
getType()
15760 << DD->getSourceRange();
15761 DiagnosedNonDeducedAuto =
true;
15766 Decls.push_back(D);
15772 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15774 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15786 if (Group.size() > 1) {
15788 VarDecl *DeducedDecl =
nullptr;
15789 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15790 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15794 if (!DT || DT->getDeducedType().isNull())
15797 Deduced = DT->getDeducedType();
15799 }
else if (!
Context.hasSameType(DT->getDeducedType(),
Deduced)) {
15800 auto *AT = dyn_cast<AutoType>(DT);
15802 diag::err_auto_different_deductions)
15804 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15828 if (Group.empty() || !Group[0])
15834 if (Group.size() >= 2) {
15842 Decl *MaybeTagDecl = Group[0];
15844 Group = Group.slice(1);
15897 const auto *VD = dyn_cast<ValueDecl>(D);
15911 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15913 Diag(TD->getLocation(), diag::note_declared_at);
15919 if (!ExplicitThisLoc.
isValid())
15922 "explicit parameter in non-cplusplus mode");
15924 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15936 LSI->ExplicitObjectParameter = P;
15959 ? diag::ext_register_storage_class
15960 : diag::warn_deprecated_register)
15966 diag::err_invalid_storage_class_in_func_decl)
15975 diag::err_invalid_storage_class_in_func_decl);
15987 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
16008 PrevDecl =
nullptr;
16030 diag::err_hlsl_incomplete_resource_array_in_function_param);
16043 New->setInvalidDecl();
16062 Diag(
New->getLocation(), diag::err_module_private_local)
16066 if (
New->hasAttr<BlocksAttr>())
16067 Diag(
New->getLocation(), diag::err_block_not_allowed_on)
16068 << diag::NotAllowedBlockVarReason::NonlocalVariable;
16082 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
16084 Param->setImplicit();
16097 !
Parameter->getIdentifier()->isPlaceholder()) {
16098 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
16106 if (
LangOpts.NumLargeByValueCopy == 0)
16112 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
16113 if (Size >
LangOpts.NumLargeByValueCopy)
16121 if (
T->isDependentType() || !
T.isPODType(
Context))
16123 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
16124 if (Size >
LangOpts.NumLargeByValueCopy)
16137 T->isObjCLifetimeType()) {
16144 if (
T->isArrayType()) {
16145 if (!
T.isConstQualified()) {
16149 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
16151 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
16156 lifetime =
T->getObjCARCImplicitLifetime();
16158 T =
Context.getLifetimeQualifiedType(
T, lifetime);
16163 if (
T->isArrayType() && !
T.hasAddressSpace()) {
16169 T =
Context.getAddrSpaceQualType(
T, ImplAS);
16176 Context.getAdjustedParameterType(
T),
16177 TSInfo, SC,
nullptr);
16182 if (
New->isParameterPack())
16184 CSI->LocalPacks.push_back(
New);
16186 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
16187 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
16194 if (
T->isObjCObjectType()) {
16198 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
16200 T =
Context.getObjCObjectPointerType(
T);
16205 if (
T.getPointerAuth()) {
16206 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
16207 New->setInvalidDecl();
16221 !(
T->isFunctionPointerType() &&
16227 Diag(NameLoc, diag::err_arg_with_address_space);
16228 New->setInvalidDecl();
16232 if (
Context.getTargetInfo().getTriple().isPPC64() &&
16233 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
16234 New->setInvalidDecl();
16255 for (
int i = FTI.
NumParams; i != 0; ) {
16260 llvm::raw_svector_ostream(Code)
16271 const char* PrevSpec;
16274 DiagID,
Context.getPrintingPolicy());
16303 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
16305 ParentScope, D, TemplateParameterLists, Bases);
16311 if (!Bases.empty())
16319 Consumer.HandleInlineFunctionDefinition(D);
16328 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
16331 PossiblePrototype = Prev;
16355 if (II->isStr(
"main") || II->isStr(
"efi_main"))
16374 if (FD->
hasAttr<DeviceKernelAttr>())
16423 bool DefinitionVisible =
false;
16426 DefinitionVisible) &&
16429 !
Definition->getTemplateParameterLists().empty())) {
16432 if (!DefinitionVisible) {
16433 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16447 Diag(
Definition->getLocation(), diag::note_previous_definition);
16456 LSI->
Lambda = LambdaClass;
16496 for (
const auto &
C : LambdaClass->
captures()) {
16497 if (
C.capturesVariable()) {
16501 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16503 true,
C.getLocation(),
16504 C.isPackExpansion()
16506 I->getType(),
false);
16508 }
else if (
C.capturesThis()) {
16534 FD = FunTmpl->getTemplatedDecl();
16545 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16550 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16555 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16556 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16557 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16558 !
Attr->isDefaultVersion()) {
16567 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16569 Ctor->isDefaultConstructor() &&
16570 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16573 if (DLLExportAttr *
Attr = Ctor->getAttr<DLLExportAttr>())
16616 "There should be an active template instantiation on the stack "
16617 "when instantiating a generic lambda!");
16627 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16628 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16643 diag::err_func_def_incomplete_result) ||
16645 diag::err_abstract_type_in_decl,
16661 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16665 "parameters should not be in newly created FD yet");
16668 if (NonParmDecl->getDeclName())
16673 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16674 for (
auto *EI : ED->enumerators())
16682 Param->setOwningFunction(FD);
16685 if (Param->getIdentifier() && FnBodyScope) {
16722 assert(!FD->
hasAttr<DLLExportAttr>());
16723 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16753 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
16754 if (!SKEPAttr->isInvalidAttr()) {
16774 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16775 FD = TD->getTemplatedDecl();
16776 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16788 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16789 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16790 if (!NRVOCandidate->isNRVOVariable()) {
16791 Diag(Returns[I]->getRetValue()->getExprLoc(),
16792 diag::warn_not_eliding_copy_on_return);
16812 Outer.Fun.hasTrailingReturnType()) {
16830 if (FD->isConstexpr())
16835 if (FD->getReturnType()->getContainedDeducedType())
16838 return Consumer.shouldSkipFunctionBody(D);
16845 FD->setHasSkippedBody();
16858 S.PopExpressionEvaluationContext();
16863 bool IsLambda =
false;
16867 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16869 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16870 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16884 return It->second = R;
16889 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16891 if (IsOrNestedInEscapingBlock(P.second))
16892 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16907 methodHasName(FD,
"get_return_object_on_allocation_failure");
16917 if (!FD->
hasAttr<CoroWrapperAttr>())
16922 bool RetainFunctionScopeInfo) {
16949 SYCLKernelEntryPointAttr *SKEPAttr =
16950 FD->
getAttr<SYCLKernelEntryPointAttr>();
16952 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16953 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16954 SKEPAttr->setInvalidAttr();
16956 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16957 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16958 SKEPAttr->setInvalidAttr();
16960 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16961 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16962 SKEPAttr->setInvalidAttr();
16964 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16965 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16966 SKEPAttr->setInvalidAttr();
16974 if (Body && !SKEPAttr->isInvalidAttr()) {
17004 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
17006 Diag(SEAttr->getLocation(),
17007 diag::err_sycl_external_invalid_deleted_function)
17037 Expr *Dummy =
nullptr;
17048 if (LSI->HasImplicitReturnType) {
17055 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
17059 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
17060 Proto->getExtProtoInfo()));
17093 dyn_cast<CXXDestructorDecl>(FD))
17113 if (PossiblePrototype) {
17117 TypeLoc TL = TI->getTypeLoc();
17120 diag::note_declaration_not_a_prototype)
17123 FTL.getRParenLoc(),
"void")
17131 if (LocInfo.first.isInvalid())
17135 StringRef Buffer = SM.getBufferData(LocInfo.first, &
Invalid);
17139 if (LocInfo.second > Buffer.size())
17142 const char *LexStart = Buffer.data() + LocInfo.second;
17143 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
17145 return StartTok.consume_front(
"const") &&
17147 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
17150 auto findBeginLoc = [&]() {
17166 diag::note_static_for_internal_linkage)
17177 if (!PossiblePrototype)
17223 if (PossiblePrototype)
17225 diag::warn_non_prototype_changes_behavior)
17232 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
17233 if (!CmpndBody->body_empty())
17234 Diag(CmpndBody->body_front()->getBeginLoc(),
17235 diag::warn_dispatch_body_ignored);
17237 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
17245 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
17246 Context.setNonKeyFunction(MD);
17262 "Function parsing confused");
17263 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
17275 << MD->getSelector().getAsString();
17280 bool isDesignated =
17281 MD->isDesignatedInitializerForTheInterface(&InitMethod);
17282 assert(isDesignated && InitMethod);
17283 (void)isDesignated;
17286 auto IFace = MD->getClassInterface();
17289 auto SuperD = IFace->getSuperClass();
17299 diag::warn_objc_designated_init_missing_super_call);
17301 diag::note_objc_designated_init_marked_here);
17309 diag::warn_objc_secondary_init_missing_init_call);
17324 else if (
AMDGPU().HasPotentiallyUnguardedBuiltinUsage(FD))
17329 "This should only be set for ObjC methods, which should have been "
17330 "handled in the block above.");
17345 if (!
Destructor->getParent()->isDependentType())
17363 ActivePolicy = &WP;
17366 if (!IsInstantiation && FD &&
17372 if (FD && FD->
hasAttr<NakedAttr>()) {
17376 bool RegisterVariables =
false;
17377 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
17378 for (
const auto *
Decl : DS->decls()) {
17379 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
17380 RegisterVariables =
17381 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
17382 if (!RegisterVariables)
17387 if (RegisterVariables)
17390 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
17391 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
17400 "Leftover temporaries in function");
17401 assert(!
Cleanup.exprNeedsCleanups() &&
17402 "Unaccounted cleanups in function");
17404 "Leftover expressions for odr-use checking");
17413 if (!IsInstantiation)
17416 if (!RetainFunctionScopeInfo)
17446 D = TD->getTemplatedDecl();
17458 assert(
LangOpts.implicitFunctionsAllowed() &&
17459 "Implicit function declarations aren't allowed in this language mode");
17466 Scope *BlockScope = S;
17474 Scope *ContextScope = BlockScope;
17478 ContextScope = ContextScope->
getParent();
17498 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17501 return ExternCPrev;
17507 if (II.
getName().starts_with(
"__builtin_"))
17508 diag_id = diag::warn_builtin_unknown;
17511 diag_id = diag::ext_implicit_function_decl_c99;
17513 diag_id = diag::warn_implicit_function_decl;
17521 if (S && !ExternCPrev &&
17528 Diag(Loc, diag_id) << &II;
17544 return ExternCPrev;
17552 Context.getPrintingPolicy());
17554 assert(!
Error &&
"Error setting up implicit decl!");
17597 bool IsNothrow =
false;
17609 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17627 if (!FD->
hasAttr<AllocSizeAttr>()) {
17628 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17639 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17640 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17667 unsigned FormatIdx;
17669 if (HasPrototype &&
17670 Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17671 if (!FD->
hasAttr<FormatAttr>() && FormatIdx < FD->getNumParams()) {
17672 const char *fmt =
"printf";
17678 HasVAListArg ? 0 : FormatIdx+2,
17682 if (HasPrototype &&
17683 Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17684 if (!FD->
hasAttr<FormatAttr>() && FormatIdx < FD->getNumParams())
17685 FD->
addAttr(FormatAttr::CreateImplicit(
17687 HasVAListArg ? 0 : FormatIdx + 2, FD->
getLocation()));
17692 if (!FD->
hasAttr<CallbackAttr>() &&
17693 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17694 FD->
addAttr(CallbackAttr::CreateImplicit(
17700 bool NoExceptions =
17702 bool ConstWithoutErrnoAndExceptions =
17703 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17704 bool ConstWithoutExceptions =
17705 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17706 if (!FD->
hasAttr<ConstAttr>() &&
17707 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17708 (!ConstWithoutErrnoAndExceptions ||
17710 (!ConstWithoutExceptions || NoExceptions))
17716 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17717 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17719 switch (BuiltinID) {
17720 case Builtin::BI__builtin_fma:
17721 case Builtin::BI__builtin_fmaf:
17722 case Builtin::BI__builtin_fmal:
17723 case Builtin::BIfma:
17724 case Builtin::BIfmaf:
17725 case Builtin::BIfmal:
17735 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17736 !FD->
hasAttr<NonNullAttr>()) {
17738 for (
int I : Indxs) {
17741 T =
Context.getAttributedType(attr::TypeNonNull,
T,
T);
17746 for (
int I : Indxs)
17747 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17748 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17749 ParamIndxs.size()));
17752 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17753 !FD->
hasAttr<ReturnsTwiceAttr>())
17756 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17758 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17760 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17763 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17768 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17775 switch (BuiltinID) {
17776 case Builtin::BImemalign:
17777 case Builtin::BIaligned_alloc:
17778 if (!FD->
hasAttr<AllocAlignAttr>())
17787 switch (BuiltinID) {
17788 case Builtin::BIcalloc:
17789 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17792 case Builtin::BImemalign:
17793 case Builtin::BIaligned_alloc:
17794 case Builtin::BIrealloc:
17798 case Builtin::BImalloc:
17818 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17834 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17839 &
Context.Idents.get(
"printf"), 2,
17840 Name->
isStr(
"vasprintf") ? 0 : 3,
17844 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17848 !FD->
hasAttr<FormatArgAttr>())
17856 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17857 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17860 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17861 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17914 if (
T->isDependentType())
17924 if (
T->isAtomicType())
17925 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17928 std::optional<unsigned> QualSelect;
17930 QualSelect = diag::CVQualList::Both;
17932 QualSelect = diag::CVQualList::Const;
17934 QualSelect = diag::CVQualList::Volatile;
17937 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17939 T =
T.getAtomicUnqualifiedType();
17944 if (BT->isInteger())
17947 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17948 <<
T <<
T->isBitIntType();
17952 QualType EnumUnderlyingTy,
bool IsFixed,
17954 if (IsScoped != Prev->
isScoped()) {
17955 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17961 if (IsFixed && Prev->
isFixed()) {
17964 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17967 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17973 }
else if (IsFixed != Prev->
isFixed()) {
17974 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17996 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
18032 llvm_unreachable(
"invalid TTK");
18071 if (IsIgnoredLoc(NewTagLoc))
18074 auto IsIgnored = [&](
const TagDecl *Tag) {
18075 return IsIgnoredLoc(Tag->getLocation());
18092 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
18100 if (isDefinition) {
18108 bool previousMismatch =
false;
18110 if (I->getTagKind() !=
NewTag) {
18115 if (!previousMismatch) {
18116 previousMismatch =
true;
18117 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
18121 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
18134 if (PrevDef && IsIgnored(PrevDef))
18138 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
18145 Diag(NewTagLoc, diag::note_struct_class_suggestion)
18175 if (!Namespace || Namespace->isAnonymousNamespace())
18178 Namespaces.push_back(II);
18181 if (Lookup == Namespace)
18188 llvm::raw_svector_ostream OS(Insertion);
18191 std::reverse(Namespaces.begin(), Namespaces.end());
18192 for (
auto *II : Namespaces)
18193 OS << II->getName() <<
"::";
18206 if (OldDC->
Equals(NewDC))
18225 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
18226 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
18231 "Nameless record must be a definition!");
18236 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
18239 bool isMemberSpecialization =
false;
18240 bool IsInjectedClassName =
false;
18246 if (TemplateParameterLists.size() > 0 ||
18250 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
18267 !isMemberSpecialization)
18268 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
18271 if (TemplateParams) {
18273 Diag(KWLoc, diag::err_enum_template);
18277 if (TemplateParams->
size() > 0) {
18286 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
18287 AS, ModulePrivateLoc,
18289 TemplateParameterLists.data(), isMemberSpecialization, SkipBody);
18295 isMemberSpecialization =
true;
18299 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
18318 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
18319 assert(ScopedEnum || !ScopedEnumUsesClassTag);
18320 Diag(KWLoc, diag::note_enum_friend)
18321 << (ScopedEnum + ScopedEnumUsesClassTag);
18327 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
18328 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
18331 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum) ||
18335 EnumUnderlying =
Context.IntTy.getTypePtr();
18336 }
else if (UnderlyingType.
get()) {
18344 EnumUnderlying = TI;
18348 EnumUnderlying =
Context.IntTy.getTypePtr();
18352 EnumUnderlying =
Context.IntTy.getTypePtr();
18362 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
18363 TI && TI->
getType()->isAtomicType())
18366 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
18372 EnumUnderlying =
Context.IntTy.getTypePtr();
18378 bool isStdBadAlloc =
false;
18379 bool isStdAlignValT =
false;
18388 auto createTagFromNewDecl = [&]() ->
TagDecl * {
18398 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
18402 if (EnumUnderlying) {
18404 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18410 ?
Context.getPromotedIntegerType(EnumTy)
18431 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18447 goto CreateNewDecl;
18455 IsDependent =
true;
18484 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18486 IsDependent =
true;
18491 Diag(NameLoc, diag::err_not_tag_in_scope)
18492 << Kind << Name << DC << SS.
getRange();
18495 goto CreateNewDecl;
18543 bool FriendSawTagOutsideEnclosingNamespace =
false;
18550 FriendSawTagOutsideEnclosingNamespace =
true;
18559 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18561 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18592 Previous.getFoundDecl()->isTemplateParameter()) {
18601 if (Name->
isStr(
"bad_alloc")) {
18603 isStdBadAlloc =
true;
18610 }
else if (Name->
isStr(
"align_val_t")) {
18611 isStdAlignValT =
true;
18623 IsTemplateParamOrArg)) {
18624 if (
Invalid)
goto CreateNewDecl;
18707 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18708 if (Tag->getDeclName() == Name &&
18709 Tag->getDeclContext()->getRedeclContext()
18710 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18723 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18724 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18727 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18729 *
this, OldTag->getDeclContext(), SearchDC))) {
18730 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18731 Diag(Shadow->getTargetDecl()->getLocation(),
18732 diag::note_using_decl_target);
18733 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18737 goto CreateNewDecl;
18741 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18748 isMemberSpecialization)) {
18750 if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18751 RD && RD->isInjectedClassName()) {
18758 IsInjectedClassName =
true;
18766 bool SafeToContinue =
18769 if (SafeToContinue)
18770 Diag(KWLoc, diag::err_use_with_wrong_tag)
18773 PrevTagDecl->getKindName());
18775 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18776 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18778 if (SafeToContinue)
18779 Kind = PrevTagDecl->getTagKind();
18792 return PrevTagDecl;
18796 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18797 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18798 else if (
const Type *
T =
18799 dyn_cast_if_present<const Type *>(EnumUnderlying))
18806 ScopedEnum, EnumUnderlyingTy,
18807 IsFixed, PrevEnum))
18817 Diag(NameLoc, diag::ext_member_redeclared);
18818 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18827 if (
const auto *OutermostClass = dyn_cast<CXXRecordDecl>(PrevDecl)) {
18828 while (
const auto *ParentClass =
18829 dyn_cast<CXXRecordDecl>(OutermostClass->getParent()))
18830 OutermostClass = ParentClass;
18832 if (OutermostClass->isLocalClass() &&
18834 Diag(NameLoc, diag::err_local_nested_class_invalid_scope)
18835 << Name << OutermostClass;
18836 Diag(OutermostClass->getLocation(), diag::note_defined_here)
18846 if (!Attrs.
empty()) {
18850 (PrevTagDecl->getFriendObjectKind() ==
18863 return PrevTagDecl;
18868 return PrevTagDecl;
18877 if (Def->isBeingDefined()) {
18878 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18879 Diag(PrevTagDecl->getLocation(),
18880 diag::note_previous_definition);
18888 bool IsExplicitSpecializationAfterInstantiation =
false;
18889 if (isMemberSpecialization) {
18891 IsExplicitSpecializationAfterInstantiation =
18892 RD->getTemplateSpecializationKind() !=
18894 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18895 IsExplicitSpecializationAfterInstantiation =
18896 ED->getTemplateSpecializationKind() !=
18905 bool HiddenDefVisible =
false;
18907 HiddenDefVisible) ||
18919 SkipBody->
New = createTagFromNewDecl();
18928 if (!HiddenDefVisible && Hidden)
18933 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18938 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18941 Diag(NameLoc, diag::err_redefinition) << Name;
18943 NameLoc.
isValid() ? NameLoc : KWLoc);
18962 SearchDC = PrevTagDecl->getDeclContext();
18968 IsInjectedClassName) {
18969 SearchDC = PrevTagDecl->getDeclContext();
18997 Diag(NameLoc, diag::err_tag_reference_non_tag)
18998 << PrevDecl << NTK << Kind;
19004 SS.
isNotEmpty() || isMemberSpecialization)) {
19010 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
19016 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
19019 Diag(NameLoc, diag::err_tag_definition_of_typedef)
19020 << Name << Kind << TND->getUnderlyingType();
19028 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
19060 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
19061 ScopedEnumUsesClassTag, IsFixed);
19065 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
19073 if (IsFixed && ED->
isFixed()) {
19076 }
else if (PrevDecl &&
19078 Diag(Loc, diag::ext_forward_ref_enum_def)
19082 unsigned DiagID = diag::ext_forward_ref_enum;
19084 DiagID = diag::ext_ms_forward_ref_enum;
19086 DiagID = diag::err_forward_ref_enum;
19091 if (EnumUnderlying) {
19093 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
19099 ?
Context.getPromotedIntegerType(EnumTy)
19101 assert(ED->
isComplete() &&
"enum with type should be complete");
19111 cast_or_null<CXXRecordDecl>(PrevDecl));
19117 cast_or_null<RecordDecl>(PrevDecl));
19123 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
19129 (IsTypeSpecifier || IsTemplateParamOrArg) &&
19131 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
19138 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
19151 isMemberSpecialization))
19155 if (TemplateParameterLists.size() > 0) {
19156 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
19175 RD->addAttr(PackedAttr::CreateImplicit(
Context));
19184 RD->addAttr(MSNoVTableAttr::CreateImplicit(
Context));
19187 if (ModulePrivateLoc.
isValid()) {
19188 if (isMemberSpecialization)
19189 Diag(
New->getLocation(), diag::err_module_private_specialization)
19196 New->setModulePrivate();
19216 Diag(Loc, diag::err_type_defined_in_param_type)
19222 }
else if (!PrevDecl) {
19226 Diag(Loc, diag::warn_decl_in_param_list)
19232 New->setInvalidDecl();
19259 New->startDefinition();
19261 New->setCompleteDefinition();
19262 New->demoteThisDefinitionToDeclaration();
19290 if (!
New->isInvalidDecl() &&
19291 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
19298 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
19311 if (isMemberSpecialization && !
New->isInvalidDecl())
19318 if (
New->isBeingDefined())
19319 if (
auto RD = dyn_cast<RecordDecl>(
New))
19320 RD->completeDefinition();
19322 }
else if (SkipBody && SkipBody->
ShouldSkip) {
19356 bool IsFinalSpelledSealed,
19364 if (!
Record->getIdentifier())
19372 IsFinalSpelledSealed
19373 ? FinalAttr::Keyword_sealed
19374 : FinalAttr::Keyword_final));
19392 "Broken injected-class-name");
19399 Tag->setBraceRange(BraceRange);
19402 if (Tag->isBeingDefined()) {
19403 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
19404 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19405 RD->completeDefinition();
19408 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
19410 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
19411 auto *Def = RD->getDefinition();
19412 assert(Def &&
"The record is expected to have a completed definition");
19413 unsigned NumInitMethods = 0;
19414 for (
auto *
Method : Def->methods()) {
19415 if (!
Method->getIdentifier())
19417 if (
Method->getName() ==
"__init")
19420 if (NumInitMethods > 1 || !Def->hasInitMethod())
19421 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
19439 Tag->setTopLevelDeclInObjCContainer();
19442 if (!Tag->isInvalidDecl())
19443 Consumer.HandleTagDeclDefinition(Tag);
19447 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
19453 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
19457 if (llvm::any_of(RD->
fields(),
19458 [](
const FieldDecl *FD) { return FD->isBitField(); }))
19459 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
19466 Tag->setInvalidDecl();
19469 if (Tag->isBeingDefined()) {
19470 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19471 RD->completeDefinition();
19484 QualType FieldTy,
bool IsMsStruct,
19495 diag::err_field_incomplete_or_sizeless))
19498 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19500 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19510 llvm::APSInt
Value;
19515 BitWidth = ICE.
get();
19518 if (
Value == 0 && FieldName)
19519 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19522 if (
Value.isSigned() &&
Value.isNegative()) {
19524 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19526 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19533 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19538 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19539 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19540 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19544 bool CStdConstraintViolation =
19546 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19547 if (CStdConstraintViolation || MSBitfieldViolation) {
19548 unsigned DiagWidth =
19549 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19550 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19552 << !CStdConstraintViolation << DiagWidth;
19558 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19559 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19602 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19613 diag::err_invalid_thread)
19621 switch (
Previous.getResultKind()) {
19628 PrevDecl =
Previous.getRepresentativeDecl();
19642 PrevDecl =
nullptr;
19646 PrevDecl =
nullptr;
19653 TSSL, AS, PrevDecl, &D);
19656 Record->setInvalidDecl();
19675 bool Mutable,
Expr *BitWidth,
19681 bool InvalidDecl =
false;
19686 if (
T.isNull() ||
T->containsErrors()) {
19687 InvalidDecl =
true;
19693 bool isIncomplete =
19697 diag::err_field_incomplete_or_sizeless);
19698 if (isIncomplete) {
19700 Record->setInvalidDecl();
19701 InvalidDecl =
true;
19706 Record->setInvalidDecl();
19707 InvalidDecl =
true;
19713 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19714 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19715 Diag(Loc, diag::err_field_with_address_space);
19716 Record->setInvalidDecl();
19717 InvalidDecl =
true;
19723 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19724 T->isBlockPointerType()) {
19725 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19726 Record->setInvalidDecl();
19727 InvalidDecl =
true;
19732 "__cl_clang_bitfields",
LangOpts)) {
19733 Diag(Loc, diag::err_opencl_bitfields);
19734 InvalidDecl =
true;
19740 T.hasQualifiers()) {
19741 InvalidDecl =
true;
19742 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19747 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19749 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19750 InvalidDecl =
true;
19755 diag::err_abstract_type_in_decl,
19757 InvalidDecl =
true;
19760 BitWidth =
nullptr;
19766 InvalidDecl =
true;
19767 BitWidth =
nullptr;
19772 if (!InvalidDecl && Mutable) {
19773 unsigned DiagID = 0;
19774 if (
T->isReferenceType())
19775 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19776 : diag::err_mutable_reference;
19777 else if (
T.isConstQualified())
19778 DiagID = diag::err_mutable_const;
19784 Diag(ErrLoc, DiagID);
19785 if (DiagID != diag::ext_mutable_reference) {
19787 InvalidDecl =
true;
19799 BitWidth, Mutable, InitStyle);
19808 Diag(Loc, diag::err_duplicate_member) << II;
19814 if (
Record->isUnion()) {
19816 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19831 const bool HaveMSExt =
19836 HaveMSExt ? diag::ext_union_member_of_reference_type
19837 : diag::err_union_member_of_reference_type)
19857 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19860 if (
T.isObjCGCWeak())
19861 Diag(Loc, diag::warn_attribute_weak_on_field);
19864 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19868 if (
Context.getTargetInfo().hasAMDGPUTypes()) {
19886 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19897 if (RDecl->hasNonTrivialCopyConstructor())
19899 else if (!RDecl->hasTrivialDefaultConstructor())
19901 else if (RDecl->hasNonTrivialCopyAssignment())
19903 else if (RDecl->hasNonTrivialDestructor())
19908 RDecl->hasObjectMember()) {
19916 if (!FD->
hasAttr<UnavailableAttr>())
19917 FD->
addAttr(UnavailableAttr::CreateImplicit(
19918 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19925 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19926 : diag::err_illegal_union_or_anon_struct_member)
19938 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19941 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19949 if (!CD->IsClassExtension())
19966 AllIvarDecls.push_back(Ivar);
19978 if (!
Record->hasUserDeclaredDestructor()) {
19986 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19987 if (DD->isInvalidDecl())
19991 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
20005 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
20009 Msg = diag::err_ambiguous_destructor;
20014 Msg = diag::err_no_viable_destructor;
20025 Record->setInvalidDecl();
20032 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
20076 if (!Method->getTrailingRequiresClause())
20077 SatisfactionStatus.push_back(
true);
20081 SatisfactionStatus.push_back(
false);
20083 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
20087 for (
size_t i = 0; i < Methods.size(); i++) {
20088 if (!SatisfactionStatus[i])
20096 bool AnotherMethodIsMoreConstrained =
false;
20097 for (
size_t j = 0; j < Methods.size(); j++) {
20098 if (i == j || !SatisfactionStatus[j])
20112 AnotherMethodIsMoreConstrained =
true;
20116 AnotherMethodIsMoreConstrained)) {
20119 AnotherMethodIsMoreConstrained =
true;
20121 if (AnotherMethodIsMoreConstrained)
20126 if (!AnotherMethodIsMoreConstrained) {
20127 Method->setIneligibleOrNotSelected(
false);
20128 Record->addedEligibleSpecialMemberFunction(Method,
20129 1 << llvm::to_underlying(CSM));
20143 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
20145 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
20147 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
20151 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
20152 if (CD->isInvalidDecl())
20154 if (CD->isDefaultConstructor())
20155 DefaultConstructors.push_back(MD);
20156 else if (CD->isCopyConstructor())
20157 CopyConstructors.push_back(MD);
20158 else if (CD->isMoveConstructor())
20159 MoveConstructors.push_back(MD);
20161 CopyAssignmentOperators.push_back(MD);
20163 MoveAssignmentOperators.push_back(MD);
20181 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
20182 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
20195 if (
const auto *TD = dyn_cast<TagDecl>(D))
20196 return !TD->isCompleteDefinition();
20211 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
20218 assert(EnclosingDecl &&
"missing record or interface decl");
20227 case Decl::ObjCCategory:
20230 case Decl::ObjCImplementation:
20238 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
20242 unsigned NumNamedMembers = 0;
20244 for (
const auto *I :
Record->decls()) {
20245 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
20246 if (IFD->getDeclName())
20253 const FieldDecl *PreviousField =
nullptr;
20263 RecFields.push_back(FD);
20283 bool IsLastField = (i + 1 == Fields.end());
20298 unsigned DiagID = 0;
20299 if (!
Record->isUnion() && !IsLastField) {
20302 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
20306 }
else if (
Record->isUnion())
20308 ? diag::ext_flexible_array_union_ms
20309 : diag::ext_flexible_array_union_gnu;
20310 else if (NumNamedMembers < 1)
20312 ? diag::ext_flexible_array_empty_aggregate_ms
20313 : diag::ext_flexible_array_empty_aggregate_gnu;
20323 if (CXXRecord && CXXRecord->getNumVBases() != 0)
20337 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
20344 Record->setHasFlexibleArrayMember(
true);
20353 diag::err_incomplete_type)
20356 diag::err_field_incomplete_or_sizeless))) {
20362 if (
Record && RD->hasFlexibleArrayMember()) {
20365 Record->setHasFlexibleArrayMember(
true);
20366 if (!
Record->isUnion()) {
20383 diag::err_abstract_type_in_decl,
20388 if (
Record && RD->hasObjectMember())
20389 Record->setHasObjectMember(
true);
20390 if (
Record && RD->hasVolatileMember())
20391 Record->setHasVolatileMember(
true);
20410 FD->
addAttr(UnavailableAttr::CreateImplicit(
20411 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
20415 !
Record->hasObjectMember()) {
20418 Record->setHasObjectMember(
true);
20421 if (
const auto *RD = BaseType->getAsRecordDecl();
20422 RD && RD->hasObjectMember())
20423 Record->setHasObjectMember(
true);
20424 else if (BaseType->isObjCObjectPointerType() ||
20425 BaseType.isObjCGCStrong())
20426 Record->setHasObjectMember(
true);
20431 !shouldIgnoreForRecordTriviality(FD)) {
20434 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
20437 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
20441 Record->setNonTrivialToPrimitiveCopy(
true);
20443 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
20445 if (FD->
hasAttr<ExplicitInitAttr>())
20446 Record->setHasUninitializedExplicitInitFields(
true);
20448 Record->setNonTrivialToPrimitiveDestroy(
true);
20449 Record->setParamDestroyedInCallee(
true);
20451 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
20455 if (RD->getArgPassingRestrictions() ==
20457 Record->setArgPassingRestrictions(
20460 Record->setArgPassingRestrictions(
20464 Record->setArgPassingRestrictions(
20466 Record->setNonTrivialToPrimitiveCopy(
true);
20471 Record->setHasVolatileMember(
true);
20472 bool ReportMSBitfieldStoragePacking =
20473 Record && PreviousField &&
20474 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
20476 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
20480 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
20481 IsNonDependentBitField(PreviousField)) {
20485 if (FDStorageSize != PreviousFieldStorageSize) {
20487 diag::warn_ms_bitfield_mismatched_storage_packing)
20491 diag::note_ms_bitfield_mismatched_storage_size_previous)
20492 << PreviousField << PreviousField->
getType();
20502 bool Completed =
false;
20507 Record->setInvalidDecl();
20511 if (!CXXRecord->isInvalidDecl()) {
20514 I = CXXRecord->conversion_begin(),
20515 E = CXXRecord->conversion_end(); I != E; ++I)
20516 I.setAccess((*I)->getAccess());
20522 if (!CXXRecord->isDependentType()) {
20523 if (!CXXRecord->isInvalidDecl()) {
20527 if (CXXRecord->getNumVBases()) {
20529 CXXRecord->getFinalOverriders(FinalOverriders);
20531 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20532 MEnd = FinalOverriders.end();
20535 SOEnd = M->second.end();
20536 SO != SOEnd; ++SO) {
20537 assert(SO->second.size() > 0 &&
20538 "Virtual function without overriding functions?");
20539 if (SO->second.size() == 1)
20546 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20548 Diag(M->first->getLocation(),
20549 diag::note_overridden_virtual_function);
20551 OM = SO->second.begin(),
20552 OMEnd = SO->second.end();
20554 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20555 << (
const NamedDecl *)M->first << OM->Method->getParent();
20557 Record->setInvalidDecl();
20560 CXXRecord->completeDefinition(&FinalOverriders);
20570 Record->completeDefinition();
20579 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20580 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20581 EntirelyFunctionPointers(
Record)))) {
20585 Record->reorderDecls(NewDeclOrdering);
20590 auto *Dtor = CXXRecord->getDestructor();
20591 if (Dtor && Dtor->isImplicit() &&
20593 CXXRecord->setImplicitDestructorIsDeleted();
20598 if (
Record->hasAttrs()) {
20601 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20603 IA->getRange(), IA->getBestCase(),
20604 IA->getInheritanceModel());
20610 bool CheckForZeroSize;
20612 CheckForZeroSize =
true;
20617 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20619 CXXRecord->isCLike();
20621 if (CheckForZeroSize) {
20622 bool ZeroSize =
true;
20623 bool IsEmpty =
true;
20624 unsigned NonBitFields = 0;
20626 E =
Record->field_end();
20627 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20629 if (I->isUnnamedBitField()) {
20630 if (!I->isZeroLengthBitField())
20634 QualType FieldType = I->getType();
20636 !
Context.getTypeSizeInChars(FieldType).isZero())
20646 diag::warn_zero_size_struct_union_in_extern_c :
20647 diag::warn_zero_size_struct_union_compat)
20648 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20655 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20656 : diag::ext_no_named_members_in_struct_union)
20664 ID->setEndOfDefinitionLoc(RBrac);
20666 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20668 ID->addDecl(ClsFields[i]);
20672 if (ID->getSuperClass())
20675 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20676 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20677 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20683 IMPDecl->setIvarLBraceLoc(LBrac);
20684 IMPDecl->setIvarRBraceLoc(RBrac);
20686 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20694 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20698 Diag(ClsFields[i]->getLocation(),
20699 diag::err_duplicate_ivar_declaration);
20700 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20706 Diag(ClsFields[i]->getLocation(),
20707 diag::err_duplicate_ivar_declaration);
20708 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20714 CDecl->addDecl(ClsFields[i]);
20716 CDecl->setIvarLBraceLoc(LBrac);
20717 CDecl->setIvarRBraceLoc(RBrac);
20733 assert((
T->isIntegralType(Context) ||
20734 T->isEnumeralType()) &&
"Integral type required!");
20735 const unsigned NumTypes = 4;
20736 QualType SignedIntegralTypes[NumTypes] = {
20737 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20739 QualType UnsignedIntegralTypes[NumTypes] = {
20740 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20741 Context.UnsignedLongLongTy
20748 unsigned BitWidth = Context.getIntWidth(
T);
20749 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20750 : UnsignedIntegralTypes;
20751 for (
unsigned I = 0; I != NumTypes; ++I)
20752 if (Context.getTypeSize(Types[I]) > BitWidth)
20763 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20764 llvm::APSInt EnumVal(IntWidth);
20784 EltTy =
Enum->getIntegerType();
20790 Val = Converted.
get();
20797 if (
Enum->isComplete()) {
20798 EltTy =
Enum->getIntegerType();
20804 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20807 .isWindowsMSVCEnvironment()) {
20808 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20810 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20833 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20835 ? diag::warn_c17_compat_enum_value_not_int
20836 : diag::ext_c23_enum_value_not_int)
20838 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20850 if (
Enum->isDependentType())
20852 else if (!LastEnumConst) {
20861 if (
Enum->isFixed()) {
20862 EltTy =
Enum->getIntegerType();
20871 EltTy = LastEnumConst->
getType();
20874 if (EnumVal < LastEnumConst->getInitVal()) {
20886 if (
T.isNull() ||
Enum->isFixed()) {
20890 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20892 if (
Enum->isFixed())
20894 Diag(IdLoc, diag::err_enumerator_wrapped)
20898 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20909 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20921 ? diag::warn_c17_compat_enum_value_not_int
20922 : diag::ext_c23_enum_value_not_int)
20923 << 1 <<
toString(EnumVal, 10) << 1;
20925 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20928 : diag::ext_c23_enum_value_not_int)
20929 << 1 <<
toString(EnumVal, 10) << 1;
20937 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20956 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20964 Skip.Previous = Hidden;
20978 cast_or_null<EnumConstantDecl>(lastEnumConst);
20995 PrevDecl =
nullptr;
21022 "Received TagDecl when not in C++!");
21025 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
21027 Diag(IdLoc, diag::err_redefinition) << Id;
21060 if (!BO->isAdditiveOp())
21068 InitExpr = BO->getLHS();
21072 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
21092 if (!
Enum->getIdentifier())
21096 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
21105 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
21108 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
21112 llvm::APSInt Val = D->getInitVal();
21113 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
21116 DuplicatesVector DupVector;
21117 ValueToVectorMap EnumMap;
21121 for (
auto *Element : Elements) {
21135 EnumMap.insert({EnumConstantToKey(ECD), ECD});
21138 if (EnumMap.size() == 0)
21142 for (
auto *Element : Elements) {
21148 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
21149 if (Iter == EnumMap.end())
21152 DeclOrVector& Entry = Iter->second;
21159 auto Vec = std::make_unique<ECDVector>();
21161 Vec->push_back(ECD);
21168 DupVector.emplace_back(std::move(Vec));
21174 if (*Vec->begin() == ECD)
21177 Vec->push_back(ECD);
21181 for (
const auto &Vec : DupVector) {
21182 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
21185 auto *FirstECD = Vec->front();
21186 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
21187 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
21188 << FirstECD->getSourceRange();
21192 for (
auto *ECD : llvm::drop_begin(*Vec))
21193 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
21194 << ECD <<
toString(ECD->getInitVal(), 10)
21195 << ECD->getSourceRange();
21200 bool AllowMask)
const {
21201 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
21205 llvm::APInt &FlagBits = R.first->second;
21209 const auto &EVal = E->getInitVal();
21211 if (EVal.isPowerOf2())
21212 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
21224 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
21225 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
21232 bool HasBitwiseOp =
false;
21237 for (
const auto *ECD :
Enum->enumerators()) {
21238 const Expr *InitExpr = ECD->getInitExpr();
21244 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
21248 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
21249 HasBitwiseOp =
true;
21250 }
else if (Op == BO_LT || Op == BO_GT) {
21253 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
21255 if (IntLiteral->getValue() == 1)
21256 SuspiciousCompares.push_back(BinOp);
21264 if (HasBitwiseOp) {
21265 for (
const auto *BinOp : SuspiciousCompares) {
21266 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
21271 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
21272 << BinOp->getOpcodeStr() << SuggestedOp;
21274 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
21290 if (
Enum->isDependentType()) {
21291 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
21293 cast_or_null<EnumConstantDecl>(Elements[i]);
21294 if (!ECD)
continue;
21305 unsigned NumNegativeBits = 0;
21306 unsigned NumPositiveBits = 0;
21307 bool MembersRepresentableByInt =
21308 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
21312 unsigned BestWidth;
21333 if (
Enum->isComplete()) {
21334 BestType =
Enum->getIntegerType();
21335 if (
Context.isPromotableIntegerType(BestType))
21336 BestPromotionType =
Context.getPromotedIntegerType(BestType);
21338 BestPromotionType = BestType;
21340 BestWidth =
Context.getIntWidth(BestType);
21342 bool EnumTooLarge =
Context.computeBestEnumTypes(
21343 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
21344 BestWidth =
Context.getIntWidth(BestType);
21346 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
21351 for (
auto *D : Elements) {
21352 auto *ECD = cast_or_null<EnumConstantDecl>(D);
21353 if (!ECD)
continue;
21362 llvm::APSInt InitVal = ECD->getInitVal();
21370 MembersRepresentableByInt) {
21378 NewWidth =
Context.getTargetInfo().getIntWidth();
21380 }
else if (ECD->getType() == BestType) {
21388 ECD->setType(EnumType);
21392 NewWidth = BestWidth;
21397 InitVal = InitVal.extOrTrunc(NewWidth);
21398 InitVal.setIsSigned(NewSign);
21399 ECD->setInitVal(
Context, InitVal);
21402 if (ECD->getInitExpr() &&
21403 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
21405 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
21414 ECD->setType(EnumType);
21416 ECD->setType(NewTy);
21419 Enum->completeDefinition(BestType, BestPromotionType,
21420 NumPositiveBits, NumNegativeBits);
21425 if (
Enum->isClosedFlag()) {
21426 for (
Decl *D : Elements) {
21428 if (!ECD)
continue;
21431 if (InitVal != 0 && !InitVal.isPowerOf2() &&
21439 if (
Enum->hasAttrs())
21478 AsmLabelAttr *
Attr =
21479 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
21489 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
21503 auto *
Attr = WeakAttr::CreateImplicit(
Context, PragmaLoc);
21521 if (!PrevDecl->
hasAttr<AliasAttr>())
21522 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21565 assert(FD &&
"Expected non-null FunctionDecl");
21572 FD->
hasAttr<SYCLKernelEntryPointAttr>() ||
21573 FD->
hasAttr<SYCLExternalAttr>()))
21577 auto IsEmittedForExternalSymbol = [
this, FD]() {
21589 if (
LangOpts.OpenMPIsTargetDevice) {
21592 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21599 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21603 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21604 if (IsEmittedForExternalSymbol())
21610 }
else if (
LangOpts.OpenMP > 45) {
21614 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21617 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21636 if (IsEmittedForExternalSymbol() ||
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.
Defines helper utilities for supporting the HLSL runtime environment.
static const Decl * getCanonicalDecl(const Decl *D)
Result
Implement __builtin_bit_cast and related operations.
#define CC_VLS_CASE(ABI_VLEN)
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 AMDGPU.
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 isEmittedOnlyIfUsed(const FunctionDecl *FD)
Whether the definition FD is only handed to the ASTConsumer, and thus to CodeGen, once it is used,...
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 isEmittedRegardlessOfUses(const Sema &S, const FunctionDecl *FD, bool Final)
Whether CodeGen emits FD regardless of whether it is used.
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 bool checkWeakAttrCompatibility(Sema &S, const NamedDecl &ND, const WeakAttr &Attr)
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 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 bool isSYCLAddressSpace(LangAS AS)
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
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
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.
bool shouldEmitCUDADecl(const ValueDecl *D) const
Determines if the global variable or function D is emitted on the side of the CUDA/HIP compilation,...
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
bool isImplicit() const
Returns true if the attribute has been implicitly created instead of explicitly written by the user.
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.
void setAttr(const Attr *A)
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)
CXXSpecialMemberKind getSpecialMemberKind() const
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)
This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
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
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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()
DeclContext * getEnclosingNonExpansionStatementContext()
Retrieve the innermost enclosing context that doesn't belong to an expansion statement.
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)
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)
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc, const LateParsedAttrList &LateAttrs={})
AddTypeInfo - Add a chunk to this declarator.
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...
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, SourceLocation RSquareLoc, 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.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) 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 ...
bool isImmediateFunction() const
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:
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.
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
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.
bool isImmediateEscalating() const
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 isExplicitSpecialization() const
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 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...
static std::optional< Token > findNextToken(SourceLocation Loc, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeComments=false)
Finds the token that comes right after the given location.
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.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
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.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
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.
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.
bool hasAddressSpace() const
Check if this type has any address space qualifier.
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
static std::string getAddrSpaceAsString(LangAS AS)
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.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
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 DiagnoseUnguardedBuiltinUsage(FunctionDecl *FD)
void checkNamedBarrierWrapper(RecordDecl *R)
Called in ActOnFields - whenever a C/C++ Record is being finalized.
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)
QualType ActOnTemplateShorthand(TemplateDecl *Template, SourceLocation NameLoc)
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)
ObjCLiteralKind CheckLiteralKind(Expr *FromE)
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)
StmtResult BuildUnresolvedSYCLKernelCallStmt(CompoundStmt *Body, Expr *LaunchIdExpr)
Builds an UnresolvedSYCLKernelCallStmt to wrap 'Body'.
StmtResult BuildSYCLKernelCallStmt(FunctionDecl *FD, CompoundStmt *Body, Expr *LaunchIdExpr)
Builds a SYCLKernelCallStmt to wrap 'Body' and to be used as the body of 'FD'.
void CheckSYCLExternalFunctionDecl(FunctionDecl *FD)
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
ExprResult BuildSYCLKernelLaunchIdExpr(FunctionDecl *FD, QualType KernelName)
Builds an expression for the lookup of a 'sycl_kernel_launch' template with 'KernelName' as an explic...
SwiftNameAttr * mergeNameAttr(Decl *D, const SwiftNameAttr &SNA, StringRef Name)
SwiftAttrAttr * mergeAttrAttr(Decl *D, const SwiftAttrAttr &SAA)
WebAssemblyExportNameAttr * mergeExportNameAttr(Decl *D, const WebAssemblyExportNameAttr &AL)
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)
bool isFromSameSingleIncludeHeader(const Decl *PrevD, SourceLocation NewLoc)
Determine if a definition at NewLoc coincides with PrevD.
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.
void deduceOpenCLAddressSpace(VarDecl *decl)
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...
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.
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.
bool areDocumentationDiagsEnabled(SourceLocation Loc)
Returns true if any of the documentation warnings is enabled at Loc.
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)
Preprocessor & getPreprocessor() const
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.
bool CheckVarDeclSizeAddressSpace(const VarDecl *VD, LangAS AS)
Check whether the given variable declaration has a size that fits within the address space it is decl...
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)
PersonalityAttr * mergePersonalityAttr(Decl *D, FunctionDecl *Routine, const AttributeCommonInfo &CI)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
void ActOnCXXForRangeDecl(Decl *D, bool InExpansionStmt)
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...
AvailabilityAttr * mergeAndInferAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment, const IdentifierInfo *InferredPlatformII)
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
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)
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
DiagnosticsEngine & getDiagnostics() const
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
void ActOnReenterFunctionPrototypeParams(Scope *S, ArrayRef< ParmVarDecl * > Params)
Add Params to scope, so a late-parsed attribute can name them.
void * SkippedDefinitionContext
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
bool InOverflowBehaviorAssignmentContext
Track if we're currently analyzing overflow behavior types in assignment context.
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
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...
InitSegPragmaState CurInitSeg
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
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)
void addImplicitCallingConvAbiTag(FunctionDecl *FD)
Attach the ABI tag a standard calling convention variant requires, as an implicit abi_tag attribute.
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)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
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)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
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.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
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.
llvm::MapVector< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
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)
void ActOnExitFunctionPrototypeParams(Scope *S, ArrayRef< ParmVarDecl * > Params)
Undo the above, for when S outlives the attribute so no scope pop removes them.
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_enum 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
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
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 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".
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
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)
bool isRedefinitionAllowedFor(NamedDecl *D, SourceLocation NewDefinitionLoc, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
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.
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)
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
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()
llvm::SmallPtrSet< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
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)
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...
void addLifetimeBoundToImplicitThis(CXXMethodDecl *MD)
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
void LoadExternalExtnameUndeclaredIdentifiers()
Load pragma redefine_extname'd undeclared identifiers from the external source.
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...
bool isMainFileLoc(SourceLocation Loc) const
Determines whether the given source location is in the main file and we're in a context where we shou...
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)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool AllowTypoCorrection=true)
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 isTagRedeclarationInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
Determine whether a tag-like declaration found by lookup can be redeclared in the given scope.
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...
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...
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.
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, bool IsMemberSpecialization, SkipBodyInfo *SkipBody=nullptr)
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...
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
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.
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.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
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.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
void pushTrivial(ASTContext &Context, QualType T, SourceLocation Loc)
Pushes 'T' with all locations pointing to 'Loc'.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
QualType getType() const
Get the type for which this source info wrapper provides information.
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 isHLSLIntangibleType() const
bool isScalarType() const
bool isVariableArrayType() const
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,...
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
bool isReserveIDT() const
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
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.
void assignAddressSpace(const ASTContext &Ctxt, LangAS AS)
Apply a deduced address space, if one isn't already set.
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.
@ TLS_None
Not a TLS variable.
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.
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.
Expr * SYCLKernelLaunchIdExpr
An unresolved identifier lookup expression for an implicit call to a SYCL kernel launch function in a...
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 [...].
bool BeforeCompoundStatement
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.
constexpr bool isInitializedByPipeline(LangAS AS)
bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD)
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)
Top level wrappers for InstallAPI frontend operations.
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.
GVALinkage
A more specific kind of linkage than enum Linkage.
@ 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.
OptionalUnsigned< unsigned > UnsignedOrNone
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.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
@ Deduced
The normal deduced case.
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
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.
@ 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)
@ 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.
bool isLambdaMethod(const DeclContext *DC)
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.
An element in an Objective-C dictionary literal.
Expr * Value
The value of the dictionary element.
Expr * Key
The key for the dictionary element.
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.