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)
548 T =
Context.getTypeDeclType(TD);
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()) {
723 if (
Context.hasSameUnqualifiedType(T,
Base.getType()))
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.");
1392 assert(
CurContext &&
"DeclContext imbalance!");
1395 assert(
CurContext &&
"Popped translation unit!");
1405 assert(
CurContext &&
"skipping definition of undefined tag");
1433 assert(!S->
getEntity() &&
"scope already has entity");
1466 "expected to be initializing a template parameter scope");
1494 cast<Decl>(DC)->getDescribedTemplateParams()) {
1495 unsigned DCDepth = TPL->getDepth() + 1;
1496 if (DCDepth > ScopeDepth)
1498 if (ScopeDepth == DCDepth)
1517 "The next DeclContext should be lexically contained in the current one.");
1521 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1524 if (Param->getIdentifier()) {
1534 assert(
CurContext &&
"DeclContext imbalance!");
1536 assert(
CurContext &&
"Popped translation unit!");
1550 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1565 return ND->
hasAttr<OverloadableAttr>();
1568 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1623 for (; I != IEnd; ++I) {
1656 bool AllowInlineNamespace)
const {
1657 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1664 if (ScopeDC->getPrimaryContext() == TargetDC)
1676 bool ConsiderLinkage,
1677 bool AllowInlineNamespace) {
1695 if (
auto *VD = dyn_cast<VarDecl>(D))
1697 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1699 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1713 if (
New->getFriendObjectKind() &&
1754 if (NewIsModuleInterface || OldIsModuleInterface) {
1758 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1760 << NewIsModuleInterface
1762 << OldIsModuleInterface
1765 New->setInvalidDecl();
1778 if (!
New->getLexicalDeclContext()
1779 ->getNonTransparentContext()
1780 ->isFileContext() ||
1786 bool IsNewExported =
New->isInExportDeclContext();
1790 if (!IsNewExported && !IsOldExported)
1802 New->getOwningModule()->isImplicitGlobalModule())
1805 assert(IsNewExported);
1813 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1831 "New and Old are not the same definition, we should diagnostic it "
1832 "immediately instead of checking it.");
1835 "We shouldn't see unreachable definitions here.");
1883 return OldM == NewM;
1920 return CD->isCopyConstructor();
1927 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1928 if (!RD->hasNameForLinkage())
1949 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1955 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1958 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1967 if (FD->doesThisDeclarationHaveABody() &&
1968 Context.DeclMustBeEmitted(FD))
1970 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1977 if (
Context.DeclMustBeEmitted(VD))
1980 if (VD->isStaticDataMember() &&
1983 if (VD->isStaticDataMember() &&
1985 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1997 return mightHaveNonExternalLinkage(D);
2004 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2010 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2025 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2029 bool IsAllIgnored =
true;
2030 for (
const auto *BD : DD->bindings()) {
2031 if (BD->isReferenced())
2033 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2034 BD->hasAttr<UnusedAttr>());
2047 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2057 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2060 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2061 if (!WithinFunction)
2072 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2075 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2076 Init = Cleanups->getSubExpr();
2078 const auto *Ty = VD->getType().getTypePtr();
2083 if (TT->getDecl()->hasAttr<UnusedAttr>())
2089 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2090 MTE && MTE->getExtendingDecl()) {
2091 Ty = VD->getType().getNonReferenceType().getTypePtr();
2092 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2097 if (Ty->isIncompleteType() || Ty->isDependentType())
2102 Ty = Ty->getBaseElementTypeUnsafe();
2104 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2105 if (Tag->hasAttr<UnusedAttr>())
2108 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2109 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2113 const auto *Construct =
2114 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2115 if (Construct && !Construct->isElidable()) {
2117 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2118 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2124 if (
Init->isTypeDependent()) {
2126 if (!Ctor->isTrivial())
2167 for (
auto *TmpD : D->
decls()) {
2168 if (
const auto *T = dyn_cast<TypedefNameDecl>(TmpD))
2170 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2184 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2196 DiagID = diag::warn_unused_exception_param;
2198 DiagID = diag::warn_unused_label;
2200 DiagID = diag::warn_unused_variable;
2219 if (Ty->isReferenceType() || Ty->isDependentType())
2222 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2223 if (Tag->hasAttr<UnusedAttr>())
2227 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2228 RD && !RD->hasAttr<WarnUnusedAttr>())
2240 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2246 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2253 assert(iter->getSecond() >= 0 &&
2254 "Found a negative number of references to a VarDecl");
2255 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2265 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2266 if (!UnusedCXXCondDecl)
2272 DiagID = diag::warn_unused_but_set_parameter;
2274 DiagID = diag::warn_unused_but_set_global;
2276 DiagID = diag::warn_unused_but_set_variable;
2286 bool Diagnose =
false;
2290 Diagnose = L->
getStmt() ==
nullptr;
2301 "Scope shouldn't contain decls!");
2308 std::optional<SourceLocation> PreviousDeclLoc;
2313 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2318 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2321 for (
auto *TmpD : S->
decls()) {
2322 assert(TmpD &&
"This decl didn't get pushed??");
2330 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2333 if (
auto *VD = dyn_cast<VarDecl>(D);
2334 VD && !VD->isInternalLinkageFileVar()) {
2343 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2354 auto ShadowI = ShadowingDecls.find(D);
2355 if (ShadowI != ShadowingDecls.end()) {
2356 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2357 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2358 PDiag(diag::warn_ctor_parm_shadows_field)
2359 << D << FD << FD->getParent());
2361 ShadowingDecls.erase(ShadowI);
2365 llvm::sort(DeclDiags,
2366 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2371 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2373 for (
const LocAndDiag &D : DeclDiags) {
2375 if (D.PreviousDeclLoc)
2376 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2400 return "ucontext.h";
2402 llvm_unreachable(
"unhandled error kind");
2413 Parent->
addDecl(CLinkageDecl);
2414 Parent = CLinkageDecl;
2418 if (
Context.BuiltinInfo.isImmediate(ID)) {
2420 "consteval builtins should only be available in C++20 mode");
2429 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2435 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2438 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2440 Params.push_back(parm);
2442 New->setParams(Params);
2450 Scope *S,
bool ForRedeclaration,
2457 if (!ForRedeclaration)
2463 Context.BuiltinInfo.allowTypeMismatch(ID))
2469 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2470 <<
Context.BuiltinInfo.getName(ID);
2476 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2478 <<
Context.BuiltinInfo.getName(ID);
2482 if (!ForRedeclaration &&
2483 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2484 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2485 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2486 : diag::ext_implicit_lib_function_decl)
2487 <<
Context.BuiltinInfo.getName(ID) << R;
2488 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2489 Diag(Loc, diag::note_include_header_or_declare)
2490 << Header <<
Context.BuiltinInfo.getName(ID);
2526 while (Filter.hasNext()) {
2535 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2537 Decl->getUnderlyingType()))
2542 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2543 Decl->getAnonDeclWithTypedefName())
2555 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2556 OldType = OldTypedef->getUnderlyingType();
2558 OldType =
Context.getTypeDeclType(Old);
2564 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2568 New->setInvalidDecl();
2572 if (OldType != NewType &&
2575 !
Context.hasSameType(OldType, NewType)) {
2577 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2578 << Kind << NewType << OldType;
2581 New->setInvalidDecl();
2591 if (
New->isInvalidDecl())
return;
2597 switch (TypeID->getLength()) {
2601 if (!TypeID->isStr(
"id"))
2604 if (!T->isPointerType())
2606 if (!T->isVoidPointerType()) {
2611 Context.setObjCIdRedefinitionType(T);
2613 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2618 if (!TypeID->isStr(
"Class"))
2620 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2622 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2626 if (!TypeID->isStr(
"SEL"))
2628 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2630 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2640 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2641 <<
New->getDeclName();
2647 return New->setInvalidDecl();
2652 return New->setInvalidDecl();
2654 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2655 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2656 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2659 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2663 if (OldTD->isModed())
2664 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2665 OldTD->getUnderlyingType());
2667 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2723 Diag(
New->getLocation(), diag::err_redefinition)
2724 <<
New->getDeclName();
2726 return New->setInvalidDecl();
2741 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2744 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2745 <<
New->getDeclName();
2752 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2754 for (
auto *ECD : ED->enumerators()) {
2765 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2766 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2767 for (
const auto *i : D->
attrs())
2768 if (i->getKind() == A->
getKind()) {
2784 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2785 return VD->isThisDeclarationADefinition();
2786 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2787 return TD->isCompleteDefinition() || TD->isBeingDefined();
2798 AlignedAttr *OldAlignasAttr =
nullptr;
2799 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2800 unsigned OldAlign = 0;
2808 if (I->isAlignmentDependent())
2814 unsigned Align = I->getAlignment(S.
Context);
2815 if (Align > OldAlign) {
2817 OldStrictestAlignAttr = I;
2822 AlignedAttr *NewAlignasAttr =
nullptr;
2823 unsigned NewAlign = 0;
2824 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2825 if (I->isAlignmentDependent())
2831 unsigned Align = I->getAlignment(S.
Context);
2832 if (Align > NewAlign)
2836 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2844 if (OldAlign == 0 || NewAlign == 0) {
2857 if (OldAlign != NewAlign) {
2858 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2861 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2874 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2876 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2880 bool AnyAdded =
false;
2883 if (OldAlign > NewAlign) {
2884 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2885 Clone->setInherited(
true);
2886 New->addAttr(Clone);
2891 if (OldAlignasAttr && !NewAlignasAttr &&
2892 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2893 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2894 Clone->setInherited(
true);
2895 New->addAttr(Clone);
2902#define WANT_DECL_MERGE_LOGIC
2903#include "clang/Sema/AttrParsedAttrImpl.inc"
2904#undef WANT_DECL_MERGE_LOGIC
2911 if (!DiagnoseMutualExclusions(S, D,
Attr))
2922 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr)) {
2924 if (AvailabilityAttr *
Inf = AA->getInferredAttrAs())
2925 InferredPlatformII =
Inf->getPlatform();
2927 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2928 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2929 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2930 AA->getPriority(), AA->getEnvironment(), InferredPlatformII);
2931 }
else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2933 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2935 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2937 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2939 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2941 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2942 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2944 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2946 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2947 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2949 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2951 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2953 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2955 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2957 IA->getInheritanceModel());
2958 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2967 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2969 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2971 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2973 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2984 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2985 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2986 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2988 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2990 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2992 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2994 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2996 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2999 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
3002 WS->getSpelledArgsCount());
3003 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
3005 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
3010 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
3014 else if (
const auto *PA = dyn_cast<PersonalityAttr>(
Attr))
3029 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
3030 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
3034 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3040 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
3042 if (FD->isDefined(Def,
true))
3049 for (
const auto *Attribute : D->
attrs())
3050 if (Attribute->getKind() == Kind)
3058 if (!
New->hasAttrs())
3062 if (!Def || Def ==
New)
3066 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3067 Attr *NewAttribute = NewAttributes[I];
3076 NewAttributes.erase(NewAttributes.begin() + I);
3084 ? diag::err_alias_after_tentative
3085 : diag::err_redefinition;
3087 if (
Diag == diag::err_redefinition)
3097 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3133 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3134 if (AA->isAlignas()) {
3145 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3147 NewAttributes.erase(NewAttributes.begin() + I);
3157 diag::err_loader_uninitialized_redeclaration);
3159 NewAttributes.erase(NewAttributes.begin() + I);
3182 diag::err_sycl_entry_point_after_definition)
3195 diag::warn_attribute_precede_definition);
3197 NewAttributes.erase(NewAttributes.begin() + I);
3203 const ConstInitAttr *CIAttr,
3204 bool AttrBeforeInit) {
3211 std::string SuitableSpelling;
3213 SuitableSpelling = std::string(
3215 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3217 InsertLoc, {tok::l_square, tok::l_square,
3218 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3219 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3220 tok::r_square, tok::r_square}));
3221 if (SuitableSpelling.empty())
3223 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3224 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3225 tok::r_paren, tok::r_paren}));
3226 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3227 SuitableSpelling =
"constinit";
3228 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3229 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3230 if (SuitableSpelling.empty())
3231 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3232 SuitableSpelling +=
" ";
3234 if (AttrBeforeInit) {
3237 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3240 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3244 S.
Diag(CIAttr->getLocation(),
3245 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3246 : diag::warn_require_const_init_added_too_late)
3249 << CIAttr->isConstinit()
3257 UsedAttr *NewAttr = OldAttr->clone(
Context);
3258 NewAttr->setInherited(
true);
3259 New->addAttr(NewAttr);
3262 RetainAttr *NewAttr = OldAttr->clone(
Context);
3263 NewAttr->setInherited(
true);
3264 New->addAttr(NewAttr);
3273 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3274 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3275 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3283 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3286 if (InitDecl == NewVD) {
3290 if (OldConstInit && OldConstInit->isConstinit())
3293 }
else if (NewConstInit) {
3297 if (InitDecl && InitDecl != NewVD) {
3300 NewVD->dropAttr<ConstInitAttr>();
3308 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3309 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3310 if (!OldA->isEquivalent(NewA)) {
3312 Diag(
New->getLocation(), diag::err_different_asm_label);
3313 Diag(OldA->getLocation(), diag::note_previous_declaration);
3315 }
else if (Old->
isUsed()) {
3318 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3324 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3325 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3326 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3327 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3328 Diag(NewAbiTagAttr->getLocation(),
3329 diag::err_new_abi_tag_on_redeclaration)
3331 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3335 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3341 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3342 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3344 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3351 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3352 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3354 Diag(
New->getLocation(), diag::warn_mismatched_section)
3362 bool foundAny =
New->hasAttrs();
3392 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3405 if (!foundAny)
New->dropAttrs();
3410 checkAttrIsTypeDependent(D, A);
3421 newAttr->setInherited(
true);
3443 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3458 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3459 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3460 S.
Diag(CDA->getLocation(),
3461 diag::err_carries_dependency_missing_on_first_decl) << 1;
3469 diag::note_carries_dependency_missing_first_decl) << 1;
3488 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3489 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3497 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3529 if (*Oldnullability != *Newnullability) {
3530 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3547 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3548 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3549 if (OldParamDT && NewParamDT &&
3550 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3551 QualType OldParamOT = OldParamDT->getOriginalType();
3552 QualType NewParamOT = NewParamDT->getOriginalType();
3555 << NewParam << NewParamOT;
3566struct GNUCompatibleParamWarning {
3567 ParmVarDecl *OldParm;
3568 ParmVarDecl *NewParm;
3569 QualType PromotedType;
3576template <
typename T>
3577static std::pair<diag::kind, SourceLocation>
3581 if (Old->isThisDeclarationADefinition())
3582 PrevDiag = diag::note_previous_definition;
3583 else if (Old->isImplicit()) {
3584 PrevDiag = diag::note_previous_implicit_declaration;
3585 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3586 if (FD->getBuiltinID())
3587 PrevDiag = diag::note_previous_builtin_declaration;
3590 OldLocation =
New->getLocation();
3592 PrevDiag = diag::note_previous_declaration;
3593 return std::make_pair(PrevDiag, OldLocation);
3601 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3602 !LangOpts.CPlusPlus &&
3608 const AttributedType *AT = T->getAs<AttributedType>();
3609 while (AT && !AT->isCallingConv())
3610 AT = AT->getModifiedType()->getAs<AttributedType>();
3614template <
typename T>
3628template<
typename T>
static bool isExternC(T *D) {
return D->isExternC(); }
3635template<
typename ExpectedDecl>
3657 !Old->getDeclContext()->getRedeclContext()->Equals(
3658 New->getDeclContext()->getRedeclContext()) &&
3663 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3676 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3677 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3680 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3681 AttrA->isDynamic() == AttrB->isDynamic();
3707 if (NamedDC->Equals(SemaDC))
3710 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3712 "unexpected context for redeclaration");
3723 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3724 FixSemaDC(FD->getDescribedFunctionTemplate());
3725 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3726 FixSemaDC(VD->getDescribedVarTemplate());
3730 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3738 Diag(
New->getLocation(), diag::err_using_decl_friend);
3739 Diag(Shadow->getTargetDecl()->getLocation(),
3740 diag::note_using_decl_target);
3741 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3749 New->getDescribedFunctionTemplate()) {
3761 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3762 <<
New->getDeclName();
3786 std::tie(PrevDiag, OldLocation) =
3796 !
New->getTemplateSpecializationInfo() &&
3799 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3800 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3802 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3803 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3808 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3809 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3810 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3813 New->dropAttr<InternalLinkageAttr>();
3816 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3817 if (!Old->
hasAttr<ErrorAttr>()) {
3818 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3820 New->dropAttr<ErrorAttr>();
3828 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3829 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3830 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3839 const Decl *DiagOld = Old;
3841 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3842 const auto *A = D->getAttr<OverloadableAttr>();
3843 return A && !A->isImplicit();
3852 diag::note_attribute_overloadable_prev_overload)
3856 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3858 New->dropAttr<OverloadableAttr>();
3865 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3867 Diag(OldLocation, diag::note_previous_declaration);
3890 bool RequiresAdjustment =
false;
3892 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3898 if (!NewCCExplicit) {
3902 RequiresAdjustment =
true;
3910 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3914 RequiresAdjustment =
true;
3918 Diag(
New->getLocation(), diag::err_cconv_change)
3921 << (!FirstCCExplicit ?
"" :
3925 Diag(
First->getLocation(), diag::note_previous_declaration);
3933 RequiresAdjustment =
true;
3945 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3946 FPT2->getParamTypes(), EPI2);
3948 New->setType(NewQType);
3957 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3960 Diag(OldLocation, diag::note_previous_declaration);
3965 RequiresAdjustment =
true;
3971 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3972 <<
"'ns_returns_retained'";
3973 Diag(OldLocation, diag::note_previous_declaration);
3978 RequiresAdjustment =
true;
3984 AnyX86NoCallerSavedRegistersAttr *
Attr =
3985 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3986 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3987 Diag(OldLocation, diag::note_previous_declaration);
3992 RequiresAdjustment =
true;
3995 if (RequiresAdjustment) {
3999 NewQType =
Context.getCanonicalType(
New->getType());
4004 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
4012 if (
New->hasAttr<GNUInlineAttr>() &&
4021 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
4022 <<
New->getDeclName();
4023 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4027 QualType OldQTypeForComparison = OldQType;
4028 if (
Context.hasAnyFunctionEffects()) {
4030 const auto NewFX =
New->getFunctionEffects();
4031 if (OldFX != NewFX) {
4033 for (
const auto &Diff : Diffs) {
4034 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
4036 diag::warn_mismatched_func_effect_redeclaration)
4037 << Diff.effectName();
4048 if (!MergeErrs.empty())
4055 NewFPT->getParamTypes(), EPI);
4057 New->setType(ModQT);
4058 NewQType =
New->getType();
4063 EPI = OldFPT->getExtProtoInfo();
4065 OldQTypeForComparison =
Context.getFunctionType(
4066 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4068 if (OldFX.empty()) {
4079 NewQType =
Context.getCanonicalType(
New->getType());
4087 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4088 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4090 OldDeclaredReturnType)) {
4095 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4097 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4098 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4099 <<
New <<
New->getReturnTypeSourceRange();
4101 !Old->
hasAttr<OverloadableAttr>() &&
4102 !
New->hasAttr<OverloadableAttr>())
4103 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4105 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4106 <<
New->getReturnTypeSourceRange();
4107 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4117 if (OldReturnType != NewReturnType) {
4121 if (OldAT && OldAT->isDeduced()) {
4122 QualType DT = OldAT->getDeducedType();
4133 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4135 if (OldMethod && NewMethod) {
4142 bool IsClassScopeExplicitSpecialization =
4148 !IsClassScopeExplicitSpecialization) {
4153 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4154 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4165 NewDiag = diag::err_constructor_redeclared;
4167 NewDiag = diag::err_destructor_redeclared;
4169 NewDiag = diag::err_conv_function_redeclared;
4171 NewDiag = diag::err_member_redeclared;
4173 Diag(
New->getLocation(), NewDiag);
4175 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4176 <<
New <<
New->getType();
4178 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4191 diag::err_definition_of_implicitly_declared_member)
4197 diag::err_definition_of_explicitly_defaulted_member)
4220 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4221 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4222 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4231 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4232 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4233 Diag(CDA->getLocation(),
4234 diag::err_carries_dependency_missing_on_first_decl) << 0;
4236 diag::note_carries_dependency_missing_first_decl) << 0;
4244 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4245 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4246 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4261 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4275 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4276 Diag(OldLocation, PrevDiag);
4278 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4279 Diag(OldLocation, PrevDiag);
4286 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4294 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4304 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4332 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4336 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4354 if (
New->hasWrittenPrototype()) {
4366 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4367 if (WithoutProto ==
New)
4368 IsWithoutProtoADef = NewDeclIsDefn;
4370 IsWithProtoADef = NewDeclIsDefn;
4372 diag::warn_non_prototype_changes_behavior)
4373 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4374 << (WithoutProto == Old) << IsWithProtoADef;
4384 !IsWithoutProtoADef)
4390 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4395 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4398 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4399 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4400 OldProto->getParamTypes(),
4401 OldProto->getExtProtoInfo());
4402 New->setType(NewQType);
4403 New->setHasInheritedPrototype();
4407 for (
const auto &ParamType : OldProto->param_types()) {
4410 ParamType,
nullptr,
SC_None,
nullptr);
4411 Param->setScopeInfo(0, Params.size());
4412 Param->setImplicit();
4413 Params.push_back(Param);
4416 New->setParams(Params);
4425 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4452 NewProto->getReturnType());
4453 bool LooseCompatible = !MergedReturn.isNull();
4455 LooseCompatible && Idx != End; ++Idx) {
4459 NewProto->getParamType(Idx))) {
4460 ArgTypes.push_back(NewParm->
getType());
4464 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4465 NewProto->getParamType(Idx) };
4466 Warnings.push_back(Warn);
4467 ArgTypes.push_back(NewParm->
getType());
4469 LooseCompatible =
false;
4472 if (LooseCompatible) {
4473 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4474 Diag(Warnings[Warn].NewParm->getLocation(),
4475 diag::ext_param_promoted_not_compatible_with_prototype)
4476 << Warnings[Warn].PromotedType
4477 << Warnings[Warn].OldParm->getType();
4478 if (Warnings[Warn].OldParm->getLocation().isValid())
4479 Diag(Warnings[Warn].OldParm->getLocation(),
4480 diag::note_previous_declaration);
4483 if (MergeTypeWithOld)
4484 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4501 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4502 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4503 Diag(OldLocation, diag::note_previous_builtin_declaration)
4508 PrevDiag = diag::note_previous_builtin_declaration;
4511 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4512 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4517 Scope *S,
bool MergeTypeWithOld) {
4523 New->setIsPureVirtual();
4532 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4546 if (!Merged.isNull() && MergeTypeWithOld)
4547 New->setType(Merged);
4571 ni != ne && oi != oe; ++ni, ++oi)
4580 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4581 ? diag::err_redefinition_different_type
4582 : diag::err_redeclaration_different_type)
4587 std::tie(PrevDiag, OldLocation)
4589 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4590 New->setInvalidDecl();
4594 bool MergeTypeWithOld) {
4600 if (
New->getType()->isUndeducedType()) {
4622 QualType PrevVDTy = PrevVD->getType();
4626 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4634 MergedT =
New->getType();
4645 else if (
New->getType()->isObjCObjectPointerType() &&
4647 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4662 if ((
New->getType()->isDependentType() ||
4667 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4676 if (MergeTypeWithOld)
4677 New->setType(MergedT);
4711 if (
New->isInvalidDecl())
4724 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4728 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4730 return New->setInvalidDecl();
4732 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4735 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4737 return New->setInvalidDecl();
4741 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4742 <<
New->getDeclName();
4744 New->getLocation());
4745 return New->setInvalidDecl();
4757 return New->setInvalidDecl();
4764 Diag(
New->getLocation(), diag::err_duplicate_member)
4765 <<
New->getIdentifier();
4767 New->setInvalidDecl();
4773 if (
New->hasAttr<WeakImportAttr>())
4776 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4779 New->dropAttr<WeakImportAttr>();
4784 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4785 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4786 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4789 New->dropAttr<InternalLinkageAttr>();
4794 if (MostRecent != Old) {
4797 if (
New->isInvalidDecl())
4802 if (
New->isInvalidDecl())
4807 std::tie(PrevDiag, OldLocation) =
4812 !
New->isStaticDataMember() &&
4815 Diag(
New->getLocation(), diag::ext_static_non_static)
4816 <<
New->getDeclName();
4817 Diag(OldLocation, PrevDiag);
4819 Diag(
New->getLocation(), diag::err_static_non_static)
4820 <<
New->getDeclName();
4821 Diag(OldLocation, PrevDiag);
4822 return New->setInvalidDecl();
4836 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4837 !
New->isStaticDataMember() &&
4839 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4840 Diag(OldLocation, PrevDiag);
4841 return New->setInvalidDecl();
4845 if (
New->hasExternalStorage() &&
4847 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4848 Diag(OldLocation, PrevDiag);
4849 return New->setInvalidDecl();
4852 !
New->hasExternalStorage()) {
4853 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4854 Diag(OldLocation, PrevDiag);
4855 return New->setInvalidDecl();
4865 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4868 !
New->getLexicalDeclContext()->isRecord())) {
4869 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4870 Diag(OldLocation, PrevDiag);
4871 return New->setInvalidDecl();
4879 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4880 Diag(Def->getLocation(), diag::note_previous_definition);
4894 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4895 Diag(OldLocation, PrevDiag);
4896 }
else if (!
New->getTLSKind()) {
4897 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4898 Diag(OldLocation, PrevDiag);
4904 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4906 Diag(OldLocation, PrevDiag);
4916 diag::warn_deprecated_redundant_constexpr_static_def);
4922 New->setInvalidDecl();
4931 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4938 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4939 Diag(OldLocation, PrevDiag);
4940 New->setInvalidDecl();
4949 New->setPreviousDecl(Old);
4959 New->setImplicitlyInline();
4964 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4966 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4967 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4968 auto &HSI =
PP.getHeaderSearchInfo();
4969 StringRef HdrFilename =
4972 auto noteFromModuleOrInclude = [&](
Module *Mod,
4978 if (IncLoc.isValid()) {
4980 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4986 Diag(IncLoc, diag::note_redefinition_include_same_file)
4987 << HdrFilename.str();
4997 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
5005 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
5021 New->getDescribedVarTemplate() ||
5022 !
New->getTemplateParameterLists().empty() ||
5023 New->getDeclContext()->isDependentContext() ||
5024 New->hasAttr<SelectAnyAttr>())) {
5027 New->demoteThisDefinitionToDeclaration();
5035 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
5037 New->setInvalidDecl();
5063 if (!
Context.getLangOpts().CPlusPlus)
5069 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5072 Context.getManglingNumberContext(Tag->getParent());
5081 Decl *ManglingContextDecl;
5082 std::tie(MCtx, ManglingContextDecl) =
5092struct NonCLikeKind {
5104 explicit operator bool() {
return Kind !=
None; }
5112 return {NonCLikeKind::Invalid, {}};
5119 return {NonCLikeKind::BaseClass,
5131 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5132 if (FD->hasInClassInitializer()) {
5133 auto *
Init = FD->getInClassInitializer();
5134 return {NonCLikeKind::DefaultMemberInit,
5150 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5158 if (MemberRD->isLambda())
5159 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5163 if (MemberRD->isThisDeclarationADefinition()) {
5169 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5186 Context.getCanonicalTagType(TagFromDeclSpec))) {
5188 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5199 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5203 if (NonCLike || ChangesLinkage) {
5204 if (NonCLike.Kind == NonCLikeKind::Invalid)
5207 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5208 if (ChangesLinkage) {
5210 if (NonCLike.Kind == NonCLikeKind::None)
5211 DiagID = diag::err_typedef_changes_linkage;
5213 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5219 TextToInsert +=
' ';
5222 Diag(FixitLoc, DiagID)
5225 if (NonCLike.Kind != NonCLikeKind::None) {
5226 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5227 << NonCLike.Kind - 1 << NonCLike.Range;
5230 << NewTD << isa<TypeAliasDecl>(NewTD);
5255 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5256 if (ED->isScopedUsingClassTag())
5263 llvm_unreachable(
"unexpected type specifier");
5271 bool IsExplicitInstantiation,
5274 Decl *TagD =
nullptr;
5292 Tag = CTD->getTemplatedDecl();
5297 Tag->setFreeStanding();
5298 if (Tag->isInvalidDecl())
5307 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5344 "Friend ellipsis but not friend-specified?");
5347 bool DeclaresAnything =
true;
5351 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5354 Record->getDeclContext()->isRecord()) {
5368 DeclaresAnything =
false;
5387 if ((Tag && Tag->getDeclName()) ||
5397 DeclaresAnything =
false;
5409 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5410 !
Enum->isInvalidDecl())
5411 DeclaresAnything =
false;
5419 DeclaresAnything =
false;
5423 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5425 << Tag->getTagKind()
5438 if (!DeclaresAnything) {
5441 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5442 ? diag::err_no_declarators
5443 : diag::ext_no_declarators)
5456 unsigned DiagID = diag::warn_standalone_specifier;
5458 DiagID = diag::ext_standalone_specifier;
5499 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5500 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5502 DiagnosticId = diag::warn_attribute_ignored;
5503 else if (AL.isRegularKeywordAttribute())
5504 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5506 DiagnosticId = diag::warn_declspec_attribute_ignored;
5507 Diag(AL.getLoc(), DiagnosticId)
5511 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5512 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5535 NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5536 assert(PrevDecl &&
"Expected a non-null Decl");
5549 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5551 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5557 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5567 if (
Record->isAnonymousStructOrUnion())
5572 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5606 for (
auto *D : AnonRecord->
decls()) {
5629 unsigned OldChainingSize = Chaining.size();
5631 Chaining.append(IF->chain_begin(), IF->chain_end());
5633 Chaining.push_back(VD);
5635 assert(Chaining.size() >= 2);
5638 for (
unsigned i = 0; i < Chaining.size(); i++)
5639 NamedChain[i] = Chaining[i];
5643 VD->
getType(), {NamedChain, Chaining.size()});
5657 Chaining.resize(OldChainingSize);
5671 "Parser allowed 'typedef' as storage class VarDecl.");
5672 switch (StorageClassSpec) {
5686 llvm_unreachable(
"unknown storage class specifier");
5690 assert(
Record->hasInClassInitializer());
5692 for (
const auto *I :
Record->decls()) {
5693 const auto *FD = dyn_cast<FieldDecl>(I);
5694 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5695 FD = IFD->getAnonField();
5696 if (FD && FD->hasInClassInitializer())
5697 return FD->getLocation();
5700 llvm_unreachable(
"couldn't find in-class initializer");
5708 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5728 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5730 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5732 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5738 const char *PrevSpec =
nullptr;
5750 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5755 PrevSpec, DiagID, Policy);
5763 diag::err_anonymous_union_with_storage_spec)
5769 PrevSpec, DiagID,
Context.getPrintingPolicy());
5777 <<
Record->isUnion() <<
"const"
5781 diag::ext_anonymous_struct_union_qualified)
5782 <<
Record->isUnion() <<
"volatile"
5786 diag::ext_anonymous_struct_union_qualified)
5787 <<
Record->isUnion() <<
"restrict"
5791 diag::ext_anonymous_struct_union_qualified)
5792 <<
Record->isUnion() <<
"_Atomic"
5796 diag::ext_anonymous_struct_union_qualified)
5797 <<
Record->isUnion() <<
"__unaligned"
5807 for (
auto *Mem :
Record->decls()) {
5809 if (Mem->isInvalidDecl())
5812 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5816 assert(FD->getAccess() !=
AS_none);
5818 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5830 }
else if (Mem->isImplicit()) {
5837 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5838 if (!MemRecord->isAnonymousStructOrUnion() &&
5839 MemRecord->getDeclName()) {
5842 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5846 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5854 Diag(MemRecord->getLocation(),
5855 diag::ext_anonymous_record_with_anonymous_type)
5865 unsigned DK = diag::err_anonymous_record_bad_member;
5867 DK = diag::err_anonymous_record_with_type;
5869 DK = diag::err_anonymous_record_with_function;
5871 DK = diag::err_anonymous_record_with_static;
5875 DK == diag::err_anonymous_record_with_type)
5876 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5879 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5895 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5916 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5920 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5936 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5942 Record->getLocation(),
nullptr,
5958 Record->setAnonymousStructOrUnion(
true);
5969 Chain.push_back(Anon);
5975 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5978 Decl *ManglingContextDecl;
5979 std::tie(MCtx, ManglingContextDecl) =
5998 assert(
Record &&
"expected a record!");
6003 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
6011 nullptr, RecTy, TInfo,
6023 Chain.push_back(Anon);
6027 diag::err_field_incomplete_or_sizeless) ||
6032 ParentDecl->setInvalidDecl();
6069 diag::err_deduction_guide_name_not_class_template)
6089 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6099 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6100 Context.getCanonicalType(Ty)));
6111 Context.getCanonicalType(Ty)));
6132 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6144 Context.getCanonicalType(Ty)));
6152 return Context.getNameForTemplate(TName, TNameLoc);
6157 llvm_unreachable(
"Unknown name kind");
6185 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6190 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6198 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6199 (DeclTyName && DeclTyName == DefTyName))
6200 Params.push_back(Idx);
6227#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6228#include "clang/Basic/TransformTypeTraits.def"
6233 if (T.isNull() || !T->isInstantiationDependentType())
break;
6243 if (!TSI)
return true;
6256 if (
Result.isInvalid())
return true;
6301 << D << static_cast<int>(Status);
6312 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6313 llvm::omp::TraitProperty::
6314 implementation_extension_bind_to_declaration))
6339 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6350 bool IsMemberSpecialization) {
6351 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6352 "without nested-name-specifier");
6368 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6369 : diag::err_member_extra_qualification)
6373 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6381 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6383 Diag(Loc, diag::err_member_qualification)
6386 Diag(Loc, diag::err_invalid_declarator_global_scope)
6389 Diag(Loc, diag::err_invalid_declarator_in_function)
6392 Diag(Loc, diag::err_invalid_declarator_in_block)
6396 Diag(Loc, diag::err_export_non_namespace_scope_name)
6403 Diag(Loc, diag::err_invalid_declarator_scope)
6411 Diag(Loc, diag::err_member_qualification)
6438 Diag(Loc, diag::ext_template_after_declarative_nns)
6443 TL = std::exchange(NextTL,
TypeLoc())) {
6445 switch (TL.getTypeLocClass()) {
6446 case TypeLoc::TemplateSpecialization: {
6448 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6449 if (
auto *T = TST.getTypePtr(); T->isDependentType() && T->isTypeAlias())
6450 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6451 << TST.getLocalSourceRange();
6454 case TypeLoc::Decltype:
6455 case TypeLoc::PackIndexing: {
6456 const Type *T = TL.getTypePtr();
6463 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6464 << T->isDecltypeType() << TL.getSourceRange();
6467 case TypeLoc::DependentName:
6474 if (TemplateKeywordLoc.
isValid())
6475 Diag(Loc, diag::ext_template_after_declarative_nns)
6516 diag::err_template_qualified_declarator_no_match)
6523 if (!IsDependentContext &&
6530 diag::err_member_def_undefined_record)
6551 if (EnteringContext && IsDependentContext &&
6552 TemplateParamLists.size() != 0) {
6571 bool IsLinkageLookup =
false;
6572 bool CreateBuiltins =
false;
6585 R->isFunctionType())) {
6586 IsLinkageLookup =
true;
6588 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6589 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6591 CreateBuiltins =
true;
6593 if (IsLinkageLookup) {
6635 bool AllowForCompatibility =
false;
6638 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6639 TemplateParamParent->isDeclScope(TPD);
6642 AllowForCompatibility);
6659 (TemplateParamLists.size() == 0 || R->isFunctionType()))
6672 bool AddToScope =
true;
6674 if (TemplateParamLists.size()) {
6680 }
else if (R->isFunctionType()) {
6696 if (
New->getDeclName() && AddToScope)
6699 if (
OpenMP().isInOpenMPDeclareTargetContext())
6710 bool &SizeIsNegative,
6711 llvm::APSInt &Oversized) {
6716 SizeIsNegative =
false;
6719 if (T->isDependentType())
6725 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6730 if (FixedType.
isNull())
return FixedType;
6731 FixedType = Context.getPointerType(FixedType);
6732 return Qs.
apply(Context, FixedType);
6734 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6735 QualType Inner = PTy->getInnerType();
6739 if (FixedType.
isNull())
return FixedType;
6740 FixedType = Context.getParenType(FixedType);
6741 return Qs.
apply(Context, FixedType);
6751 SizeIsNegative, Oversized);
6761 llvm::APSInt Res =
Result.Val.getInt();
6764 if (Res.isSigned() && Res.isNegative()) {
6765 SizeIsNegative =
true;
6770 unsigned ActiveSizeBits =
6774 : Res.getActiveBits();
6776 Oversized = std::move(Res);
6780 QualType FoldedArrayType = Context.getConstantArrayType(
6782 return Qs.
apply(Context, FoldedArrayType);
6807 TypeLoc DstElemTL = DstATL.getElementLoc();
6826 bool &SizeIsNegative,
6827 llvm::APSInt &Oversized) {
6830 SizeIsNegative, Oversized);
6833 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6841 unsigned FailedFoldDiagID) {
6842 bool SizeIsNegative;
6843 llvm::APSInt Oversized;
6845 TInfo,
Context, SizeIsNegative, Oversized);
6847 Diag(Loc, diag::ext_vla_folded_to_constant);
6854 Diag(Loc, diag::err_typecheck_negative_array_size);
6855 else if (Oversized.getBoolValue())
6857 Oversized, 10, Oversized.isSigned(),
false,
6859 else if (FailedFoldDiagID)
6860 Diag(Loc, FailedFoldDiagID);
6872 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6877 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6886 diag::err_virtual_non_function);
6890 diag::err_explicit_non_function);
6894 diag::err_noreturn_non_function);
6915 ? diag::warn_ms_inline_non_function
6916 : diag::err_inline_non_function)
6920 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6925 diag::err_deduction_guide_invalid_specifier)
6934 if (!NewTD)
return nullptr;
6955 if (T->isVariablyModifiedType()) {
6959 bool SizeIsNegative;
6960 llvm::APSInt Oversized;
6971 else if (T->isVariableArrayType())
6973 else if (Oversized.getBoolValue())
7010 switch (II->getNotableIdentifierID()) {
7011 case tok::NotableIdentifierKind::FILE:
7014 case tok::NotableIdentifierKind::jmp_buf:
7015 Context.setjmp_bufDecl(NewTD);
7017 case tok::NotableIdentifierKind::sigjmp_buf:
7018 Context.setsigjmp_bufDecl(NewTD);
7020 case tok::NotableIdentifierKind::ucontext_t:
7021 Context.setucontext_tDecl(NewTD);
7023 case tok::NotableIdentifierKind::float_t:
7024 case tok::NotableIdentifierKind::double_t:
7025 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7062 if (Context.getLangOpts().CPlusPlus) {
7086 if (!OuterContext->
Equals(PrevOuterContext))
7095 if (!SS.
isSet())
return;
7122 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7131 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7132 if (VD->hasInit()) {
7133 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7134 assert(VD->isThisDeclarationADefinition() &&
7135 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7137 VD->dropAttr<AliasAttr>();
7146 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7149 diag::err_attribute_selectany_non_extern_data);
7156 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7159 diag::warn_attribute_hybrid_patchable_non_extern);
7165 auto *VD = dyn_cast<VarDecl>(&ND);
7166 bool IsAnonymousNS =
false;
7169 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7170 while (NS && !IsAnonymousNS) {
7172 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7179 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7181 (!AnonNSInMicrosoftMode &&
7192 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7193 FD = FD->getMostRecentDecl();
7198 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7204 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7205 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7206 int NoImplicitObjectError = -1;
7208 NoImplicitObjectError = 0;
7209 else if (MD->isStatic())
7210 NoImplicitObjectError = 1;
7211 else if (MD->isExplicitObjectMemberFunction())
7212 NoImplicitObjectError = 2;
7213 if (NoImplicitObjectError != -1) {
7214 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7215 << NoImplicitObjectError << A->getRange();
7217 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7219 }
else if (MD->getReturnType()->isVoidType()) {
7223 err_lifetimebound_implicit_object_parameter_void_return_type);
7228 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7233 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7235 S.
Diag(A->getLocation(),
7236 diag::err_lifetimebound_parameter_void_return_type);
7244 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7245 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7264 bool IsSpecialization,
7265 bool IsDefinition) {
7269 bool IsTemplate =
false;
7270 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7271 OldDecl = OldTD->getTemplatedDecl();
7273 if (!IsSpecialization)
7274 IsDefinition =
false;
7276 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7277 NewDecl = NewTD->getTemplatedDecl();
7281 if (!OldDecl || !NewDecl)
7284 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7285 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7286 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7287 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7291 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7292 (NewExportAttr && !NewExportAttr->isInherited());
7298 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7300 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7302 bool JustWarn =
false;
7304 auto *VD = dyn_cast<VarDecl>(OldDecl);
7305 if (VD && !VD->getDescribedVarTemplate())
7307 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7319 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7320 : diag::err_attribute_dll_redeclaration;
7323 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7336 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7338 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7341 IsStaticDataMember = VD->isStaticDataMember();
7342 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7344 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7345 IsInline = FD->isInlined();
7346 IsQualifiedFriend = FD->getQualifier() &&
7350 if (OldImportAttr && !HasNewAttr &&
7351 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7353 if (IsMicrosoftABI && IsDefinition) {
7354 if (IsSpecialization) {
7357 diag::err_attribute_dllimport_function_specialization_definition);
7358 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7359 NewDecl->
dropAttr<DLLImportAttr>();
7362 diag::warn_redeclaration_without_import_attribute)
7365 NewDecl->
dropAttr<DLLImportAttr>();
7366 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7367 S.
Context, NewImportAttr->getRange()));
7369 }
else if (IsMicrosoftABI && IsSpecialization) {
7370 assert(!IsDefinition);
7374 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7375 << NewDecl << OldImportAttr;
7377 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7378 OldDecl->
dropAttr<DLLImportAttr>();
7379 NewDecl->
dropAttr<DLLImportAttr>();
7381 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7384 OldDecl->
dropAttr<DLLImportAttr>();
7385 NewDecl->
dropAttr<DLLImportAttr>();
7387 diag::warn_dllimport_dropped_from_inline_function)
7388 << NewDecl << OldImportAttr;
7395 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7397 !NewImportAttr && !NewExportAttr) {
7398 if (
const DLLExportAttr *ParentExportAttr =
7399 MD->getParent()->getAttr<DLLExportAttr>()) {
7400 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7401 NewAttr->setInherited(
true);
7453 return D->isExternC();
7470 llvm_unreachable(
"Unexpected context");
7480 llvm_unreachable(
"Unexpected context");
7525 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7526 return FD->isExternC();
7527 if (
const auto *VD = dyn_cast<VarDecl>(D))
7528 return VD->isExternC();
7530 llvm_unreachable(
"Unknown type of decl!");
7541 if (R->isImageType() || R->isPipeType()) {
7543 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7555 if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7557 diag::err_invalid_type_for_program_scope_var)
7567 QualType NR = R.getCanonicalType();
7586 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7595 if (R->isEventT()) {
7603 if (R->isSamplerT()) {
7618 R.isConstQualified())) {
7619 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7629template <
typename AttrTy>
7632 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7633 AttrTy *Clone = Attribute->clone(S.
Context);
7634 Clone->setInherited(
true);
7662 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7664 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7671 "NewD is not a function or variable");
7680 if (IdentName ==
nullptr)
7684 auto &Label = PendingName->second;
7690 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7700 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7719 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7723 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7725 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7735 const auto &TI =
Context.getTargetInfo();
7736 bool HasSizeMismatch;
7738 if (!TI.isValidGCCRegisterName(Label))
7739 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7740 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7742 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7743 else if (HasSizeMismatch)
7744 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7747 if (!
R->isIntegralType(
Context) && !
R->isPointerType()) {
7749 diag::err_asm_unsupported_register_type)
7764 bool IsPlaceholderVariable =
false;
7770 if (!Decomp.bindings().empty()) {
7771 II = Decomp.bindings()[0].Name;
7785 IsPlaceholderVariable =
true;
7793 if (IsPlaceholderVariable)
7807 bool IsLocalExternDecl = SC ==
SC_Extern &&
7826 : diag::warn_deprecated_register)
7849 const AutoType *AT = TL.getTypePtr();
7853 bool IsMemberSpecialization =
false;
7854 bool IsVariableTemplateSpecialization =
false;
7856 bool IsVariableTemplate =
false;
7864 if (R->getContainedDeducedType())
7885 false, IsMemberSpecialization,
Invalid);
7887 if (TemplateParams) {
7894 if (!TemplateParams->
size() &&
7899 diag::err_template_variable_noparams)
7903 TemplateParams =
nullptr;
7911 IsVariableTemplateSpecialization =
true;
7915 IsVariableTemplate =
true;
7923 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7928 "should have a 'template<>' for this decl");
7931 bool IsExplicitSpecialization =
7942 (IsExplicitSpecialization || IsMemberSpecialization)) {
7944 diag::ext_explicit_specialization_storage_class)
7950 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7956 if (Ctxt->isFunctionOrMethod()) {
7957 FunctionOrMethod = Ctxt;
7960 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7962 AnonStruct = ParentDecl;
7966 if (FunctionOrMethod) {
7970 diag::err_static_data_member_not_allowed_in_local_class)
7971 << Name << RD->getDeclName() << RD->getTagKind();
7973 }
else if (AnonStruct) {
7978 diag::err_static_data_member_not_allowed_in_anon_struct)
7981 }
else if (RD->isUnion()) {
7985 diag_compat::static_data_member_in_union)
8003 diag::err_static_out_of_line)
8016 diag::err_storage_class_for_static_member)
8021 llvm_unreachable(
"C storage class in c++!");
8025 if (IsVariableTemplateSpecialization) {
8027 TemplateParamLists.size() > 0
8028 ? TemplateParamLists[0]->getTemplateLoc()
8031 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8046 if (IsVariableTemplate) {
8049 TemplateParams, NewVD);
8055 if (R->getContainedDeducedType())
8070 unsigned VDTemplateParamLists =
8071 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8072 if (TemplateParamLists.size() > VDTemplateParamLists)
8074 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8081 }
else if (
CurContext->isFunctionOrMethod()) {
8084 diag::err_inline_declaration_block_scope) << Name
8089 : diag::compat_pre_cxx17_inline_variable);
8100 if (IsLocalExternDecl) {
8103 B->setLocalExternDecl();
8108 bool EmitTLSUnsupportedError =
false;
8121 diag::err_thread_non_global)
8123 else if (!
Context.getTargetInfo().isTLSSupported()) {
8128 EmitTLSUnsupportedError =
true;
8135 diag::err_thread_unsupported);
8146 diag::err_constexpr_wrong_decl_kind)
8147 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8157 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8164 diag::err_constinit_local_variable);
8168 ConstInitAttr::Keyword_constinit));
8186 diag::warn_static_local_in_extern_inline);
8192 if (IsVariableTemplateSpecialization)
8197 else if (IsMemberSpecialization)
8212 B->setModulePrivate();
8222 diag::err_opencl_unknown_type_specifier)
8232 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8233 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8251 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8278 if (R->isFunctionPointerType())
8283 if (EmitTLSUnsupportedError &&
8286 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8288 diag::err_thread_unsupported);
8290 if (EmitTLSUnsupportedError &&
8297 (NewVD->
hasAttr<CUDASharedAttr>() ||
8298 NewVD->
hasAttr<CUDAConstantAttr>())) {
8306 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8307 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8312 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8319 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8331 IsMemberSpecialization ||
8332 IsVariableTemplateSpecialization);
8346 if (IsMemberSpecialization && !IsVariableTemplate &&
8347 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8364 !IsVariableTemplateSpecialization) {
8372 if (!IsPlaceholderVariable)
8403 if (IsMemberSpecialization) {
8408 ->setMemberSpecialization();
8427 Decl *ManglingContextDecl;
8428 std::tie(MCtx, ManglingContextDecl) =
8520 return !Diags.
isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8532 NamedDecl *ShadowedDecl = R.getFoundDecl();
8546 NamedDecl *ShadowedDecl = R.getFoundDecl();
8555 NamedDecl *ShadowedDecl = R.getFoundDecl();
8564 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8565 if (
const auto *MD =
8569 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8575 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8578 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8583 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8584 if (shadowedVar->isExternC()) {
8587 for (
auto *I : shadowedVar->redecls())
8588 if (I->isFileVarDecl()) {
8596 unsigned WarningDiag = diag::warn_decl_shadow;
8599 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8605 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8611 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8617 ->ShadowingDecls.push_back({D, VD});
8628 ->ShadowingDecls.push_back({D, ShadowedDecl});
8634 bool HasLocalStorage =
false;
8635 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8636 HasLocalStorage = VD->hasLocalStorage();
8637 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8641 if (HasLocalStorage) {
8646 ParentDC && !ParentDC->
Equals(OldDC);
8687 Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8689 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8696 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8702 Diag(Shadow.VD->getLocation(),
8703 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8704 : diag::warn_decl_shadow)
8705 << Shadow.VD->getDeclName()
8708 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8709 << Shadow.VD->getDeclName() << 0;
8712 Diag(Shadow.VD->getLocation(),
8714 : diag::warn_decl_shadow_uncaptured_local)
8715 << Shadow.VD->getDeclName()
8741 auto *DRE = dyn_cast<DeclRefExpr>(E);
8745 auto I = ShadowingDecls.find(D);
8746 if (I == ShadowingDecls.end())
8748 const NamedDecl *ShadowedDecl = I->second;
8750 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8755 ShadowingDecls.erase(I);
8763 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8822 assert(Prev &&
"should have found a previous declaration to diagnose");
8824 Prev = FD->getFirstDecl();
8828 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8850 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8862 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8882 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8892 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8900 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8916 if (T->isUndeducedType())
8922 if (T->isObjCObjectType()) {
8925 T =
Context.getObjCObjectPointerType(T);
8956 if (NewVD->
hasAttr<BlocksAttr>()) {
8961 if (T->isBlockPointerType()) {
8964 if (!T.isConstQualified()) {
8965 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8971 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8980 if (!T->isSamplerT() && !T->isDependentType() &&
8987 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8988 <<
Scope <<
"global or constant";
8990 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8991 <<
Scope <<
"constant";
9005 bool AllowFunctionScopeLocalVariables =
9008 "__cl_clang_function_scope_local_variables",
getLangOpts());
9009 if (AllowFunctionScopeLocalVariables) {
9016 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9028 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9053 && !NewVD->
hasAttr<BlocksAttr>()) {
9064 if (T->isWebAssemblyTableType()) {
9075 const auto *ATy = dyn_cast<ConstantArrayType>(T.getTypePtr());
9076 if (!ATy || ATy->getZExtSize() != 0) {
9078 diag::err_typecheck_wasm_table_must_have_zero_length);
9088 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9091 ArrayT && ArrayT->isZeroSize()) {
9097 bool isVM = T->isVariablyModifiedType();
9098 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9104 bool SizeIsNegative;
9105 llvm::APSInt Oversized;
9110 FixedT = FixedTInfo->
getType();
9111 else if (FixedTInfo) {
9117 if ((!FixedTInfo || FixedT.
isNull()) && T->isVariableArrayType()) {
9150 if (T->isVoidType()) {
9162 !T.isWebAssemblyReferenceType() && !T->isHLSLSpecificType()) {
9168 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9170 << diag::NotAllowedBlockVarReason::VariablyModifiedType;
9182 !T->isDependentType() &&
9184 diag::err_constexpr_var_non_literal)) {
9190 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9200 llvm::StringMap<bool> CallerFeatureMap;
9201 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9203 CallerFeatureMap)) {
9211 llvm::StringMap<bool> CallerFeatureMap;
9212 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9217 if (T.hasAddressSpace() &&
9251 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9256 Name =
Context.DeclarationNames.getCXXDestructorName(
9257 Context.getCanonicalTagType(BaseRecord));
9262 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9269 if (Overridden.insert(BaseMD).second) {
9286 return !Overridden.empty();
9292 struct ActOnFDArgs {
9306 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9307 CXXRecordDecl *Parent)
9308 : Context(Context), OriginalFD(TypoFD),
9311 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9315 SmallVector<unsigned, 1> MismatchedParams;
9317 CDeclEnd = candidate.
end();
9318 CDecl != CDeclEnd; ++CDecl) {
9319 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9323 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9324 CXXRecordDecl *Parent = MD->getParent();
9327 }
else if (!ExpectedParent) {
9336 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9337 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9341 ASTContext &Context;
9342 FunctionDecl *OriginalFD;
9343 CXXRecordDecl *ExpectedParent;
9363 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9371 IsLocalFriend ? diag::err_no_matching_local_friend :
9373 diag::err_member_decl_does_not_match;
9385 "Cannot have an ambiguity in previous-declaration lookup");
9387 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9389 if (!Prev.
empty()) {
9398 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9399 NearMatches.push_back(std::make_pair(FD, ParamNum));
9407 IsLocalFriend ?
nullptr : NewDC))) {
9414 CDeclEnd = Correction.
end();
9415 CDecl != CDeclEnd; ++CDecl) {
9435 ExtraArgs.S, ExtraArgs.D,
9438 ExtraArgs.AddToScope);
9446 Decl *Canonical =
Result->getCanonicalDecl();
9449 if ((*I)->getCanonicalDecl() == Canonical)
9456 SemaRef.
PDiag(IsLocalFriend
9457 ? diag::err_no_matching_local_friend_suggest
9458 : diag::err_member_decl_does_not_match_suggest)
9459 << Name << NewDC << IsDefinition);
9472 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9475 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9481 bool NewFDisConst = NewMD && NewMD->
isConst();
9484 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9485 NearMatch != NearMatchEnd; ++NearMatch) {
9488 bool FDisConst = MD && MD->
isConst();
9489 bool IsMember = MD || !IsLocalFriend;
9492 if (
unsigned Idx = NearMatch->second) {
9496 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9497 : diag::note_local_decl_close_param_match)
9500 }
else if (FDisConst != NewFDisConst) {
9502 diag::note_member_def_close_const_match)
9507 else if (FTI.hasMethodTypeQualifiers() &&
9508 FTI.getConstQualifierLoc().isValid())
9512 IsMember ? diag::note_member_def_close_match
9513 : diag::note_local_decl_close_match);
9521 default: llvm_unreachable(
"Unknown storage class!");
9526 diag::err_typecheck_sclass_func);
9543 diag::err_static_block_func);
9559 bool &IsVirtualOkay) {
9573 diag::err_c23_constexpr_not_variable);
9576 diag::err_constexpr_wrong_decl_kind)
9577 <<
static_cast<int>(ConstexprKind);
9598 (!R->getAsAdjusted<
FunctionType>() && R->isFunctionProtoType());
9601 "Strict prototypes are required");
9622 "Constructors can only be declared in a member context");
9628 isInline,
false, ConstexprKind,
9639 false, ConstexprKind,
9640 TrailingRequiresClause);
9643 if (
Record->isBeingDefined())
9652 IsVirtualOkay =
true;
9664 true, ConstexprKind, TrailingRequiresClause);
9670 diag::err_conv_function_not_member);
9678 IsVirtualOkay =
true;
9683 TrailingRequiresClause);
9710 IsVirtualOkay = !Ret->isStatic();
9724 true , ConstexprKind, TrailingRequiresClause);
9741 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9749 if (Names.end() !=
Match)
9754 }
while (DesugaredTy != Ty);
9793 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9795 bool IsStandardLayoutType =
true;
9801 if (!CXXRec->hasDefinition())
9802 CXXRec = CXXRec->getTemplateInstantiationPattern();
9803 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9804 IsStandardLayoutType =
false;
9807 !IsStandardLayoutType)
9855 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9869 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9882 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9891 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9908 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9916 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9917 PT = Typedef->desugar();
9939 HistoryStack.push_back(
nullptr);
9944 VisitStack.push_back(PD);
9945 assert(VisitStack.back() &&
"First decl null?");
9948 const Decl *
Next = VisitStack.pop_back_val();
9950 assert(!HistoryStack.empty());
9952 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9953 ValidTypes.insert(Hist->getType().getTypePtr());
9962 HistoryStack.push_back(Field);
9964 QualType FieldTy = Field->getType();
9968 "Unexpected type.");
9977 VisitStack.push_back(
nullptr);
9979 for (
const auto *FD : RD->
fields()) {
9990 VisitStack.push_back(FD);
10001 S.
Diag(Param->getLocation(),
10002 diag::err_record_with_pointers_kernel_param)
10006 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
10009 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
10010 << PD->getDeclName();
10015 I = HistoryStack.begin() + 1,
10016 E = HistoryStack.end();
10029 }
while (!VisitStack.empty());
10046 (LangOpts.CPlusPlus &&
10056 unsigned BuiltinID) {
10057 switch (BuiltinID) {
10058 case Builtin::BI__GetExceptionInfo:
10062 case Builtin::BIaddressof:
10063 case Builtin::BI__addressof:
10064 case Builtin::BIforward:
10065 case Builtin::BIforward_like:
10066 case Builtin::BImove:
10067 case Builtin::BImove_if_noexcept:
10068 case Builtin::BIas_const: {
10073 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10085 bool &AddToScope) {
10088 assert(R->isFunctionType());
10093 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10095 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10096 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10097 TemplateParamLists.back() = Invented;
10099 TemplateParamLists.push_back(Invented);
10109 diag::err_invalid_thread)
10117 bool isFriend =
false;
10119 bool isMemberSpecialization =
false;
10120 bool isFunctionTemplateSpecialization =
false;
10122 bool HasExplicitTemplateArgs =
false;
10125 bool isVirtualOkay =
false;
10132 if (!NewFD)
return nullptr;
10142 if (IsLocalExternDecl)
10152 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10180 if (isVirtual && Parent->isUnion()) {
10184 if ((Parent->isClass() || Parent->isStruct()) &&
10185 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10188 if (
auto *Def = Parent->getDefinition())
10189 Def->setInitMethod(
true);
10194 isMemberSpecialization =
false;
10195 isFunctionTemplateSpecialization =
false;
10210 isMemberSpecialization,
Invalid);
10211 if (TemplateParams) {
10216 if (TemplateParams->
size() > 0) {
10224 }
else if (TemplateId) {
10241 Name, TemplateParams,
10247 if (TemplateParamLists.size() > 1) {
10254 isFunctionTemplateSpecialization =
true;
10256 if (TemplateParamLists.size() > 0)
10276 << Name << RemoveRange
10282 HasExplicitTemplateArgs =
true;
10289 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10295 if (TemplateParamLists.size() > 0)
10300 if (isFriend && TemplateId)
10301 isFunctionTemplateSpecialization =
true;
10307 if (isFunctionTemplateSpecialization && TemplateId) {
10308 HasExplicitTemplateArgs =
true;
10339 if (!isVirtualOkay) {
10341 diag::err_virtual_non_function);
10345 diag::err_virtual_out_of_class)
10351 diag::err_virtual_member_function_template)
10370 diag::err_inline_declaration_block_scope) << Name
10384 diag::err_explicit_out_of_class)
10391 diag::err_explicit_non_ctor_or_conv_function)
10409 <<
static_cast<int>(ConstexprKind);
10420 diag::err_invalid_consteval_decl_kind)
10428 if (isFunctionTemplateSpecialization) {
10431 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10477 if (!isFriend && SC !=
SC_None) {
10485 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10487 diag::ext_explicit_specialization_storage_class)
10494 "Out-of-line member function should be a CXXMethodDecl");
10511 ? diag::ext_static_out_of_line
10512 : diag::err_static_out_of_line)
10537 PendingInlineFuncDecls.insert(NewFD);
10544 isMemberSpecialization ||
10545 isFunctionTemplateSpecialization);
10556 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
10583 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10585 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10586 Param->setDeclContext(NewFD);
10587 Params.push_back(Param);
10589 if (Param->isInvalidDecl())
10602 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10607 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10612 DeclContext *TagDC = TD->getLexicalDeclContext();
10616 TD->setDeclContext(NewFD);
10624 if (TagDC != PrototypeTagContext)
10625 TD->setLexicalDeclContext(TagDC);
10639 for (
const auto &AI : FT->param_types()) {
10642 Param->setScopeInfo(0, Params.size());
10643 Params.push_back(Param);
10646 assert(R->isFunctionNoProtoType() && NewFD->
getNumParams() == 0 &&
10647 "Should not need args for typedef of non-prototype fn");
10651 NewFD->setParams(Params);
10676 !NewFD->
hasAttr<SectionAttr>())
10677 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10683 !NewFD->
hasAttr<SectionAttr>()) {
10684 NewFD->
addAttr(SectionAttr::CreateImplicit(
10686 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10697 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10698 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10703 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10712 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10713 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10714 !NewTVA->isDefaultVersion() &&
10715 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10717 AddToScope =
false;
10729 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10744 isMemberSpecialization,
10751 "previous declaration set still overloaded");
10763 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10786 diag::ext_operator_new_delete_declared_inline)
10813 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10825 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10833 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10837 Diag(TRC->getBeginLoc(),
10838 diag::err_constrained_non_templated_function);
10855 if (isFunctionTemplateSpecialization) {
10856 bool isDependentSpecialization =
false;
10861 isDependentSpecialization =
10863 (HasExplicitTemplateArgs &&
10864 TemplateSpecializationType::
10865 anyInstantiationDependentTemplateArguments(
10867 assert((!isDependentSpecialization ||
10868 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10869 "dependent friend function specialization without template "
10875 isDependentSpecialization =
10880 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10881 if (isDependentSpecialization) {
10888 NewFD, ExplicitTemplateArgs,
Previous))
10909 isMemberSpecialization,
10918 "previous declaration set still overloaded");
10959 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
11005 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
11006 AddToScope = ExtraArgs.AddToScope;
11015 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
11016 AddToScope = ExtraArgs.AddToScope;
11022 !isFriend && !isFunctionTemplateSpecialization &&
11023 !isMemberSpecialization) {
11041 if (NewFD->
hasAttr<HLSLShaderAttr>())
11049 if (
unsigned BuiltinID = II->getBuiltinID()) {
11050 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11051 if (!InStdNamespace &&
11056 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11057 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11064 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11066 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11071 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11087 if (NewFD->
hasAttr<OverloadableAttr>() &&
11090 diag::err_attribute_overloadable_no_prototype)
11092 NewFD->
dropAttr<OverloadableAttr>();
11125 isMemberSpecialization ||
11126 isFunctionTemplateSpecialization,
11137 Context.setcudaConfigureCallDecl(NewFD);
11139 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11145 Context.setcudaGetParameterBufferDecl(NewFD);
11147 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11153 Context.setcudaLaunchDeviceDecl(NewFD);
11204 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11224 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11226 QualType ElemTy = PipeTy->getElementType();
11228 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11234 if (
Context.getTargetInfo().getTriple().isWasm()) {
11236 Diag(Param->getTypeSpecStartLoc(),
11237 diag::err_wasm_table_as_function_parameter);
11245 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11246 if (NewFD->
hasAttr<ConstructorAttr>()) {
11247 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11249 NewFD->
dropAttr<AvailabilityAttr>();
11251 if (NewFD->
hasAttr<DestructorAttr>()) {
11252 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11254 NewFD->
dropAttr<AvailabilityAttr>();
11265 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11269 Diag(NBA->getLocation(),
11270 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11271 << NBA->getSpelling();
11274 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11275 << NBA->getSpelling();
11284 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11308 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11312 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11323 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11324 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11334 bool IsDefinition) {
11337 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11339 return SectionAttr::CreateImplicit(
11341 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11389 auto *VD = dyn_cast<ValueDecl>(D);
11390 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11391 return !VD || !PrevVD ||
11393 PrevVD->getType());
11401 const auto *TA = FD->
getAttr<TargetAttr>();
11402 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11404 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11417 for (
const auto &Feat : ParseInfo.
Features) {
11418 auto BareFeat = StringRef{Feat}.substr(1);
11419 if (Feat[0] ==
'-') {
11421 <<
Feature << (
"no-" + BareFeat);
11441 for (
auto &Feat : ParseInfo.
Features)
11442 Feats.push_back(StringRef{Feat}.substr(1));
11445 TVA->getFeatures(Feats);
11447 for (
const auto &Feat : Feats) {
11467 case attr::ArmLocallyStreaming:
11472 case attr::NonNull:
11473 case attr::NoThrow:
11482 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11483 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11484 <<
static_cast<unsigned>(MVKind) << A;
11486 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11491 switch (A->getKind()) {
11492 case attr::CPUDispatch:
11493 case attr::CPUSpecific:
11496 return Diagnose(S, A);
11500 return Diagnose(S, A);
11502 case attr::TargetVersion:
11505 return Diagnose(S, A);
11507 case attr::TargetClones:
11510 return Diagnose(S, A);
11514 return Diagnose(S, A);
11527 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11528 enum DoesntSupport {
11535 DefaultedFuncs = 6,
11536 ConstexprFuncs = 7,
11537 ConstevalFuncs = 8,
11549 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11552 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11560 if (!TemplatesSupported &&
11562 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11565 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11566 if (NewCXXFD->isVirtual())
11567 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11571 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11575 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11580 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11584 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11588 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11589 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11593 QualType NewReturnType = NewType->getReturnType();
11596 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11609 bool ArmStreamingCCMismatched =
false;
11610 if (OldFPT && NewFPT) {
11617 ArmStreamingCCMismatched =
true;
11620 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11623 QualType OldReturnType = OldType->getReturnType();
11625 if (OldReturnType != NewReturnType)
11626 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11629 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11632 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11635 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11658 bool IsCPUSpecificCPUDispatchMVKind =
11662 if (CausesMV && OldFD &&
11670 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11677 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11679 S.
PDiag(diag::note_multiversioning_caused_here)),
11681 S.
PDiag(diag::err_multiversion_doesnt_support)
11682 <<
static_cast<unsigned>(MVKind)),
11684 S.
PDiag(diag::err_multiversion_diff)),
11686 !IsCPUSpecificCPUDispatchMVKind,
11699 "Function lacks multiversion attribute");
11700 const auto *TA = FD->
getAttr<TargetAttr>();
11701 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11704 if (TA && !TA->isDefaultVersion())
11741 To->
addAttr(TargetVersionAttr::CreateImplicit(
11752 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11753 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11754 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11755 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11757 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11766 if (NewTA && !NewTA->isDefaultVersion() &&
11767 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11784 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11785 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11794 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11802 OldTA->getFeaturesStr());
11806 NewTA->getFeaturesStr());
11809 if (OldParsed == NewParsed) {
11817 for (
const auto *FD : OldFD->
redecls()) {
11818 const auto *CurTA = FD->
getAttr<TargetAttr>();
11819 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11823 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11824 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11826 << (NewTA ? 0 : 2);
11827 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11874 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11890 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11891 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11898 NewTA->getFeaturesStr());
11903 NewTVA->getFeatures(NewFeats);
11904 llvm::sort(NewFeats);
11907 bool UseMemberUsingDeclRules =
11910 bool MayNeedOverloadableChecks =
11919 if (MayNeedOverloadableChecks &&
11920 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11923 switch (NewMVKind) {
11926 "Only target_clones can be omitted in subsequent declarations");
11929 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11930 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11939 CurTA->getFeaturesStr());
11941 if (CurParsed == NewParsed) {
11950 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11951 if (CurTVA->getName() == NewTVA->getName()) {
11958 CurTVA->getFeatures(CurFeats);
11959 llvm::sort(CurFeats);
11961 if (CurFeats == NewFeats) {
11967 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11969 if (NewFeats.empty())
11972 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11974 CurClones->getFeatures(CurFeats, I);
11975 llvm::sort(CurFeats);
11977 if (CurFeats == NewFeats) {
11988 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11989 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11990 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11991 !std::equal(CurClones->featuresStrs_begin(),
11992 CurClones->featuresStrs_end(),
11993 NewClones->featuresStrs_begin())) {
11999 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
12001 CurTVA->getFeatures(CurFeats);
12002 llvm::sort(CurFeats);
12005 if (CurFeats.empty())
12008 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
12010 NewClones->getFeatures(NewFeats, I);
12011 llvm::sort(NewFeats);
12013 if (CurFeats == NewFeats) {
12029 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
12030 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12035 CurFD->
hasAttr<CPUDispatchAttr>()) {
12036 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12038 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12039 NewCPUDisp->cpus_begin(),
12041 return Cur->getName() == New->getName();
12056 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12058 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12059 NewCPUSpec->cpus_begin(),
12061 return Cur->getName() == New->getName();
12072 if (CurII == NewII) {
12142 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12143 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12144 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12145 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12146 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12156 NewTVA->isDefaultVersion())) {
12157 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12165 if (NewTA && TI.
getTriple().isAArch64())
12192 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12205 if (OldFD->
isUsed(
false)) {
12207 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12229 bool IsPure = NewFD->
hasAttr<PureAttr>();
12230 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12233 if (!IsPure && !IsConst)
12240 if (IsPure && IsConst) {
12250 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12256 bool IsMemberSpecialization,
12259 "Variably modified return types are not handled here");
12264 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12269 bool MayNeedOverloadableChecks =
false;
12281 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12283 OldDecl = Candidate;
12286 MayNeedOverloadableChecks =
true;
12311 OldDecl =
Previous.getFoundDecl();
12312 MergeTypeWithPrevious =
false;
12315 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12316 NewFD->
hasAttr<OverloadableAttr>()) {
12318 MayNeedOverloadableChecks =
true;
12330 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12381 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12382 if (!OldMD || !OldMD->
isStatic()) {
12417 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12418 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12421 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12430 NewFD->
setAccess(OldTemplateDecl->getAccess());
12431 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12436 if (IsMemberSpecialization &&
12439 assert(OldTemplateDecl->isMemberSpecialization());
12442 if (OldFD->isDeleted()) {
12444 assert(OldFD->getCanonicalDecl() == OldFD);
12446 OldFD->setDeletedAsWritten(
false);
12460 !NewFD->
getAttr<OverloadableAttr>()) {
12464 return ND->hasAttr<OverloadableAttr>();
12466 "Non-redecls shouldn't happen without overloadable present");
12469 const auto *FD = dyn_cast<FunctionDecl>(ND);
12470 return FD && !FD->
hasAttr<OverloadableAttr>();
12473 if (OtherUnmarkedIter !=
Previous.end()) {
12475 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12476 Diag((*OtherUnmarkedIter)->getLocation(),
12477 diag::note_attribute_overloadable_prev_overload)
12487 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12490 if (NewFD->
hasAttr<SYCLExternalAttr>())
12500 dyn_cast<CXXDestructorDecl>(NewFD)) {
12508 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12513 Context.DeclarationNames.getCXXDestructorName(ClassType);
12520 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12521 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12527 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12533 if (!
Method->isFunctionTemplateSpecialization() &&
12534 !
Method->getDescribedFunctionTemplate() &&
12535 Method->isCanonicalDecl()) {
12542 diag::err_constrained_virtual_method);
12577 if (R->isIncompleteType() && !R->isVoidType())
12580 else if (!R.isPODType(
Context) && !R->isVoidType() &&
12581 !R->isObjCObjectPointerType())
12582 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12595 auto HasNoexcept = [&](
QualType T) ->
bool {
12600 T = RT->getPointeeType();
12601 else if (T->isAnyPointerType())
12602 T = T->getPointeeType();
12604 T = MPT->getPointeeType();
12606 if (FPT->isNothrow())
12612 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12613 for (
QualType T : FPT->param_types())
12614 AnyNoexcept |= HasNoexcept(T);
12617 diag::warn_cxx17_compat_exception_spec_in_signature)
12622 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12624 if (!Parm->getType()->isDependentType() &&
12625 Parm->hasAttr<CUDAGridConstantAttr>() &&
12626 !(IsKernel && Parm->getType().isConstQualified()))
12627 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12628 diag::err_cuda_grid_constant_not_allowed);
12634 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12644 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12655 ? diag::err_static_main : diag::warn_static_main)
12663 Diag(NoreturnLoc, diag::ext_noreturn_main);
12664 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12676 << FD->
hasAttr<DeviceKernelAttr>();
12681 if (FD->
hasAttr<SYCLExternalAttr>()) {
12683 << FD->
getAttr<SYCLExternalAttr>();
12694 assert(T->isFunctionType() &&
"function decl is not of function type");
12716 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12741 Diag(start, diag::warn_main_in_named_module)
12753 bool HasExtraParameters = (nparams > 3);
12764 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12765 HasExtraParameters =
false;
12767 if (HasExtraParameters) {
12780 for (
unsigned i = 0; i < nparams; ++i) {
12783 bool mismatch =
true;
12800 mismatch = !qs.
empty();
12829 if (T.isOSCygMing())
12834 if (T.isOSWindows() && T.getArch() == llvm::Triple::x86)
12842 assert(T->isFunctionType() &&
"function decl is not of function type");
12851 if (FD->
getName() !=
"DllMain")
12858 FT =
Context.adjustFunctionType(
12863 FT =
Context.adjustFunctionType(FT,
12885 if (
Init->isValueDependent()) {
12886 assert(
Init->containsErrors() &&
12887 "Dependent code should only occur in error-recovery path.");
12890 const Expr *Culprit;
12891 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12899 if (
auto ALE = dyn_cast<ObjCArrayLiteral>(
Init)) {
12900 for (
auto *Elm : ALE->elements()) {
12901 if (!Elm->isConstantInitializer(
Context)) {
12902 Diag(Elm->getExprLoc(),
12903 diag::err_objc_literal_nonconstant_at_file_scope)
12910 if (
auto DLE = dyn_cast<ObjCDictionaryLiteral>(
Init)) {
12911 for (
size_t I = 0, N = DLE->getNumElements(); I != N; ++I) {
12918 diag::err_objc_literal_nonconstant_at_file_scope)
12925 diag::err_objc_literal_nonconstant_at_file_scope)
12933 diag::err_objc_literal_nonconstant_at_file_scope)
12945 class SelfReferenceChecker
12951 bool isReferenceType;
12952 bool isInCXXOperatorCall;
12960 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12961 S(S), OrigDecl(OrigDecl) {
12964 isReferenceType =
false;
12965 isInCXXOperatorCall =
false;
12966 isInitList =
false;
12967 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12968 isPODType = VD->getType().isPODType(S.
Context);
12970 isReferenceType = VD->getType()->isReferenceType();
12977 void CheckExpr(Expr *E) {
12978 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12986 InitFieldIndex.push_back(0);
12987 for (
auto *Child : InitList->
children()) {
12989 ++InitFieldIndex.back();
12991 InitFieldIndex.pop_back();
12996 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12997 llvm::SmallVector<FieldDecl*, 4> Fields;
12999 bool ReferenceField =
false;
13002 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13003 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
13006 Fields.push_back(FD);
13008 ReferenceField =
true;
13009 Base = ME->getBase()->IgnoreParenImpCasts();
13013 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
13014 if (!DRE || DRE->
getDecl() != OrigDecl)
13018 if (CheckReference && !ReferenceField)
13022 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
13023 for (
const FieldDecl *I : llvm::reverse(Fields))
13024 UsedFieldIndex.push_back(I->getFieldIndex());
13029 for (
auto UsedIter = UsedFieldIndex.begin(),
13030 UsedEnd = UsedFieldIndex.end(),
13031 OrigIter = InitFieldIndex.begin(),
13032 OrigEnd = InitFieldIndex.end();
13033 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
13034 if (*UsedIter < *OrigIter)
13036 if (*UsedIter > *OrigIter)
13041 HandleDeclRefExpr(DRE);
13048 void HandleValue(Expr *E) {
13050 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
13051 HandleDeclRefExpr(DRE);
13055 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
13056 Visit(CO->getCond());
13057 HandleValue(CO->getTrueExpr());
13058 HandleValue(CO->getFalseExpr());
13062 if (BinaryConditionalOperator *BCO =
13063 dyn_cast<BinaryConditionalOperator>(E)) {
13064 Visit(BCO->getCond());
13065 HandleValue(BCO->getFalseExpr());
13069 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
13070 if (Expr *SE = OVE->getSourceExpr())
13075 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
13076 if (BO->getOpcode() == BO_Comma) {
13077 Visit(BO->getLHS());
13078 HandleValue(BO->getRHS());
13091 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13095 Base = ME->getBase()->IgnoreParenImpCasts();
13097 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13098 HandleDeclRefExpr(DRE);
13107 void VisitDeclRefExpr(DeclRefExpr *E) {
13108 if (isReferenceType)
13109 HandleDeclRefExpr(E);
13112 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13118 Inherited::VisitImplicitCastExpr(E);
13121 void VisitMemberExpr(MemberExpr *E) {
13123 if (CheckInitListMemberExpr(E,
true ))
13132 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13133 bool Warn = (MD && !MD->
isStatic());
13135 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13138 Base = ME->getBase()->IgnoreParenImpCasts();
13141 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13143 HandleDeclRefExpr(DRE);
13152 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13153 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13157 return Inherited::VisitCXXOperatorCallExpr(E);
13161 HandleValue(Arg->IgnoreParenImpCasts());
13165 if (!isInCXXOperatorCall) {
13166 Inherited::VisitLambdaExpr(E);
13171 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13172 HandleDeclRefExpr(DRE);
13177 void VisitUnaryOperator(UnaryOperator *E) {
13191 Inherited::VisitUnaryOperator(E);
13194 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13196 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13198 Expr *ArgExpr = E->
getArg(0);
13199 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13200 if (ILE->getNumInits() == 1)
13201 ArgExpr = ILE->getInit(0);
13202 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13203 if (ICE->getCastKind() == CK_NoOp)
13204 ArgExpr = ICE->getSubExpr();
13205 HandleValue(ArgExpr);
13208 Inherited::VisitCXXConstructExpr(E);
13211 void VisitCallExpr(CallExpr *E) {
13214 HandleValue(E->
getArg(0));
13218 Inherited::VisitCallExpr(E);
13221 void VisitBinaryOperator(BinaryOperator *E) {
13223 HandleValue(E->
getLHS());
13228 Inherited::VisitBinaryOperator(E);
13234 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13239 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13241 if (OrigDecl != ReferenceDecl)
return;
13243 if (isReferenceType) {
13244 diag = diag::warn_uninit_self_reference_in_reference_init;
13246 diag = diag::warn_static_self_reference_in_init;
13250 diag = diag::warn_uninit_self_reference_in_init;
13264 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13274 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13275 VD && VD->isConstexpr() && VD->isFileVarDecl())
13283 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13284 if (ICE->getCastKind() == CK_LValueToRValue)
13285 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13286 if (DRE->
getDecl() == OrigDecl)
13289 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13296 struct VarDeclOrName {
13298 DeclarationName Name;
13300 friend const Sema::SemaDiagnosticBuilder &
13301 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13302 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13312 bool IsInitCapture = !VDecl;
13314 "init captures are expected to be deduced prior to initialization");
13316 VarDeclOrName VN{VDecl, Name};
13319 assert(
Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13323 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13324 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13325 << (int)
Deduced->getContainedAutoType()->getKeyword()
13332 assert(VDecl &&
"no init for init capture deduction?");
13347 DeduceInits =
Init;
13349 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13351 DeduceInits = PL->exprs();
13354 assert(VDecl &&
"non-auto type for init capture deduction?");
13365 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13366 DeduceInits = IL->inits();
13370 if (DeduceInits.empty()) {
13373 Diag(
Init->getBeginLoc(), IsInitCapture
13374 ? diag::err_init_capture_no_expression
13375 : diag::err_auto_var_init_no_expression)
13376 << VN <<
Type << Range;
13380 if (DeduceInits.size() > 1) {
13381 Diag(DeduceInits[1]->getBeginLoc(),
13382 IsInitCapture ? diag::err_init_capture_multiple_expressions
13383 : diag::err_auto_var_init_multiple_expressions)
13384 << VN <<
Type << Range;
13388 Expr *DeduceInit = DeduceInits[0];
13390 Diag(
Init->getBeginLoc(), IsInitCapture
13391 ? diag::err_init_capture_paren_braces
13392 : diag::err_auto_var_init_paren_braces)
13398 bool DefaultedAnyToId =
false;
13400 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13402 if (
Result.isInvalid()) {
13406 DefaultedAnyToId =
true;
13416 Type.getQualifiers());
13424 if (!IsInitCapture)
13427 Diag(Range.getBegin(),
13428 diag::err_init_capture_deduction_failure_from_init_list)
13434 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13449 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13452 return DeducedType;
13457 assert(!
Init || !
Init->containsErrors());
13461 if (DeducedType.
isNull()) {
13470 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13494 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13495 Init = EWC->getSubExpr();
13497 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13498 Init = CE->getSubExpr();
13503 "shouldn't be called if type doesn't have a non-trivial C struct");
13504 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13505 for (
auto *I : ILE->inits()) {
13506 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13507 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13533bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13539 return FD->
hasAttr<UnavailableAttr>();
13542struct DiagNonTrivalCUnionDefaultInitializeVisitor
13549 DiagNonTrivalCUnionDefaultInitializeVisitor(
13552 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13555 const FieldDecl *FD,
bool InNonTrivialUnion) {
13558 InNonTrivialUnion);
13559 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13562 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13563 bool InNonTrivialUnion) {
13564 if (InNonTrivialUnion)
13566 << 1 << 0 << QT << FD->
getName();
13569 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13570 if (InNonTrivialUnion)
13572 << 1 << 0 << QT << FD->
getName();
13575 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13577 if (RD->isUnion()) {
13578 if (OrigLoc.isValid()) {
13579 bool IsUnion =
false;
13580 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13581 IsUnion = OrigRD->isUnion();
13582 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13583 << 0 << OrigTy << IsUnion << UseContext;
13585 OrigLoc = SourceLocation();
13587 InNonTrivialUnion =
true;
13590 if (InNonTrivialUnion)
13591 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13594 for (
const FieldDecl *FD : RD->fields())
13595 if (!shouldIgnoreForRecordTriviality(FD))
13596 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13599 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13604 SourceLocation OrigLoc;
13609struct DiagNonTrivalCUnionDestructedTypeVisitor
13612 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13614 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13615 SourceLocation OrigLoc,
13618 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13621 const FieldDecl *FD,
bool InNonTrivialUnion) {
13624 InNonTrivialUnion);
13625 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13628 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13629 bool InNonTrivialUnion) {
13630 if (InNonTrivialUnion)
13632 << 1 << 1 << QT << FD->
getName();
13635 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13636 if (InNonTrivialUnion)
13638 << 1 << 1 << QT << FD->
getName();
13641 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13643 if (RD->isUnion()) {
13644 if (OrigLoc.isValid()) {
13645 bool IsUnion =
false;
13646 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13647 IsUnion = OrigRD->isUnion();
13648 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13649 << 1 << OrigTy << IsUnion << UseContext;
13651 OrigLoc = SourceLocation();
13653 InNonTrivialUnion =
true;
13656 if (InNonTrivialUnion)
13657 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13660 for (
const FieldDecl *FD : RD->fields())
13661 if (!shouldIgnoreForRecordTriviality(FD))
13662 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13665 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13666 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13667 bool InNonTrivialUnion) {}
13672 SourceLocation OrigLoc;
13677struct DiagNonTrivalCUnionCopyVisitor
13679 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13681 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13683 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13686 const FieldDecl *FD,
bool InNonTrivialUnion) {
13689 InNonTrivialUnion);
13690 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13693 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13694 bool InNonTrivialUnion) {
13695 if (InNonTrivialUnion)
13697 << 1 << 2 << QT << FD->
getName();
13700 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13701 if (InNonTrivialUnion)
13703 << 1 << 2 << QT << FD->
getName();
13706 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13708 if (RD->isUnion()) {
13709 if (OrigLoc.isValid()) {
13710 bool IsUnion =
false;
13711 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13712 IsUnion = OrigRD->isUnion();
13713 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13714 << 2 << OrigTy << IsUnion << UseContext;
13716 OrigLoc = SourceLocation();
13718 InNonTrivialUnion =
true;
13721 if (InNonTrivialUnion)
13722 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13725 for (
const FieldDecl *FD : RD->fields())
13726 if (!shouldIgnoreForRecordTriviality(FD))
13727 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13730 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13731 if (InNonTrivialUnion)
13733 << 1 << 2 << QT << FD->
getName();
13737 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13738 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13739 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13740 bool InNonTrivialUnion) {}
13745 SourceLocation OrigLoc;
13754 unsigned NonTrivialKind) {
13758 "shouldn't be called if type doesn't have a non-trivial C union");
13762 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13763 .visit(QT,
nullptr,
false);
13766 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13767 .visit(QT,
nullptr,
false);
13769 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13770 .visit(QT,
nullptr,
false);
13794 bool TargetIsInline = Dcl->
isInline();
13795 bool TargetWasTemplated =
13812 TargetWasTemplated =
13822 if (!TargetIsInline || TargetWasTemplated)
13832 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13833 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13839 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13840 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13862 T = T.getNonReferenceType();
13863 if (T->isFunctionType())
13865 if (!T.isConstant(Ctx))
13867 if (T->isPointerType())
13885 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13886 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13898 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13899 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13905 llvm::scope_exit ResetDeclForInitializer([
this]() {
13916 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13917 if (!
Method->isInvalidDecl()) {
13919 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13920 <<
Method->getDeclName() <<
Init->getSourceRange();
13921 Method->setInvalidDecl();
13926 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13928 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13937 if (
Expr *E = Recovery.
get())
13944 Context.AMDGPUFeaturePredicateTy) {
13946 diag::err_amdgcn_predicate_type_is_not_constructible)
13953 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13954 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13961 if (
Init->containsErrors()) {
13970 "decl should be invalidated when deduce fails");
13982 if (VDecl->
hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
13989 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
14009 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
14010 BaseDeclType = Array->getElementType();
14012 diag::err_typecheck_decl_incomplete_type)) {
14019 diag::err_abstract_type_in_decl,
14037 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
14046 if (Def != VDecl &&
14066 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
14069 diag::note_previous_initializer)
14094 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14095 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14101 if (!
HLSL().handleInitialization(VDecl,
Init))
14113 if (!
Result.isUsable()) {
14121 bool InitializedFromParenListExpr =
false;
14122 bool IsParenListInit =
false;
14129 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14131 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14132 InitializedFromParenListExpr =
true;
14133 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14134 Args = CXXDirectInit->getInitExprs();
14135 InitializedFromParenListExpr =
true;
14142 if (!
Result.isUsable()) {
14162 IsParenListInit = !InitSeq.
steps().empty() &&
14166 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14168 Context.getAsIncompleteArrayType(VDeclType) &&
14169 Context.getAsIncompleteArrayType(
Init->getType())) {
14198 if (VDecl->
hasAttr<BlocksAttr>())
14211 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14212 Init->getBeginLoc()))
14213 FSI->markSafeWeakUse(
Init);
14234 if (!
Result.isUsable()) {
14274 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14275 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14277 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14312 <<
Init->getSourceRange();
14328 diag::ext_in_class_initializer_float_type_cxx11)
14329 << DclT <<
Init->getSourceRange();
14331 diag::note_in_class_initializer_float_type_cxx11)
14334 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14335 << DclT <<
Init->getSourceRange();
14338 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14339 <<
Init->getSourceRange();
14346 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14347 << DclT <<
Init->getSourceRange()
14353 << DclT <<
Init->getSourceRange();
14366 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14374 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14387 if (!InitType.
isNull() &&
14405 if (InitializedFromParenListExpr) {
14406 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14429 VarDecl *VD = dyn_cast<VarDecl>(D);
14433 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14434 for (
auto *BD : DD->bindings())
14435 BD->setInvalidDecl();
14448 Context.getBaseElementType(Ty),
14449 diag::err_typecheck_decl_incomplete_type)) {
14456 diag::err_abstract_type_in_decl,
14471 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14475 Diag(Var->getLocation(),
14476 diag::err_amdgcn_predicate_type_is_not_constructible)
14478 Var->setInvalidDecl();
14483 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14484 Var->setInvalidDecl();
14500 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14501 !Var->isThisDeclarationADemotedDefinition()) {
14502 if (Var->isStaticDataMember()) {
14506 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14507 Diag(Var->getLocation(),
14508 diag::err_constexpr_static_mem_var_requires_init)
14510 Var->setInvalidDecl();
14514 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14515 Var->setInvalidDecl();
14522 if (!Var->isInvalidDecl() &&
14524 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14525 bool HasConstExprDefaultConstructor =
false;
14526 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14527 for (
auto *Ctor : RD->ctors()) {
14528 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14529 Ctor->getMethodQualifiers().getAddressSpace() ==
14531 HasConstExprDefaultConstructor =
true;
14535 if (!HasConstExprDefaultConstructor) {
14536 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14537 Var->setInvalidDecl();
14543 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14544 Diag(Var->getLocation(), diag::err_specialization_const);
14545 Var->setInvalidDecl();
14549 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14550 if (Var->getStorageClass() ==
SC_Extern) {
14551 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14553 Var->setInvalidDecl();
14557 diag::err_typecheck_decl_incomplete_type)) {
14558 Var->setInvalidDecl();
14561 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14562 if (!RD->hasTrivialDefaultConstructor()) {
14563 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14564 Var->setInvalidDecl();
14574 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14581 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14597 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14599 diag::err_typecheck_decl_incomplete_type))
14600 Var->setInvalidDecl();
14605 diag::err_abstract_type_in_decl,
14607 Var->setInvalidDecl();
14610 Diag(Var->getLocation(), diag::warn_private_extern);
14611 Diag(Var->getLocation(), diag::note_private_extern);
14614 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14615 !Var->isInvalidDecl())
14626 if (!Var->isInvalidDecl()) {
14630 Var->getLocation(), ArrayT->getElementType(),
14631 diag::err_array_incomplete_or_sizeless_type))
14632 Var->setInvalidDecl();
14634 if (Var->getStorageClass() ==
SC_Static) {
14644 if (Var->isFirstDecl())
14646 diag::ext_typecheck_decl_incomplete_type,
14652 if (!Var->isInvalidDecl())
14663 if (Var->isConstexpr())
14664 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14667 Diag(Var->getLocation(),
14668 diag::err_typecheck_incomplete_array_needs_initializer);
14669 Var->setInvalidDecl();
14676 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14677 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14686 if (Var->isInvalidDecl())
14689 if (!Var->hasAttr<AliasAttr>()) {
14692 diag::err_typecheck_decl_incomplete_type)) {
14693 Var->setInvalidDecl();
14702 diag::err_abstract_type_in_decl,
14704 Var->setInvalidDecl();
14711 unsigned DiagID = diag::warn_default_init_const_unsafe;
14712 if (Var->getStorageDuration() ==
SD_Static ||
14713 Var->getStorageDuration() ==
SD_Thread)
14714 DiagID = diag::warn_default_init_const;
14716 bool EmitCppCompat = !
Diags.isIgnored(
14717 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14718 Var->getLocation());
14720 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14734 if (
const auto *CXXRecord =
14735 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14739 if (!CXXRecord->isPOD())
14784 }
else if (
Init.isInvalid()) {
14802 VarDecl *VD = dyn_cast<VarDecl>(D);
14861 const char *PrevSpec;
14886 Context.getAttributedType(
Attr, MethodType, MethodType);
14897 if (var->isInvalidDecl())
return;
14904 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14906 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14908 var->setInvalidDecl();
14916 var->hasLocalStorage()) {
14917 switch (var->getType().getObjCLifetime()) {
14930 if (var->hasLocalStorage() &&
14939 if (var->isThisDeclarationADefinition() &&
14940 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14941 var->isExternallyVisible() && var->hasLinkage() &&
14942 !var->isInline() && !var->getDescribedVarTemplate() &&
14946 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14947 var->getLocation())) {
14949 VarDecl *prev = var->getPreviousDecl();
14954 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14955 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14961 std::optional<bool> CacheHasConstInit;
14962 const Expr *CacheCulprit =
nullptr;
14963 auto checkConstInit = [&]()
mutable {
14964 const Expr *
Init = var->getInit();
14965 if (
Init->isInstantiationDependent())
14968 if (!CacheHasConstInit)
14969 CacheHasConstInit = var->getInit()->isConstantInitializer(
14970 Context, var->getType()->isReferenceType(), &CacheCulprit);
14971 return *CacheHasConstInit;
14975 if (var->getType().isDestructedType()) {
14979 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14981 Diag(var->getLocation(), diag::note_use_thread_local);
14983 if (!checkConstInit()) {
14991 Diag(var->getLocation(), diag::note_use_thread_local);
14997 if (!var->getType()->isStructureType() && var->hasInit() &&
15000 unsigned NumInits = ILE->getNumInits();
15002 for (
unsigned I = 0; I < NumInits; ++I) {
15003 const auto *
Init = ILE->getInit(I);
15006 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15010 unsigned NumConcat = SL->getNumConcatenated();
15014 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
15015 bool OnlyOneMissingComma =
true;
15016 for (
unsigned J = I + 1; J < NumInits; ++J) {
15017 const auto *
Init = ILE->getInit(J);
15020 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
15021 if (!SLJ || SLJ->getNumConcatenated() > 1) {
15022 OnlyOneMissingComma =
false;
15027 if (OnlyOneMissingComma) {
15029 for (
unsigned i = 0; i < NumConcat - 1; ++i)
15031 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
15033 Diag(SL->getStrTokenLoc(1),
15034 diag::warn_concatenated_literal_array_init)
15036 Diag(SL->getBeginLoc(),
15037 diag::note_concatenated_string_literal_silence);
15048 if (var->hasAttr<BlocksAttr>())
15052 bool GlobalStorage = var->hasGlobalStorage();
15053 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
15055 bool HasConstInit =
true;
15058 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
15063 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
15064 (GlobalStorage || var->isConstexpr() ||
15065 var->mightBeUsableInConstantExpressions(
Context))) {
15077 HasConstInit = checkConstInit();
15081 if (HasConstInit) {
15082 if (var->isStaticDataMember() && !var->isInline() &&
15083 var->getLexicalDeclContext()->isRecord() &&
15084 type->isIntegralOrEnumerationType()) {
15089 diag::ext_in_class_initializer_non_constant)
15090 <<
Init->getSourceRange();
15093 (void)var->checkForConstantInitialization(Notes);
15095 }
else if (CacheCulprit) {
15096 Notes.emplace_back(CacheCulprit->
getExprLoc(),
15097 PDiag(diag::note_invalid_subexpr_in_const_expr));
15102 HasConstInit = var->checkForConstantInitialization(Notes);
15105 if (HasConstInit) {
15107 }
else if (var->isConstexpr()) {
15111 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15112 diag::note_invalid_subexpr_in_const_expr) {
15113 DiagLoc = Notes[0].first;
15116 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15117 << var <<
Init->getSourceRange();
15118 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15119 Diag(Notes[I].first, Notes[I].second);
15120 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15121 auto *
Attr = var->getAttr<ConstInitAttr>();
15122 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15123 <<
Init->getSourceRange();
15126 for (
auto &it : Notes)
15127 Diag(it.first, it.second);
15128 }
else if (var->isStaticDataMember() && !var->isInline() &&
15129 var->getLexicalDeclContext()->isRecord()) {
15130 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15131 <<
Init->getSourceRange();
15132 for (
auto &it : Notes)
15133 Diag(it.first, it.second);
15134 var->setInvalidDecl();
15135 }
else if (IsGlobal &&
15137 var->getLocation())) {
15146 if (!checkConstInit())
15147 Diag(var->getLocation(), diag::warn_global_constructor)
15148 <<
Init->getSourceRange();
15154 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15159 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15160 std::optional<QualType::NonConstantStorageReason> Reason;
15161 if (HasConstInit &&
15162 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15168 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15175 var->getType().isConstQualified()) {
15177 NonConstNonReferenceType) &&
15178 "This case should've already been handled elsewhere");
15179 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15180 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15186 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15188 SectionAttr::Declspec_allocate));
15190 var->dropAttr<SectionAttr>();
15205 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15206 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15213 if (!
type->isDependentType())
15219 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty() &&
15220 (ModuleScopes.back().Module->isHeaderLikeModule() ||
15223 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15226 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15237 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15238 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15248 NewAttr->setInherited(
true);
15250 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15251 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15252 NewAttr->setInherited(
true);
15257 if (!FD->
hasAttr<DLLExportAttr>())
15260 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15261 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15262 NewAttr->setInherited(
true);
15273 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15278 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15291 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15303 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15307 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15311 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15315 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15320 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15321 for (
auto *BD : DD->bindings()) {
15326 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15349 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15356 bool IsClassTemplateMember =
15358 Context->getDescribedClassTemplate();
15361 IsClassTemplateMember
15362 ? diag::warn_attribute_dllimport_static_field_definition
15363 : diag::err_attribute_dllimport_static_field_definition);
15364 Diag(IA->getLocation(), diag::note_attribute);
15365 if (!IsClassTemplateMember)
15393 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15413 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15417 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15419 if (!MagicValueExpr) {
15422 std::optional<llvm::APSInt> MagicValueInt;
15424 Diag(I->getRange().getBegin(),
15425 diag::err_type_tag_for_datatype_not_ice)
15429 if (MagicValueInt->getActiveBits() > 64) {
15430 Diag(I->getRange().getBegin(),
15431 diag::err_type_tag_for_datatype_too_large)
15435 uint64_t MagicValue = MagicValueInt->getZExtValue();
15438 I->getMatchingCType(),
15439 I->getLayoutCompatible(),
15440 I->getMustBeNull());
15445 auto *VD = dyn_cast<VarDecl>(DD);
15446 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15458 bool DiagnosedMultipleDecomps =
false;
15460 bool DiagnosedNonDeducedAuto =
false;
15462 for (
Decl *D : Group) {
15467 if (
auto *VD = dyn_cast<VarDecl>(D);
15468 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15469 VD->hasGlobalStorage())
15473 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15474 if (!FirstDeclaratorInGroup)
15475 FirstDeclaratorInGroup = DD;
15476 if (!FirstDecompDeclaratorInGroup)
15477 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15480 FirstNonDeducedAutoInGroup = DD;
15482 if (FirstDeclaratorInGroup != DD) {
15485 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15487 diag::err_decomp_decl_not_alone)
15489 << DD->getSourceRange();
15490 DiagnosedMultipleDecomps =
true;
15496 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15498 diag::err_auto_non_deduced_not_alone)
15499 << FirstNonDeducedAutoInGroup->
getType()
15502 << DD->getSourceRange();
15503 DiagnosedNonDeducedAuto =
true;
15508 Decls.push_back(D);
15514 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15516 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15528 if (Group.size() > 1) {
15530 VarDecl *DeducedDecl =
nullptr;
15531 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15532 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15536 if (!DT || DT->getDeducedType().isNull())
15539 Deduced = DT->getDeducedType();
15541 }
else if (!
Context.hasSameType(DT->getDeducedType(),
Deduced)) {
15542 auto *AT = dyn_cast<AutoType>(DT);
15544 diag::err_auto_different_deductions)
15546 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15570 if (Group.empty() || !Group[0])
15573 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15574 Group[0]->getLocation()) &&
15575 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15576 Group[0]->getLocation()))
15579 if (Group.size() >= 2) {
15587 Decl *MaybeTagDecl = Group[0];
15589 Group = Group.slice(1);
15642 const auto *VD = dyn_cast<ValueDecl>(D);
15656 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15658 Diag(TD->getLocation(), diag::note_declared_at);
15664 if (!ExplicitThisLoc.
isValid())
15667 "explicit parameter in non-cplusplus mode");
15669 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15681 LSI->ExplicitObjectParameter = P;
15704 ? diag::ext_register_storage_class
15705 : diag::warn_deprecated_register)
15711 diag::err_invalid_storage_class_in_func_decl)
15720 diag::err_invalid_storage_class_in_func_decl);
15732 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15753 PrevDecl =
nullptr;
15770 diag::err_hlsl_incomplete_resource_array_in_function_param);
15782 New->setInvalidDecl();
15801 Diag(
New->getLocation(), diag::err_module_private_local)
15805 if (
New->hasAttr<BlocksAttr>())
15806 Diag(
New->getLocation(), diag::err_block_not_allowed_on)
15807 << diag::NotAllowedBlockVarReason::NonlocalVariable;
15821 T,
Context.getTrivialTypeSourceInfo(T, Loc),
15823 Param->setImplicit();
15836 !
Parameter->getIdentifier()->isPlaceholder()) {
15837 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15845 if (
LangOpts.NumLargeByValueCopy == 0)
15851 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15852 if (Size >
LangOpts.NumLargeByValueCopy)
15860 if (T->isDependentType() || !T.isPODType(
Context))
15862 unsigned Size =
Context.getTypeSizeInChars(T).getQuantity();
15863 if (Size >
LangOpts.NumLargeByValueCopy)
15876 T->isObjCLifetimeType()) {
15883 if (T->isArrayType()) {
15884 if (!T.isConstQualified()) {
15888 NameLoc, diag::err_arc_array_param_no_ownership, T,
false));
15890 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15895 lifetime = T->getObjCARCImplicitLifetime();
15897 T =
Context.getLifetimeQualifiedType(T, lifetime);
15902 if (T->isArrayType() && !T.hasAddressSpace()) {
15908 T =
Context.getAddrSpaceQualType(T, ImplAS);
15915 Context.getAdjustedParameterType(T),
15916 TSInfo, SC,
nullptr);
15921 if (
New->isParameterPack())
15923 CSI->LocalPacks.push_back(
New);
15925 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15926 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15933 if (T->isObjCObjectType()) {
15937 diag::err_object_cannot_be_passed_returned_by_value) << 1 << T
15939 T =
Context.getObjCObjectPointerType(T);
15944 if (T.getPointerAuth()) {
15945 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) << T << 1;
15946 New->setInvalidDecl();
15960 !(T->isFunctionPointerType() &&
15966 Diag(NameLoc, diag::err_arg_with_address_space);
15967 New->setInvalidDecl();
15971 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15972 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15973 New->setInvalidDecl();
15994 for (
int i = FTI.
NumParams; i != 0; ) {
15999 llvm::raw_svector_ostream(Code)
16010 const char* PrevSpec;
16013 DiagID,
Context.getPrintingPolicy());
16042 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
16044 ParentScope, D, TemplateParameterLists, Bases);
16050 if (!Bases.empty())
16058 Consumer.HandleInlineFunctionDefinition(D);
16067 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
16070 PossiblePrototype = Prev;
16094 if (II->isStr(
"main") || II->isStr(
"efi_main"))
16113 if (FD->
hasAttr<DeviceKernelAttr>())
16162 bool DefinitionVisible =
false;
16166 !
Definition->getTemplateParameterLists().empty())) {
16169 if (!DefinitionVisible) {
16170 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16184 Diag(
Definition->getLocation(), diag::note_previous_definition);
16193 LSI->
Lambda = LambdaClass;
16232 for (
const auto &
C : LambdaClass->
captures()) {
16233 if (
C.capturesVariable()) {
16237 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16239 true,
C.getLocation(),
16240 C.isPackExpansion()
16242 I->getType(),
false);
16244 }
else if (
C.capturesThis()) {
16270 FD = FunTmpl->getTemplatedDecl();
16281 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16286 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16291 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16292 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16293 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16294 !
Attr->isDefaultVersion()) {
16303 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16305 Ctor->isDefaultConstructor() &&
16306 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16351 "There should be an active template instantiation on the stack "
16352 "when instantiating a generic lambda!");
16362 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16363 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16378 diag::err_func_def_incomplete_result) ||
16380 diag::err_abstract_type_in_decl,
16396 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16400 "parameters should not be in newly created FD yet");
16403 if (NonParmDecl->getDeclName())
16408 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16409 for (
auto *EI : ED->enumerators())
16417 Param->setOwningFunction(FD);
16420 if (Param->getIdentifier() && FnBodyScope) {
16457 assert(!FD->
hasAttr<DLLExportAttr>());
16458 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16488 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
16489 if (!SKEPAttr->isInvalidAttr()) {
16509 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16510 FD = TD->getTemplatedDecl();
16511 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16523 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16524 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16525 if (!NRVOCandidate->isNRVOVariable()) {
16526 Diag(Returns[I]->getRetValue()->getExprLoc(),
16527 diag::warn_not_eliding_copy_on_return);
16547 Outer.Fun.hasTrailingReturnType()) {
16565 if (FD->isConstexpr())
16570 if (FD->getReturnType()->getContainedDeducedType())
16573 return Consumer.shouldSkipFunctionBody(D);
16580 FD->setHasSkippedBody();
16593 S.PopExpressionEvaluationContext();
16598 bool IsLambda =
false;
16602 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16604 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16605 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16619 return It->second = R;
16624 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16626 if (IsOrNestedInEscapingBlock(P.second))
16627 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16642 methodHasName(FD,
"get_return_object_on_allocation_failure");
16652 if (!FD->
hasAttr<CoroWrapperAttr>())
16657 bool RetainFunctionScopeInfo) {
16684 SYCLKernelEntryPointAttr *SKEPAttr =
16685 FD->
getAttr<SYCLKernelEntryPointAttr>();
16687 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16688 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16689 SKEPAttr->setInvalidAttr();
16691 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16692 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16693 SKEPAttr->setInvalidAttr();
16695 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16696 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16697 SKEPAttr->setInvalidAttr();
16699 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16700 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16701 SKEPAttr->setInvalidAttr();
16709 if (Body && !SKEPAttr->isInvalidAttr()) {
16739 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16741 Diag(SEAttr->getLocation(),
16742 diag::err_sycl_external_invalid_deleted_function)
16772 Expr *Dummy =
nullptr;
16783 if (LSI->HasImplicitReturnType) {
16790 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16794 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16795 Proto->getExtProtoInfo()));
16828 dyn_cast<CXXDestructorDecl>(FD))
16848 if (PossiblePrototype) {
16852 TypeLoc TL = TI->getTypeLoc();
16855 diag::note_declaration_not_a_prototype)
16858 FTL.getRParenLoc(),
"void")
16866 if (LocInfo.first.isInvalid())
16870 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16874 if (LocInfo.second > Buffer.size())
16877 const char *LexStart = Buffer.data() + LocInfo.second;
16878 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16880 return StartTok.consume_front(
"const") &&
16882 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16885 auto findBeginLoc = [&]() {
16901 diag::note_static_for_internal_linkage)
16912 if (!PossiblePrototype)
16958 if (PossiblePrototype)
16960 diag::warn_non_prototype_changes_behavior)
16967 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16968 if (!CmpndBody->body_empty())
16969 Diag(CmpndBody->body_front()->getBeginLoc(),
16970 diag::warn_dispatch_body_ignored);
16972 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16980 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16981 Context.setNonKeyFunction(MD);
16997 "Function parsing confused");
16998 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
17010 << MD->getSelector().getAsString();
17015 bool isDesignated =
17016 MD->isDesignatedInitializerForTheInterface(&InitMethod);
17017 assert(isDesignated && InitMethod);
17018 (void)isDesignated;
17021 auto IFace = MD->getClassInterface();
17024 auto SuperD = IFace->getSuperClass();
17034 diag::warn_objc_designated_init_missing_super_call);
17036 diag::note_objc_designated_init_marked_here);
17044 diag::warn_objc_secondary_init_missing_init_call);
17059 else if (
AMDGPU().HasPotentiallyUnguardedBuiltinUsage(FD))
17064 "This should only be set for ObjC methods, which should have been "
17065 "handled in the block above.");
17080 if (!
Destructor->getParent()->isDependentType())
17098 ActivePolicy = &WP;
17101 if (!IsInstantiation && FD &&
17107 if (FD && FD->
hasAttr<NakedAttr>()) {
17111 bool RegisterVariables =
false;
17112 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
17113 for (
const auto *
Decl : DS->decls()) {
17114 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
17115 RegisterVariables =
17116 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
17117 if (!RegisterVariables)
17122 if (RegisterVariables)
17125 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
17126 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
17135 "Leftover temporaries in function");
17136 assert(!
Cleanup.exprNeedsCleanups() &&
17137 "Unaccounted cleanups in function");
17139 "Leftover expressions for odr-use checking");
17148 if (!IsInstantiation)
17151 if (!RetainFunctionScopeInfo)
17180 D = TD->getTemplatedDecl();
17192 assert(
LangOpts.implicitFunctionsAllowed() &&
17193 "Implicit function declarations aren't allowed in this language mode");
17200 Scope *BlockScope = S;
17208 Scope *ContextScope = BlockScope;
17212 ContextScope = ContextScope->
getParent();
17232 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17235 return ExternCPrev;
17241 if (II.
getName().starts_with(
"__builtin_"))
17242 diag_id = diag::warn_builtin_unknown;
17245 diag_id = diag::ext_implicit_function_decl_c99;
17247 diag_id = diag::warn_implicit_function_decl;
17255 if (S && !ExternCPrev &&
17262 Diag(Loc, diag_id) << &II;
17278 return ExternCPrev;
17286 Context.getPrintingPolicy());
17288 assert(!
Error &&
"Error setting up implicit decl!");
17331 bool IsNothrow =
false;
17343 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17361 if (!FD->
hasAttr<AllocSizeAttr>()) {
17362 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17373 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17374 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17398 unsigned FormatIdx;
17400 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17401 if (!FD->
hasAttr<FormatAttr>()) {
17402 const char *fmt =
"printf";
17404 if (FormatIdx < NumParams &&
17410 HasVAListArg ? 0 : FormatIdx+2,
17414 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17416 if (!FD->
hasAttr<FormatAttr>())
17418 &
Context.Idents.get(
"scanf"),
17420 HasVAListArg ? 0 : FormatIdx+2,
17426 if (!FD->
hasAttr<CallbackAttr>() &&
17427 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17428 FD->
addAttr(CallbackAttr::CreateImplicit(
17434 bool NoExceptions =
17436 bool ConstWithoutErrnoAndExceptions =
17437 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17438 bool ConstWithoutExceptions =
17439 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17440 if (!FD->
hasAttr<ConstAttr>() &&
17441 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17442 (!ConstWithoutErrnoAndExceptions ||
17444 (!ConstWithoutExceptions || NoExceptions))
17450 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17451 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17453 switch (BuiltinID) {
17454 case Builtin::BI__builtin_fma:
17455 case Builtin::BI__builtin_fmaf:
17456 case Builtin::BI__builtin_fmal:
17457 case Builtin::BIfma:
17458 case Builtin::BIfmaf:
17459 case Builtin::BIfmal:
17469 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17470 !FD->
hasAttr<NonNullAttr>()) {
17472 for (
int I : Indxs) {
17475 T =
Context.getAttributedType(attr::TypeNonNull, T, T);
17480 for (
int I : Indxs)
17481 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17482 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17483 ParamIndxs.size()));
17486 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17487 !FD->
hasAttr<ReturnsTwiceAttr>())
17490 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17492 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17494 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17497 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17502 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17509 switch (BuiltinID) {
17510 case Builtin::BImemalign:
17511 case Builtin::BIaligned_alloc:
17512 if (!FD->
hasAttr<AllocAlignAttr>())
17521 switch (BuiltinID) {
17522 case Builtin::BIcalloc:
17523 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17526 case Builtin::BImemalign:
17527 case Builtin::BIaligned_alloc:
17528 case Builtin::BIrealloc:
17532 case Builtin::BImalloc:
17552 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17568 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17571 if (!FD->
hasAttr<FormatAttr>())
17573 &
Context.Idents.get(
"printf"), 2,
17574 Name->
isStr(
"vasprintf") ? 0 : 3,
17578 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17581 if (!FD->
hasAttr<FormatArgAttr>())
17589 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17590 assert(!T.isNull() &&
"GetTypeForDeclarator() returned null type");
17593 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17594 TInfo =
Context.getTrivialTypeSourceInfo(T);
17647 if (T->isDependentType())
17657 if (T->isAtomicType())
17658 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17661 std::optional<unsigned> QualSelect;
17663 QualSelect = diag::CVQualList::Both;
17665 QualSelect = diag::CVQualList::Const;
17667 QualSelect = diag::CVQualList::Volatile;
17670 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17672 T = T.getAtomicUnqualifiedType();
17677 if (BT->isInteger())
17680 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17681 << T << T->isBitIntType();
17685 QualType EnumUnderlyingTy,
bool IsFixed,
17687 if (IsScoped != Prev->
isScoped()) {
17688 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17694 if (IsFixed && Prev->
isFixed()) {
17697 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17700 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17706 }
else if (IsFixed != Prev->
isFixed()) {
17707 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17729 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17765 llvm_unreachable(
"invalid TTK");
17804 if (IsIgnoredLoc(NewTagLoc))
17807 auto IsIgnored = [&](
const TagDecl *Tag) {
17808 return IsIgnoredLoc(Tag->getLocation());
17825 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17833 if (isDefinition) {
17841 bool previousMismatch =
false;
17843 if (I->getTagKind() !=
NewTag) {
17848 if (!previousMismatch) {
17849 previousMismatch =
true;
17850 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17854 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17867 if (PrevDef && IsIgnored(PrevDef))
17871 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17878 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17908 if (!Namespace || Namespace->isAnonymousNamespace())
17911 Namespaces.push_back(II);
17914 if (Lookup == Namespace)
17921 llvm::raw_svector_ostream OS(Insertion);
17924 std::reverse(Namespaces.begin(), Namespaces.end());
17925 for (
auto *II : Namespaces)
17926 OS << II->getName() <<
"::";
17939 if (OldDC->
Equals(NewDC))
17958 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17959 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17964 "Nameless record must be a definition!");
17969 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17972 bool isMemberSpecialization =
false;
17973 bool IsInjectedClassName =
false;
17979 if (TemplateParameterLists.size() > 0 ||
17983 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
18000 !isMemberSpecialization)
18001 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
18004 if (TemplateParams) {
18006 Diag(KWLoc, diag::err_enum_template);
18010 if (TemplateParams->
size() > 0) {
18019 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
18020 AS, ModulePrivateLoc,
18022 TemplateParameterLists.data(), isMemberSpecialization, SkipBody);
18028 isMemberSpecialization =
true;
18032 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
18051 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
18052 assert(ScopedEnum || !ScopedEnumUsesClassTag);
18053 Diag(KWLoc, diag::note_enum_friend)
18054 << (ScopedEnum + ScopedEnumUsesClassTag);
18060 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
18061 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
18064 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum) ||
18068 EnumUnderlying =
Context.IntTy.getTypePtr();
18069 }
else if (UnderlyingType.
get()) {
18077 EnumUnderlying = TI;
18081 EnumUnderlying =
Context.IntTy.getTypePtr();
18085 EnumUnderlying =
Context.IntTy.getTypePtr();
18095 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
18096 TI && TI->
getType()->isAtomicType())
18099 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
18105 EnumUnderlying =
Context.IntTy.getTypePtr();
18111 bool isStdBadAlloc =
false;
18112 bool isStdAlignValT =
false;
18121 auto createTagFromNewDecl = [&]() ->
TagDecl * {
18131 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
18135 if (EnumUnderlying) {
18137 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18143 ?
Context.getPromotedIntegerType(EnumTy)
18164 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18180 goto CreateNewDecl;
18188 IsDependent =
true;
18217 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18219 IsDependent =
true;
18224 Diag(NameLoc, diag::err_not_tag_in_scope)
18225 << Kind << Name << DC << SS.
getRange();
18228 goto CreateNewDecl;
18276 bool FriendSawTagOutsideEnclosingNamespace =
false;
18283 FriendSawTagOutsideEnclosingNamespace =
true;
18292 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18294 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18325 Previous.getFoundDecl()->isTemplateParameter()) {
18334 if (Name->
isStr(
"bad_alloc")) {
18336 isStdBadAlloc =
true;
18343 }
else if (Name->
isStr(
"align_val_t")) {
18344 isStdAlignValT =
true;
18356 IsTemplateParamOrArg)) {
18357 if (
Invalid)
goto CreateNewDecl;
18440 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18441 if (Tag->getDeclName() == Name &&
18442 Tag->getDeclContext()->getRedeclContext()
18443 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18450 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18452 RD->isInjectedClassName()) {
18459 IsInjectedClassName =
true;
18466 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18467 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18470 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18472 *
this, OldTag->getDeclContext(), SearchDC))) {
18473 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18474 Diag(Shadow->getTargetDecl()->getLocation(),
18475 diag::note_using_decl_target);
18476 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18480 goto CreateNewDecl;
18484 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18490 SS.
isNotEmpty() || isMemberSpecialization)) {
18496 bool SafeToContinue =
18499 if (SafeToContinue)
18500 Diag(KWLoc, diag::err_use_with_wrong_tag)
18503 PrevTagDecl->getKindName());
18505 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18506 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18508 if (SafeToContinue)
18509 Kind = PrevTagDecl->getTagKind();
18522 return PrevTagDecl;
18526 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18527 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18528 else if (
const Type *T =
18529 dyn_cast_if_present<const Type *>(EnumUnderlying))
18530 EnumUnderlyingTy =
QualType(T, 0);
18536 ScopedEnum, EnumUnderlyingTy,
18537 IsFixed, PrevEnum))
18547 Diag(NameLoc, diag::ext_member_redeclared);
18548 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18557 if (
const auto *OutermostClass = dyn_cast<CXXRecordDecl>(PrevDecl)) {
18558 while (
const auto *ParentClass =
18559 dyn_cast<CXXRecordDecl>(OutermostClass->getParent()))
18560 OutermostClass = ParentClass;
18562 if (OutermostClass->isLocalClass() &&
18564 Diag(NameLoc, diag::err_local_nested_class_invalid_scope)
18565 << Name << OutermostClass;
18566 Diag(OutermostClass->getLocation(), diag::note_defined_here)
18576 if (!Attrs.
empty()) {
18580 (PrevTagDecl->getFriendObjectKind() ==
18593 return PrevTagDecl;
18598 return PrevTagDecl;
18607 if (Def->isBeingDefined()) {
18608 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18609 Diag(PrevTagDecl->getLocation(),
18610 diag::note_previous_definition);
18618 bool IsExplicitSpecializationAfterInstantiation =
false;
18619 if (isMemberSpecialization) {
18621 IsExplicitSpecializationAfterInstantiation =
18622 RD->getTemplateSpecializationKind() !=
18624 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18625 IsExplicitSpecializationAfterInstantiation =
18626 ED->getTemplateSpecializationKind() !=
18635 bool HiddenDefVisible =
false;
18649 SkipBody->
New = createTagFromNewDecl();
18658 if (!HiddenDefVisible && Hidden)
18663 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18668 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18671 Diag(NameLoc, diag::err_redefinition) << Name;
18673 NameLoc.
isValid() ? NameLoc : KWLoc);
18692 SearchDC = PrevTagDecl->getDeclContext();
18720 Diag(NameLoc, diag::err_tag_reference_non_tag)
18721 << PrevDecl << NTK << Kind;
18727 SS.
isNotEmpty() || isMemberSpecialization)) {
18733 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18739 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18742 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18743 << Name << Kind << TND->getUnderlyingType();
18751 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18783 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18784 ScopedEnumUsesClassTag, IsFixed);
18788 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18796 if (IsFixed && ED->
isFixed()) {
18799 }
else if (PrevDecl &&
18801 Diag(Loc, diag::ext_forward_ref_enum_def)
18805 unsigned DiagID = diag::ext_forward_ref_enum;
18807 DiagID = diag::ext_ms_forward_ref_enum;
18809 DiagID = diag::err_forward_ref_enum;
18814 if (EnumUnderlying) {
18816 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18822 ?
Context.getPromotedIntegerType(EnumTy)
18824 assert(ED->
isComplete() &&
"enum with type should be complete");
18834 cast_or_null<CXXRecordDecl>(PrevDecl));
18840 cast_or_null<RecordDecl>(PrevDecl));
18846 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18852 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18854 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18861 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18874 isMemberSpecialization))
18878 if (TemplateParameterLists.size() > 0) {
18879 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18898 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18904 if (ModulePrivateLoc.
isValid()) {
18905 if (isMemberSpecialization)
18906 Diag(
New->getLocation(), diag::err_module_private_specialization)
18913 New->setModulePrivate();
18933 Diag(Loc, diag::err_type_defined_in_param_type)
18939 }
else if (!PrevDecl) {
18943 Diag(Loc, diag::warn_decl_in_param_list)
18949 New->setInvalidDecl();
18971 New->startDefinition();
18973 New->setCompleteDefinition();
18974 New->demoteThisDefinitionToDeclaration();
19002 if (!
New->isInvalidDecl() &&
19003 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
19010 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
19023 if (isMemberSpecialization && !
New->isInvalidDecl())
19030 if (
New->isBeingDefined())
19031 if (
auto RD = dyn_cast<RecordDecl>(
New))
19032 RD->completeDefinition();
19034 }
else if (SkipBody && SkipBody->
ShouldSkip) {
19068 bool IsFinalSpelledSealed,
19076 if (!
Record->getIdentifier())
19084 IsFinalSpelledSealed
19085 ? FinalAttr::Keyword_sealed
19086 : FinalAttr::Keyword_final));
19104 "Broken injected-class-name");
19111 Tag->setBraceRange(BraceRange);
19114 if (Tag->isBeingDefined()) {
19115 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
19116 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19117 RD->completeDefinition();
19120 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
19122 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
19123 auto *Def = RD->getDefinition();
19124 assert(Def &&
"The record is expected to have a completed definition");
19125 unsigned NumInitMethods = 0;
19126 for (
auto *
Method : Def->methods()) {
19127 if (!
Method->getIdentifier())
19129 if (
Method->getName() ==
"__init")
19132 if (NumInitMethods > 1 || !Def->hasInitMethod())
19133 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
19151 Tag->setTopLevelDeclInObjCContainer();
19154 if (!Tag->isInvalidDecl())
19155 Consumer.HandleTagDeclDefinition(Tag);
19159 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
19165 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
19169 if (llvm::any_of(RD->
fields(),
19170 [](
const FieldDecl *FD) { return FD->isBitField(); }))
19171 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
19178 Tag->setInvalidDecl();
19181 if (Tag->isBeingDefined()) {
19182 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19183 RD->completeDefinition();
19196 QualType FieldTy,
bool IsMsStruct,
19207 diag::err_field_incomplete_or_sizeless))
19210 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19212 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19222 llvm::APSInt
Value;
19227 BitWidth = ICE.
get();
19230 if (
Value == 0 && FieldName)
19231 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19234 if (
Value.isSigned() &&
Value.isNegative()) {
19236 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19238 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19245 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19250 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19251 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19252 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19256 bool CStdConstraintViolation =
19258 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19259 if (CStdConstraintViolation || MSBitfieldViolation) {
19260 unsigned DiagWidth =
19261 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19262 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19264 << !CStdConstraintViolation << DiagWidth;
19270 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19271 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19314 TInfo =
Context.getTrivialTypeSourceInfo(T, Loc);
19325 diag::err_invalid_thread)
19333 switch (
Previous.getResultKind()) {
19340 PrevDecl =
Previous.getRepresentativeDecl();
19354 PrevDecl =
nullptr;
19358 PrevDecl =
nullptr;
19365 TSSL, AS, PrevDecl, &D);
19368 Record->setInvalidDecl();
19387 bool Mutable,
Expr *BitWidth,
19393 bool InvalidDecl =
false;
19398 if (T.isNull() || T->containsErrors()) {
19399 InvalidDecl =
true;
19405 bool isIncomplete =
19409 diag::err_field_incomplete_or_sizeless);
19410 if (isIncomplete) {
19412 Record->setInvalidDecl();
19413 InvalidDecl =
true;
19418 Record->setInvalidDecl();
19419 InvalidDecl =
true;
19425 if (T.hasAddressSpace() || T->isDependentAddressSpaceType() ||
19426 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19427 Diag(Loc, diag::err_field_with_address_space);
19428 Record->setInvalidDecl();
19429 InvalidDecl =
true;
19435 if (T->isEventT() || T->isImageType() || T->isSamplerT() ||
19436 T->isBlockPointerType()) {
19437 Diag(Loc, diag::err_opencl_type_struct_or_union_field) << T;
19438 Record->setInvalidDecl();
19439 InvalidDecl =
true;
19444 "__cl_clang_bitfields",
LangOpts)) {
19445 Diag(Loc, diag::err_opencl_bitfields);
19446 InvalidDecl =
true;
19452 T.hasQualifiers()) {
19453 InvalidDecl =
true;
19454 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19459 if (!InvalidDecl && T->isVariablyModifiedType()) {
19461 TInfo, T, Loc, diag::err_typecheck_field_variable_size))
19462 InvalidDecl =
true;
19467 diag::err_abstract_type_in_decl,
19469 InvalidDecl =
true;
19472 BitWidth =
nullptr;
19478 InvalidDecl =
true;
19479 BitWidth =
nullptr;
19484 if (!InvalidDecl && Mutable) {
19485 unsigned DiagID = 0;
19486 if (T->isReferenceType())
19487 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19488 : diag::err_mutable_reference;
19489 else if (T.isConstQualified())
19490 DiagID = diag::err_mutable_const;
19496 Diag(ErrLoc, DiagID);
19497 if (DiagID != diag::ext_mutable_reference) {
19499 InvalidDecl =
true;
19511 BitWidth, Mutable, InitStyle);
19520 Diag(Loc, diag::err_duplicate_member) << II;
19526 if (
Record->isUnion()) {
19528 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19543 const bool HaveMSExt =
19548 HaveMSExt ? diag::ext_union_member_of_reference_type
19549 : diag::err_union_member_of_reference_type)
19569 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19572 if (T.isObjCGCWeak())
19573 Diag(Loc, diag::warn_attribute_weak_on_field);
19576 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19593 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19604 if (RDecl->hasNonTrivialCopyConstructor())
19606 else if (!RDecl->hasTrivialDefaultConstructor())
19608 else if (RDecl->hasNonTrivialCopyAssignment())
19610 else if (RDecl->hasNonTrivialDestructor())
19615 RDecl->hasObjectMember()) {
19623 if (!FD->
hasAttr<UnavailableAttr>())
19624 FD->
addAttr(UnavailableAttr::CreateImplicit(
19625 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19632 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19633 : diag::err_illegal_union_or_anon_struct_member)
19645 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19648 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19656 if (!CD->IsClassExtension())
19673 AllIvarDecls.push_back(Ivar);
19685 if (!
Record->hasUserDeclaredDestructor()) {
19693 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19694 if (DD->isInvalidDecl())
19698 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19712 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19716 Msg = diag::err_ambiguous_destructor;
19721 Msg = diag::err_no_viable_destructor;
19732 Record->setInvalidDecl();
19739 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19783 if (!Method->getTrailingRequiresClause())
19784 SatisfactionStatus.push_back(
true);
19788 SatisfactionStatus.push_back(
false);
19790 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19794 for (
size_t i = 0; i < Methods.size(); i++) {
19795 if (!SatisfactionStatus[i])
19803 bool AnotherMethodIsMoreConstrained =
false;
19804 for (
size_t j = 0; j < Methods.size(); j++) {
19805 if (i == j || !SatisfactionStatus[j])
19819 AnotherMethodIsMoreConstrained =
true;
19823 AnotherMethodIsMoreConstrained)) {
19826 AnotherMethodIsMoreConstrained =
true;
19828 if (AnotherMethodIsMoreConstrained)
19833 if (!AnotherMethodIsMoreConstrained) {
19834 Method->setIneligibleOrNotSelected(
false);
19835 Record->addedEligibleSpecialMemberFunction(Method,
19836 1 << llvm::to_underlying(CSM));
19850 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19852 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19854 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19858 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19859 if (CD->isInvalidDecl())
19861 if (CD->isDefaultConstructor())
19862 DefaultConstructors.push_back(MD);
19863 else if (CD->isCopyConstructor())
19864 CopyConstructors.push_back(MD);
19865 else if (CD->isMoveConstructor())
19866 MoveConstructors.push_back(MD);
19868 CopyAssignmentOperators.push_back(MD);
19870 MoveAssignmentOperators.push_back(MD);
19888 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19889 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19902 if (
const auto *TD = dyn_cast<TagDecl>(D))
19903 return !TD->isCompleteDefinition();
19918 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19925 assert(EnclosingDecl &&
"missing record or interface decl");
19934 case Decl::ObjCCategory:
19937 case Decl::ObjCImplementation:
19945 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19949 unsigned NumNamedMembers = 0;
19951 for (
const auto *I :
Record->decls()) {
19952 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19953 if (IFD->getDeclName())
19960 const FieldDecl *PreviousField =
nullptr;
19970 RecFields.push_back(FD);
19990 bool IsLastField = (i + 1 == Fields.end());
20005 unsigned DiagID = 0;
20006 if (!
Record->isUnion() && !IsLastField) {
20009 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
20013 }
else if (
Record->isUnion())
20015 ? diag::ext_flexible_array_union_ms
20016 : diag::ext_flexible_array_union_gnu;
20017 else if (NumNamedMembers < 1)
20019 ? diag::ext_flexible_array_empty_aggregate_ms
20020 : diag::ext_flexible_array_empty_aggregate_gnu;
20030 if (CXXRecord && CXXRecord->getNumVBases() != 0)
20044 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
20051 Record->setHasFlexibleArrayMember(
true);
20060 diag::err_incomplete_type)
20063 diag::err_field_incomplete_or_sizeless))) {
20069 if (
Record && RD->hasFlexibleArrayMember()) {
20072 Record->setHasFlexibleArrayMember(
true);
20073 if (!
Record->isUnion()) {
20090 diag::err_abstract_type_in_decl,
20095 if (
Record && RD->hasObjectMember())
20096 Record->setHasObjectMember(
true);
20097 if (
Record && RD->hasVolatileMember())
20098 Record->setHasVolatileMember(
true);
20117 FD->
addAttr(UnavailableAttr::CreateImplicit(
20118 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
20122 !
Record->hasObjectMember()) {
20125 Record->setHasObjectMember(
true);
20128 if (
const auto *RD = BaseType->getAsRecordDecl();
20129 RD && RD->hasObjectMember())
20130 Record->setHasObjectMember(
true);
20131 else if (BaseType->isObjCObjectPointerType() ||
20132 BaseType.isObjCGCStrong())
20133 Record->setHasObjectMember(
true);
20138 !shouldIgnoreForRecordTriviality(FD)) {
20141 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
20144 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
20148 Record->setNonTrivialToPrimitiveCopy(
true);
20150 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
20152 if (FD->
hasAttr<ExplicitInitAttr>())
20153 Record->setHasUninitializedExplicitInitFields(
true);
20155 Record->setNonTrivialToPrimitiveDestroy(
true);
20156 Record->setParamDestroyedInCallee(
true);
20158 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
20162 if (RD->getArgPassingRestrictions() ==
20164 Record->setArgPassingRestrictions(
20167 Record->setArgPassingRestrictions(
20171 Record->setArgPassingRestrictions(
20173 Record->setNonTrivialToPrimitiveCopy(
true);
20178 Record->setHasVolatileMember(
true);
20179 bool ReportMSBitfieldStoragePacking =
20180 Record && PreviousField &&
20181 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
20183 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
20187 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
20188 IsNonDependentBitField(PreviousField)) {
20192 if (FDStorageSize != PreviousFieldStorageSize) {
20194 diag::warn_ms_bitfield_mismatched_storage_packing)
20198 diag::note_ms_bitfield_mismatched_storage_size_previous)
20199 << PreviousField << PreviousField->
getType();
20209 bool Completed =
false;
20214 Record->setInvalidDecl();
20218 if (!CXXRecord->isInvalidDecl()) {
20221 I = CXXRecord->conversion_begin(),
20222 E = CXXRecord->conversion_end(); I != E; ++I)
20223 I.setAccess((*I)->getAccess());
20229 if (!CXXRecord->isDependentType()) {
20230 if (!CXXRecord->isInvalidDecl()) {
20234 if (CXXRecord->getNumVBases()) {
20236 CXXRecord->getFinalOverriders(FinalOverriders);
20238 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20239 MEnd = FinalOverriders.end();
20242 SOEnd = M->second.end();
20243 SO != SOEnd; ++SO) {
20244 assert(SO->second.size() > 0 &&
20245 "Virtual function without overriding functions?");
20246 if (SO->second.size() == 1)
20253 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20255 Diag(M->first->getLocation(),
20256 diag::note_overridden_virtual_function);
20258 OM = SO->second.begin(),
20259 OMEnd = SO->second.end();
20261 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20262 << (
const NamedDecl *)M->first << OM->Method->getParent();
20264 Record->setInvalidDecl();
20267 CXXRecord->completeDefinition(&FinalOverriders);
20277 Record->completeDefinition();
20286 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20287 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20288 EntirelyFunctionPointers(
Record)))) {
20292 Record->reorderDecls(NewDeclOrdering);
20297 auto *Dtor = CXXRecord->getDestructor();
20298 if (Dtor && Dtor->isImplicit() &&
20300 CXXRecord->setImplicitDestructorIsDeleted();
20305 if (
Record->hasAttrs()) {
20308 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20310 IA->getRange(), IA->getBestCase(),
20311 IA->getInheritanceModel());
20317 bool CheckForZeroSize;
20319 CheckForZeroSize =
true;
20324 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20326 CXXRecord->isCLike();
20328 if (CheckForZeroSize) {
20329 bool ZeroSize =
true;
20330 bool IsEmpty =
true;
20331 unsigned NonBitFields = 0;
20333 E =
Record->field_end();
20334 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20336 if (I->isUnnamedBitField()) {
20337 if (!I->isZeroLengthBitField())
20341 QualType FieldType = I->getType();
20343 !
Context.getTypeSizeInChars(FieldType).isZero())
20353 diag::warn_zero_size_struct_union_in_extern_c :
20354 diag::warn_zero_size_struct_union_compat)
20355 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20362 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20363 : diag::ext_no_named_members_in_struct_union)
20371 ID->setEndOfDefinitionLoc(RBrac);
20373 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20375 ID->addDecl(ClsFields[i]);
20379 if (ID->getSuperClass())
20382 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20383 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20384 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20390 IMPDecl->setIvarLBraceLoc(LBrac);
20391 IMPDecl->setIvarRBraceLoc(RBrac);
20393 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20401 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20405 Diag(ClsFields[i]->getLocation(),
20406 diag::err_duplicate_ivar_declaration);
20407 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20413 Diag(ClsFields[i]->getLocation(),
20414 diag::err_duplicate_ivar_declaration);
20415 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20421 CDecl->addDecl(ClsFields[i]);
20423 CDecl->setIvarLBraceLoc(LBrac);
20424 CDecl->setIvarRBraceLoc(RBrac);
20436 assert((T->isIntegralType(Context) ||
20437 T->isEnumeralType()) &&
"Integral type required!");
20438 const unsigned NumTypes = 4;
20439 QualType SignedIntegralTypes[NumTypes] = {
20440 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20442 QualType UnsignedIntegralTypes[NumTypes] = {
20443 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20444 Context.UnsignedLongLongTy
20447 unsigned BitWidth = Context.getTypeSize(T);
20449 : UnsignedIntegralTypes;
20450 for (
unsigned I = 0; I != NumTypes; ++I)
20451 if (Context.getTypeSize(Types[I]) > BitWidth)
20462 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20463 llvm::APSInt EnumVal(IntWidth);
20483 EltTy =
Enum->getIntegerType();
20489 Val = Converted.
get();
20496 if (
Enum->isComplete()) {
20497 EltTy =
Enum->getIntegerType();
20503 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20506 .isWindowsMSVCEnvironment()) {
20507 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20509 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20532 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20534 ? diag::warn_c17_compat_enum_value_not_int
20535 : diag::ext_c23_enum_value_not_int)
20537 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20549 if (
Enum->isDependentType())
20551 else if (!LastEnumConst) {
20560 if (
Enum->isFixed()) {
20561 EltTy =
Enum->getIntegerType();
20570 EltTy = LastEnumConst->
getType();
20573 if (EnumVal < LastEnumConst->getInitVal()) {
20585 if (T.isNull() ||
Enum->isFixed()) {
20589 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20591 if (
Enum->isFixed())
20593 Diag(IdLoc, diag::err_enumerator_wrapped)
20597 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20608 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20620 ? diag::warn_c17_compat_enum_value_not_int
20621 : diag::ext_c23_enum_value_not_int)
20622 << 1 <<
toString(EnumVal, 10) << 1;
20624 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20627 : diag::ext_c23_enum_value_not_int)
20628 << 1 <<
toString(EnumVal, 10) << 1;
20636 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20655 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20663 Skip.Previous = Hidden;
20677 cast_or_null<EnumConstantDecl>(lastEnumConst);
20694 PrevDecl =
nullptr;
20721 "Received TagDecl when not in C++!");
20724 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20726 Diag(IdLoc, diag::err_redefinition) << Id;
20759 if (!BO->isAdditiveOp())
20767 InitExpr = BO->getLHS();
20771 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20791 if (!
Enum->getIdentifier())
20795 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20804 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20807 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20811 llvm::APSInt Val = D->getInitVal();
20812 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20815 DuplicatesVector DupVector;
20816 ValueToVectorMap EnumMap;
20820 for (
auto *Element : Elements) {
20834 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20837 if (EnumMap.size() == 0)
20841 for (
auto *Element : Elements) {
20847 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20848 if (Iter == EnumMap.end())
20851 DeclOrVector& Entry = Iter->second;
20858 auto Vec = std::make_unique<ECDVector>();
20860 Vec->push_back(ECD);
20867 DupVector.emplace_back(std::move(Vec));
20873 if (*Vec->begin() == ECD)
20876 Vec->push_back(ECD);
20880 for (
const auto &Vec : DupVector) {
20881 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20884 auto *FirstECD = Vec->front();
20885 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20886 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20887 << FirstECD->getSourceRange();
20891 for (
auto *ECD : llvm::drop_begin(*Vec))
20892 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20893 << ECD <<
toString(ECD->getInitVal(), 10)
20894 << ECD->getSourceRange();
20899 bool AllowMask)
const {
20900 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20904 llvm::APInt &FlagBits = R.first->second;
20908 const auto &EVal = E->getInitVal();
20910 if (EVal.isPowerOf2())
20911 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20923 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20924 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20931 bool HasBitwiseOp =
false;
20936 for (
const auto *ECD :
Enum->enumerators()) {
20937 const Expr *InitExpr = ECD->getInitExpr();
20943 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20947 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20948 HasBitwiseOp =
true;
20949 }
else if (Op == BO_LT || Op == BO_GT) {
20952 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20954 if (IntLiteral->getValue() == 1)
20955 SuspiciousCompares.push_back(BinOp);
20963 if (HasBitwiseOp) {
20964 for (
const auto *BinOp : SuspiciousCompares) {
20965 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20970 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20971 << BinOp->getOpcodeStr() << SuggestedOp;
20973 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20989 if (
Enum->isDependentType()) {
20990 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20992 cast_or_null<EnumConstantDecl>(Elements[i]);
20993 if (!ECD)
continue;
21004 unsigned NumNegativeBits = 0;
21005 unsigned NumPositiveBits = 0;
21006 bool MembersRepresentableByInt =
21007 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
21011 unsigned BestWidth;
21032 if (
Enum->isComplete()) {
21033 BestType =
Enum->getIntegerType();
21034 if (
Context.isPromotableIntegerType(BestType))
21035 BestPromotionType =
Context.getPromotedIntegerType(BestType);
21037 BestPromotionType = BestType;
21039 BestWidth =
Context.getIntWidth(BestType);
21041 bool EnumTooLarge =
Context.computeBestEnumTypes(
21042 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
21043 BestWidth =
Context.getIntWidth(BestType);
21045 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
21050 for (
auto *D : Elements) {
21051 auto *ECD = cast_or_null<EnumConstantDecl>(D);
21052 if (!ECD)
continue;
21061 llvm::APSInt InitVal = ECD->getInitVal();
21069 MembersRepresentableByInt) {
21077 NewWidth =
Context.getTargetInfo().getIntWidth();
21079 }
else if (ECD->getType() == BestType) {
21087 ECD->setType(EnumType);
21091 NewWidth = BestWidth;
21096 InitVal = InitVal.extOrTrunc(NewWidth);
21097 InitVal.setIsSigned(NewSign);
21098 ECD->setInitVal(
Context, InitVal);
21101 if (ECD->getInitExpr() &&
21102 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
21104 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
21113 ECD->setType(EnumType);
21115 ECD->setType(NewTy);
21118 Enum->completeDefinition(BestType, BestPromotionType,
21119 NumPositiveBits, NumNegativeBits);
21124 if (
Enum->isClosedFlag()) {
21125 for (
Decl *D : Elements) {
21127 if (!ECD)
continue;
21130 if (InitVal != 0 && !InitVal.isPowerOf2() &&
21138 if (
Enum->hasAttrs())
21177 AsmLabelAttr *
Attr =
21178 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
21188 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
21201 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
21217 if (!PrevDecl->
hasAttr<AliasAttr>())
21218 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21227 assert(FD &&
"Expected non-null FunctionDecl");
21234 FD->
hasAttr<SYCLKernelEntryPointAttr>() ||
21235 FD->
hasAttr<SYCLExternalAttr>()))
21239 auto IsEmittedForExternalSymbol = [
this, FD]() {
21251 if (
LangOpts.OpenMPIsTargetDevice) {
21254 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21261 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21265 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21266 if (IsEmittedForExternalSymbol())
21272 }
else if (
LangOpts.OpenMP > 45) {
21276 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21279 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21298 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()
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, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
const Expr * getInitExpr() const
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
bool isComplete() const
Returns true if this can be considered a complete type.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
void setEnumKeyRange(SourceRange Range)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool 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...
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.
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.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
PragmaClangSection PragmaClangRodataSection
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
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 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)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
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)
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_bits attribute.
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
PragmaClangSection PragmaClangTextSection
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".
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
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()
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)
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...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
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 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 [...].
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
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.