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)
1518 "The next DeclContext should be lexically contained in the current one.");
1522 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1525 if (Param->getIdentifier()) {
1535 assert(
CurContext &&
"DeclContext imbalance!");
1537 assert(
CurContext &&
"Popped translation unit!");
1551 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1566 return ND->
hasAttr<OverloadableAttr>();
1569 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1624 for (; I != IEnd; ++I) {
1657 bool AllowInlineNamespace)
const {
1658 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1665 if (ScopeDC->getPrimaryContext() == TargetDC)
1677 bool ConsiderLinkage,
1678 bool AllowInlineNamespace) {
1696 if (
auto *VD = dyn_cast<VarDecl>(D))
1698 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1700 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1714 if (
New->getFriendObjectKind() &&
1755 if (NewIsModuleInterface || OldIsModuleInterface) {
1759 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1761 << NewIsModuleInterface
1763 << OldIsModuleInterface
1766 New->setInvalidDecl();
1779 if (!
New->getLexicalDeclContext()
1780 ->getNonTransparentContext()
1781 ->isFileContext() ||
1787 bool IsNewExported =
New->isInExportDeclContext();
1791 if (!IsNewExported && !IsOldExported)
1803 New->getOwningModule()->isImplicitGlobalModule())
1806 assert(IsNewExported);
1814 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1832 "New and Old are not the same definition, we should diagnostic it "
1833 "immediately instead of checking it.");
1836 "We shouldn't see unreachable definitions here.");
1884 return OldM == NewM;
1921 return CD->isCopyConstructor();
1928 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1929 if (!RD->hasNameForLinkage())
1950 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1956 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1959 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1968 if (FD->doesThisDeclarationHaveABody() &&
1969 Context.DeclMustBeEmitted(FD))
1971 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1978 if (
Context.DeclMustBeEmitted(VD))
1981 if (VD->isStaticDataMember() &&
1984 if (VD->isStaticDataMember() &&
1986 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1998 return mightHaveNonExternalLinkage(D);
2005 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2011 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2026 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2030 bool IsAllIgnored =
true;
2031 for (
const auto *BD : DD->bindings()) {
2032 if (BD->isReferenced())
2034 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2035 BD->hasAttr<UnusedAttr>());
2048 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2058 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2061 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2062 if (!WithinFunction)
2073 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2076 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2077 Init = Cleanups->getSubExpr();
2079 const auto *Ty = VD->getType().getTypePtr();
2084 if (TT->getDecl()->hasAttr<UnusedAttr>())
2090 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2091 MTE && MTE->getExtendingDecl()) {
2092 Ty = VD->getType().getNonReferenceType().getTypePtr();
2093 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2098 if (Ty->isIncompleteType() || Ty->isDependentType())
2103 Ty = Ty->getBaseElementTypeUnsafe();
2105 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2106 if (Tag->hasAttr<UnusedAttr>())
2109 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2110 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2114 const auto *Construct =
2115 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2116 if (Construct && !Construct->isElidable()) {
2118 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2119 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2125 if (
Init->isTypeDependent()) {
2127 if (!Ctor->isTrivial())
2168 for (
auto *TmpD : D->
decls()) {
2169 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2171 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2185 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2197 DiagID = diag::warn_unused_exception_param;
2199 DiagID = diag::warn_unused_label;
2201 DiagID = diag::warn_unused_variable;
2220 if (Ty->isReferenceType() || Ty->isDependentType())
2223 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2224 if (Tag->hasAttr<UnusedAttr>())
2228 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2229 RD && !RD->hasAttr<WarnUnusedAttr>())
2241 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2247 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2254 assert(iter->getSecond() >= 0 &&
2255 "Found a negative number of references to a VarDecl");
2256 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2266 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2267 if (!UnusedCXXCondDecl)
2273 DiagID = diag::warn_unused_but_set_parameter;
2275 DiagID = diag::warn_unused_but_set_global;
2277 DiagID = diag::warn_unused_but_set_variable;
2287 bool Diagnose =
false;
2291 Diagnose = L->
getStmt() ==
nullptr;
2302 "Scope shouldn't contain decls!");
2309 std::optional<SourceLocation> PreviousDeclLoc;
2314 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2319 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2322 for (
auto *TmpD : S->
decls()) {
2323 assert(TmpD &&
"This decl didn't get pushed??");
2331 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2334 if (
auto *VD = dyn_cast<VarDecl>(D);
2335 VD && !VD->isInternalLinkageFileVar()) {
2344 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2355 auto ShadowI = ShadowingDecls.find(D);
2356 if (ShadowI != ShadowingDecls.end()) {
2357 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2358 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2359 PDiag(diag::warn_ctor_parm_shadows_field)
2360 << D << FD << FD->getParent());
2362 ShadowingDecls.erase(ShadowI);
2366 llvm::sort(DeclDiags,
2367 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2372 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2374 for (
const LocAndDiag &D : DeclDiags) {
2376 if (D.PreviousDeclLoc)
2377 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2401 return "ucontext.h";
2403 llvm_unreachable(
"unhandled error kind");
2414 Parent->
addDecl(CLinkageDecl);
2415 Parent = CLinkageDecl;
2419 if (
Context.BuiltinInfo.isImmediate(ID)) {
2421 "consteval builtins should only be available in C++20 mode");
2430 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2436 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2439 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2441 Params.push_back(parm);
2443 New->setParams(Params);
2451 Scope *S,
bool ForRedeclaration,
2458 if (!ForRedeclaration)
2464 Context.BuiltinInfo.allowTypeMismatch(ID))
2470 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2471 <<
Context.BuiltinInfo.getName(ID);
2477 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2479 <<
Context.BuiltinInfo.getName(ID);
2483 if (!ForRedeclaration &&
2484 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2485 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2486 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2487 : diag::ext_implicit_lib_function_decl)
2488 <<
Context.BuiltinInfo.getName(ID) << R;
2489 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2490 Diag(Loc, diag::note_include_header_or_declare)
2491 << Header <<
Context.BuiltinInfo.getName(ID);
2527 while (Filter.hasNext()) {
2536 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2538 Decl->getUnderlyingType()))
2543 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2544 Decl->getAnonDeclWithTypedefName())
2556 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2557 OldType = OldTypedef->getUnderlyingType();
2559 OldType =
Context.getTypeDeclType(Old);
2565 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2569 New->setInvalidDecl();
2573 if (OldType != NewType &&
2576 !
Context.hasSameType(OldType, NewType)) {
2578 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2579 << Kind << NewType << OldType;
2582 New->setInvalidDecl();
2592 if (
New->isInvalidDecl())
return;
2598 switch (TypeID->getLength()) {
2602 if (!TypeID->isStr(
"id"))
2605 if (!
T->isPointerType())
2607 if (!
T->isVoidPointerType()) {
2612 Context.setObjCIdRedefinitionType(
T);
2614 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2619 if (!TypeID->isStr(
"Class"))
2621 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2623 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2627 if (!TypeID->isStr(
"SEL"))
2629 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2631 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2641 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2642 <<
New->getDeclName();
2648 return New->setInvalidDecl();
2653 return New->setInvalidDecl();
2655 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2656 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2657 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2660 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2664 if (OldTD->isModed())
2665 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2666 OldTD->getUnderlyingType());
2668 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2724 Diag(
New->getLocation(), diag::err_redefinition)
2725 <<
New->getDeclName();
2727 return New->setInvalidDecl();
2742 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2745 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2746 <<
New->getDeclName();
2753 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2755 for (
auto *ECD : ED->enumerators()) {
2766 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2767 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2768 for (
const auto *i : D->
attrs())
2769 if (i->getKind() == A->
getKind()) {
2785 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2786 return VD->isThisDeclarationADefinition();
2787 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2788 return TD->isCompleteDefinition() || TD->isBeingDefined();
2799 AlignedAttr *OldAlignasAttr =
nullptr;
2800 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2801 unsigned OldAlign = 0;
2809 if (I->isAlignmentDependent())
2815 unsigned Align = I->getAlignment(S.
Context);
2816 if (Align > OldAlign) {
2818 OldStrictestAlignAttr = I;
2823 AlignedAttr *NewAlignasAttr =
nullptr;
2824 unsigned NewAlign = 0;
2825 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2826 if (I->isAlignmentDependent())
2832 unsigned Align = I->getAlignment(S.
Context);
2833 if (Align > NewAlign)
2837 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2845 if (OldAlign == 0 || NewAlign == 0) {
2858 if (OldAlign != NewAlign) {
2859 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2862 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2875 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2877 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2881 bool AnyAdded =
false;
2884 if (OldAlign > NewAlign) {
2885 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2886 Clone->setInherited(
true);
2887 New->addAttr(Clone);
2892 if (OldAlignasAttr && !NewAlignasAttr &&
2893 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2894 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2895 Clone->setInherited(
true);
2896 New->addAttr(Clone);
2903#define WANT_DECL_MERGE_LOGIC
2904#include "clang/Sema/AttrParsedAttrImpl.inc"
2905#undef WANT_DECL_MERGE_LOGIC
2912 if (!DiagnoseMutualExclusions(S, D,
Attr))
2923 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr)) {
2925 if (AvailabilityAttr *
Inf = AA->getInferredAttrAs())
2926 InferredPlatformII =
Inf->getPlatform();
2928 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2929 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2930 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2931 AA->getPriority(), AA->getEnvironment(), InferredPlatformII);
2932 }
else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2934 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2936 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2938 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2940 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2942 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2943 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2945 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2947 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2948 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2950 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2952 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2954 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2956 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2958 IA->getInheritanceModel());
2959 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2968 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2970 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2972 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2974 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2985 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2986 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2987 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2989 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2991 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2993 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2995 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2997 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
3000 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
3003 WS->getSpelledArgsCount());
3004 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
3006 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
3011 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
3015 else if (
const auto *PA = dyn_cast<PersonalityAttr>(
Attr))
3030 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
3031 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
3035 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3041 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
3043 if (FD->isDefined(Def,
true))
3050 for (
const auto *Attribute : D->
attrs())
3051 if (Attribute->getKind() == Kind)
3059 if (!
New->hasAttrs())
3063 if (!Def || Def ==
New)
3067 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3068 Attr *NewAttribute = NewAttributes[I];
3077 NewAttributes.erase(NewAttributes.begin() + I);
3085 ? diag::err_alias_after_tentative
3086 : diag::err_redefinition;
3088 if (
Diag == diag::err_redefinition)
3098 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3134 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3135 if (AA->isAlignas()) {
3146 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3148 NewAttributes.erase(NewAttributes.begin() + I);
3158 diag::err_loader_uninitialized_redeclaration);
3160 NewAttributes.erase(NewAttributes.begin() + I);
3183 diag::err_sycl_entry_point_after_definition)
3196 diag::warn_attribute_precede_definition);
3198 NewAttributes.erase(NewAttributes.begin() + I);
3204 const ConstInitAttr *CIAttr,
3205 bool AttrBeforeInit) {
3212 std::string SuitableSpelling;
3214 SuitableSpelling = std::string(
3216 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3218 InsertLoc, {tok::l_square, tok::l_square,
3219 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3220 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3221 tok::r_square, tok::r_square}));
3222 if (SuitableSpelling.empty())
3224 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3225 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3226 tok::r_paren, tok::r_paren}));
3227 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3228 SuitableSpelling =
"constinit";
3229 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3230 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3231 if (SuitableSpelling.empty())
3232 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3233 SuitableSpelling +=
" ";
3235 if (AttrBeforeInit) {
3238 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3241 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3245 S.
Diag(CIAttr->getLocation(),
3246 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3247 : diag::warn_require_const_init_added_too_late)
3250 << CIAttr->isConstinit()
3258 UsedAttr *NewAttr = OldAttr->clone(
Context);
3259 NewAttr->setInherited(
true);
3260 New->addAttr(NewAttr);
3263 RetainAttr *NewAttr = OldAttr->clone(
Context);
3264 NewAttr->setInherited(
true);
3265 New->addAttr(NewAttr);
3274 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3275 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3276 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3284 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3287 if (InitDecl == NewVD) {
3291 if (OldConstInit && OldConstInit->isConstinit())
3294 }
else if (NewConstInit) {
3298 if (InitDecl && InitDecl != NewVD) {
3301 NewVD->dropAttr<ConstInitAttr>();
3309 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3310 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3311 if (!OldA->isEquivalent(NewA)) {
3313 Diag(
New->getLocation(), diag::err_different_asm_label);
3314 Diag(OldA->getLocation(), diag::note_previous_declaration);
3316 }
else if (Old->
isUsed()) {
3319 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3325 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3326 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3327 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3328 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3329 Diag(NewAbiTagAttr->getLocation(),
3330 diag::err_new_abi_tag_on_redeclaration)
3332 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3336 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3342 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3343 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3345 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3352 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3353 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3355 Diag(
New->getLocation(), diag::warn_mismatched_section)
3363 bool foundAny =
New->hasAttrs();
3393 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3406 if (!foundAny)
New->dropAttrs();
3411 checkAttrIsTypeDependent(D, A);
3422 newAttr->setInherited(
true);
3444 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3459 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3460 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3461 S.
Diag(CDA->getLocation(),
3462 diag::err_carries_dependency_missing_on_first_decl) << 1;
3470 diag::note_carries_dependency_missing_first_decl) << 1;
3489 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3490 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3498 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3530 if (*Oldnullability != *Newnullability) {
3531 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3548 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3549 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3550 if (OldParamDT && NewParamDT &&
3551 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3552 QualType OldParamOT = OldParamDT->getOriginalType();
3553 QualType NewParamOT = NewParamDT->getOriginalType();
3556 << NewParam << NewParamOT;
3567struct GNUCompatibleParamWarning {
3568 ParmVarDecl *OldParm;
3569 ParmVarDecl *NewParm;
3570 QualType PromotedType;
3577template <
typename T>
3578static std::pair<diag::kind, SourceLocation>
3582 if (Old->isThisDeclarationADefinition())
3583 PrevDiag = diag::note_previous_definition;
3584 else if (Old->isImplicit()) {
3585 PrevDiag = diag::note_previous_implicit_declaration;
3586 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3587 if (FD->getBuiltinID())
3588 PrevDiag = diag::note_previous_builtin_declaration;
3591 OldLocation =
New->getLocation();
3593 PrevDiag = diag::note_previous_declaration;
3594 return std::make_pair(PrevDiag, OldLocation);
3602 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3603 !LangOpts.CPlusPlus &&
3609 const AttributedType *AT =
T->getAs<AttributedType>();
3610 while (AT && !AT->isCallingConv())
3611 AT = AT->getModifiedType()->getAs<AttributedType>();
3615template <
typename T>
3629template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3636template<
typename ExpectedDecl>
3658 !Old->getDeclContext()->getRedeclContext()->Equals(
3659 New->getDeclContext()->getRedeclContext()) &&
3664 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3677 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3678 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3681 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3682 AttrA->isDynamic() == AttrB->isDynamic();
3708 if (NamedDC->Equals(SemaDC))
3711 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3713 "unexpected context for redeclaration");
3724 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3725 FixSemaDC(FD->getDescribedFunctionTemplate());
3726 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3727 FixSemaDC(VD->getDescribedVarTemplate());
3731 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3739 Diag(
New->getLocation(), diag::err_using_decl_friend);
3740 Diag(Shadow->getTargetDecl()->getLocation(),
3741 diag::note_using_decl_target);
3742 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3750 New->getDescribedFunctionTemplate()) {
3762 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3763 <<
New->getDeclName();
3787 std::tie(PrevDiag, OldLocation) =
3797 !
New->getTemplateSpecializationInfo() &&
3800 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3801 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3803 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3804 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3809 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3810 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3811 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3814 New->dropAttr<InternalLinkageAttr>();
3817 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3818 if (!Old->
hasAttr<ErrorAttr>()) {
3819 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3821 New->dropAttr<ErrorAttr>();
3829 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3830 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3831 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3840 const Decl *DiagOld = Old;
3842 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3843 const auto *A = D->getAttr<OverloadableAttr>();
3844 return A && !A->isImplicit();
3853 diag::note_attribute_overloadable_prev_overload)
3857 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3859 New->dropAttr<OverloadableAttr>();
3866 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3868 Diag(OldLocation, diag::note_previous_declaration);
3891 bool RequiresAdjustment =
false;
3893 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3899 if (!NewCCExplicit) {
3903 RequiresAdjustment =
true;
3911 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3915 RequiresAdjustment =
true;
3919 Diag(
New->getLocation(), diag::err_cconv_change)
3922 << (!FirstCCExplicit ?
"" :
3926 Diag(
First->getLocation(), diag::note_previous_declaration);
3934 RequiresAdjustment =
true;
3946 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3947 FPT2->getParamTypes(), EPI2);
3949 New->setType(NewQType);
3958 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3961 Diag(OldLocation, diag::note_previous_declaration);
3966 RequiresAdjustment =
true;
3972 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3973 <<
"'ns_returns_retained'";
3974 Diag(OldLocation, diag::note_previous_declaration);
3979 RequiresAdjustment =
true;
3985 AnyX86NoCallerSavedRegistersAttr *
Attr =
3986 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3987 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3988 Diag(OldLocation, diag::note_previous_declaration);
3993 RequiresAdjustment =
true;
3996 if (RequiresAdjustment) {
4000 NewQType =
Context.getCanonicalType(
New->getType());
4005 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
4013 if (
New->hasAttr<GNUInlineAttr>() &&
4022 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
4023 <<
New->getDeclName();
4024 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4028 QualType OldQTypeForComparison = OldQType;
4029 if (
Context.hasAnyFunctionEffects()) {
4031 const auto NewFX =
New->getFunctionEffects();
4032 if (OldFX != NewFX) {
4034 for (
const auto &Diff : Diffs) {
4035 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
4037 diag::warn_mismatched_func_effect_redeclaration)
4038 << Diff.effectName();
4049 if (!MergeErrs.empty())
4056 NewFPT->getParamTypes(), EPI);
4058 New->setType(ModQT);
4059 NewQType =
New->getType();
4064 EPI = OldFPT->getExtProtoInfo();
4066 OldQTypeForComparison =
Context.getFunctionType(
4067 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4069 if (OldFX.empty()) {
4080 NewQType =
Context.getCanonicalType(
New->getType());
4088 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4089 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4091 OldDeclaredReturnType)) {
4096 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4098 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4099 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4100 <<
New <<
New->getReturnTypeSourceRange();
4102 !Old->
hasAttr<OverloadableAttr>() &&
4103 !
New->hasAttr<OverloadableAttr>())
4104 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4106 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4107 <<
New->getReturnTypeSourceRange();
4108 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4118 if (OldReturnType != NewReturnType) {
4122 if (OldAT && OldAT->isDeduced()) {
4123 QualType DT = OldAT->getDeducedType();
4134 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4136 if (OldMethod && NewMethod) {
4143 bool IsClassScopeExplicitSpecialization =
4149 !IsClassScopeExplicitSpecialization) {
4154 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4155 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4166 NewDiag = diag::err_constructor_redeclared;
4168 NewDiag = diag::err_destructor_redeclared;
4170 NewDiag = diag::err_conv_function_redeclared;
4172 NewDiag = diag::err_member_redeclared;
4174 Diag(
New->getLocation(), NewDiag);
4176 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4177 <<
New <<
New->getType();
4179 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4192 diag::err_definition_of_implicitly_declared_member)
4198 diag::err_definition_of_explicitly_defaulted_member)
4221 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4222 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4223 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4232 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4233 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4234 Diag(CDA->getLocation(),
4235 diag::err_carries_dependency_missing_on_first_decl) << 0;
4237 diag::note_carries_dependency_missing_first_decl) << 0;
4245 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4246 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4247 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4262 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4276 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4277 Diag(OldLocation, PrevDiag);
4279 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4280 Diag(OldLocation, PrevDiag);
4287 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4295 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4305 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4333 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4337 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4355 if (
New->hasWrittenPrototype()) {
4367 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4368 if (WithoutProto ==
New)
4369 IsWithoutProtoADef = NewDeclIsDefn;
4371 IsWithProtoADef = NewDeclIsDefn;
4373 diag::warn_non_prototype_changes_behavior)
4374 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4375 << (WithoutProto == Old) << IsWithProtoADef;
4385 !IsWithoutProtoADef)
4391 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4396 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4399 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4400 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4401 OldProto->getParamTypes(),
4402 OldProto->getExtProtoInfo());
4403 New->setType(NewQType);
4404 New->setHasInheritedPrototype();
4408 for (
const auto &ParamType : OldProto->param_types()) {
4411 ParamType,
nullptr,
SC_None,
nullptr);
4412 Param->setScopeInfo(0, Params.size());
4413 Param->setImplicit();
4414 Params.push_back(Param);
4417 New->setParams(Params);
4426 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4453 NewProto->getReturnType());
4454 bool LooseCompatible = !MergedReturn.isNull();
4456 LooseCompatible && Idx != End; ++Idx) {
4460 NewProto->getParamType(Idx))) {
4461 ArgTypes.push_back(NewParm->
getType());
4465 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4466 NewProto->getParamType(Idx) };
4467 Warnings.push_back(Warn);
4468 ArgTypes.push_back(NewParm->
getType());
4470 LooseCompatible =
false;
4473 if (LooseCompatible) {
4474 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4475 Diag(Warnings[Warn].NewParm->getLocation(),
4476 diag::ext_param_promoted_not_compatible_with_prototype)
4477 << Warnings[Warn].PromotedType
4478 << Warnings[Warn].OldParm->getType();
4479 if (Warnings[Warn].OldParm->getLocation().isValid())
4480 Diag(Warnings[Warn].OldParm->getLocation(),
4481 diag::note_previous_declaration);
4484 if (MergeTypeWithOld)
4485 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4502 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4503 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4504 Diag(OldLocation, diag::note_previous_builtin_declaration)
4509 PrevDiag = diag::note_previous_builtin_declaration;
4512 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4513 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4518 Scope *S,
bool MergeTypeWithOld) {
4524 New->setIsPureVirtual();
4533 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4547 if (!Merged.isNull() && MergeTypeWithOld)
4548 New->setType(Merged);
4572 ni != ne && oi != oe; ++ni, ++oi)
4581 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4582 ? diag::err_redefinition_different_type
4583 : diag::err_redeclaration_different_type)
4588 std::tie(PrevDiag, OldLocation)
4590 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4591 New->setInvalidDecl();
4595 bool MergeTypeWithOld) {
4601 if (
New->getType()->isUndeducedType()) {
4623 QualType PrevVDTy = PrevVD->getType();
4627 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4635 MergedT =
New->getType();
4646 else if (
New->getType()->isObjCObjectPointerType() &&
4648 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4663 if ((
New->getType()->isDependentType() ||
4668 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4677 if (MergeTypeWithOld)
4678 New->setType(MergedT);
4712 if (
New->isInvalidDecl())
4725 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4729 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4731 return New->setInvalidDecl();
4733 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4736 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4738 return New->setInvalidDecl();
4742 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4743 <<
New->getDeclName();
4745 New->getLocation());
4746 return New->setInvalidDecl();
4758 return New->setInvalidDecl();
4765 Diag(
New->getLocation(), diag::err_duplicate_member)
4766 <<
New->getIdentifier();
4768 New->setInvalidDecl();
4771 if (NewTemplate && OldTemplate)
4778 if (
New->hasAttr<WeakImportAttr>())
4781 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4784 New->dropAttr<WeakImportAttr>();
4789 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4790 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4791 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4794 New->dropAttr<InternalLinkageAttr>();
4799 if (MostRecent != Old) {
4802 if (
New->isInvalidDecl())
4807 if (
New->isInvalidDecl())
4812 std::tie(PrevDiag, OldLocation) =
4817 !
New->isStaticDataMember() &&
4820 Diag(
New->getLocation(), diag::ext_static_non_static)
4821 <<
New->getDeclName();
4822 Diag(OldLocation, PrevDiag);
4824 Diag(
New->getLocation(), diag::err_static_non_static)
4825 <<
New->getDeclName();
4826 Diag(OldLocation, PrevDiag);
4827 return New->setInvalidDecl();
4841 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4842 !
New->isStaticDataMember() &&
4844 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4845 Diag(OldLocation, PrevDiag);
4846 return New->setInvalidDecl();
4850 if (
New->hasExternalStorage() &&
4852 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4853 Diag(OldLocation, PrevDiag);
4854 return New->setInvalidDecl();
4857 !
New->hasExternalStorage()) {
4858 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4859 Diag(OldLocation, PrevDiag);
4860 return New->setInvalidDecl();
4870 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4873 !
New->getLexicalDeclContext()->isRecord())) {
4874 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4875 Diag(OldLocation, PrevDiag);
4876 return New->setInvalidDecl();
4884 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4885 Diag(Def->getLocation(), diag::note_previous_definition);
4899 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4900 Diag(OldLocation, PrevDiag);
4901 }
else if (!
New->getTLSKind()) {
4902 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4903 Diag(OldLocation, PrevDiag);
4909 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4911 Diag(OldLocation, PrevDiag);
4921 diag::warn_deprecated_redundant_constexpr_static_def);
4927 New->setInvalidDecl();
4936 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4943 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4944 Diag(OldLocation, PrevDiag);
4945 New->setInvalidDecl();
4954 New->setPreviousDecl(Old);
4964 New->setImplicitlyInline();
4969 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4971 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4972 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4973 auto &HSI =
PP.getHeaderSearchInfo();
4974 StringRef HdrFilename =
4977 auto noteFromModuleOrInclude = [&](
Module *Mod,
4983 if (IncLoc.isValid()) {
4985 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4991 Diag(IncLoc, diag::note_redefinition_include_same_file)
4992 << HdrFilename.str();
5002 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
5010 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
5026 New->getDescribedVarTemplate() ||
5027 !
New->getTemplateParameterLists().empty() ||
5028 New->getDeclContext()->isDependentContext() ||
5029 New->hasAttr<SelectAnyAttr>())) {
5032 New->demoteThisDefinitionToDeclaration();
5040 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
5042 New->setInvalidDecl();
5068 if (!
Context.getLangOpts().CPlusPlus)
5074 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5077 Context.getManglingNumberContext(Tag->getParent());
5086 Decl *ManglingContextDecl;
5087 std::tie(MCtx, ManglingContextDecl) =
5097struct NonCLikeKind {
5109 explicit operator bool() {
return Kind !=
None; }
5117 return {NonCLikeKind::Invalid, {}};
5124 return {NonCLikeKind::BaseClass,
5136 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5137 if (FD->hasInClassInitializer()) {
5138 auto *
Init = FD->getInClassInitializer();
5139 return {NonCLikeKind::DefaultMemberInit,
5155 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5163 if (MemberRD->isLambda())
5164 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5168 if (MemberRD->isThisDeclarationADefinition()) {
5174 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5191 Context.getCanonicalTagType(TagFromDeclSpec))) {
5193 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5204 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5208 if (NonCLike || ChangesLinkage) {
5209 if (NonCLike.Kind == NonCLikeKind::Invalid)
5212 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5213 if (ChangesLinkage) {
5215 if (NonCLike.Kind == NonCLikeKind::None)
5216 DiagID = diag::err_typedef_changes_linkage;
5218 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5224 TextToInsert +=
' ';
5227 Diag(FixitLoc, DiagID)
5230 if (NonCLike.Kind != NonCLikeKind::None) {
5231 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5232 << NonCLike.Kind - 1 << NonCLike.Range;
5235 << NewTD << isa<TypeAliasDecl>(NewTD);
5260 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5261 if (ED->isScopedUsingClassTag())
5268 llvm_unreachable(
"unexpected type specifier");
5276 bool IsExplicitInstantiation,
5279 Decl *TagD =
nullptr;
5297 Tag = CTD->getTemplatedDecl();
5302 Tag->setFreeStanding();
5303 if (Tag->isInvalidDecl())
5312 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5349 "Friend ellipsis but not friend-specified?");
5352 bool DeclaresAnything =
true;
5356 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5359 Record->getDeclContext()->isRecord()) {
5373 DeclaresAnything =
false;
5392 if ((Tag && Tag->getDeclName()) ||
5402 DeclaresAnything =
false;
5414 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5415 !
Enum->isInvalidDecl())
5416 DeclaresAnything =
false;
5424 DeclaresAnything =
false;
5428 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5430 << Tag->getTagKind()
5443 if (!DeclaresAnything) {
5446 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5447 ? diag::err_no_declarators
5448 : diag::ext_no_declarators)
5461 unsigned DiagID = diag::warn_standalone_specifier;
5463 DiagID = diag::ext_standalone_specifier;
5504 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5505 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5507 DiagnosticId = diag::warn_attribute_ignored;
5508 else if (AL.isRegularKeywordAttribute())
5509 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5511 DiagnosticId = diag::warn_declspec_attribute_ignored;
5512 Diag(AL.getLoc(), DiagnosticId)
5516 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5517 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5540 NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5541 assert(PrevDecl &&
"Expected a non-null Decl");
5554 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5556 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5562 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5572 if (
Record->isAnonymousStructOrUnion())
5577 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5611 for (
auto *D : AnonRecord->
decls()) {
5634 unsigned OldChainingSize = Chaining.size();
5636 Chaining.append(IF->chain_begin(), IF->chain_end());
5638 Chaining.push_back(VD);
5640 assert(Chaining.size() >= 2);
5643 for (
unsigned i = 0; i < Chaining.size(); i++)
5644 NamedChain[i] = Chaining[i];
5648 VD->
getType(), {NamedChain, Chaining.size()});
5662 Chaining.resize(OldChainingSize);
5676 "Parser allowed 'typedef' as storage class VarDecl.");
5677 switch (StorageClassSpec) {
5691 llvm_unreachable(
"unknown storage class specifier");
5695 assert(
Record->hasInClassInitializer());
5697 for (
const auto *I :
Record->decls()) {
5698 const auto *FD = dyn_cast<FieldDecl>(I);
5699 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5700 FD = IFD->getAnonField();
5701 if (FD && FD->hasInClassInitializer())
5702 return FD->getLocation();
5705 llvm_unreachable(
"couldn't find in-class initializer");
5713 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5733 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5735 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5737 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5743 const char *PrevSpec =
nullptr;
5755 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5760 PrevSpec, DiagID, Policy);
5768 diag::err_anonymous_union_with_storage_spec)
5774 PrevSpec, DiagID,
Context.getPrintingPolicy());
5782 <<
Record->isUnion() <<
"const"
5786 diag::ext_anonymous_struct_union_qualified)
5787 <<
Record->isUnion() <<
"volatile"
5791 diag::ext_anonymous_struct_union_qualified)
5792 <<
Record->isUnion() <<
"restrict"
5796 diag::ext_anonymous_struct_union_qualified)
5797 <<
Record->isUnion() <<
"_Atomic"
5801 diag::ext_anonymous_struct_union_qualified)
5802 <<
Record->isUnion() <<
"__unaligned"
5812 for (
auto *Mem :
Record->decls()) {
5814 if (Mem->isInvalidDecl())
5817 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5821 assert(FD->getAccess() !=
AS_none);
5823 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5835 }
else if (Mem->isImplicit()) {
5842 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5843 if (!MemRecord->isAnonymousStructOrUnion() &&
5844 MemRecord->getDeclName()) {
5847 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5851 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5859 Diag(MemRecord->getLocation(),
5860 diag::ext_anonymous_record_with_anonymous_type)
5870 unsigned DK = diag::err_anonymous_record_bad_member;
5872 DK = diag::err_anonymous_record_with_type;
5874 DK = diag::err_anonymous_record_with_function;
5876 DK = diag::err_anonymous_record_with_static;
5880 DK == diag::err_anonymous_record_with_type)
5881 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5884 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5900 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5921 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5925 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5941 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5947 Record->getLocation(),
nullptr,
5963 Record->setAnonymousStructOrUnion(
true);
5974 Chain.push_back(Anon);
5980 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5983 Decl *ManglingContextDecl;
5984 std::tie(MCtx, ManglingContextDecl) =
6003 assert(
Record &&
"expected a record!");
6008 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
6016 nullptr, RecTy, TInfo,
6028 Chain.push_back(Anon);
6032 diag::err_field_incomplete_or_sizeless) ||
6037 ParentDecl->setInvalidDecl();
6074 diag::err_deduction_guide_name_not_class_template)
6094 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6104 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6105 Context.getCanonicalType(Ty)));
6116 Context.getCanonicalType(Ty)));
6137 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6149 Context.getCanonicalType(Ty)));
6157 return Context.getNameForTemplate(TName, TNameLoc);
6162 llvm_unreachable(
"Unknown name kind");
6190 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6195 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6203 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6204 (DeclTyName && DeclTyName == DefTyName))
6205 Params.push_back(Idx);
6232#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6233#include "clang/Basic/Traits.inc"
6238 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6248 if (!TSI)
return true;
6261 if (
Result.isInvalid())
return true;
6306 << D << static_cast<int>(Status);
6317 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6318 llvm::omp::TraitProperty::
6319 implementation_extension_bind_to_declaration))
6344 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6355 bool IsMemberSpecialization) {
6356 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6357 "without nested-name-specifier");
6373 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6374 : diag::err_member_extra_qualification)
6378 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6386 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6388 Diag(Loc, diag::err_member_qualification)
6391 Diag(Loc, diag::err_invalid_declarator_global_scope)
6394 Diag(Loc, diag::err_invalid_declarator_in_function)
6397 Diag(Loc, diag::err_invalid_declarator_in_block)
6401 Diag(Loc, diag::err_export_non_namespace_scope_name)
6408 Diag(Loc, diag::err_invalid_declarator_scope)
6418 if (IsMemberSpecialization)
6422 Diag(Loc, diag::err_member_qualification)
6449 Diag(Loc, diag::ext_template_after_declarative_nns)
6454 TL = std::exchange(NextTL,
TypeLoc())) {
6456 switch (TL.getTypeLocClass()) {
6457 case TypeLoc::TemplateSpecialization: {
6459 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6460 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6461 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6462 << TST.getLocalSourceRange();
6465 case TypeLoc::Decltype:
6466 case TypeLoc::PackIndexing: {
6467 const Type *
T = TL.getTypePtr();
6474 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6475 <<
T->isDecltypeType() << TL.getSourceRange();
6478 case TypeLoc::DependentName:
6485 if (TemplateKeywordLoc.
isValid())
6486 Diag(Loc, diag::ext_template_after_declarative_nns)
6527 diag::err_template_qualified_declarator_no_match)
6534 if (!IsDependentContext &&
6541 diag::err_member_def_undefined_record)
6562 if (EnteringContext && IsDependentContext &&
6563 TemplateParamLists.size() != 0) {
6582 bool IsLinkageLookup =
false;
6583 bool CreateBuiltins =
false;
6596 R->isFunctionType())) {
6597 IsLinkageLookup =
true;
6599 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6600 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6602 CreateBuiltins =
true;
6604 if (IsLinkageLookup) {
6646 bool AllowForCompatibility =
false;
6649 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6650 TemplateParamParent->isDeclScope(TPD);
6653 AllowForCompatibility);
6670 (TemplateParamLists.size() == 0 || R->isFunctionType()))
6683 bool AddToScope =
true;
6685 if (TemplateParamLists.size()) {
6691 }
else if (R->isFunctionType()) {
6707 if (
New->getDeclName() && AddToScope)
6710 if (
OpenMP().isInOpenMPDeclareTargetContext())
6721 bool &SizeIsNegative,
6722 llvm::APSInt &Oversized) {
6727 SizeIsNegative =
false;
6730 if (
T->isDependentType())
6736 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6741 if (FixedType.
isNull())
return FixedType;
6742 FixedType = Context.getPointerType(FixedType);
6743 return Qs.
apply(Context, FixedType);
6745 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6746 QualType Inner = PTy->getInnerType();
6750 if (FixedType.
isNull())
return FixedType;
6751 FixedType = Context.getParenType(FixedType);
6752 return Qs.
apply(Context, FixedType);
6762 SizeIsNegative, Oversized);
6772 llvm::APSInt Res =
Result.Val.getInt();
6775 if (Res.isSigned() && Res.isNegative()) {
6776 SizeIsNegative =
true;
6781 unsigned ActiveSizeBits =
6785 : Res.getActiveBits();
6787 Oversized = std::move(Res);
6791 QualType FoldedArrayType = Context.getConstantArrayType(
6793 return Qs.
apply(Context, FoldedArrayType);
6818 TypeLoc DstElemTL = DstATL.getElementLoc();
6837 bool &SizeIsNegative,
6838 llvm::APSInt &Oversized) {
6841 SizeIsNegative, Oversized);
6844 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6852 unsigned FailedFoldDiagID) {
6853 bool SizeIsNegative;
6854 llvm::APSInt Oversized;
6856 TInfo,
Context, SizeIsNegative, Oversized);
6858 Diag(Loc, diag::ext_vla_folded_to_constant);
6865 Diag(Loc, diag::err_typecheck_negative_array_size);
6866 else if (Oversized.getBoolValue())
6868 Oversized, 10, Oversized.isSigned(),
false,
6870 else if (FailedFoldDiagID)
6871 Diag(Loc, FailedFoldDiagID);
6883 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6888 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6897 diag::err_virtual_non_function);
6901 diag::err_explicit_non_function);
6905 diag::err_noreturn_non_function);
6926 ? diag::warn_ms_inline_non_function
6927 : diag::err_inline_non_function)
6931 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6936 diag::err_deduction_guide_invalid_specifier)
6945 if (!NewTD)
return nullptr;
6966 if (
T->isVariablyModifiedType()) {
6970 bool SizeIsNegative;
6971 llvm::APSInt Oversized;
6982 else if (
T->isVariableArrayType())
6984 else if (Oversized.getBoolValue())
7021 switch (II->getNotableIdentifierID()) {
7022 case tok::NotableIdentifierKind::FILE:
7025 case tok::NotableIdentifierKind::jmp_buf:
7026 Context.setjmp_bufDecl(NewTD);
7028 case tok::NotableIdentifierKind::sigjmp_buf:
7029 Context.setsigjmp_bufDecl(NewTD);
7031 case tok::NotableIdentifierKind::ucontext_t:
7032 Context.setucontext_tDecl(NewTD);
7034 case tok::NotableIdentifierKind::float_t:
7035 case tok::NotableIdentifierKind::double_t:
7036 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7073 if (Context.getLangOpts().CPlusPlus) {
7097 if (!OuterContext->
Equals(PrevOuterContext))
7106 if (!SS.
isSet())
return;
7133 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7142 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7143 if (VD->hasInit()) {
7144 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7145 assert(VD->isThisDeclarationADefinition() &&
7146 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7148 VD->dropAttr<AliasAttr>();
7157 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7160 diag::err_attribute_selectany_non_extern_data);
7167 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7170 diag::warn_attribute_hybrid_patchable_non_extern);
7176 auto *VD = dyn_cast<VarDecl>(&ND);
7177 bool IsAnonymousNS =
false;
7180 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7181 while (NS && !IsAnonymousNS) {
7183 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7190 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7192 (!AnonNSInMicrosoftMode &&
7203 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7204 FD = FD->getMostRecentDecl();
7209 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7215 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7216 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7217 int NoImplicitObjectError = -1;
7219 NoImplicitObjectError = 0;
7220 else if (MD->isStatic())
7221 NoImplicitObjectError = 1;
7222 else if (MD->isExplicitObjectMemberFunction())
7223 NoImplicitObjectError = 2;
7224 if (NoImplicitObjectError != -1) {
7225 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7226 << NoImplicitObjectError << A->getRange();
7228 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7230 }
else if (MD->getReturnType()->isVoidType()) {
7234 err_lifetimebound_implicit_object_parameter_void_return_type);
7239 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7244 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7246 S.
Diag(A->getLocation(),
7247 diag::err_lifetimebound_parameter_void_return_type);
7255 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7256 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7275 bool IsSpecialization,
7276 bool IsDefinition) {
7280 bool IsTemplate =
false;
7281 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7282 OldDecl = OldTD->getTemplatedDecl();
7284 if (!IsSpecialization)
7285 IsDefinition =
false;
7287 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7288 NewDecl = NewTD->getTemplatedDecl();
7292 if (!OldDecl || !NewDecl)
7295 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7296 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7297 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7298 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7302 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7303 (NewExportAttr && !NewExportAttr->isInherited());
7309 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7311 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7313 bool JustWarn =
false;
7315 auto *VD = dyn_cast<VarDecl>(OldDecl);
7316 if (VD && !VD->getDescribedVarTemplate())
7318 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7330 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7331 : diag::err_attribute_dll_redeclaration;
7334 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7347 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7349 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7352 IsStaticDataMember = VD->isStaticDataMember();
7353 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7355 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7356 IsInline = FD->isInlined();
7357 IsQualifiedFriend = FD->getQualifier() &&
7361 if (OldImportAttr && !HasNewAttr &&
7362 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7364 if (IsMicrosoftABI && IsDefinition) {
7365 if (IsSpecialization) {
7368 diag::err_attribute_dllimport_function_specialization_definition);
7369 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7370 NewDecl->
dropAttr<DLLImportAttr>();
7373 diag::warn_redeclaration_without_import_attribute)
7376 NewDecl->
dropAttr<DLLImportAttr>();
7377 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7378 S.
Context, NewImportAttr->getRange()));
7380 }
else if (IsMicrosoftABI && IsSpecialization) {
7381 assert(!IsDefinition);
7385 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7386 << NewDecl << OldImportAttr;
7388 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7389 OldDecl->
dropAttr<DLLImportAttr>();
7390 NewDecl->
dropAttr<DLLImportAttr>();
7392 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7395 OldDecl->
dropAttr<DLLImportAttr>();
7396 NewDecl->
dropAttr<DLLImportAttr>();
7398 diag::warn_dllimport_dropped_from_inline_function)
7399 << NewDecl << OldImportAttr;
7406 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7408 !NewImportAttr && !NewExportAttr) {
7409 if (
const DLLExportAttr *ParentExportAttr =
7410 MD->getParent()->getAttr<DLLExportAttr>()) {
7411 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7412 NewAttr->setInherited(
true);
7464 return D->isExternC();
7481 llvm_unreachable(
"Unexpected context");
7491 llvm_unreachable(
"Unexpected context");
7536 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7537 return FD->isExternC();
7538 if (
const auto *VD = dyn_cast<VarDecl>(D))
7539 return VD->isExternC();
7541 llvm_unreachable(
"Unknown type of decl!");
7552 if (R->isImageType() || R->isPipeType()) {
7554 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7566 if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7568 diag::err_invalid_type_for_program_scope_var)
7578 QualType NR = R.getCanonicalType();
7597 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7606 if (R->isEventT()) {
7614 if (R->isSamplerT()) {
7629 R.isConstQualified())) {
7630 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7640template <
typename AttrTy>
7643 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7644 AttrTy *Clone = Attribute->clone(S.
Context);
7645 Clone->setInherited(
true);
7673 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7675 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7682 "NewD is not a function or variable");
7691 if (IdentName ==
nullptr)
7695 auto &Label = PendingName->second;
7701 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7711 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7730 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7734 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7736 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7746 const auto &TI =
Context.getTargetInfo();
7747 bool HasSizeMismatch;
7749 if (!TI.isValidGCCRegisterName(Label))
7750 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7751 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7753 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7754 else if (HasSizeMismatch)
7755 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7758 if (!
R->isIntegralType(
Context) && !
R->isPointerType()) {
7760 diag::err_asm_unsupported_register_type)
7775 bool IsPlaceholderVariable =
false;
7781 if (!Decomp.bindings().empty()) {
7782 II = Decomp.bindings()[0].Name;
7796 IsPlaceholderVariable =
true;
7804 if (IsPlaceholderVariable)
7818 bool IsLocalExternDecl = SC ==
SC_Extern &&
7837 : diag::warn_deprecated_register)
7860 const AutoType *AT = TL.getTypePtr();
7864 bool IsMemberSpecialization =
false;
7865 bool IsVariableTemplateSpecialization =
false;
7867 bool IsVariableTemplate =
false;
7875 if (R->getContainedDeducedType())
7896 false, IsMemberSpecialization,
Invalid);
7898 if (TemplateParams) {
7905 if (!TemplateParams->
size() &&
7910 diag::err_template_variable_noparams)
7914 TemplateParams =
nullptr;
7922 IsVariableTemplateSpecialization =
true;
7926 IsVariableTemplate =
true;
7934 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7939 "should have a 'template<>' for this decl");
7942 bool IsExplicitSpecialization =
7953 (IsExplicitSpecialization || IsMemberSpecialization)) {
7955 diag::ext_explicit_specialization_storage_class)
7961 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7967 if (Ctxt->isFunctionOrMethod()) {
7968 FunctionOrMethod = Ctxt;
7971 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7973 AnonStruct = ParentDecl;
7977 if (FunctionOrMethod) {
7981 diag::err_static_data_member_not_allowed_in_local_class)
7982 << Name << RD->getDeclName() << RD->getTagKind();
7984 }
else if (AnonStruct) {
7989 diag::err_static_data_member_not_allowed_in_anon_struct)
7992 }
else if (RD->isUnion()) {
7996 diag_compat::static_data_member_in_union)
8014 diag::err_static_out_of_line)
8027 diag::err_storage_class_for_static_member)
8032 llvm_unreachable(
"C storage class in c++!");
8036 if (IsVariableTemplateSpecialization) {
8038 TemplateParamLists.size() > 0
8039 ? TemplateParamLists[0]->getTemplateLoc()
8042 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8057 if (IsVariableTemplate) {
8060 TemplateParams, NewVD);
8066 if (R->getContainedDeducedType())
8081 unsigned VDTemplateParamLists =
8082 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8083 if (TemplateParamLists.size() > VDTemplateParamLists)
8085 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8092 }
else if (
CurContext->isFunctionOrMethod()) {
8095 diag::err_inline_declaration_block_scope) << Name
8100 : diag::compat_pre_cxx17_inline_variable);
8111 if (IsLocalExternDecl) {
8114 B->setLocalExternDecl();
8119 bool EmitTLSUnsupportedError =
false;
8132 diag::err_thread_non_global)
8134 else if (!
Context.getTargetInfo().isTLSSupported()) {
8139 EmitTLSUnsupportedError =
true;
8146 diag::err_thread_unsupported);
8157 diag::err_constexpr_wrong_decl_kind)
8158 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8168 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8175 diag::err_constinit_local_variable);
8179 ConstInitAttr::Keyword_constinit));
8197 diag::warn_static_local_in_extern_inline);
8203 if (IsVariableTemplateSpecialization)
8208 else if (IsMemberSpecialization)
8223 B->setModulePrivate();
8233 diag::err_opencl_unknown_type_specifier)
8243 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8244 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8262 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8289 if (R->isFunctionPointerType())
8294 if (EmitTLSUnsupportedError &&
8297 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8299 diag::err_thread_unsupported);
8301 if (EmitTLSUnsupportedError &&
8308 (NewVD->
hasAttr<CUDASharedAttr>() ||
8309 NewVD->
hasAttr<CUDAConstantAttr>())) {
8317 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8318 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8323 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8330 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8342 IsMemberSpecialization ||
8343 IsVariableTemplateSpecialization);
8357 if (IsMemberSpecialization && !IsVariableTemplate &&
8358 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8375 !IsVariableTemplateSpecialization) {
8386 if (NewTemplate && IsMemberSpecialization) {
8398 if (!IsPlaceholderVariable)
8429 if (IsMemberSpecialization) {
8434 ->setMemberSpecialization();
8453 Decl *ManglingContextDecl;
8454 std::tie(MCtx, ManglingContextDecl) =
8546 return !Diags.
isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8558 NamedDecl *ShadowedDecl = R.getFoundDecl();
8572 NamedDecl *ShadowedDecl = R.getFoundDecl();
8581 NamedDecl *ShadowedDecl = R.getFoundDecl();
8590 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8591 if (
const auto *MD =
8595 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8601 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8604 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8609 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8610 if (shadowedVar->isExternC()) {
8613 for (
auto *I : shadowedVar->redecls())
8614 if (I->isFileVarDecl()) {
8622 unsigned WarningDiag = diag::warn_decl_shadow;
8625 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8631 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8637 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8643 ->ShadowingDecls.push_back({D, VD});
8654 ->ShadowingDecls.push_back({D, ShadowedDecl});
8660 bool HasLocalStorage =
false;
8661 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8662 HasLocalStorage = VD->hasLocalStorage();
8663 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8667 if (HasLocalStorage) {
8672 ParentDC && !ParentDC->
Equals(OldDC);
8713 Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8715 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8722 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8728 Diag(Shadow.VD->getLocation(),
8729 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8730 : diag::warn_decl_shadow)
8731 << Shadow.VD->getDeclName()
8734 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8735 << Shadow.VD->getDeclName() << 0;
8738 Diag(Shadow.VD->getLocation(),
8740 : diag::warn_decl_shadow_uncaptured_local)
8741 << Shadow.VD->getDeclName()
8767 auto *DRE = dyn_cast<DeclRefExpr>(E);
8771 auto I = ShadowingDecls.find(D);
8772 if (I == ShadowingDecls.end())
8774 const NamedDecl *ShadowedDecl = I->second;
8776 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8781 ShadowingDecls.erase(I);
8789 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8848 assert(Prev &&
"should have found a previous declaration to diagnose");
8850 Prev = FD->getFirstDecl();
8854 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8876 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8888 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8908 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8918 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8926 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8942 if (
T->isUndeducedType())
8948 if (
T->isObjCObjectType()) {
8951 T =
Context.getObjCObjectPointerType(
T);
8982 if (NewVD->
hasAttr<BlocksAttr>()) {
8987 if (
T->isBlockPointerType()) {
8990 if (!
T.isConstQualified()) {
8991 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8997 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
9006 if (!
T->isSamplerT() && !
T->isDependentType() &&
9013 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
9014 <<
Scope <<
"global or constant";
9016 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
9017 <<
Scope <<
"constant";
9031 bool AllowFunctionScopeLocalVariables =
9034 "__cl_clang_function_scope_local_variables",
getLangOpts());
9035 if (AllowFunctionScopeLocalVariables) {
9042 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9054 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9079 && !NewVD->
hasAttr<BlocksAttr>()) {
9090 if (
T->isWebAssemblyTableType()) {
9101 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
9102 if (!ATy || ATy->getZExtSize() != 0) {
9104 diag::err_typecheck_wasm_table_must_have_zero_length);
9114 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9117 ArrayT && ArrayT->isZeroSize()) {
9123 bool isVM =
T->isVariablyModifiedType();
9124 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9130 bool SizeIsNegative;
9131 llvm::APSInt Oversized;
9136 FixedT = FixedTInfo->
getType();
9137 else if (FixedTInfo) {
9143 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9176 if (
T->isVoidType()) {
9188 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9194 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9196 << diag::NotAllowedBlockVarReason::VariablyModifiedType;
9208 !
T->isDependentType() &&
9210 diag::err_constexpr_var_non_literal)) {
9216 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9226 llvm::StringMap<bool> CallerFeatureMap;
9227 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9229 CallerFeatureMap)) {
9237 llvm::StringMap<bool> CallerFeatureMap;
9238 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9243 if (
T.hasAddressSpace() &&
9277 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9282 Name =
Context.DeclarationNames.getCXXDestructorName(
9283 Context.getCanonicalTagType(BaseRecord));
9288 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9295 if (Overridden.insert(BaseMD).second) {
9312 return !Overridden.empty();
9318 struct ActOnFDArgs {
9332 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9333 CXXRecordDecl *Parent)
9334 : Context(Context), OriginalFD(TypoFD),
9337 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9341 SmallVector<unsigned, 1> MismatchedParams;
9343 CDeclEnd = candidate.
end();
9344 CDecl != CDeclEnd; ++CDecl) {
9345 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9349 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9350 CXXRecordDecl *Parent = MD->getParent();
9353 }
else if (!ExpectedParent) {
9362 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9363 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9367 ASTContext &Context;
9368 FunctionDecl *OriginalFD;
9369 CXXRecordDecl *ExpectedParent;
9389 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9397 IsLocalFriend ? diag::err_no_matching_local_friend :
9399 diag::err_member_decl_does_not_match;
9411 "Cannot have an ambiguity in previous-declaration lookup");
9413 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9415 if (!Prev.
empty()) {
9424 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9425 NearMatches.push_back(std::make_pair(FD, ParamNum));
9433 IsLocalFriend ?
nullptr : NewDC))) {
9440 CDeclEnd = Correction.
end();
9441 CDecl != CDeclEnd; ++CDecl) {
9461 ExtraArgs.S, ExtraArgs.D,
9464 ExtraArgs.AddToScope);
9472 Decl *Canonical =
Result->getCanonicalDecl();
9475 if ((*I)->getCanonicalDecl() == Canonical)
9482 SemaRef.
PDiag(IsLocalFriend
9483 ? diag::err_no_matching_local_friend_suggest
9484 : diag::err_member_decl_does_not_match_suggest)
9485 << Name << NewDC << IsDefinition);
9498 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9501 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9507 bool NewFDisConst = NewMD && NewMD->
isConst();
9510 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9511 NearMatch != NearMatchEnd; ++NearMatch) {
9514 bool FDisConst = MD && MD->
isConst();
9515 bool IsMember = MD || !IsLocalFriend;
9518 if (
unsigned Idx = NearMatch->second) {
9522 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9523 : diag::note_local_decl_close_param_match)
9526 }
else if (FDisConst != NewFDisConst) {
9528 diag::note_member_def_close_const_match)
9533 else if (FTI.hasMethodTypeQualifiers() &&
9534 FTI.getConstQualifierLoc().isValid())
9538 IsMember ? diag::note_member_def_close_match
9539 : diag::note_local_decl_close_match);
9547 default: llvm_unreachable(
"Unknown storage class!");
9552 diag::err_typecheck_sclass_func);
9569 diag::err_static_block_func);
9585 bool &IsVirtualOkay) {
9599 diag::err_c23_constexpr_not_variable);
9602 diag::err_constexpr_wrong_decl_kind)
9603 <<
static_cast<int>(ConstexprKind);
9624 (!R->getAsAdjusted<
FunctionType>() && R->isFunctionProtoType());
9627 "Strict prototypes are required");
9648 "Constructors can only be declared in a member context");
9654 isInline,
false, ConstexprKind,
9665 false, ConstexprKind,
9666 TrailingRequiresClause);
9669 if (
Record->isBeingDefined())
9678 IsVirtualOkay =
true;
9690 true, ConstexprKind, TrailingRequiresClause);
9696 diag::err_conv_function_not_member);
9704 IsVirtualOkay =
true;
9709 TrailingRequiresClause);
9736 IsVirtualOkay = !Ret->isStatic();
9750 true , ConstexprKind, TrailingRequiresClause);
9767 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9775 if (Names.end() !=
Match)
9780 }
while (DesugaredTy != Ty);
9819 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9821 bool IsStandardLayoutType =
true;
9827 if (!CXXRec->hasDefinition())
9828 CXXRec = CXXRec->getTemplateInstantiationPattern();
9829 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9830 IsStandardLayoutType =
false;
9833 !IsStandardLayoutType)
9881 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9895 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9908 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9917 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9934 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9942 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9943 PT = Typedef->desugar();
9965 HistoryStack.push_back(
nullptr);
9970 VisitStack.push_back(PD);
9971 assert(VisitStack.back() &&
"First decl null?");
9974 const Decl *
Next = VisitStack.pop_back_val();
9976 assert(!HistoryStack.empty());
9978 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9979 ValidTypes.insert(Hist->getType().getTypePtr());
9988 HistoryStack.push_back(Field);
9990 QualType FieldTy = Field->getType();
9994 "Unexpected type.");
10003 VisitStack.push_back(
nullptr);
10005 for (
const auto *FD : RD->
fields()) {
10016 VisitStack.push_back(FD);
10027 S.
Diag(Param->getLocation(),
10028 diag::err_record_with_pointers_kernel_param)
10032 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
10035 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
10036 << PD->getDeclName();
10041 I = HistoryStack.begin() + 1,
10042 E = HistoryStack.end();
10055 }
while (!VisitStack.empty());
10072 (LangOpts.CPlusPlus &&
10082 unsigned BuiltinID) {
10083 switch (BuiltinID) {
10084 case Builtin::BI__GetExceptionInfo:
10088 case Builtin::BIaddressof:
10089 case Builtin::BI__addressof:
10090 case Builtin::BIforward:
10091 case Builtin::BIforward_like:
10092 case Builtin::BImove:
10093 case Builtin::BImove_if_noexcept:
10094 case Builtin::BIas_const: {
10099 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10111 bool &AddToScope) {
10114 assert(R->isFunctionType());
10119 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10121 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10122 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10123 TemplateParamLists.back() = Invented;
10125 TemplateParamLists.push_back(Invented);
10135 diag::err_invalid_thread)
10143 bool isFriend =
false;
10145 bool isMemberSpecialization =
false;
10146 bool isFunctionTemplateSpecialization =
false;
10148 bool HasExplicitTemplateArgs =
false;
10151 bool isVirtualOkay =
false;
10158 if (!NewFD)
return nullptr;
10168 if (IsLocalExternDecl)
10178 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10206 if (isVirtual && Parent->isUnion()) {
10210 if ((Parent->isClass() || Parent->isStruct()) &&
10211 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10214 if (
auto *Def = Parent->getDefinition())
10215 Def->setInitMethod(
true);
10220 isMemberSpecialization =
false;
10221 isFunctionTemplateSpecialization =
false;
10236 isMemberSpecialization,
Invalid);
10237 if (TemplateParams) {
10242 if (TemplateParams->
size() > 0) {
10250 }
else if (TemplateId) {
10267 Name, TemplateParams,
10273 if (TemplateParamLists.size() > 1) {
10280 isFunctionTemplateSpecialization =
true;
10282 if (TemplateParamLists.size() > 0)
10302 << Name << RemoveRange
10308 HasExplicitTemplateArgs =
true;
10315 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10321 if (TemplateParamLists.size() > 0)
10326 if (isFriend && TemplateId)
10327 isFunctionTemplateSpecialization =
true;
10333 if (isFunctionTemplateSpecialization && TemplateId) {
10334 HasExplicitTemplateArgs =
true;
10365 if (!isVirtualOkay) {
10367 diag::err_virtual_non_function);
10371 diag::err_virtual_out_of_class)
10377 diag::err_virtual_member_function_template)
10396 diag::err_inline_declaration_block_scope) << Name
10410 diag::err_explicit_out_of_class)
10417 diag::err_explicit_non_ctor_or_conv_function)
10435 <<
static_cast<int>(ConstexprKind);
10446 diag::err_invalid_consteval_decl_kind)
10454 if (isFunctionTemplateSpecialization) {
10457 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10503 if (!isFriend && SC !=
SC_None) {
10511 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10513 diag::ext_explicit_specialization_storage_class)
10520 "Out-of-line member function should be a CXXMethodDecl");
10537 ? diag::ext_static_out_of_line
10538 : diag::err_static_out_of_line)
10563 PendingInlineFuncDecls.insert(NewFD);
10570 isMemberSpecialization ||
10571 isFunctionTemplateSpecialization);
10582 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
10609 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10611 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10612 Param->setDeclContext(NewFD);
10613 Params.push_back(Param);
10615 if (Param->isInvalidDecl())
10628 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10633 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10638 DeclContext *TagDC = TD->getLexicalDeclContext();
10642 TD->setDeclContext(NewFD);
10650 if (TagDC != PrototypeTagContext)
10651 TD->setLexicalDeclContext(TagDC);
10665 for (
const auto &AI : FT->param_types()) {
10668 Param->setScopeInfo(0, Params.size());
10669 Params.push_back(Param);
10672 assert(R->isFunctionNoProtoType() && NewFD->
getNumParams() == 0 &&
10673 "Should not need args for typedef of non-prototype fn");
10677 NewFD->setParams(Params);
10702 !NewFD->
hasAttr<SectionAttr>())
10703 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10709 !NewFD->
hasAttr<SectionAttr>()) {
10710 NewFD->
addAttr(SectionAttr::CreateImplicit(
10712 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10723 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10724 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10729 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10738 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10739 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10740 !NewTVA->isDefaultVersion() &&
10741 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10743 AddToScope =
false;
10755 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10770 isMemberSpecialization,
10777 "previous declaration set still overloaded");
10789 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10812 diag::ext_operator_new_delete_declared_inline)
10839 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10851 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10859 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10863 Diag(TRC->getBeginLoc(),
10864 diag::err_constrained_non_templated_function);
10881 if (isFunctionTemplateSpecialization) {
10882 bool isDependentSpecialization =
false;
10887 isDependentSpecialization =
10889 (HasExplicitTemplateArgs &&
10890 TemplateSpecializationType::
10891 anyInstantiationDependentTemplateArguments(
10893 assert((!isDependentSpecialization ||
10894 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10895 "dependent friend function specialization without template "
10901 isDependentSpecialization =
10906 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10907 if (isDependentSpecialization) {
10914 NewFD, ExplicitTemplateArgs,
Previous))
10935 isMemberSpecialization,
10944 "previous declaration set still overloaded");
10985 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
11031 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
11032 AddToScope = ExtraArgs.AddToScope;
11041 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
11042 AddToScope = ExtraArgs.AddToScope;
11048 !isFriend && !isFunctionTemplateSpecialization &&
11049 !isMemberSpecialization) {
11067 if (NewFD->
hasAttr<HLSLShaderAttr>())
11071 if (
const NoInlineAttr *NoInline = NewFD->
getAttr<NoInlineAttr>()) {
11073 QualType ParamTy = PVD->getType().getNonReferenceType();
11081 Diag(PVD->getLocation(),
11082 diag::err_hlsl_resource_param_in_noinline_function)
11084 Diag(NoInline->getLocation(), diag::note_attribute);
11094 if (
unsigned BuiltinID = II->getBuiltinID()) {
11095 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11096 if (!InStdNamespace &&
11101 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11102 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11109 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11111 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11116 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11132 if (NewFD->
hasAttr<OverloadableAttr>() &&
11135 diag::err_attribute_overloadable_no_prototype)
11137 NewFD->
dropAttr<OverloadableAttr>();
11170 isMemberSpecialization ||
11171 isFunctionTemplateSpecialization,
11182 Context.setcudaConfigureCallDecl(NewFD);
11184 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11190 Context.setcudaGetParameterBufferDecl(NewFD);
11192 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11198 Context.setcudaLaunchDeviceDecl(NewFD);
11249 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11269 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11271 QualType ElemTy = PipeTy->getElementType();
11273 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11279 if (
Context.getTargetInfo().getTriple().isWasm()) {
11281 Diag(Param->getTypeSpecStartLoc(),
11282 diag::err_wasm_table_as_function_parameter);
11290 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11291 if (NewFD->
hasAttr<ConstructorAttr>()) {
11292 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11294 NewFD->
dropAttr<AvailabilityAttr>();
11296 if (NewFD->
hasAttr<DestructorAttr>()) {
11297 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11299 NewFD->
dropAttr<AvailabilityAttr>();
11310 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11314 Diag(NBA->getLocation(),
11315 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11316 << NBA->getSpelling();
11319 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11320 << NBA->getSpelling();
11329 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11353 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11357 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11368 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11369 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11379 bool IsDefinition) {
11382 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11384 return SectionAttr::CreateImplicit(
11386 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11434 auto *VD = dyn_cast<ValueDecl>(D);
11435 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11436 return !VD || !PrevVD ||
11438 PrevVD->getType());
11446 const auto *TA = FD->
getAttr<TargetAttr>();
11447 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11449 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11462 for (
const auto &Feat : ParseInfo.
Features) {
11463 auto BareFeat = StringRef{Feat}.substr(1);
11464 if (Feat[0] ==
'-') {
11466 <<
Feature << (
"no-" + BareFeat);
11486 for (
auto &Feat : ParseInfo.
Features)
11487 Feats.push_back(StringRef{Feat}.substr(1));
11490 TVA->getFeatures(Feats);
11492 for (
const auto &Feat : Feats) {
11512 case attr::ArmLocallyStreaming:
11517 case attr::NonNull:
11518 case attr::NoThrow:
11527 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11528 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11529 <<
static_cast<unsigned>(MVKind) << A;
11531 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11536 switch (A->getKind()) {
11537 case attr::CPUDispatch:
11538 case attr::CPUSpecific:
11541 return Diagnose(S, A);
11545 return Diagnose(S, A);
11547 case attr::TargetVersion:
11550 return Diagnose(S, A);
11552 case attr::TargetClones:
11555 return Diagnose(S, A);
11559 return Diagnose(S, A);
11572 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11573 enum DoesntSupport {
11580 DefaultedFuncs = 6,
11581 ConstexprFuncs = 7,
11582 ConstevalFuncs = 8,
11594 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11597 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11605 if (!TemplatesSupported &&
11607 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11610 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11611 if (NewCXXFD->isVirtual())
11612 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11616 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11620 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11625 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11629 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11633 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11634 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11638 QualType NewReturnType = NewType->getReturnType();
11641 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11654 bool ArmStreamingCCMismatched =
false;
11655 if (OldFPT && NewFPT) {
11662 ArmStreamingCCMismatched =
true;
11665 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11668 QualType OldReturnType = OldType->getReturnType();
11670 if (OldReturnType != NewReturnType)
11671 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11674 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11677 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11680 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11703 bool IsCPUSpecificCPUDispatchMVKind =
11707 if (CausesMV && OldFD &&
11715 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11722 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11724 S.
PDiag(diag::note_multiversioning_caused_here)),
11726 S.
PDiag(diag::err_multiversion_doesnt_support)
11727 <<
static_cast<unsigned>(MVKind)),
11729 S.
PDiag(diag::err_multiversion_diff)),
11731 !IsCPUSpecificCPUDispatchMVKind,
11744 "Function lacks multiversion attribute");
11745 const auto *TA = FD->
getAttr<TargetAttr>();
11746 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11749 if (TA && !TA->isDefaultVersion())
11786 To->
addAttr(TargetVersionAttr::CreateImplicit(
11797 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11798 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11799 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11800 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11802 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11811 if (NewTA && !NewTA->isDefaultVersion() &&
11812 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11829 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11830 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11839 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11847 OldTA->getFeaturesStr());
11851 NewTA->getFeaturesStr());
11854 if (OldParsed == NewParsed) {
11862 for (
const auto *FD : OldFD->
redecls()) {
11863 const auto *CurTA = FD->
getAttr<TargetAttr>();
11864 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11868 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11869 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11871 << (NewTA ? 0 : 2);
11872 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11919 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11935 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11936 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11943 NewTA->getFeaturesStr());
11948 NewTVA->getFeatures(NewFeats);
11949 llvm::sort(NewFeats);
11952 bool UseMemberUsingDeclRules =
11955 bool MayNeedOverloadableChecks =
11964 if (MayNeedOverloadableChecks &&
11965 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11968 switch (NewMVKind) {
11971 "Only target_clones can be omitted in subsequent declarations");
11974 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11975 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11984 CurTA->getFeaturesStr());
11986 if (CurParsed == NewParsed) {
11995 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11996 if (CurTVA->getName() == NewTVA->getName()) {
12003 CurTVA->getFeatures(CurFeats);
12004 llvm::sort(CurFeats);
12006 if (CurFeats == NewFeats) {
12012 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
12014 if (NewFeats.empty())
12017 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
12019 CurClones->getFeatures(CurFeats, I);
12020 llvm::sort(CurFeats);
12022 if (CurFeats == NewFeats) {
12033 assert(NewClones &&
"MultiVersionKind does not match attribute type");
12034 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
12035 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
12036 !std::equal(CurClones->featuresStrs_begin(),
12037 CurClones->featuresStrs_end(),
12038 NewClones->featuresStrs_begin())) {
12044 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
12046 CurTVA->getFeatures(CurFeats);
12047 llvm::sort(CurFeats);
12050 if (CurFeats.empty())
12053 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
12055 NewClones->getFeatures(NewFeats, I);
12056 llvm::sort(NewFeats);
12058 if (CurFeats == NewFeats) {
12074 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
12075 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12080 CurFD->
hasAttr<CPUDispatchAttr>()) {
12081 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12083 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12084 NewCPUDisp->cpus_begin(),
12086 return Cur->getName() == New->getName();
12101 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12103 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12104 NewCPUSpec->cpus_begin(),
12106 return Cur->getName() == New->getName();
12117 if (CurII == NewII) {
12187 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12188 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12189 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12190 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12191 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12201 NewTVA->isDefaultVersion())) {
12202 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12210 if (NewTA && TI.
getTriple().isAArch64())
12237 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12250 if (OldFD->
isUsed(
false)) {
12252 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12274 bool IsPure = NewFD->
hasAttr<PureAttr>();
12275 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12278 if (!IsPure && !IsConst)
12285 if (IsPure && IsConst) {
12295 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12301 bool IsMemberSpecialization,
12304 "Variably modified return types are not handled here");
12309 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12314 bool MayNeedOverloadableChecks =
false;
12326 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12328 OldDecl = Candidate;
12331 MayNeedOverloadableChecks =
true;
12356 OldDecl =
Previous.getFoundDecl();
12357 MergeTypeWithPrevious =
false;
12360 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12361 NewFD->
hasAttr<OverloadableAttr>()) {
12363 MayNeedOverloadableChecks =
true;
12375 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12426 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12427 if (!OldMD || !OldMD->
isStatic()) {
12462 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12463 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12466 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12475 NewFD->
setAccess(OldTemplateDecl->getAccess());
12476 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12481 if (IsMemberSpecialization &&
12484 assert(OldTemplateDecl->isMemberSpecialization());
12487 if (OldFD->isDeleted()) {
12489 assert(OldFD->getCanonicalDecl() == OldFD);
12491 OldFD->setDeletedAsWritten(
false);
12505 !NewFD->
getAttr<OverloadableAttr>()) {
12509 return ND->hasAttr<OverloadableAttr>();
12511 "Non-redecls shouldn't happen without overloadable present");
12514 const auto *FD = dyn_cast<FunctionDecl>(ND);
12515 return FD && !FD->
hasAttr<OverloadableAttr>();
12518 if (OtherUnmarkedIter !=
Previous.end()) {
12520 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12521 Diag((*OtherUnmarkedIter)->getLocation(),
12522 diag::note_attribute_overloadable_prev_overload)
12532 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12535 if (NewFD->
hasAttr<SYCLExternalAttr>())
12545 dyn_cast<CXXDestructorDecl>(NewFD)) {
12553 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12558 Context.DeclarationNames.getCXXDestructorName(ClassType);
12565 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12566 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12572 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12578 if (!
Method->isFunctionTemplateSpecialization() &&
12579 !
Method->getDescribedFunctionTemplate() &&
12580 Method->isCanonicalDecl()) {
12587 diag::err_constrained_virtual_method);
12622 if (R->isIncompleteType() && !R->isVoidType())
12625 else if (!R.isPODType(
Context) && !R->isVoidType() &&
12626 !R->isObjCObjectPointerType())
12627 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12640 auto HasNoexcept = [&](
QualType T) ->
bool {
12645 T = RT->getPointeeType();
12646 else if (
T->isAnyPointerType())
12647 T =
T->getPointeeType();
12649 T = MPT->getPointeeType();
12651 if (FPT->isNothrow())
12657 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12659 AnyNoexcept |= HasNoexcept(
T);
12662 diag::warn_cxx17_compat_exception_spec_in_signature)
12667 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12669 if (!Parm->getType()->isDependentType() &&
12670 Parm->hasAttr<CUDAGridConstantAttr>() &&
12671 !(IsKernel && Parm->getType().isConstQualified()))
12672 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12673 diag::err_cuda_grid_constant_not_allowed);
12679 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12689 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12700 ? diag::err_static_main : diag::warn_static_main)
12708 Diag(NoreturnLoc, diag::ext_noreturn_main);
12709 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12721 << FD->
hasAttr<DeviceKernelAttr>();
12726 if (FD->
hasAttr<SYCLExternalAttr>()) {
12728 << FD->
getAttr<SYCLExternalAttr>();
12739 assert(
T->isFunctionType() &&
"function decl is not of function type");
12761 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12786 Diag(start, diag::warn_main_in_named_module)
12798 bool HasExtraParameters = (nparams > 3);
12809 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12810 HasExtraParameters =
false;
12812 if (HasExtraParameters) {
12825 for (
unsigned i = 0; i < nparams; ++i) {
12828 bool mismatch =
true;
12845 mismatch = !qs.
empty();
12874 if (
T.isOSCygMing())
12879 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12887 assert(
T->isFunctionType() &&
"function decl is not of function type");
12896 if (FD->
getName() !=
"DllMain")
12903 FT =
Context.adjustFunctionType(
12908 FT =
Context.adjustFunctionType(FT,
12930 if (
Init->isValueDependent()) {
12931 assert(
Init->containsErrors() &&
12932 "Dependent code should only occur in error-recovery path.");
12935 const Expr *Culprit;
12936 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12944 if (
auto ALE = dyn_cast<ObjCArrayLiteral>(
Init)) {
12945 for (
auto *Elm : ALE->elements()) {
12946 if (!Elm->isConstantInitializer(
Context)) {
12947 Diag(Elm->getExprLoc(),
12948 diag::err_objc_literal_nonconstant_at_file_scope)
12955 if (
auto DLE = dyn_cast<ObjCDictionaryLiteral>(
Init)) {
12956 for (
size_t I = 0, N = DLE->getNumElements(); I != N; ++I) {
12963 diag::err_objc_literal_nonconstant_at_file_scope)
12970 diag::err_objc_literal_nonconstant_at_file_scope)
12978 diag::err_objc_literal_nonconstant_at_file_scope)
12990 class SelfReferenceChecker
12996 bool isReferenceType;
12997 bool isInCXXOperatorCall;
13005 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
13006 S(S), OrigDecl(OrigDecl) {
13009 isReferenceType =
false;
13010 isInCXXOperatorCall =
false;
13011 isInitList =
false;
13012 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
13013 isPODType = VD->getType().isPODType(S.
Context);
13015 isReferenceType = VD->getType()->isReferenceType();
13022 void CheckExpr(Expr *E) {
13023 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
13031 InitFieldIndex.push_back(0);
13032 for (
auto *Child : InitList->
children()) {
13034 ++InitFieldIndex.back();
13036 InitFieldIndex.pop_back();
13041 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
13042 llvm::SmallVector<FieldDecl*, 4> Fields;
13044 bool ReferenceField =
false;
13047 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13048 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
13051 Fields.push_back(FD);
13053 ReferenceField =
true;
13054 Base = ME->getBase()->IgnoreParenImpCasts();
13058 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
13059 if (!DRE || DRE->
getDecl() != OrigDecl)
13063 if (CheckReference && !ReferenceField)
13067 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
13068 for (
const FieldDecl *I : llvm::reverse(Fields))
13069 UsedFieldIndex.push_back(I->getFieldIndex());
13074 for (
auto UsedIter = UsedFieldIndex.begin(),
13075 UsedEnd = UsedFieldIndex.end(),
13076 OrigIter = InitFieldIndex.begin(),
13077 OrigEnd = InitFieldIndex.end();
13078 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
13079 if (*UsedIter < *OrigIter)
13081 if (*UsedIter > *OrigIter)
13086 HandleDeclRefExpr(DRE);
13093 void HandleValue(Expr *E) {
13095 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
13096 HandleDeclRefExpr(DRE);
13100 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
13101 Visit(CO->getCond());
13102 HandleValue(CO->getTrueExpr());
13103 HandleValue(CO->getFalseExpr());
13107 if (BinaryConditionalOperator *BCO =
13108 dyn_cast<BinaryConditionalOperator>(E)) {
13109 Visit(BCO->getCond());
13110 HandleValue(BCO->getFalseExpr());
13114 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
13115 if (Expr *SE = OVE->getSourceExpr())
13120 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
13121 if (BO->getOpcode() == BO_Comma) {
13122 Visit(BO->getLHS());
13123 HandleValue(BO->getRHS());
13136 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13140 Base = ME->getBase()->IgnoreParenImpCasts();
13142 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13143 HandleDeclRefExpr(DRE);
13152 void VisitDeclRefExpr(DeclRefExpr *E) {
13153 if (isReferenceType)
13154 HandleDeclRefExpr(E);
13157 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13163 Inherited::VisitImplicitCastExpr(E);
13166 void VisitMemberExpr(MemberExpr *E) {
13168 if (CheckInitListMemberExpr(E,
true ))
13177 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13178 bool Warn = (MD && !MD->
isStatic());
13180 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13183 Base = ME->getBase()->IgnoreParenImpCasts();
13186 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13188 HandleDeclRefExpr(DRE);
13197 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13198 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13202 return Inherited::VisitCXXOperatorCallExpr(E);
13206 HandleValue(Arg->IgnoreParenImpCasts());
13210 if (!isInCXXOperatorCall) {
13211 Inherited::VisitLambdaExpr(E);
13216 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13217 HandleDeclRefExpr(DRE);
13222 void VisitUnaryOperator(UnaryOperator *E) {
13236 Inherited::VisitUnaryOperator(E);
13239 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13241 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13243 Expr *ArgExpr = E->
getArg(0);
13244 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13245 if (ILE->getNumInits() == 1)
13246 ArgExpr = ILE->getInit(0);
13247 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13248 if (ICE->getCastKind() == CK_NoOp)
13249 ArgExpr = ICE->getSubExpr();
13250 HandleValue(ArgExpr);
13253 Inherited::VisitCXXConstructExpr(E);
13256 void VisitCallExpr(CallExpr *E) {
13259 HandleValue(E->
getArg(0));
13263 Inherited::VisitCallExpr(E);
13266 void VisitBinaryOperator(BinaryOperator *E) {
13268 HandleValue(E->
getLHS());
13273 Inherited::VisitBinaryOperator(E);
13279 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13284 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13286 if (OrigDecl != ReferenceDecl)
return;
13288 if (isReferenceType) {
13289 diag = diag::warn_uninit_self_reference_in_reference_init;
13291 diag = diag::warn_static_self_reference_in_init;
13295 diag = diag::warn_uninit_self_reference_in_init;
13309 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13319 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13320 VD && VD->isConstexpr() && VD->isFileVarDecl())
13328 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13329 if (ICE->getCastKind() == CK_LValueToRValue)
13330 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13331 if (DRE->
getDecl() == OrigDecl)
13334 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13341 struct VarDeclOrName {
13343 DeclarationName Name;
13345 friend const Sema::SemaDiagnosticBuilder &
13346 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13347 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13357 bool IsInitCapture = !VDecl;
13359 "init captures are expected to be deduced prior to initialization");
13361 VarDeclOrName VN{VDecl, Name};
13364 assert(
Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13368 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13369 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13370 << (int)
Deduced->getContainedAutoType()->getKeyword()
13377 assert(VDecl &&
"no init for init capture deduction?");
13392 DeduceInits =
Init;
13394 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13396 DeduceInits = PL->exprs();
13399 assert(VDecl &&
"non-auto type for init capture deduction?");
13410 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13411 DeduceInits = IL->inits();
13415 if (DeduceInits.empty()) {
13418 Diag(
Init->getBeginLoc(), IsInitCapture
13419 ? diag::err_init_capture_no_expression
13420 : diag::err_auto_var_init_no_expression)
13421 << VN <<
Type << Range;
13425 if (DeduceInits.size() > 1) {
13426 Diag(DeduceInits[1]->getBeginLoc(),
13427 IsInitCapture ? diag::err_init_capture_multiple_expressions
13428 : diag::err_auto_var_init_multiple_expressions)
13429 << VN <<
Type << Range;
13433 Expr *DeduceInit = DeduceInits[0];
13435 Diag(
Init->getBeginLoc(), IsInitCapture
13436 ? diag::err_init_capture_paren_braces
13437 : diag::err_auto_var_init_paren_braces)
13443 bool DefaultedAnyToId =
false;
13445 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13447 if (
Result.isInvalid()) {
13451 DefaultedAnyToId =
true;
13461 Type.getQualifiers());
13469 if (!IsInitCapture)
13472 Diag(Range.getBegin(),
13473 diag::err_init_capture_deduction_failure_from_init_list)
13479 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13494 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13497 return DeducedType;
13502 assert(!
Init || !
Init->containsErrors());
13506 if (DeducedType.
isNull()) {
13515 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13539 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13540 Init = EWC->getSubExpr();
13542 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13543 Init = CE->getSubExpr();
13548 "shouldn't be called if type doesn't have a non-trivial C struct");
13549 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13550 for (
auto *I : ILE->inits()) {
13551 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13552 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13578bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13584 return FD->
hasAttr<UnavailableAttr>();
13587struct DiagNonTrivalCUnionDefaultInitializeVisitor
13594 DiagNonTrivalCUnionDefaultInitializeVisitor(
13597 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13600 const FieldDecl *FD,
bool InNonTrivialUnion) {
13603 InNonTrivialUnion);
13604 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13607 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13608 bool InNonTrivialUnion) {
13609 if (InNonTrivialUnion)
13611 << 1 << 0 << QT << FD->
getName();
13614 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13615 if (InNonTrivialUnion)
13617 << 1 << 0 << QT << FD->
getName();
13620 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13622 if (RD->isUnion()) {
13623 if (OrigLoc.isValid()) {
13624 bool IsUnion =
false;
13625 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13626 IsUnion = OrigRD->isUnion();
13627 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13628 << 0 << OrigTy << IsUnion << UseContext;
13630 OrigLoc = SourceLocation();
13632 InNonTrivialUnion =
true;
13635 if (InNonTrivialUnion)
13636 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13639 for (
const FieldDecl *FD : RD->fields())
13640 if (!shouldIgnoreForRecordTriviality(FD))
13641 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13644 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13649 SourceLocation OrigLoc;
13654struct DiagNonTrivalCUnionDestructedTypeVisitor
13657 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13659 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13660 SourceLocation OrigLoc,
13663 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13666 const FieldDecl *FD,
bool InNonTrivialUnion) {
13669 InNonTrivialUnion);
13670 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13673 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13674 bool InNonTrivialUnion) {
13675 if (InNonTrivialUnion)
13677 << 1 << 1 << QT << FD->
getName();
13680 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13681 if (InNonTrivialUnion)
13683 << 1 << 1 << QT << FD->
getName();
13686 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13688 if (RD->isUnion()) {
13689 if (OrigLoc.isValid()) {
13690 bool IsUnion =
false;
13691 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13692 IsUnion = OrigRD->isUnion();
13693 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13694 << 1 << OrigTy << IsUnion << UseContext;
13696 OrigLoc = SourceLocation();
13698 InNonTrivialUnion =
true;
13701 if (InNonTrivialUnion)
13702 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13705 for (
const FieldDecl *FD : RD->fields())
13706 if (!shouldIgnoreForRecordTriviality(FD))
13707 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13710 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13711 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13712 bool InNonTrivialUnion) {}
13717 SourceLocation OrigLoc;
13722struct DiagNonTrivalCUnionCopyVisitor
13724 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13726 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13728 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13731 const FieldDecl *FD,
bool InNonTrivialUnion) {
13734 InNonTrivialUnion);
13735 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13738 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13739 bool InNonTrivialUnion) {
13740 if (InNonTrivialUnion)
13742 << 1 << 2 << QT << FD->
getName();
13745 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13746 if (InNonTrivialUnion)
13748 << 1 << 2 << QT << FD->
getName();
13751 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13753 if (RD->isUnion()) {
13754 if (OrigLoc.isValid()) {
13755 bool IsUnion =
false;
13756 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13757 IsUnion = OrigRD->isUnion();
13758 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13759 << 2 << OrigTy << IsUnion << UseContext;
13761 OrigLoc = SourceLocation();
13763 InNonTrivialUnion =
true;
13766 if (InNonTrivialUnion)
13767 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13770 for (
const FieldDecl *FD : RD->fields())
13771 if (!shouldIgnoreForRecordTriviality(FD))
13772 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13775 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13776 if (InNonTrivialUnion)
13778 << 1 << 2 << QT << FD->
getName();
13782 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13783 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13784 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13785 bool InNonTrivialUnion) {}
13790 SourceLocation OrigLoc;
13799 unsigned NonTrivialKind) {
13803 "shouldn't be called if type doesn't have a non-trivial C union");
13807 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13808 .visit(QT,
nullptr,
false);
13811 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13812 .visit(QT,
nullptr,
false);
13814 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13815 .visit(QT,
nullptr,
false);
13839 bool TargetIsInline = Dcl->
isInline();
13840 bool TargetWasTemplated =
13857 TargetWasTemplated =
13867 if (!TargetIsInline || TargetWasTemplated)
13877 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13878 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13884 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13885 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13907 T =
T.getNonReferenceType();
13908 if (
T->isFunctionType())
13910 if (!
T.isConstant(Ctx))
13912 if (
T->isPointerType())
13930 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13931 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13943 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13944 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13950 llvm::scope_exit ResetDeclForInitializer([
this]() {
13961 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13962 if (!
Method->isInvalidDecl()) {
13964 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13965 <<
Method->getDeclName() <<
Init->getSourceRange();
13966 Method->setInvalidDecl();
13971 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13973 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13982 if (
Expr *E = Recovery.
get())
13989 Context.AMDGPUFeaturePredicateTy) {
13991 diag::err_amdgcn_predicate_type_is_not_constructible)
13998 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13999 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
14006 if (
Init->containsErrors()) {
14015 "decl should be invalidated when deduce fails");
14027 if (VDecl->
hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
14034 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
14054 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
14055 BaseDeclType = Array->getElementType();
14057 diag::err_typecheck_decl_incomplete_type)) {
14064 diag::err_abstract_type_in_decl,
14082 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
14091 if (Def != VDecl &&
14111 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
14114 diag::note_previous_initializer)
14139 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14140 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14146 if (!
HLSL().handleInitialization(VDecl,
Init))
14158 if (!
Result.isUsable()) {
14166 bool InitializedFromParenListExpr =
false;
14167 bool IsParenListInit =
false;
14174 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14176 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14177 InitializedFromParenListExpr =
true;
14178 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14179 Args = CXXDirectInit->getInitExprs();
14180 InitializedFromParenListExpr =
true;
14187 if (!
Result.isUsable()) {
14207 IsParenListInit = !InitSeq.
steps().empty() &&
14211 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14213 Context.getAsIncompleteArrayType(VDeclType) &&
14214 Context.getAsIncompleteArrayType(
Init->getType())) {
14243 if (VDecl->
hasAttr<BlocksAttr>())
14256 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14257 Init->getBeginLoc()))
14258 FSI->markSafeWeakUse(
Init);
14279 if (!
Result.isUsable()) {
14319 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14320 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14322 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14357 <<
Init->getSourceRange();
14373 diag::ext_in_class_initializer_float_type_cxx11)
14374 << DclT <<
Init->getSourceRange();
14376 diag::note_in_class_initializer_float_type_cxx11)
14379 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14380 << DclT <<
Init->getSourceRange();
14383 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14384 <<
Init->getSourceRange();
14391 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14392 << DclT <<
Init->getSourceRange()
14398 << DclT <<
Init->getSourceRange();
14411 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14419 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14432 if (!InitType.
isNull() &&
14450 if (InitializedFromParenListExpr) {
14451 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14474 VarDecl *VD = dyn_cast<VarDecl>(D);
14478 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14479 for (
auto *BD : DD->bindings())
14480 BD->setInvalidDecl();
14493 Context.getBaseElementType(Ty),
14494 diag::err_typecheck_decl_incomplete_type)) {
14501 diag::err_abstract_type_in_decl,
14516 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14520 Diag(Var->getLocation(),
14521 diag::err_amdgcn_predicate_type_is_not_constructible)
14523 Var->setInvalidDecl();
14532 dyn_cast<DecompositionDecl>(RealDecl)->getRSquareLoc();
14534 RSquareLoc,
PP.getSourceManager(),
PP.getLangOpts()))
14535 Loc =
Next->getLocation();
14536 Diag(Loc, diag::err_decomp_decl_requires_init) << Var;
14537 Var->setInvalidDecl();
14553 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14554 !Var->isThisDeclarationADemotedDefinition()) {
14555 if (Var->isStaticDataMember()) {
14559 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14560 Diag(Var->getLocation(),
14561 diag::err_constexpr_static_mem_var_requires_init)
14563 Var->setInvalidDecl();
14567 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14568 Var->setInvalidDecl();
14575 if (!Var->isInvalidDecl() &&
14577 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14578 bool HasConstExprDefaultConstructor =
false;
14579 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14580 for (
auto *Ctor : RD->ctors()) {
14581 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14582 Ctor->getMethodQualifiers().getAddressSpace() ==
14584 HasConstExprDefaultConstructor =
true;
14588 if (!HasConstExprDefaultConstructor) {
14589 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14590 Var->setInvalidDecl();
14596 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14597 Diag(Var->getLocation(), diag::err_specialization_const);
14598 Var->setInvalidDecl();
14602 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14603 if (Var->getStorageClass() ==
SC_Extern) {
14604 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14606 Var->setInvalidDecl();
14610 diag::err_typecheck_decl_incomplete_type)) {
14611 Var->setInvalidDecl();
14614 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14615 if (!RD->hasTrivialDefaultConstructor()) {
14616 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14617 Var->setInvalidDecl();
14627 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14634 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14650 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14652 diag::err_typecheck_decl_incomplete_type))
14653 Var->setInvalidDecl();
14658 diag::err_abstract_type_in_decl,
14660 Var->setInvalidDecl();
14663 Diag(Var->getLocation(), diag::warn_private_extern);
14664 Diag(Var->getLocation(), diag::note_private_extern);
14667 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14668 !Var->isInvalidDecl())
14679 if (!Var->isInvalidDecl()) {
14683 Var->getLocation(), ArrayT->getElementType(),
14684 diag::err_array_incomplete_or_sizeless_type))
14685 Var->setInvalidDecl();
14687 if (Var->getStorageClass() ==
SC_Static) {
14697 if (Var->isFirstDecl())
14699 diag::ext_typecheck_decl_incomplete_type,
14705 if (!Var->isInvalidDecl())
14716 if (Var->isConstexpr())
14717 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14720 Diag(Var->getLocation(),
14721 diag::err_typecheck_incomplete_array_needs_initializer);
14722 Var->setInvalidDecl();
14729 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14730 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14739 if (Var->isInvalidDecl())
14742 if (!Var->hasAttr<AliasAttr>()) {
14745 diag::err_typecheck_decl_incomplete_type)) {
14746 Var->setInvalidDecl();
14755 diag::err_abstract_type_in_decl,
14757 Var->setInvalidDecl();
14764 unsigned DiagID = diag::warn_default_init_const_unsafe;
14765 if (Var->getStorageDuration() ==
SD_Static ||
14766 Var->getStorageDuration() ==
SD_Thread)
14767 DiagID = diag::warn_default_init_const;
14769 bool EmitCppCompat = !
Diags.isIgnored(
14770 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14771 Var->getLocation());
14773 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14787 if (
const auto *CXXRecord =
14788 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14792 if (!CXXRecord->isPOD())
14837 }
else if (
Init.isInvalid()) {
14855 VarDecl *VD = dyn_cast<VarDecl>(D);
14858 << InExpansionStmt;
14900 << InExpansionStmt << VD <<
Error;
14915 const char *PrevSpec;
14940 Context.getAttributedType(
Attr, MethodType, MethodType);
14951 if (var->isInvalidDecl())
return;
14958 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14960 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14962 var->setInvalidDecl();
14970 var->hasLocalStorage()) {
14971 switch (var->getType().getObjCLifetime()) {
14984 if (var->hasLocalStorage() &&
14993 if (var->isThisDeclarationADefinition() &&
14994 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14995 var->isExternallyVisible() && var->hasLinkage() &&
14996 !var->isInline() && !var->getDescribedVarTemplate() &&
15000 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
15001 var->getLocation())) {
15003 VarDecl *prev = var->getPreviousDecl();
15008 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
15009 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
15015 std::optional<bool> CacheHasConstInit;
15016 const Expr *CacheCulprit =
nullptr;
15017 auto checkConstInit = [&]()
mutable {
15018 const Expr *
Init = var->getInit();
15019 if (
Init->isInstantiationDependent())
15022 if (!CacheHasConstInit)
15023 CacheHasConstInit = var->getInit()->isConstantInitializer(
15024 Context, var->getType()->isReferenceType(), &CacheCulprit);
15025 return *CacheHasConstInit;
15029 if (var->getType().isDestructedType()) {
15033 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
15035 Diag(var->getLocation(), diag::note_use_thread_local);
15037 if (!checkConstInit()) {
15045 Diag(var->getLocation(), diag::note_use_thread_local);
15051 if (!var->getType()->isStructureType() && var->hasInit() &&
15054 unsigned NumInits = ILE->getNumInits();
15056 for (
unsigned I = 0; I < NumInits; ++I) {
15057 const auto *
Init = ILE->getInit(I);
15060 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15064 unsigned NumConcat = SL->getNumConcatenated();
15068 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
15069 bool OnlyOneMissingComma =
true;
15070 for (
unsigned J = I + 1; J < NumInits; ++J) {
15071 const auto *
Init = ILE->getInit(J);
15074 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15075 if (!SLJ || SLJ->getNumConcatenated() > 1) {
15076 OnlyOneMissingComma =
false;
15081 if (OnlyOneMissingComma) {
15083 for (
unsigned i = 0; i < NumConcat - 1; ++i)
15085 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
15087 Diag(SL->getStrTokenLoc(1),
15088 diag::warn_concatenated_literal_array_init)
15090 Diag(SL->getBeginLoc(),
15091 diag::note_concatenated_string_literal_silence);
15102 if (var->hasAttr<BlocksAttr>())
15106 bool GlobalStorage = var->hasGlobalStorage();
15107 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
15109 bool HasConstInit =
true;
15112 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
15117 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
15118 (GlobalStorage || var->isConstexpr() ||
15119 var->mightBeUsableInConstantExpressions(
Context))) {
15131 HasConstInit = checkConstInit();
15135 if (HasConstInit) {
15136 if (var->isStaticDataMember() && !var->isInline() &&
15137 var->getLexicalDeclContext()->isRecord() &&
15138 type->isIntegralOrEnumerationType()) {
15143 diag::ext_in_class_initializer_non_constant)
15144 <<
Init->getSourceRange();
15147 (void)var->checkForConstantInitialization(Notes);
15149 }
else if (CacheCulprit) {
15150 Notes.emplace_back(CacheCulprit->
getExprLoc(),
15151 PDiag(diag::note_invalid_subexpr_in_const_expr));
15156 HasConstInit = var->checkForConstantInitialization(Notes);
15159 if (HasConstInit) {
15161 }
else if (var->isConstexpr()) {
15165 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15166 diag::note_invalid_subexpr_in_const_expr) {
15167 DiagLoc = Notes[0].first;
15170 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15171 << var <<
Init->getSourceRange();
15172 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15173 Diag(Notes[I].first, Notes[I].second);
15174 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15175 auto *
Attr = var->getAttr<ConstInitAttr>();
15176 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15177 <<
Init->getSourceRange();
15180 for (
auto &it : Notes)
15181 Diag(it.first, it.second);
15182 }
else if (var->isStaticDataMember() && !var->isInline() &&
15183 var->getLexicalDeclContext()->isRecord()) {
15184 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15185 <<
Init->getSourceRange();
15186 for (
auto &it : Notes)
15187 Diag(it.first, it.second);
15188 var->setInvalidDecl();
15189 }
else if (IsGlobal &&
15191 var->getLocation())) {
15200 if (!checkConstInit())
15201 Diag(var->getLocation(), diag::warn_global_constructor)
15202 <<
Init->getSourceRange();
15208 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15213 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15214 std::optional<QualType::NonConstantStorageReason> Reason;
15215 if (HasConstInit &&
15216 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15222 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15229 var->getType().isConstQualified()) {
15231 NonConstNonReferenceType) &&
15232 "This case should've already been handled elsewhere");
15233 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15234 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15240 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15242 SectionAttr::Declspec_allocate));
15244 var->dropAttr<SectionAttr>();
15259 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15260 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15267 if (!
type->isDependentType())
15273 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty() &&
15274 (ModuleScopes.back().Module->isHeaderLikeModule() ||
15277 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15280 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15291 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15292 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15302 NewAttr->setInherited(
true);
15304 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15305 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15306 NewAttr->setInherited(
true);
15311 if (!FD->
hasAttr<DLLExportAttr>())
15314 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15315 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15316 NewAttr->setInherited(
true);
15327 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15332 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15345 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15357 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15361 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15365 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15369 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15374 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15375 for (
auto *BD : DD->bindings()) {
15380 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15403 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15410 bool IsClassTemplateMember =
15412 Context->getDescribedClassTemplate();
15415 IsClassTemplateMember
15416 ? diag::warn_attribute_dllimport_static_field_definition
15417 : diag::err_attribute_dllimport_static_field_definition);
15418 Diag(IA->getLocation(), diag::note_attribute);
15419 if (!IsClassTemplateMember)
15447 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15467 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15471 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15473 if (!MagicValueExpr) {
15476 std::optional<llvm::APSInt> MagicValueInt;
15478 Diag(I->getRange().getBegin(),
15479 diag::err_type_tag_for_datatype_not_ice)
15483 if (MagicValueInt->getActiveBits() > 64) {
15484 Diag(I->getRange().getBegin(),
15485 diag::err_type_tag_for_datatype_too_large)
15489 uint64_t MagicValue = MagicValueInt->getZExtValue();
15492 I->getMatchingCType(),
15493 I->getLayoutCompatible(),
15494 I->getMustBeNull());
15499 auto *VD = dyn_cast<VarDecl>(DD);
15500 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15512 bool DiagnosedMultipleDecomps =
false;
15514 bool DiagnosedNonDeducedAuto =
false;
15516 for (
Decl *D : Group) {
15521 if (
auto *VD = dyn_cast<VarDecl>(D);
15522 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15523 VD->hasGlobalStorage())
15527 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15528 if (!FirstDeclaratorInGroup)
15529 FirstDeclaratorInGroup = DD;
15530 if (!FirstDecompDeclaratorInGroup)
15531 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15534 FirstNonDeducedAutoInGroup = DD;
15536 if (FirstDeclaratorInGroup != DD) {
15539 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15541 diag::err_decomp_decl_not_alone)
15543 << DD->getSourceRange();
15544 DiagnosedMultipleDecomps =
true;
15550 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15552 diag::err_auto_non_deduced_not_alone)
15553 << FirstNonDeducedAutoInGroup->
getType()
15556 << DD->getSourceRange();
15557 DiagnosedNonDeducedAuto =
true;
15562 Decls.push_back(D);
15568 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15570 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15582 if (Group.size() > 1) {
15584 VarDecl *DeducedDecl =
nullptr;
15585 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15586 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15590 if (!DT || DT->getDeducedType().isNull())
15593 Deduced = DT->getDeducedType();
15595 }
else if (!
Context.hasSameType(DT->getDeducedType(),
Deduced)) {
15596 auto *AT = dyn_cast<AutoType>(DT);
15598 diag::err_auto_different_deductions)
15600 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15624 if (Group.empty() || !Group[0])
15627 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15628 Group[0]->getLocation()) &&
15629 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15630 Group[0]->getLocation()))
15633 if (Group.size() >= 2) {
15641 Decl *MaybeTagDecl = Group[0];
15643 Group = Group.slice(1);
15696 const auto *VD = dyn_cast<ValueDecl>(D);
15710 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15712 Diag(TD->getLocation(), diag::note_declared_at);
15718 if (!ExplicitThisLoc.
isValid())
15721 "explicit parameter in non-cplusplus mode");
15723 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15735 LSI->ExplicitObjectParameter = P;
15758 ? diag::ext_register_storage_class
15759 : diag::warn_deprecated_register)
15765 diag::err_invalid_storage_class_in_func_decl)
15774 diag::err_invalid_storage_class_in_func_decl);
15786 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15807 PrevDecl =
nullptr;
15829 diag::err_hlsl_incomplete_resource_array_in_function_param);
15842 New->setInvalidDecl();
15861 Diag(
New->getLocation(), diag::err_module_private_local)
15865 if (
New->hasAttr<BlocksAttr>())
15866 Diag(
New->getLocation(), diag::err_block_not_allowed_on)
15867 << diag::NotAllowedBlockVarReason::NonlocalVariable;
15881 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
15883 Param->setImplicit();
15896 !
Parameter->getIdentifier()->isPlaceholder()) {
15897 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15905 if (
LangOpts.NumLargeByValueCopy == 0)
15911 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15912 if (Size >
LangOpts.NumLargeByValueCopy)
15920 if (
T->isDependentType() || !
T.isPODType(
Context))
15922 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
15923 if (Size >
LangOpts.NumLargeByValueCopy)
15936 T->isObjCLifetimeType()) {
15943 if (
T->isArrayType()) {
15944 if (!
T.isConstQualified()) {
15948 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15950 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15955 lifetime =
T->getObjCARCImplicitLifetime();
15957 T =
Context.getLifetimeQualifiedType(
T, lifetime);
15962 if (
T->isArrayType() && !
T.hasAddressSpace()) {
15968 T =
Context.getAddrSpaceQualType(
T, ImplAS);
15975 Context.getAdjustedParameterType(
T),
15976 TSInfo, SC,
nullptr);
15981 if (
New->isParameterPack())
15983 CSI->LocalPacks.push_back(
New);
15985 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15986 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15993 if (
T->isObjCObjectType()) {
15997 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15999 T =
Context.getObjCObjectPointerType(
T);
16004 if (
T.getPointerAuth()) {
16005 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
16006 New->setInvalidDecl();
16020 !(
T->isFunctionPointerType() &&
16026 Diag(NameLoc, diag::err_arg_with_address_space);
16027 New->setInvalidDecl();
16031 if (
Context.getTargetInfo().getTriple().isPPC64() &&
16032 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
16033 New->setInvalidDecl();
16054 for (
int i = FTI.
NumParams; i != 0; ) {
16059 llvm::raw_svector_ostream(Code)
16070 const char* PrevSpec;
16073 DiagID,
Context.getPrintingPolicy());
16102 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
16104 ParentScope, D, TemplateParameterLists, Bases);
16110 if (!Bases.empty())
16118 Consumer.HandleInlineFunctionDefinition(D);
16127 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
16130 PossiblePrototype = Prev;
16154 if (II->isStr(
"main") || II->isStr(
"efi_main"))
16173 if (FD->
hasAttr<DeviceKernelAttr>())
16222 bool DefinitionVisible =
false;
16226 !
Definition->getTemplateParameterLists().empty())) {
16229 if (!DefinitionVisible) {
16230 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16244 Diag(
Definition->getLocation(), diag::note_previous_definition);
16253 LSI->
Lambda = LambdaClass;
16293 for (
const auto &
C : LambdaClass->
captures()) {
16294 if (
C.capturesVariable()) {
16298 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16300 true,
C.getLocation(),
16301 C.isPackExpansion()
16303 I->getType(),
false);
16305 }
else if (
C.capturesThis()) {
16331 FD = FunTmpl->getTemplatedDecl();
16342 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16347 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16352 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16353 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16354 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16355 !
Attr->isDefaultVersion()) {
16364 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16366 Ctor->isDefaultConstructor() &&
16367 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16370 if (DLLExportAttr *
Attr = Ctor->getAttr<DLLExportAttr>())
16413 "There should be an active template instantiation on the stack "
16414 "when instantiating a generic lambda!");
16424 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16425 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16440 diag::err_func_def_incomplete_result) ||
16442 diag::err_abstract_type_in_decl,
16458 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16462 "parameters should not be in newly created FD yet");
16465 if (NonParmDecl->getDeclName())
16470 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16471 for (
auto *EI : ED->enumerators())
16479 Param->setOwningFunction(FD);
16482 if (Param->getIdentifier() && FnBodyScope) {
16519 assert(!FD->
hasAttr<DLLExportAttr>());
16520 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16550 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
16551 if (!SKEPAttr->isInvalidAttr()) {
16571 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16572 FD = TD->getTemplatedDecl();
16573 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16585 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16586 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16587 if (!NRVOCandidate->isNRVOVariable()) {
16588 Diag(Returns[I]->getRetValue()->getExprLoc(),
16589 diag::warn_not_eliding_copy_on_return);
16609 Outer.Fun.hasTrailingReturnType()) {
16627 if (FD->isConstexpr())
16632 if (FD->getReturnType()->getContainedDeducedType())
16635 return Consumer.shouldSkipFunctionBody(D);
16642 FD->setHasSkippedBody();
16655 S.PopExpressionEvaluationContext();
16660 bool IsLambda =
false;
16664 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16666 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16667 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16681 return It->second = R;
16686 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16688 if (IsOrNestedInEscapingBlock(P.second))
16689 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16704 methodHasName(FD,
"get_return_object_on_allocation_failure");
16714 if (!FD->
hasAttr<CoroWrapperAttr>())
16719 bool RetainFunctionScopeInfo) {
16746 SYCLKernelEntryPointAttr *SKEPAttr =
16747 FD->
getAttr<SYCLKernelEntryPointAttr>();
16749 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16750 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16751 SKEPAttr->setInvalidAttr();
16753 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16754 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16755 SKEPAttr->setInvalidAttr();
16757 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16758 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16759 SKEPAttr->setInvalidAttr();
16761 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16762 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16763 SKEPAttr->setInvalidAttr();
16771 if (Body && !SKEPAttr->isInvalidAttr()) {
16801 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16803 Diag(SEAttr->getLocation(),
16804 diag::err_sycl_external_invalid_deleted_function)
16834 Expr *Dummy =
nullptr;
16845 if (LSI->HasImplicitReturnType) {
16852 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16856 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16857 Proto->getExtProtoInfo()));
16890 dyn_cast<CXXDestructorDecl>(FD))
16910 if (PossiblePrototype) {
16914 TypeLoc TL = TI->getTypeLoc();
16917 diag::note_declaration_not_a_prototype)
16920 FTL.getRParenLoc(),
"void")
16928 if (LocInfo.first.isInvalid())
16932 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16936 if (LocInfo.second > Buffer.size())
16939 const char *LexStart = Buffer.data() + LocInfo.second;
16940 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16942 return StartTok.consume_front(
"const") &&
16944 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16947 auto findBeginLoc = [&]() {
16963 diag::note_static_for_internal_linkage)
16974 if (!PossiblePrototype)
17020 if (PossiblePrototype)
17022 diag::warn_non_prototype_changes_behavior)
17029 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
17030 if (!CmpndBody->body_empty())
17031 Diag(CmpndBody->body_front()->getBeginLoc(),
17032 diag::warn_dispatch_body_ignored);
17034 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
17042 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
17043 Context.setNonKeyFunction(MD);
17059 "Function parsing confused");
17060 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
17072 << MD->getSelector().getAsString();
17077 bool isDesignated =
17078 MD->isDesignatedInitializerForTheInterface(&InitMethod);
17079 assert(isDesignated && InitMethod);
17080 (void)isDesignated;
17083 auto IFace = MD->getClassInterface();
17086 auto SuperD = IFace->getSuperClass();
17096 diag::warn_objc_designated_init_missing_super_call);
17098 diag::note_objc_designated_init_marked_here);
17106 diag::warn_objc_secondary_init_missing_init_call);
17121 else if (
AMDGPU().HasPotentiallyUnguardedBuiltinUsage(FD))
17126 "This should only be set for ObjC methods, which should have been "
17127 "handled in the block above.");
17142 if (!
Destructor->getParent()->isDependentType())
17160 ActivePolicy = &WP;
17163 if (!IsInstantiation && FD &&
17169 if (FD && FD->
hasAttr<NakedAttr>()) {
17173 bool RegisterVariables =
false;
17174 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
17175 for (
const auto *
Decl : DS->decls()) {
17176 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
17177 RegisterVariables =
17178 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
17179 if (!RegisterVariables)
17184 if (RegisterVariables)
17187 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
17188 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
17197 "Leftover temporaries in function");
17198 assert(!
Cleanup.exprNeedsCleanups() &&
17199 "Unaccounted cleanups in function");
17201 "Leftover expressions for odr-use checking");
17210 if (!IsInstantiation)
17213 if (!RetainFunctionScopeInfo)
17242 D = TD->getTemplatedDecl();
17254 assert(
LangOpts.implicitFunctionsAllowed() &&
17255 "Implicit function declarations aren't allowed in this language mode");
17262 Scope *BlockScope = S;
17270 Scope *ContextScope = BlockScope;
17274 ContextScope = ContextScope->
getParent();
17294 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17297 return ExternCPrev;
17303 if (II.
getName().starts_with(
"__builtin_"))
17304 diag_id = diag::warn_builtin_unknown;
17307 diag_id = diag::ext_implicit_function_decl_c99;
17309 diag_id = diag::warn_implicit_function_decl;
17317 if (S && !ExternCPrev &&
17324 Diag(Loc, diag_id) << &II;
17340 return ExternCPrev;
17348 Context.getPrintingPolicy());
17350 assert(!
Error &&
"Error setting up implicit decl!");
17393 bool IsNothrow =
false;
17405 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17423 if (!FD->
hasAttr<AllocSizeAttr>()) {
17424 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17435 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17436 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17460 unsigned FormatIdx;
17462 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17463 if (!FD->
hasAttr<FormatAttr>()) {
17464 const char *fmt =
"printf";
17466 if (FormatIdx < NumParams &&
17472 HasVAListArg ? 0 : FormatIdx+2,
17476 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17478 if (!FD->
hasAttr<FormatAttr>())
17480 &
Context.Idents.get(
"scanf"),
17482 HasVAListArg ? 0 : FormatIdx+2,
17488 if (!FD->
hasAttr<CallbackAttr>() &&
17489 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17490 FD->
addAttr(CallbackAttr::CreateImplicit(
17496 bool NoExceptions =
17498 bool ConstWithoutErrnoAndExceptions =
17499 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17500 bool ConstWithoutExceptions =
17501 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17502 if (!FD->
hasAttr<ConstAttr>() &&
17503 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17504 (!ConstWithoutErrnoAndExceptions ||
17506 (!ConstWithoutExceptions || NoExceptions))
17512 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17513 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17515 switch (BuiltinID) {
17516 case Builtin::BI__builtin_fma:
17517 case Builtin::BI__builtin_fmaf:
17518 case Builtin::BI__builtin_fmal:
17519 case Builtin::BIfma:
17520 case Builtin::BIfmaf:
17521 case Builtin::BIfmal:
17531 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17532 !FD->
hasAttr<NonNullAttr>()) {
17534 for (
int I : Indxs) {
17537 T =
Context.getAttributedType(attr::TypeNonNull,
T,
T);
17542 for (
int I : Indxs)
17543 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17544 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17545 ParamIndxs.size()));
17548 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17549 !FD->
hasAttr<ReturnsTwiceAttr>())
17552 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17554 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17556 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17559 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17564 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17571 switch (BuiltinID) {
17572 case Builtin::BImemalign:
17573 case Builtin::BIaligned_alloc:
17574 if (!FD->
hasAttr<AllocAlignAttr>())
17583 switch (BuiltinID) {
17584 case Builtin::BIcalloc:
17585 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17588 case Builtin::BImemalign:
17589 case Builtin::BIaligned_alloc:
17590 case Builtin::BIrealloc:
17594 case Builtin::BImalloc:
17614 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17630 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17633 if (!FD->
hasAttr<FormatAttr>())
17635 &
Context.Idents.get(
"printf"), 2,
17636 Name->
isStr(
"vasprintf") ? 0 : 3,
17640 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17643 if (!FD->
hasAttr<FormatArgAttr>())
17651 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17652 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17655 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17656 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17709 if (
T->isDependentType())
17719 if (
T->isAtomicType())
17720 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17723 std::optional<unsigned> QualSelect;
17725 QualSelect = diag::CVQualList::Both;
17727 QualSelect = diag::CVQualList::Const;
17729 QualSelect = diag::CVQualList::Volatile;
17732 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17734 T =
T.getAtomicUnqualifiedType();
17739 if (BT->isInteger())
17742 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17743 <<
T <<
T->isBitIntType();
17747 QualType EnumUnderlyingTy,
bool IsFixed,
17749 if (IsScoped != Prev->
isScoped()) {
17750 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17756 if (IsFixed && Prev->
isFixed()) {
17759 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17762 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17768 }
else if (IsFixed != Prev->
isFixed()) {
17769 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17791 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17827 llvm_unreachable(
"invalid TTK");
17866 if (IsIgnoredLoc(NewTagLoc))
17869 auto IsIgnored = [&](
const TagDecl *Tag) {
17870 return IsIgnoredLoc(Tag->getLocation());
17887 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17895 if (isDefinition) {
17903 bool previousMismatch =
false;
17905 if (I->getTagKind() !=
NewTag) {
17910 if (!previousMismatch) {
17911 previousMismatch =
true;
17912 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17916 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17929 if (PrevDef && IsIgnored(PrevDef))
17933 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17940 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17970 if (!Namespace || Namespace->isAnonymousNamespace())
17973 Namespaces.push_back(II);
17976 if (Lookup == Namespace)
17983 llvm::raw_svector_ostream OS(Insertion);
17986 std::reverse(Namespaces.begin(), Namespaces.end());
17987 for (
auto *II : Namespaces)
17988 OS << II->getName() <<
"::";
18001 if (OldDC->
Equals(NewDC))
18020 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
18021 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
18026 "Nameless record must be a definition!");
18031 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
18034 bool isMemberSpecialization =
false;
18035 bool IsInjectedClassName =
false;
18041 if (TemplateParameterLists.size() > 0 ||
18045 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
18062 !isMemberSpecialization)
18063 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
18066 if (TemplateParams) {
18068 Diag(KWLoc, diag::err_enum_template);
18072 if (TemplateParams->
size() > 0) {
18081 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
18082 AS, ModulePrivateLoc,
18084 TemplateParameterLists.data(), isMemberSpecialization, SkipBody);
18090 isMemberSpecialization =
true;
18094 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
18113 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
18114 assert(ScopedEnum || !ScopedEnumUsesClassTag);
18115 Diag(KWLoc, diag::note_enum_friend)
18116 << (ScopedEnum + ScopedEnumUsesClassTag);
18122 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
18123 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
18126 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum) ||
18130 EnumUnderlying =
Context.IntTy.getTypePtr();
18131 }
else if (UnderlyingType.
get()) {
18139 EnumUnderlying = TI;
18143 EnumUnderlying =
Context.IntTy.getTypePtr();
18147 EnumUnderlying =
Context.IntTy.getTypePtr();
18157 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
18158 TI && TI->
getType()->isAtomicType())
18161 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
18167 EnumUnderlying =
Context.IntTy.getTypePtr();
18173 bool isStdBadAlloc =
false;
18174 bool isStdAlignValT =
false;
18183 auto createTagFromNewDecl = [&]() ->
TagDecl * {
18193 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
18197 if (EnumUnderlying) {
18199 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18205 ?
Context.getPromotedIntegerType(EnumTy)
18226 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18242 goto CreateNewDecl;
18250 IsDependent =
true;
18279 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18281 IsDependent =
true;
18286 Diag(NameLoc, diag::err_not_tag_in_scope)
18287 << Kind << Name << DC << SS.
getRange();
18290 goto CreateNewDecl;
18338 bool FriendSawTagOutsideEnclosingNamespace =
false;
18345 FriendSawTagOutsideEnclosingNamespace =
true;
18354 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18356 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18387 Previous.getFoundDecl()->isTemplateParameter()) {
18396 if (Name->
isStr(
"bad_alloc")) {
18398 isStdBadAlloc =
true;
18405 }
else if (Name->
isStr(
"align_val_t")) {
18406 isStdAlignValT =
true;
18418 IsTemplateParamOrArg)) {
18419 if (
Invalid)
goto CreateNewDecl;
18502 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18503 if (Tag->getDeclName() == Name &&
18504 Tag->getDeclContext()->getRedeclContext()
18505 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18518 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18519 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18522 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18524 *
this, OldTag->getDeclContext(), SearchDC))) {
18525 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18526 Diag(Shadow->getTargetDecl()->getLocation(),
18527 diag::note_using_decl_target);
18528 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18532 goto CreateNewDecl;
18536 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18542 SS.
isNotEmpty() || isMemberSpecialization)) {
18544 if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18545 RD && RD->isInjectedClassName()) {
18552 IsInjectedClassName =
true;
18560 bool SafeToContinue =
18563 if (SafeToContinue)
18564 Diag(KWLoc, diag::err_use_with_wrong_tag)
18567 PrevTagDecl->getKindName());
18569 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18570 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18572 if (SafeToContinue)
18573 Kind = PrevTagDecl->getTagKind();
18586 return PrevTagDecl;
18590 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18591 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18592 else if (
const Type *
T =
18593 dyn_cast_if_present<const Type *>(EnumUnderlying))
18600 ScopedEnum, EnumUnderlyingTy,
18601 IsFixed, PrevEnum))
18611 Diag(NameLoc, diag::ext_member_redeclared);
18612 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18621 if (
const auto *OutermostClass = dyn_cast<CXXRecordDecl>(PrevDecl)) {
18622 while (
const auto *ParentClass =
18623 dyn_cast<CXXRecordDecl>(OutermostClass->getParent()))
18624 OutermostClass = ParentClass;
18626 if (OutermostClass->isLocalClass() &&
18628 Diag(NameLoc, diag::err_local_nested_class_invalid_scope)
18629 << Name << OutermostClass;
18630 Diag(OutermostClass->getLocation(), diag::note_defined_here)
18640 if (!Attrs.
empty()) {
18644 (PrevTagDecl->getFriendObjectKind() ==
18657 return PrevTagDecl;
18662 return PrevTagDecl;
18671 if (Def->isBeingDefined()) {
18672 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18673 Diag(PrevTagDecl->getLocation(),
18674 diag::note_previous_definition);
18682 bool IsExplicitSpecializationAfterInstantiation =
false;
18683 if (isMemberSpecialization) {
18685 IsExplicitSpecializationAfterInstantiation =
18686 RD->getTemplateSpecializationKind() !=
18688 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18689 IsExplicitSpecializationAfterInstantiation =
18690 ED->getTemplateSpecializationKind() !=
18699 bool HiddenDefVisible =
false;
18713 SkipBody->
New = createTagFromNewDecl();
18722 if (!HiddenDefVisible && Hidden)
18727 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18732 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18735 Diag(NameLoc, diag::err_redefinition) << Name;
18737 NameLoc.
isValid() ? NameLoc : KWLoc);
18756 IsInjectedClassName) {
18757 SearchDC = PrevTagDecl->getDeclContext();
18785 Diag(NameLoc, diag::err_tag_reference_non_tag)
18786 << PrevDecl << NTK << Kind;
18792 SS.
isNotEmpty() || isMemberSpecialization)) {
18798 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18804 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18807 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18808 << Name << Kind << TND->getUnderlyingType();
18816 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18848 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18849 ScopedEnumUsesClassTag, IsFixed);
18853 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18861 if (IsFixed && ED->
isFixed()) {
18864 }
else if (PrevDecl &&
18866 Diag(Loc, diag::ext_forward_ref_enum_def)
18870 unsigned DiagID = diag::ext_forward_ref_enum;
18872 DiagID = diag::ext_ms_forward_ref_enum;
18874 DiagID = diag::err_forward_ref_enum;
18879 if (EnumUnderlying) {
18881 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18887 ?
Context.getPromotedIntegerType(EnumTy)
18889 assert(ED->
isComplete() &&
"enum with type should be complete");
18899 cast_or_null<CXXRecordDecl>(PrevDecl));
18905 cast_or_null<RecordDecl>(PrevDecl));
18911 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18917 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18919 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18926 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18939 isMemberSpecialization))
18943 if (TemplateParameterLists.size() > 0) {
18944 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18963 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18969 if (ModulePrivateLoc.
isValid()) {
18970 if (isMemberSpecialization)
18971 Diag(
New->getLocation(), diag::err_module_private_specialization)
18978 New->setModulePrivate();
18998 Diag(Loc, diag::err_type_defined_in_param_type)
19004 }
else if (!PrevDecl) {
19008 Diag(Loc, diag::warn_decl_in_param_list)
19014 New->setInvalidDecl();
19036 New->startDefinition();
19038 New->setCompleteDefinition();
19039 New->demoteThisDefinitionToDeclaration();
19067 if (!
New->isInvalidDecl() &&
19068 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
19075 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
19088 if (isMemberSpecialization && !
New->isInvalidDecl())
19095 if (
New->isBeingDefined())
19096 if (
auto RD = dyn_cast<RecordDecl>(
New))
19097 RD->completeDefinition();
19099 }
else if (SkipBody && SkipBody->
ShouldSkip) {
19133 bool IsFinalSpelledSealed,
19141 if (!
Record->getIdentifier())
19149 IsFinalSpelledSealed
19150 ? FinalAttr::Keyword_sealed
19151 : FinalAttr::Keyword_final));
19169 "Broken injected-class-name");
19176 Tag->setBraceRange(BraceRange);
19179 if (Tag->isBeingDefined()) {
19180 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
19181 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19182 RD->completeDefinition();
19185 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
19187 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
19188 auto *Def = RD->getDefinition();
19189 assert(Def &&
"The record is expected to have a completed definition");
19190 unsigned NumInitMethods = 0;
19191 for (
auto *
Method : Def->methods()) {
19192 if (!
Method->getIdentifier())
19194 if (
Method->getName() ==
"__init")
19197 if (NumInitMethods > 1 || !Def->hasInitMethod())
19198 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
19216 Tag->setTopLevelDeclInObjCContainer();
19219 if (!Tag->isInvalidDecl())
19220 Consumer.HandleTagDeclDefinition(Tag);
19224 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
19230 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
19234 if (llvm::any_of(RD->
fields(),
19235 [](
const FieldDecl *FD) { return FD->isBitField(); }))
19236 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
19243 Tag->setInvalidDecl();
19246 if (Tag->isBeingDefined()) {
19247 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19248 RD->completeDefinition();
19261 QualType FieldTy,
bool IsMsStruct,
19272 diag::err_field_incomplete_or_sizeless))
19275 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19277 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19287 llvm::APSInt
Value;
19292 BitWidth = ICE.
get();
19295 if (
Value == 0 && FieldName)
19296 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19299 if (
Value.isSigned() &&
Value.isNegative()) {
19301 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19303 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19310 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19315 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19316 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19317 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19321 bool CStdConstraintViolation =
19323 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19324 if (CStdConstraintViolation || MSBitfieldViolation) {
19325 unsigned DiagWidth =
19326 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19327 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19329 << !CStdConstraintViolation << DiagWidth;
19335 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19336 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19379 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19390 diag::err_invalid_thread)
19398 switch (
Previous.getResultKind()) {
19405 PrevDecl =
Previous.getRepresentativeDecl();
19419 PrevDecl =
nullptr;
19423 PrevDecl =
nullptr;
19430 TSSL, AS, PrevDecl, &D);
19433 Record->setInvalidDecl();
19452 bool Mutable,
Expr *BitWidth,
19458 bool InvalidDecl =
false;
19463 if (
T.isNull() ||
T->containsErrors()) {
19464 InvalidDecl =
true;
19470 bool isIncomplete =
19474 diag::err_field_incomplete_or_sizeless);
19475 if (isIncomplete) {
19477 Record->setInvalidDecl();
19478 InvalidDecl =
true;
19483 Record->setInvalidDecl();
19484 InvalidDecl =
true;
19490 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19491 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19492 Diag(Loc, diag::err_field_with_address_space);
19493 Record->setInvalidDecl();
19494 InvalidDecl =
true;
19500 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19501 T->isBlockPointerType()) {
19502 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19503 Record->setInvalidDecl();
19504 InvalidDecl =
true;
19509 "__cl_clang_bitfields",
LangOpts)) {
19510 Diag(Loc, diag::err_opencl_bitfields);
19511 InvalidDecl =
true;
19517 T.hasQualifiers()) {
19518 InvalidDecl =
true;
19519 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19524 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19526 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19527 InvalidDecl =
true;
19532 diag::err_abstract_type_in_decl,
19534 InvalidDecl =
true;
19537 BitWidth =
nullptr;
19543 InvalidDecl =
true;
19544 BitWidth =
nullptr;
19549 if (!InvalidDecl && Mutable) {
19550 unsigned DiagID = 0;
19551 if (
T->isReferenceType())
19552 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19553 : diag::err_mutable_reference;
19554 else if (
T.isConstQualified())
19555 DiagID = diag::err_mutable_const;
19561 Diag(ErrLoc, DiagID);
19562 if (DiagID != diag::ext_mutable_reference) {
19564 InvalidDecl =
true;
19576 BitWidth, Mutable, InitStyle);
19585 Diag(Loc, diag::err_duplicate_member) << II;
19591 if (
Record->isUnion()) {
19593 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19608 const bool HaveMSExt =
19613 HaveMSExt ? diag::ext_union_member_of_reference_type
19614 : diag::err_union_member_of_reference_type)
19634 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19637 if (
T.isObjCGCWeak())
19638 Diag(Loc, diag::warn_attribute_weak_on_field);
19641 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19658 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19669 if (RDecl->hasNonTrivialCopyConstructor())
19671 else if (!RDecl->hasTrivialDefaultConstructor())
19673 else if (RDecl->hasNonTrivialCopyAssignment())
19675 else if (RDecl->hasNonTrivialDestructor())
19680 RDecl->hasObjectMember()) {
19688 if (!FD->
hasAttr<UnavailableAttr>())
19689 FD->
addAttr(UnavailableAttr::CreateImplicit(
19690 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19697 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19698 : diag::err_illegal_union_or_anon_struct_member)
19710 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19713 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19721 if (!CD->IsClassExtension())
19738 AllIvarDecls.push_back(Ivar);
19750 if (!
Record->hasUserDeclaredDestructor()) {
19758 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19759 if (DD->isInvalidDecl())
19763 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19777 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19781 Msg = diag::err_ambiguous_destructor;
19786 Msg = diag::err_no_viable_destructor;
19797 Record->setInvalidDecl();
19804 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19848 if (!Method->getTrailingRequiresClause())
19849 SatisfactionStatus.push_back(
true);
19853 SatisfactionStatus.push_back(
false);
19855 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19859 for (
size_t i = 0; i < Methods.size(); i++) {
19860 if (!SatisfactionStatus[i])
19868 bool AnotherMethodIsMoreConstrained =
false;
19869 for (
size_t j = 0; j < Methods.size(); j++) {
19870 if (i == j || !SatisfactionStatus[j])
19884 AnotherMethodIsMoreConstrained =
true;
19888 AnotherMethodIsMoreConstrained)) {
19891 AnotherMethodIsMoreConstrained =
true;
19893 if (AnotherMethodIsMoreConstrained)
19898 if (!AnotherMethodIsMoreConstrained) {
19899 Method->setIneligibleOrNotSelected(
false);
19900 Record->addedEligibleSpecialMemberFunction(Method,
19901 1 << llvm::to_underlying(CSM));
19915 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19917 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19919 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19923 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19924 if (CD->isInvalidDecl())
19926 if (CD->isDefaultConstructor())
19927 DefaultConstructors.push_back(MD);
19928 else if (CD->isCopyConstructor())
19929 CopyConstructors.push_back(MD);
19930 else if (CD->isMoveConstructor())
19931 MoveConstructors.push_back(MD);
19933 CopyAssignmentOperators.push_back(MD);
19935 MoveAssignmentOperators.push_back(MD);
19953 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19954 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19967 if (
const auto *TD = dyn_cast<TagDecl>(D))
19968 return !TD->isCompleteDefinition();
19983 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19990 assert(EnclosingDecl &&
"missing record or interface decl");
19999 case Decl::ObjCCategory:
20002 case Decl::ObjCImplementation:
20010 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
20014 unsigned NumNamedMembers = 0;
20016 for (
const auto *I :
Record->decls()) {
20017 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
20018 if (IFD->getDeclName())
20025 const FieldDecl *PreviousField =
nullptr;
20035 RecFields.push_back(FD);
20055 bool IsLastField = (i + 1 == Fields.end());
20070 unsigned DiagID = 0;
20071 if (!
Record->isUnion() && !IsLastField) {
20074 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
20078 }
else if (
Record->isUnion())
20080 ? diag::ext_flexible_array_union_ms
20081 : diag::ext_flexible_array_union_gnu;
20082 else if (NumNamedMembers < 1)
20084 ? diag::ext_flexible_array_empty_aggregate_ms
20085 : diag::ext_flexible_array_empty_aggregate_gnu;
20095 if (CXXRecord && CXXRecord->getNumVBases() != 0)
20109 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
20116 Record->setHasFlexibleArrayMember(
true);
20125 diag::err_incomplete_type)
20128 diag::err_field_incomplete_or_sizeless))) {
20134 if (
Record && RD->hasFlexibleArrayMember()) {
20137 Record->setHasFlexibleArrayMember(
true);
20138 if (!
Record->isUnion()) {
20155 diag::err_abstract_type_in_decl,
20160 if (
Record && RD->hasObjectMember())
20161 Record->setHasObjectMember(
true);
20162 if (
Record && RD->hasVolatileMember())
20163 Record->setHasVolatileMember(
true);
20182 FD->
addAttr(UnavailableAttr::CreateImplicit(
20183 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
20187 !
Record->hasObjectMember()) {
20190 Record->setHasObjectMember(
true);
20193 if (
const auto *RD = BaseType->getAsRecordDecl();
20194 RD && RD->hasObjectMember())
20195 Record->setHasObjectMember(
true);
20196 else if (BaseType->isObjCObjectPointerType() ||
20197 BaseType.isObjCGCStrong())
20198 Record->setHasObjectMember(
true);
20203 !shouldIgnoreForRecordTriviality(FD)) {
20206 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
20209 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
20213 Record->setNonTrivialToPrimitiveCopy(
true);
20215 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
20217 if (FD->
hasAttr<ExplicitInitAttr>())
20218 Record->setHasUninitializedExplicitInitFields(
true);
20220 Record->setNonTrivialToPrimitiveDestroy(
true);
20221 Record->setParamDestroyedInCallee(
true);
20223 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
20227 if (RD->getArgPassingRestrictions() ==
20229 Record->setArgPassingRestrictions(
20232 Record->setArgPassingRestrictions(
20236 Record->setArgPassingRestrictions(
20238 Record->setNonTrivialToPrimitiveCopy(
true);
20243 Record->setHasVolatileMember(
true);
20244 bool ReportMSBitfieldStoragePacking =
20245 Record && PreviousField &&
20246 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
20248 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
20252 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
20253 IsNonDependentBitField(PreviousField)) {
20257 if (FDStorageSize != PreviousFieldStorageSize) {
20259 diag::warn_ms_bitfield_mismatched_storage_packing)
20263 diag::note_ms_bitfield_mismatched_storage_size_previous)
20264 << PreviousField << PreviousField->
getType();
20274 bool Completed =
false;
20279 Record->setInvalidDecl();
20283 if (!CXXRecord->isInvalidDecl()) {
20286 I = CXXRecord->conversion_begin(),
20287 E = CXXRecord->conversion_end(); I != E; ++I)
20288 I.setAccess((*I)->getAccess());
20294 if (!CXXRecord->isDependentType()) {
20295 if (!CXXRecord->isInvalidDecl()) {
20299 if (CXXRecord->getNumVBases()) {
20301 CXXRecord->getFinalOverriders(FinalOverriders);
20303 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20304 MEnd = FinalOverriders.end();
20307 SOEnd = M->second.end();
20308 SO != SOEnd; ++SO) {
20309 assert(SO->second.size() > 0 &&
20310 "Virtual function without overriding functions?");
20311 if (SO->second.size() == 1)
20318 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20320 Diag(M->first->getLocation(),
20321 diag::note_overridden_virtual_function);
20323 OM = SO->second.begin(),
20324 OMEnd = SO->second.end();
20326 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20327 << (
const NamedDecl *)M->first << OM->Method->getParent();
20329 Record->setInvalidDecl();
20332 CXXRecord->completeDefinition(&FinalOverriders);
20342 Record->completeDefinition();
20351 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20352 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20353 EntirelyFunctionPointers(
Record)))) {
20357 Record->reorderDecls(NewDeclOrdering);
20362 auto *Dtor = CXXRecord->getDestructor();
20363 if (Dtor && Dtor->isImplicit() &&
20365 CXXRecord->setImplicitDestructorIsDeleted();
20370 if (
Record->hasAttrs()) {
20373 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20375 IA->getRange(), IA->getBestCase(),
20376 IA->getInheritanceModel());
20382 bool CheckForZeroSize;
20384 CheckForZeroSize =
true;
20389 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20391 CXXRecord->isCLike();
20393 if (CheckForZeroSize) {
20394 bool ZeroSize =
true;
20395 bool IsEmpty =
true;
20396 unsigned NonBitFields = 0;
20398 E =
Record->field_end();
20399 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20401 if (I->isUnnamedBitField()) {
20402 if (!I->isZeroLengthBitField())
20406 QualType FieldType = I->getType();
20408 !
Context.getTypeSizeInChars(FieldType).isZero())
20418 diag::warn_zero_size_struct_union_in_extern_c :
20419 diag::warn_zero_size_struct_union_compat)
20420 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20427 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20428 : diag::ext_no_named_members_in_struct_union)
20436 ID->setEndOfDefinitionLoc(RBrac);
20438 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20440 ID->addDecl(ClsFields[i]);
20444 if (ID->getSuperClass())
20447 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20448 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20449 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20455 IMPDecl->setIvarLBraceLoc(LBrac);
20456 IMPDecl->setIvarRBraceLoc(RBrac);
20458 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20466 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20470 Diag(ClsFields[i]->getLocation(),
20471 diag::err_duplicate_ivar_declaration);
20472 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20478 Diag(ClsFields[i]->getLocation(),
20479 diag::err_duplicate_ivar_declaration);
20480 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20486 CDecl->addDecl(ClsFields[i]);
20488 CDecl->setIvarLBraceLoc(LBrac);
20489 CDecl->setIvarRBraceLoc(RBrac);
20501 assert((
T->isIntegralType(Context) ||
20502 T->isEnumeralType()) &&
"Integral type required!");
20503 const unsigned NumTypes = 4;
20504 QualType SignedIntegralTypes[NumTypes] = {
20505 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20507 QualType UnsignedIntegralTypes[NumTypes] = {
20508 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20509 Context.UnsignedLongLongTy
20516 unsigned BitWidth = Context.getIntWidth(
T);
20517 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20518 : UnsignedIntegralTypes;
20519 for (
unsigned I = 0; I != NumTypes; ++I)
20520 if (Context.getTypeSize(Types[I]) > BitWidth)
20531 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20532 llvm::APSInt EnumVal(IntWidth);
20552 EltTy =
Enum->getIntegerType();
20558 Val = Converted.
get();
20565 if (
Enum->isComplete()) {
20566 EltTy =
Enum->getIntegerType();
20572 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20575 .isWindowsMSVCEnvironment()) {
20576 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20578 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20601 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20603 ? diag::warn_c17_compat_enum_value_not_int
20604 : diag::ext_c23_enum_value_not_int)
20606 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20618 if (
Enum->isDependentType())
20620 else if (!LastEnumConst) {
20629 if (
Enum->isFixed()) {
20630 EltTy =
Enum->getIntegerType();
20639 EltTy = LastEnumConst->
getType();
20642 if (EnumVal < LastEnumConst->getInitVal()) {
20654 if (
T.isNull() ||
Enum->isFixed()) {
20658 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20660 if (
Enum->isFixed())
20662 Diag(IdLoc, diag::err_enumerator_wrapped)
20666 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20677 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20689 ? diag::warn_c17_compat_enum_value_not_int
20690 : diag::ext_c23_enum_value_not_int)
20691 << 1 <<
toString(EnumVal, 10) << 1;
20693 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20696 : diag::ext_c23_enum_value_not_int)
20697 << 1 <<
toString(EnumVal, 10) << 1;
20705 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20724 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20732 Skip.Previous = Hidden;
20746 cast_or_null<EnumConstantDecl>(lastEnumConst);
20763 PrevDecl =
nullptr;
20790 "Received TagDecl when not in C++!");
20793 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20795 Diag(IdLoc, diag::err_redefinition) << Id;
20828 if (!BO->isAdditiveOp())
20836 InitExpr = BO->getLHS();
20840 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20860 if (!
Enum->getIdentifier())
20864 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20873 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20876 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20880 llvm::APSInt Val = D->getInitVal();
20881 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20884 DuplicatesVector DupVector;
20885 ValueToVectorMap EnumMap;
20889 for (
auto *Element : Elements) {
20903 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20906 if (EnumMap.size() == 0)
20910 for (
auto *Element : Elements) {
20916 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20917 if (Iter == EnumMap.end())
20920 DeclOrVector& Entry = Iter->second;
20927 auto Vec = std::make_unique<ECDVector>();
20929 Vec->push_back(ECD);
20936 DupVector.emplace_back(std::move(Vec));
20942 if (*Vec->begin() == ECD)
20945 Vec->push_back(ECD);
20949 for (
const auto &Vec : DupVector) {
20950 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20953 auto *FirstECD = Vec->front();
20954 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20955 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20956 << FirstECD->getSourceRange();
20960 for (
auto *ECD : llvm::drop_begin(*Vec))
20961 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20962 << ECD <<
toString(ECD->getInitVal(), 10)
20963 << ECD->getSourceRange();
20968 bool AllowMask)
const {
20969 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20982 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20983 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20990 bool HasBitwiseOp =
false;
20995 for (
const auto *ECD :
Enum->enumerators()) {
20996 const Expr *InitExpr = ECD->getInitExpr();
21002 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
21006 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
21007 HasBitwiseOp =
true;
21008 }
else if (Op == BO_LT || Op == BO_GT) {
21011 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
21013 if (IntLiteral->getValue() == 1)
21014 SuspiciousCompares.push_back(BinOp);
21022 if (HasBitwiseOp) {
21023 for (
const auto *BinOp : SuspiciousCompares) {
21024 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
21029 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
21030 << BinOp->getOpcodeStr() << SuggestedOp;
21032 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
21048 if (
Enum->isDependentType()) {
21049 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
21051 cast_or_null<EnumConstantDecl>(Elements[i]);
21052 if (!ECD)
continue;
21063 unsigned NumNegativeBits = 0;
21064 unsigned NumPositiveBits = 0;
21065 bool MembersRepresentableByInt =
21066 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
21070 unsigned BestWidth;
21091 if (
Enum->isComplete()) {
21092 BestType =
Enum->getIntegerType();
21093 if (
Context.isPromotableIntegerType(BestType))
21094 BestPromotionType =
Context.getPromotedIntegerType(BestType);
21096 BestPromotionType = BestType;
21098 BestWidth =
Context.getIntWidth(BestType);
21100 bool EnumTooLarge =
Context.computeBestEnumTypes(
21101 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
21102 BestWidth =
Context.getIntWidth(BestType);
21104 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
21109 for (
auto *D : Elements) {
21110 auto *ECD = cast_or_null<EnumConstantDecl>(D);
21111 if (!ECD)
continue;
21120 llvm::APSInt InitVal = ECD->getInitVal();
21128 MembersRepresentableByInt) {
21136 NewWidth =
Context.getTargetInfo().getIntWidth();
21138 }
else if (ECD->getType() == BestType) {
21146 ECD->setType(EnumType);
21150 NewWidth = BestWidth;
21155 InitVal = InitVal.extOrTrunc(NewWidth);
21156 InitVal.setIsSigned(NewSign);
21157 ECD->setInitVal(
Context, InitVal);
21160 if (ECD->getInitExpr() &&
21161 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
21163 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
21172 ECD->setType(EnumType);
21174 ECD->setType(NewTy);
21177 Enum->completeDefinition(BestType, BestPromotionType,
21178 NumPositiveBits, NumNegativeBits);
21183 if (
Enum->hasAttr<FlagEnumAttr>()) {
21185 llvm::APInt &FlagBits = R.first->second;
21188 for (
auto *E :
Enum->enumerators()) {
21189 const auto &EVal = E->getInitVal();
21191 if (EVal.isPowerOf2())
21192 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
21197 if (
Enum->isClosedFlag()) {
21198 for (
Decl *D : Elements) {
21200 if (!ECD)
continue;
21203 if (InitVal != 0 && !InitVal.isPowerOf2() &&
21211 if (
Enum->hasAttrs())
21250 AsmLabelAttr *
Attr =
21251 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
21261 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
21274 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
21290 if (!PrevDecl->
hasAttr<AliasAttr>())
21291 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21300 assert(FD &&
"Expected non-null FunctionDecl");
21307 FD->
hasAttr<SYCLKernelEntryPointAttr>() ||
21308 FD->
hasAttr<SYCLExternalAttr>()))
21312 auto IsEmittedForExternalSymbol = [
this, FD]() {
21324 if (
LangOpts.OpenMPIsTargetDevice) {
21327 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21334 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21338 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21339 if (IsEmittedForExternalSymbol())
21345 }
else if (
LangOpts.OpenMP > 45) {
21349 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21352 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21371 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.
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 isResultTypeOrTemplate(LookupResult &R, const Token &NextToken)
Determine whether the given result set contains either a type name or.
static void FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL)
static bool AllowOverloadingOfFunction(const LookupResult &Previous, ASTContext &Context, const FunctionDecl *New)
Determine whether overloading is allowed for a new function declaration considering prior declaration...
static TypeSourceInfo * TryToFixInvalidVariablyModifiedTypeSourceInfo(TypeSourceInfo *TInfo, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID, ASTContext::GetBuiltinTypeError Error)
static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D)
static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS, ExpectedDecl *New)
Check whether a redeclaration of an entity introduced by a using-declaration is valid,...
static ShadowedDeclKind computeShadowedDeclKind(const NamedDecl *ShadowedDecl, const DeclContext *OldDC)
Determine what kind of declaration we're shadowing.
static void checkIsValidOpenCLKernelParameter(Sema &S, Declarator &D, ParmVarDecl *Param, llvm::SmallPtrSetImpl< const Type * > &ValidTypes)
static void mergeParamDeclAttributes(ParmVarDecl *newDecl, const ParmVarDecl *oldDecl, Sema &S)
mergeParamDeclAttributes - Copy attributes from the old parameter to the new one.
static bool CheckC23ConstexprVarType(Sema &SemaRef, SourceLocation VarLoc, QualType T)
static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a mulitversion function declaration.
static bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old)
Merge alignment attributes from Old to New, taking into account the special semantics of C11's _Align...
static bool mergeTypeWithPrevious(Sema &S, VarDecl *NewVD, VarDecl *OldVD, LookupResult &Previous)
static void CheckConstPureAttributesUsage(Sema &S, FunctionDecl *NewFD)
static bool FindPossiblePrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool MultiVersionTypesCompatible(FunctionDecl *Old, FunctionDecl *New)
static NestedNameSpecifier synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC)
static void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx, FixItHint &Hint)
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P, SourceLocation ExplicitThisLoc)
static void checkLifetimeBoundAttr(Sema &S, NamedDecl &ND)
static void patchDefaultTargetVersion(FunctionDecl *From, FunctionDecl *To)
static bool isFunctionDefinitionDiscarded(Sema &S, FunctionDecl *FD)
Given that we are within the definition of the given function, will that definition behave like C99's...
static void CheckForDuplicateEnumValues(Sema &S, ArrayRef< Decl * > Elements, EnumDecl *Enum, QualType EnumType)
static unsigned GetDiagnosticTypeSpecifierID(const DeclSpec &DS)
static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old)
checkNewAttributesAfterDef - If we already have a definition, check that there are no new attributes ...
static bool isClassCompatTagKind(TagTypeKind Tag)
Determine if tag kind is a class-key compatible with class for redeclaration (class,...
static bool hasIdenticalPassObjectSizeAttrs(const FunctionDecl *A, const FunctionDecl *B)
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND)
static bool hasSimilarParameters(ASTContext &Context, FunctionDecl *Declaration, FunctionDecl *Definition, SmallVectorImpl< unsigned > &Params)
hasSimilarParameters - Determine whether the C++ functions Declaration and Definition have "nearly" m...
static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD)
Determine whether a class is C-like, according to the rules of C++ [dcl.typedef] for anonymous classe...
static unsigned propagateAttribute(ParmVarDecl *To, const ParmVarDecl *From, Sema &S)
static FunctionDecl * CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, DeclContext *DC, QualType &R, TypeSourceInfo *TInfo, StorageClass SC, bool &IsVirtualOkay)
static Scope * getTagInjectionScope(Scope *S, const LangOptions &LangOpts)
Find the Scope in which a tag is implicitly declared if we see an elaborated type specifier in the sp...
static bool methodHasName(const FunctionDecl *FD, StringRef Name)
static std::pair< diag::kind, SourceLocation > getNoteDiagForInvalidRedeclaration(const T *Old, const T *New)
static bool checkForConflictWithNonVisibleExternC(Sema &S, const T *ND, LookupResult &Previous)
Apply special rules for handling extern "C" declarations.
static bool DeclHasAttr(const Decl *D, const Attr *A)
DeclhasAttr - returns true if decl Declaration already has the target attribute.
static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty)
static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit)
static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags, const LookupResult &R)
static FixItHint createFriendTagNNSFixIt(Sema &SemaRef, NamedDecl *ND, Scope *S, SourceLocation NameLoc)
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
static bool CheckAnonMemberRedeclaration(Sema &SemaRef, Scope *S, DeclContext *Owner, DeclarationName Name, SourceLocation NameLoc, bool IsUnion, StorageClass SC)
We are trying to inject an anonymous member into the given scope; check if there's an existing declar...
static bool checkGlobalOrExternCConflict(Sema &S, const T *ND, bool IsGlobal, LookupResult &Previous)
Check for conflict between this global or extern "C" declaration and previous global or extern "C" de...
static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts, const NamedDecl *D)
static bool isStdBuiltin(ASTContext &Ctx, FunctionDecl *FD, unsigned BuiltinID)
Determine whether a declaration matches a known function in namespace std.
static bool InjectAnonymousStructOrUnionMembers(Sema &SemaRef, Scope *S, DeclContext *Owner, RecordDecl *AnonRecord, AccessSpecifier AS, StorageClass SC, SmallVectorImpl< NamedDecl * > &Chaining)
InjectAnonymousStructOrUnionMembers - Inject the members of the anonymous struct or union AnonRecord ...
@ InvalidAddrSpacePtrKernelParam
static bool isFromSystemHeader(SourceManager &SM, const Decl *D)
Returns true if the declaration is declared in a system header or from a system macro.
static SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const ValueDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context, CXXMethodDecl *M1, CXXMethodDecl *M2, CXXSpecialMemberKind CSM)
[class.mem.special]p5 Two special member functions are of the same kind if:
static const CXXRecordDecl * findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC)
Find the parent class with dependent bases of the innermost enclosing method context.
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record)
[class.dtor]p4: At the end of the definition of a class, overload resolution is performed among the p...
static bool shouldConsiderLinkage(const VarDecl *VD)
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record)
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD, const FunctionDecl *NewFD, bool CausesMV, MultiVersionKind MVKind)
static DeclContext * getTagInjectionContext(DeclContext *DC)
Find the DeclContext in which a tag is implicitly declared if we see an elaborated type specifier in ...
static bool EquivalentArrayTypes(QualType Old, QualType New, const ASTContext &Ctx)
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New)
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for redeclaration diagnostic message.
static void checkInheritableAttr(Sema &S, NamedDecl &ND)
static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver)
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl *Old)
static NamedDecl * DiagnoseInvalidRedeclaration(Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD, ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S)
Generate diagnostics for an invalid function redeclaration.
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, DeclarationName Name)
RebuildDeclaratorInCurrentInstantiation - Checks whether the given declarator needs to be rebuilt in ...
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record, ArrayRef< CXXMethodDecl * > Methods, CXXSpecialMemberKind CSM)
[class.mem.special]p6: An eligible special member function is a special member function for which:
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc)
static bool hasParsedAttr(Scope *S, const Declarator &PD, ParsedAttr::Kind Kind)
ShadowedDeclKind
Enum describing the select options in diag::warn_decl_shadow.
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S)
static void CheckForComparisonInEnumInitializer(SemaBase &Sema, const EnumDecl *Enum)
static void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
static bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
static void checkWeakAttr(Sema &S, NamedDecl &ND)
static void checkModularFormatAttr(Sema &S, NamedDecl &ND)
static void checkSelectAnyAttr(Sema &S, NamedDecl &ND)
static bool isImplicitInstantiation(NamedDecl *D)
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT)
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent, SourceLocation DefaultInitLoc)
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S)
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD)
Returns true if there hasn't been any invalid type diagnosed.
static void RemoveUsingDecls(LookupResult &R)
Removes using shadow declarations not at class scope from the lookup results.
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S, CXXRecordDecl *Record)
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind, MultiVersionKind MVKind)
static bool looksMutable(QualType T, const ASTContext &Ctx)
static bool isUsingDeclNotAtClassScope(NamedDecl *D)
static void propagateAttributes(ParmVarDecl *To, const ParmVarDecl *From, F &&propagator)
static const NamedDecl * getDefinition(const Decl *D)
static QualType TryToFixInvalidVariablyModifiedType(QualType T, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static bool hasDeducedAuto(DeclaratorDecl *DD)
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT)
static QualType getCoreType(QualType Ty)
static bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, AvailabilityMergeKind AMK)
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD)
Check the target or target_version attribute of the function for MultiVersion validity.
static bool isOutOfScopePreviousDeclaration(NamedDecl *, DeclContext *, ASTContext &)
Determines whether the given declaration is an out-of-scope previous declaration.
static StorageClass StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS)
StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to a VarDecl::StorageClass.
static bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a new function declaration being added to an existing multiversioned declaratio...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void checkAliasAttr(Sema &S, NamedDecl &ND)
static void filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl, LookupResult &Previous)
Typedef declarations don't have linkage, but they still denote the same entity if their types are the...
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum)
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T)
static void checkWeakRefAttr(Sema &S, NamedDecl &ND)
static bool isIncompleteDeclExternC(Sema &S, const T *D)
Determine whether a variable is extern "C" prior to attaching an initializer.
static bool isAttributeTargetADefinition(Decl *D)
static Attr * getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD)
Return a CodeSegAttr from a containing class.
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D)
Check for this common pattern:
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC, DeclContext *NewDC)
Determine whether a tag originally declared in context OldDC can be redeclared with an unqualified na...
static bool isRecordType(QualType T)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
static CharSourceRange getRange(const CharSourceRange &EditRange, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeMacroExpansion)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
@ GE_Missing_type
Missing a type.
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
TypeLoc getElementLoc() const
SourceLocation getRBracketLoc() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
@ AS_Declspec
__declspec(...)
SourceRange getRange() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
AttributeFactory & getFactory() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
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)
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
base_class_iterator bases_end()
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
base_class_iterator bases_begin()
capture_const_range captures() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool hasDefinition() const
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
UnresolvedSetIterator conversion_iterator
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
char * location_data() const
Retrieve the data associated with the source-location information.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool isCallToStdMove() const
CastKind getCastKind() const
static CharSourceRange getCharRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
llvm::APInt getSize() const
Return the constant array size as an APInt.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclListNode::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
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)
TemplateParameterList * getInventedTemplateParameterList() const
The template parameter list generated from the explicit template parameters along with any invented t...
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
const ParsedAttributesView & getDeclarationAttributes() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool hasInitializer() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, 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
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) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions:
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool 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.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isLinkageValid() const
True if the computed linkage is valid.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
bool isPlaceholderVar(const LangOptions &LangOpts) const
Visibility getVisibility() const
Determines the visibility of this entity.
bool hasLinkageBeenComputed() const
True if something has required us to compute the linkage of this declaration.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool declarationReplaces(const NamedDecl *OldD, bool IsKnownNewer=true) const
Determine whether this declaration, if known to be well-formed within its context,...
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
bool hasLinkage() const
Determine whether this declaration has linkage.
bool isExternallyVisible() const
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
TypeLoc getAsTypeLoc() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
static constexpr NestedNameSpecifier getGlobal()
bool containsErrors() const
Whether this nested name specifier contains an error.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Type
A type, stored as a Type*.
ObjCCategoryDecl - Represents a category declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
ObjCContainerDecl - Represents a container for method declarations.
ObjCIvarDecl * getIvarDecl(IdentifierInfo *Id) const
getIvarDecl - This method looks up an ivar in this ContextDecl.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
known_extensions_range known_extensions() const
Wrapper for source info for ObjC interfaces.
void setNameLoc(SourceLocation Loc)
ObjCIvarDecl - Represents an ObjC instance variable.
static ObjCIvarDecl * Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, AccessControl ac, Expr *BW=nullptr, bool synthesized=false)
ObjCMethodDecl - Represents an instance or class method declaration.
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
ParmVarDecl *const * param_iterator
ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...
static OpaquePtr make(DeclGroupRef P)
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
MapType::iterator iterator
SmallVectorImpl< UniqueVirtualMethod >::iterator overriding_iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
void setRParenLoc(SourceLocation Loc)
TypeLoc getInnerLoc() const
void setLParenLoc(SourceLocation Loc)
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
ObjCDeclQualifier getObjCDeclQualifier() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setExplicitObjectParameterLoc(SourceLocation Loc)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
static const ParsedAttributesView & none()
bool hasAttribute(ParsedAttr::Kind K) const
ParsedAttributes - A collection of parsed attributes.
AttributePool & getPool() const
unsigned getDiagID() const
Pointer-authentication qualifiers.
bool isAddressDiscriminated() const
TypeLoc getPointeeLoc() const
Wrapper for source info for pointers.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
PrimitiveDefaultInitializeKind
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
QualType withoutLocalFastQualifiers() const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
bool isConstQualified() const
Determine whether this type is const-qualified.
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
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 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)
WebAssemblyImportNameAttr * mergeImportNameAttr(Decl *D, const WebAssemblyImportNameAttr &AL)
WebAssemblyImportModuleAttr * mergeImportModuleAttr(Decl *D, const WebAssemblyImportModuleAttr &AL)
Mode getAlignMode() const
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
static NameClassification DependentNonType()
static NameClassification VarTemplate(TemplateName Name)
static NameClassification Unknown()
static NameClassification OverloadSet(ExprResult E)
static NameClassification UndeclaredTemplate(TemplateName Name)
static NameClassification FunctionTemplate(TemplateName Name)
static NameClassification NonType(NamedDecl *D)
static NameClassification Concept(TemplateName Name)
static NameClassification UndeclaredNonType()
static NameClassification TypeTemplate(TemplateName Name)
static NameClassification Error()
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Scope * getCurScope() const
Retrieve the parser's current scope.
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
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.
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 * 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)
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
PragmaStack< bool > StrictGuardStackCheckStack
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void CheckCoroutineWrapper(FunctionDecl *FD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
PragmaStack< StringLiteral * > ConstSegStack
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
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)
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.
SourceLocation CurInitSegLoc
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.
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD)
AddOverriddenMethods - See if a method overrides any in the base classes, and if so,...
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_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)
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 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.
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.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isStructureType() const
bool isDependentSizedArrayType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isIncompleteArrayType() const
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool 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.
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)
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ GVA_AvailableExternally
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
int hasAttribute(AttributeCommonInfo::Syntax Syntax, llvm::StringRef ScopeName, llvm::StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts, bool CheckPlugins)
Return the version number associated with the attribute if we recognize and implement the attribute s...
ConstexprSpecKind
Define the kind of constexpr specifier.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
std::pair< FileID, unsigned > FileIDAndOffset
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ TemplateTemplateArgument
@ DefaultInitializedObject
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool DeclAttrsMatchCUDAMode(const LangOptions &LangOpts, Decl *D)
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
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)
@ None
The alignment was not explicit in code.
@ Enumerator
Enumerator value with fixed underlying type.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ArrayRef< NamedDecl * > getDeclsInPrototype() const
Get the non-parameter decls defined within this function prototype.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
const IdentifierInfo * Ident
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
EvalResult is a struct with detailed info about an evaluated expression.
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
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.