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>();
1603 for (; I != IEnd; ++I) {
1636 bool AllowInlineNamespace)
const {
1637 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1644 if (ScopeDC->getPrimaryContext() == TargetDC)
1656 bool ConsiderLinkage,
1657 bool AllowInlineNamespace) {
1675 if (
auto *VD = dyn_cast<VarDecl>(D))
1677 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1679 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1693 if (
New->getFriendObjectKind() &&
1734 if (NewIsModuleInterface || OldIsModuleInterface) {
1738 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1740 << NewIsModuleInterface
1742 << OldIsModuleInterface
1745 New->setInvalidDecl();
1758 if (!
New->getLexicalDeclContext()
1759 ->getNonTransparentContext()
1760 ->isFileContext() ||
1766 bool IsNewExported =
New->isInExportDeclContext();
1770 if (!IsNewExported && !IsOldExported)
1782 New->getOwningModule()->isImplicitGlobalModule())
1785 assert(IsNewExported);
1793 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1811 "New and Old are not the same definition, we should diagnostic it "
1812 "immediately instead of checking it.");
1815 "We shouldn't see unreachable definitions here.");
1863 return OldM == NewM;
1900 return CD->isCopyConstructor();
1907 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1908 if (!RD->hasNameForLinkage())
1929 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1935 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1938 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1947 if (FD->doesThisDeclarationHaveABody() &&
1948 Context.DeclMustBeEmitted(FD))
1950 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1957 if (
Context.DeclMustBeEmitted(VD))
1960 if (VD->isStaticDataMember() &&
1963 if (VD->isStaticDataMember() &&
1965 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1977 return mightHaveNonExternalLinkage(D);
1984 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1990 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2005 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2009 bool IsAllIgnored =
true;
2010 for (
const auto *BD : DD->bindings()) {
2011 if (BD->isReferenced())
2013 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2014 BD->hasAttr<UnusedAttr>());
2027 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2037 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2040 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2041 if (!WithinFunction)
2052 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2055 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2056 Init = Cleanups->getSubExpr();
2058 const auto *Ty = VD->getType().getTypePtr();
2063 if (TT->getDecl()->hasAttr<UnusedAttr>())
2069 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2070 MTE && MTE->getExtendingDecl()) {
2071 Ty = VD->getType().getNonReferenceType().getTypePtr();
2072 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2077 if (Ty->isIncompleteType() || Ty->isDependentType())
2082 Ty = Ty->getBaseElementTypeUnsafe();
2084 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2085 if (Tag->hasAttr<UnusedAttr>())
2088 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2089 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2093 const auto *Construct =
2094 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2095 if (Construct && !Construct->isElidable()) {
2097 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2098 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2104 if (
Init->isTypeDependent()) {
2106 if (!Ctor->isTrivial())
2147 for (
auto *TmpD : D->
decls()) {
2148 if (
const auto *T = dyn_cast<TypedefNameDecl>(TmpD))
2150 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2164 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2176 DiagID = diag::warn_unused_exception_param;
2178 DiagID = diag::warn_unused_label;
2180 DiagID = diag::warn_unused_variable;
2199 if (Ty->isReferenceType() || Ty->isDependentType())
2202 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2203 if (Tag->hasAttr<UnusedAttr>())
2207 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2208 RD && !RD->hasAttr<WarnUnusedAttr>())
2220 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2226 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2233 assert(iter->getSecond() >= 0 &&
2234 "Found a negative number of references to a VarDecl");
2235 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2245 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2246 if (!UnusedCXXCondDecl)
2252 DiagID = diag::warn_unused_but_set_parameter;
2254 DiagID = diag::warn_unused_but_set_global;
2256 DiagID = diag::warn_unused_but_set_variable;
2266 bool Diagnose =
false;
2270 Diagnose = L->
getStmt() ==
nullptr;
2281 "Scope shouldn't contain decls!");
2288 std::optional<SourceLocation> PreviousDeclLoc;
2293 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2298 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2301 for (
auto *TmpD : S->
decls()) {
2302 assert(TmpD &&
"This decl didn't get pushed??");
2310 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2313 if (
auto *VD = dyn_cast<VarDecl>(D);
2314 VD && !VD->isInternalLinkageFileVar()) {
2323 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2334 auto ShadowI = ShadowingDecls.find(D);
2335 if (ShadowI != ShadowingDecls.end()) {
2336 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2337 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2338 PDiag(diag::warn_ctor_parm_shadows_field)
2339 << D << FD << FD->getParent());
2341 ShadowingDecls.erase(ShadowI);
2345 llvm::sort(DeclDiags,
2346 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2351 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2353 for (
const LocAndDiag &D : DeclDiags) {
2355 if (D.PreviousDeclLoc)
2356 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2380 return "ucontext.h";
2382 llvm_unreachable(
"unhandled error kind");
2393 Parent->
addDecl(CLinkageDecl);
2394 Parent = CLinkageDecl;
2398 if (
Context.BuiltinInfo.isImmediate(ID)) {
2400 "consteval builtins should only be available in C++20 mode");
2409 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2415 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2418 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2420 Params.push_back(parm);
2422 New->setParams(Params);
2430 Scope *S,
bool ForRedeclaration,
2437 if (!ForRedeclaration)
2443 Context.BuiltinInfo.allowTypeMismatch(ID))
2449 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2450 <<
Context.BuiltinInfo.getName(ID);
2456 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2458 <<
Context.BuiltinInfo.getName(ID);
2462 if (!ForRedeclaration &&
2463 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2464 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2465 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2466 : diag::ext_implicit_lib_function_decl)
2467 <<
Context.BuiltinInfo.getName(ID) << R;
2468 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2469 Diag(Loc, diag::note_include_header_or_declare)
2470 << Header <<
Context.BuiltinInfo.getName(ID);
2506 while (Filter.hasNext()) {
2515 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2517 Decl->getUnderlyingType()))
2522 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2523 Decl->getAnonDeclWithTypedefName())
2535 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2536 OldType = OldTypedef->getUnderlyingType();
2538 OldType =
Context.getTypeDeclType(Old);
2544 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2548 New->setInvalidDecl();
2552 if (OldType != NewType &&
2555 !
Context.hasSameType(OldType, NewType)) {
2557 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2558 << Kind << NewType << OldType;
2561 New->setInvalidDecl();
2571 if (
New->isInvalidDecl())
return;
2577 switch (TypeID->getLength()) {
2581 if (!TypeID->isStr(
"id"))
2584 if (!T->isPointerType())
2586 if (!T->isVoidPointerType()) {
2591 Context.setObjCIdRedefinitionType(T);
2593 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2598 if (!TypeID->isStr(
"Class"))
2600 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2602 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2606 if (!TypeID->isStr(
"SEL"))
2608 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2610 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2620 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2621 <<
New->getDeclName();
2627 return New->setInvalidDecl();
2632 return New->setInvalidDecl();
2634 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2635 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2636 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2639 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2643 if (OldTD->isModed())
2644 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2645 OldTD->getUnderlyingType());
2647 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2703 Diag(
New->getLocation(), diag::err_redefinition)
2704 <<
New->getDeclName();
2706 return New->setInvalidDecl();
2721 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2724 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2725 <<
New->getDeclName();
2732 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2734 for (
auto *ECD : ED->enumerators()) {
2745 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2746 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2747 for (
const auto *i : D->
attrs())
2748 if (i->getKind() == A->
getKind()) {
2764 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2765 return VD->isThisDeclarationADefinition();
2766 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2767 return TD->isCompleteDefinition() || TD->isBeingDefined();
2778 AlignedAttr *OldAlignasAttr =
nullptr;
2779 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2780 unsigned OldAlign = 0;
2788 if (I->isAlignmentDependent())
2794 unsigned Align = I->getAlignment(S.
Context);
2795 if (Align > OldAlign) {
2797 OldStrictestAlignAttr = I;
2802 AlignedAttr *NewAlignasAttr =
nullptr;
2803 unsigned NewAlign = 0;
2804 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2805 if (I->isAlignmentDependent())
2811 unsigned Align = I->getAlignment(S.
Context);
2812 if (Align > NewAlign)
2816 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2824 if (OldAlign == 0 || NewAlign == 0) {
2837 if (OldAlign != NewAlign) {
2838 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2841 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2854 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2856 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2860 bool AnyAdded =
false;
2863 if (OldAlign > NewAlign) {
2864 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2865 Clone->setInherited(
true);
2866 New->addAttr(Clone);
2871 if (OldAlignasAttr && !NewAlignasAttr &&
2872 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2873 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2874 Clone->setInherited(
true);
2875 New->addAttr(Clone);
2882#define WANT_DECL_MERGE_LOGIC
2883#include "clang/Sema/AttrParsedAttrImpl.inc"
2884#undef WANT_DECL_MERGE_LOGIC
2891 if (!DiagnoseMutualExclusions(S, D,
Attr))
2902 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr)) {
2904 if (AvailabilityAttr *
Inf = AA->getInferredAttrAs())
2905 InferredPlatformII =
Inf->getPlatform();
2907 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2908 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2909 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2910 AA->getPriority(), AA->getEnvironment(), InferredPlatformII);
2911 }
else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2913 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2915 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2917 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2919 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2921 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2922 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2924 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2926 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2927 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2929 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2931 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2933 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2935 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2937 IA->getInheritanceModel());
2938 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2947 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2949 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2951 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2953 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2964 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2965 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2966 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2968 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2970 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2972 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2974 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2976 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2979 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2982 WS->getSpelledArgsCount());
2983 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2985 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2990 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2994 else if (
const auto *PA = dyn_cast<PersonalityAttr>(
Attr))
3009 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
3010 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
3014 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3020 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
3022 if (FD->isDefined(Def,
true))
3029 for (
const auto *Attribute : D->
attrs())
3030 if (Attribute->getKind() == Kind)
3038 if (!
New->hasAttrs())
3042 if (!Def || Def ==
New)
3046 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3047 Attr *NewAttribute = NewAttributes[I];
3056 NewAttributes.erase(NewAttributes.begin() + I);
3064 ? diag::err_alias_after_tentative
3065 : diag::err_redefinition;
3067 if (
Diag == diag::err_redefinition)
3077 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3113 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3114 if (AA->isAlignas()) {
3125 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3127 NewAttributes.erase(NewAttributes.begin() + I);
3137 diag::err_loader_uninitialized_redeclaration);
3139 NewAttributes.erase(NewAttributes.begin() + I);
3162 diag::err_sycl_entry_point_after_definition)
3175 diag::warn_attribute_precede_definition);
3177 NewAttributes.erase(NewAttributes.begin() + I);
3183 const ConstInitAttr *CIAttr,
3184 bool AttrBeforeInit) {
3191 std::string SuitableSpelling;
3193 SuitableSpelling = std::string(
3195 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3197 InsertLoc, {tok::l_square, tok::l_square,
3198 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3199 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3200 tok::r_square, tok::r_square}));
3201 if (SuitableSpelling.empty())
3203 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3204 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3205 tok::r_paren, tok::r_paren}));
3206 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3207 SuitableSpelling =
"constinit";
3208 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3209 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3210 if (SuitableSpelling.empty())
3211 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3212 SuitableSpelling +=
" ";
3214 if (AttrBeforeInit) {
3217 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3220 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3224 S.
Diag(CIAttr->getLocation(),
3225 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3226 : diag::warn_require_const_init_added_too_late)
3229 << CIAttr->isConstinit()
3237 UsedAttr *NewAttr = OldAttr->clone(
Context);
3238 NewAttr->setInherited(
true);
3239 New->addAttr(NewAttr);
3242 RetainAttr *NewAttr = OldAttr->clone(
Context);
3243 NewAttr->setInherited(
true);
3244 New->addAttr(NewAttr);
3253 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3254 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3255 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3263 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3266 if (InitDecl == NewVD) {
3270 if (OldConstInit && OldConstInit->isConstinit())
3273 }
else if (NewConstInit) {
3277 if (InitDecl && InitDecl != NewVD) {
3280 NewVD->dropAttr<ConstInitAttr>();
3288 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3289 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3290 if (!OldA->isEquivalent(NewA)) {
3292 Diag(
New->getLocation(), diag::err_different_asm_label);
3293 Diag(OldA->getLocation(), diag::note_previous_declaration);
3295 }
else if (Old->
isUsed()) {
3298 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3304 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3305 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3306 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3307 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3308 Diag(NewAbiTagAttr->getLocation(),
3309 diag::err_new_abi_tag_on_redeclaration)
3311 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3315 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3321 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3322 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3324 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3331 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3332 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3334 Diag(
New->getLocation(), diag::warn_mismatched_section)
3342 bool foundAny =
New->hasAttrs();
3372 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3385 if (!foundAny)
New->dropAttrs();
3390 checkAttrIsTypeDependent(D, A);
3401 newAttr->setInherited(
true);
3423 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3438 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3439 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3440 S.
Diag(CDA->getLocation(),
3441 diag::err_carries_dependency_missing_on_first_decl) << 1;
3449 diag::note_carries_dependency_missing_first_decl) << 1;
3468 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3469 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3477 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3509 if (*Oldnullability != *Newnullability) {
3510 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3527 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3528 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3529 if (OldParamDT && NewParamDT &&
3530 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3531 QualType OldParamOT = OldParamDT->getOriginalType();
3532 QualType NewParamOT = NewParamDT->getOriginalType();
3535 << NewParam << NewParamOT;
3546struct GNUCompatibleParamWarning {
3547 ParmVarDecl *OldParm;
3548 ParmVarDecl *NewParm;
3549 QualType PromotedType;
3556template <
typename T>
3557static std::pair<diag::kind, SourceLocation>
3561 if (Old->isThisDeclarationADefinition())
3562 PrevDiag = diag::note_previous_definition;
3563 else if (Old->isImplicit()) {
3564 PrevDiag = diag::note_previous_implicit_declaration;
3565 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3566 if (FD->getBuiltinID())
3567 PrevDiag = diag::note_previous_builtin_declaration;
3570 OldLocation =
New->getLocation();
3572 PrevDiag = diag::note_previous_declaration;
3573 return std::make_pair(PrevDiag, OldLocation);
3581 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3582 !LangOpts.CPlusPlus &&
3588 const AttributedType *AT = T->getAs<AttributedType>();
3589 while (AT && !AT->isCallingConv())
3590 AT = AT->getModifiedType()->getAs<AttributedType>();
3594template <
typename T>
3608template<
typename T>
static bool isExternC(T *D) {
return D->isExternC(); }
3615template<
typename ExpectedDecl>
3637 !Old->getDeclContext()->getRedeclContext()->Equals(
3638 New->getDeclContext()->getRedeclContext()) &&
3643 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3656 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3657 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3660 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3661 AttrA->isDynamic() == AttrB->isDynamic();
3687 if (NamedDC->Equals(SemaDC))
3690 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3692 "unexpected context for redeclaration");
3703 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3704 FixSemaDC(FD->getDescribedFunctionTemplate());
3705 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3706 FixSemaDC(VD->getDescribedVarTemplate());
3710 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3718 Diag(
New->getLocation(), diag::err_using_decl_friend);
3719 Diag(Shadow->getTargetDecl()->getLocation(),
3720 diag::note_using_decl_target);
3721 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3729 New->getDescribedFunctionTemplate()) {
3741 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3742 <<
New->getDeclName();
3766 std::tie(PrevDiag, OldLocation) =
3776 !
New->getTemplateSpecializationInfo() &&
3779 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3780 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3782 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3783 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3788 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3789 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3790 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3793 New->dropAttr<InternalLinkageAttr>();
3796 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3797 if (!Old->
hasAttr<ErrorAttr>()) {
3798 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3800 New->dropAttr<ErrorAttr>();
3808 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3809 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3810 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3819 const Decl *DiagOld = Old;
3821 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3822 const auto *A = D->getAttr<OverloadableAttr>();
3823 return A && !A->isImplicit();
3832 diag::note_attribute_overloadable_prev_overload)
3836 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3838 New->dropAttr<OverloadableAttr>();
3845 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3847 Diag(OldLocation, diag::note_previous_declaration);
3870 bool RequiresAdjustment =
false;
3872 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3878 if (!NewCCExplicit) {
3882 RequiresAdjustment =
true;
3890 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3894 RequiresAdjustment =
true;
3898 Diag(
New->getLocation(), diag::err_cconv_change)
3901 << (!FirstCCExplicit ?
"" :
3905 Diag(
First->getLocation(), diag::note_previous_declaration);
3913 RequiresAdjustment =
true;
3925 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3926 FPT2->getParamTypes(), EPI2);
3928 New->setType(NewQType);
3937 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3940 Diag(OldLocation, diag::note_previous_declaration);
3945 RequiresAdjustment =
true;
3951 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3952 <<
"'ns_returns_retained'";
3953 Diag(OldLocation, diag::note_previous_declaration);
3958 RequiresAdjustment =
true;
3964 AnyX86NoCallerSavedRegistersAttr *
Attr =
3965 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3966 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3967 Diag(OldLocation, diag::note_previous_declaration);
3972 RequiresAdjustment =
true;
3975 if (RequiresAdjustment) {
3979 NewQType =
Context.getCanonicalType(
New->getType());
3984 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3992 if (
New->hasAttr<GNUInlineAttr>() &&
4001 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
4002 <<
New->getDeclName();
4003 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4007 QualType OldQTypeForComparison = OldQType;
4008 if (
Context.hasAnyFunctionEffects()) {
4010 const auto NewFX =
New->getFunctionEffects();
4011 if (OldFX != NewFX) {
4013 for (
const auto &Diff : Diffs) {
4014 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
4016 diag::warn_mismatched_func_effect_redeclaration)
4017 << Diff.effectName();
4028 if (!MergeErrs.empty())
4035 NewFPT->getParamTypes(), EPI);
4037 New->setType(ModQT);
4038 NewQType =
New->getType();
4043 EPI = OldFPT->getExtProtoInfo();
4045 OldQTypeForComparison =
Context.getFunctionType(
4046 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4048 if (OldFX.empty()) {
4059 NewQType =
Context.getCanonicalType(
New->getType());
4067 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4068 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4070 OldDeclaredReturnType)) {
4075 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4077 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4078 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4079 <<
New <<
New->getReturnTypeSourceRange();
4081 !Old->
hasAttr<OverloadableAttr>() &&
4082 !
New->hasAttr<OverloadableAttr>())
4083 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4085 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4086 <<
New->getReturnTypeSourceRange();
4087 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4097 if (OldReturnType != NewReturnType) {
4101 if (OldAT && OldAT->isDeduced()) {
4102 QualType DT = OldAT->getDeducedType();
4113 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4115 if (OldMethod && NewMethod) {
4122 bool IsClassScopeExplicitSpecialization =
4128 !IsClassScopeExplicitSpecialization) {
4133 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4134 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4145 NewDiag = diag::err_constructor_redeclared;
4147 NewDiag = diag::err_destructor_redeclared;
4149 NewDiag = diag::err_conv_function_redeclared;
4151 NewDiag = diag::err_member_redeclared;
4153 Diag(
New->getLocation(), NewDiag);
4155 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4156 <<
New <<
New->getType();
4158 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4171 diag::err_definition_of_implicitly_declared_member)
4177 diag::err_definition_of_explicitly_defaulted_member)
4200 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4201 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4202 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4211 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4212 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4213 Diag(CDA->getLocation(),
4214 diag::err_carries_dependency_missing_on_first_decl) << 0;
4216 diag::note_carries_dependency_missing_first_decl) << 0;
4224 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4225 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4226 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4241 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4255 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4256 Diag(OldLocation, PrevDiag);
4258 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4259 Diag(OldLocation, PrevDiag);
4266 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4274 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4284 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4312 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4316 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4334 if (
New->hasWrittenPrototype()) {
4346 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4347 if (WithoutProto ==
New)
4348 IsWithoutProtoADef = NewDeclIsDefn;
4350 IsWithProtoADef = NewDeclIsDefn;
4352 diag::warn_non_prototype_changes_behavior)
4353 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4354 << (WithoutProto == Old) << IsWithProtoADef;
4364 !IsWithoutProtoADef)
4370 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4375 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4378 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4379 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4380 OldProto->getParamTypes(),
4381 OldProto->getExtProtoInfo());
4382 New->setType(NewQType);
4383 New->setHasInheritedPrototype();
4387 for (
const auto &ParamType : OldProto->param_types()) {
4390 ParamType,
nullptr,
SC_None,
nullptr);
4391 Param->setScopeInfo(0, Params.size());
4392 Param->setImplicit();
4393 Params.push_back(Param);
4396 New->setParams(Params);
4405 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4432 NewProto->getReturnType());
4433 bool LooseCompatible = !MergedReturn.isNull();
4435 LooseCompatible && Idx != End; ++Idx) {
4439 NewProto->getParamType(Idx))) {
4440 ArgTypes.push_back(NewParm->
getType());
4444 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4445 NewProto->getParamType(Idx) };
4446 Warnings.push_back(Warn);
4447 ArgTypes.push_back(NewParm->
getType());
4449 LooseCompatible =
false;
4452 if (LooseCompatible) {
4453 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4454 Diag(Warnings[Warn].NewParm->getLocation(),
4455 diag::ext_param_promoted_not_compatible_with_prototype)
4456 << Warnings[Warn].PromotedType
4457 << Warnings[Warn].OldParm->getType();
4458 if (Warnings[Warn].OldParm->getLocation().isValid())
4459 Diag(Warnings[Warn].OldParm->getLocation(),
4460 diag::note_previous_declaration);
4463 if (MergeTypeWithOld)
4464 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4481 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4482 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4483 Diag(OldLocation, diag::note_previous_builtin_declaration)
4488 PrevDiag = diag::note_previous_builtin_declaration;
4491 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4492 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4497 Scope *S,
bool MergeTypeWithOld) {
4503 New->setIsPureVirtual();
4512 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4526 if (!Merged.isNull() && MergeTypeWithOld)
4527 New->setType(Merged);
4551 ni != ne && oi != oe; ++ni, ++oi)
4560 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4561 ? diag::err_redefinition_different_type
4562 : diag::err_redeclaration_different_type)
4567 std::tie(PrevDiag, OldLocation)
4569 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4570 New->setInvalidDecl();
4574 bool MergeTypeWithOld) {
4580 if (
New->getType()->isUndeducedType()) {
4602 QualType PrevVDTy = PrevVD->getType();
4606 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4614 MergedT =
New->getType();
4625 else if (
New->getType()->isObjCObjectPointerType() &&
4627 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4642 if ((
New->getType()->isDependentType() ||
4647 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4656 if (MergeTypeWithOld)
4657 New->setType(MergedT);
4691 if (
New->isInvalidDecl())
4704 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4708 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4710 return New->setInvalidDecl();
4712 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4715 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4717 return New->setInvalidDecl();
4721 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4722 <<
New->getDeclName();
4724 New->getLocation());
4725 return New->setInvalidDecl();
4737 return New->setInvalidDecl();
4744 Diag(
New->getLocation(), diag::err_duplicate_member)
4745 <<
New->getIdentifier();
4747 New->setInvalidDecl();
4753 if (
New->hasAttr<WeakImportAttr>())
4756 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4759 New->dropAttr<WeakImportAttr>();
4764 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4765 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4766 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4769 New->dropAttr<InternalLinkageAttr>();
4774 if (MostRecent != Old) {
4777 if (
New->isInvalidDecl())
4782 if (
New->isInvalidDecl())
4787 std::tie(PrevDiag, OldLocation) =
4792 !
New->isStaticDataMember() &&
4795 Diag(
New->getLocation(), diag::ext_static_non_static)
4796 <<
New->getDeclName();
4797 Diag(OldLocation, PrevDiag);
4799 Diag(
New->getLocation(), diag::err_static_non_static)
4800 <<
New->getDeclName();
4801 Diag(OldLocation, PrevDiag);
4802 return New->setInvalidDecl();
4816 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4817 !
New->isStaticDataMember() &&
4819 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4820 Diag(OldLocation, PrevDiag);
4821 return New->setInvalidDecl();
4825 if (
New->hasExternalStorage() &&
4827 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4828 Diag(OldLocation, PrevDiag);
4829 return New->setInvalidDecl();
4832 !
New->hasExternalStorage()) {
4833 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4834 Diag(OldLocation, PrevDiag);
4835 return New->setInvalidDecl();
4845 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4848 !
New->getLexicalDeclContext()->isRecord())) {
4849 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4850 Diag(OldLocation, PrevDiag);
4851 return New->setInvalidDecl();
4859 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4860 Diag(Def->getLocation(), diag::note_previous_definition);
4874 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4875 Diag(OldLocation, PrevDiag);
4876 }
else if (!
New->getTLSKind()) {
4877 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4878 Diag(OldLocation, PrevDiag);
4884 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4886 Diag(OldLocation, PrevDiag);
4896 diag::warn_deprecated_redundant_constexpr_static_def);
4909 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4916 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4917 Diag(OldLocation, PrevDiag);
4918 New->setInvalidDecl();
4927 New->setPreviousDecl(Old);
4937 New->setImplicitlyInline();
4942 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4944 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4945 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4946 auto &HSI =
PP.getHeaderSearchInfo();
4947 StringRef HdrFilename =
4950 auto noteFromModuleOrInclude = [&](
Module *Mod,
4956 if (IncLoc.isValid()) {
4958 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4964 Diag(IncLoc, diag::note_redefinition_include_same_file)
4965 << HdrFilename.str();
4975 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4983 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4999 New->getDescribedVarTemplate() ||
5000 !
New->getTemplateParameterLists().empty() ||
5001 New->getDeclContext()->isDependentContext() ||
5002 New->hasAttr<SelectAnyAttr>())) {
5005 New->demoteThisDefinitionToDeclaration();
5013 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
5015 New->setInvalidDecl();
5041 if (!
Context.getLangOpts().CPlusPlus)
5047 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5050 Context.getManglingNumberContext(Tag->getParent());
5059 Decl *ManglingContextDecl;
5060 std::tie(MCtx, ManglingContextDecl) =
5070struct NonCLikeKind {
5082 explicit operator bool() {
return Kind !=
None; }
5090 return {NonCLikeKind::Invalid, {}};
5097 return {NonCLikeKind::BaseClass,
5109 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5110 if (FD->hasInClassInitializer()) {
5111 auto *
Init = FD->getInClassInitializer();
5112 return {NonCLikeKind::DefaultMemberInit,
5128 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5136 if (MemberRD->isLambda())
5137 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5141 if (MemberRD->isThisDeclarationADefinition()) {
5147 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5164 Context.getCanonicalTagType(TagFromDeclSpec))) {
5166 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5177 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5181 if (NonCLike || ChangesLinkage) {
5182 if (NonCLike.Kind == NonCLikeKind::Invalid)
5185 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5186 if (ChangesLinkage) {
5188 if (NonCLike.Kind == NonCLikeKind::None)
5189 DiagID = diag::err_typedef_changes_linkage;
5191 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5197 TextToInsert +=
' ';
5200 Diag(FixitLoc, DiagID)
5203 if (NonCLike.Kind != NonCLikeKind::None) {
5204 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5205 << NonCLike.Kind - 1 << NonCLike.Range;
5208 << NewTD << isa<TypeAliasDecl>(NewTD);
5233 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5234 if (ED->isScopedUsingClassTag())
5241 llvm_unreachable(
"unexpected type specifier");
5249 bool IsExplicitInstantiation,
5252 Decl *TagD =
nullptr;
5270 Tag = CTD->getTemplatedDecl();
5275 Tag->setFreeStanding();
5276 if (Tag->isInvalidDecl())
5285 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5322 "Friend ellipsis but not friend-specified?");
5325 bool DeclaresAnything =
true;
5329 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5332 Record->getDeclContext()->isRecord()) {
5346 DeclaresAnything =
false;
5365 if ((Tag && Tag->getDeclName()) ||
5375 DeclaresAnything =
false;
5387 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5388 !
Enum->isInvalidDecl())
5389 DeclaresAnything =
false;
5397 DeclaresAnything =
false;
5401 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5403 << Tag->getTagKind()
5416 if (!DeclaresAnything) {
5419 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5420 ? diag::err_no_declarators
5421 : diag::ext_no_declarators)
5434 unsigned DiagID = diag::warn_standalone_specifier;
5436 DiagID = diag::ext_standalone_specifier;
5477 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5478 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5480 DiagnosticId = diag::warn_attribute_ignored;
5481 else if (AL.isRegularKeywordAttribute())
5482 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5484 DiagnosticId = diag::warn_declspec_attribute_ignored;
5485 Diag(AL.getLoc(), DiagnosticId)
5489 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5490 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5513 NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5514 assert(PrevDecl &&
"Expected a non-null Decl");
5527 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5529 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5535 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5545 if (
Record->isAnonymousStructOrUnion())
5550 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5584 for (
auto *D : AnonRecord->
decls()) {
5607 unsigned OldChainingSize = Chaining.size();
5609 Chaining.append(IF->chain_begin(), IF->chain_end());
5611 Chaining.push_back(VD);
5613 assert(Chaining.size() >= 2);
5616 for (
unsigned i = 0; i < Chaining.size(); i++)
5617 NamedChain[i] = Chaining[i];
5621 VD->
getType(), {NamedChain, Chaining.size()});
5635 Chaining.resize(OldChainingSize);
5649 "Parser allowed 'typedef' as storage class VarDecl.");
5650 switch (StorageClassSpec) {
5664 llvm_unreachable(
"unknown storage class specifier");
5668 assert(
Record->hasInClassInitializer());
5670 for (
const auto *I :
Record->decls()) {
5671 const auto *FD = dyn_cast<FieldDecl>(I);
5672 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5673 FD = IFD->getAnonField();
5674 if (FD && FD->hasInClassInitializer())
5675 return FD->getLocation();
5678 llvm_unreachable(
"couldn't find in-class initializer");
5686 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5706 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5708 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5710 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5716 const char *PrevSpec =
nullptr;
5728 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5733 PrevSpec, DiagID, Policy);
5741 diag::err_anonymous_union_with_storage_spec)
5747 PrevSpec, DiagID,
Context.getPrintingPolicy());
5755 <<
Record->isUnion() <<
"const"
5759 diag::ext_anonymous_struct_union_qualified)
5760 <<
Record->isUnion() <<
"volatile"
5764 diag::ext_anonymous_struct_union_qualified)
5765 <<
Record->isUnion() <<
"restrict"
5769 diag::ext_anonymous_struct_union_qualified)
5770 <<
Record->isUnion() <<
"_Atomic"
5774 diag::ext_anonymous_struct_union_qualified)
5775 <<
Record->isUnion() <<
"__unaligned"
5785 for (
auto *Mem :
Record->decls()) {
5787 if (Mem->isInvalidDecl())
5790 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5794 assert(FD->getAccess() !=
AS_none);
5796 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5808 }
else if (Mem->isImplicit()) {
5815 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5816 if (!MemRecord->isAnonymousStructOrUnion() &&
5817 MemRecord->getDeclName()) {
5820 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5824 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5832 Diag(MemRecord->getLocation(),
5833 diag::ext_anonymous_record_with_anonymous_type)
5843 unsigned DK = diag::err_anonymous_record_bad_member;
5845 DK = diag::err_anonymous_record_with_type;
5847 DK = diag::err_anonymous_record_with_function;
5849 DK = diag::err_anonymous_record_with_static;
5853 DK == diag::err_anonymous_record_with_type)
5854 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5857 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5873 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5894 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5898 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5914 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5920 Record->getLocation(),
nullptr,
5936 Record->setAnonymousStructOrUnion(
true);
5947 Chain.push_back(Anon);
5953 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5956 Decl *ManglingContextDecl;
5957 std::tie(MCtx, ManglingContextDecl) =
5976 assert(
Record &&
"expected a record!");
5981 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5989 nullptr, RecTy, TInfo,
6001 Chain.push_back(Anon);
6005 diag::err_field_incomplete_or_sizeless) ||
6010 ParentDecl->setInvalidDecl();
6047 diag::err_deduction_guide_name_not_class_template)
6067 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6077 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6078 Context.getCanonicalType(Ty)));
6089 Context.getCanonicalType(Ty)));
6110 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6122 Context.getCanonicalType(Ty)));
6130 return Context.getNameForTemplate(TName, TNameLoc);
6135 llvm_unreachable(
"Unknown name kind");
6163 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6168 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6176 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6177 (DeclTyName && DeclTyName == DefTyName))
6178 Params.push_back(Idx);
6205#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6206#include "clang/Basic/TransformTypeTraits.def"
6211 if (T.isNull() || !T->isInstantiationDependentType())
break;
6221 if (!TSI)
return true;
6234 if (
Result.isInvalid())
return true;
6279 << D << static_cast<int>(Status);
6290 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6291 llvm::omp::TraitProperty::
6292 implementation_extension_bind_to_declaration))
6317 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6328 bool IsMemberSpecialization) {
6329 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6330 "without nested-name-specifier");
6346 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6347 : diag::err_member_extra_qualification)
6351 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6359 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6361 Diag(Loc, diag::err_member_qualification)
6364 Diag(Loc, diag::err_invalid_declarator_global_scope)
6367 Diag(Loc, diag::err_invalid_declarator_in_function)
6370 Diag(Loc, diag::err_invalid_declarator_in_block)
6374 Diag(Loc, diag::err_export_non_namespace_scope_name)
6381 Diag(Loc, diag::err_invalid_declarator_scope)
6389 Diag(Loc, diag::err_member_qualification)
6416 Diag(Loc, diag::ext_template_after_declarative_nns)
6421 TL = std::exchange(NextTL,
TypeLoc())) {
6423 switch (TL.getTypeLocClass()) {
6424 case TypeLoc::TemplateSpecialization: {
6426 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6427 if (
auto *T = TST.getTypePtr(); T->isDependentType() && T->isTypeAlias())
6428 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6429 << TST.getLocalSourceRange();
6432 case TypeLoc::Decltype:
6433 case TypeLoc::PackIndexing: {
6434 const Type *T = TL.getTypePtr();
6441 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6442 << T->isDecltypeType() << TL.getSourceRange();
6445 case TypeLoc::DependentName:
6452 if (TemplateKeywordLoc.
isValid())
6453 Diag(Loc, diag::ext_template_after_declarative_nns)
6494 diag::err_template_qualified_declarator_no_match)
6501 if (!IsDependentContext &&
6508 diag::err_member_def_undefined_record)
6529 if (EnteringContext && IsDependentContext &&
6530 TemplateParamLists.size() != 0) {
6549 bool IsLinkageLookup =
false;
6550 bool CreateBuiltins =
false;
6563 R->isFunctionType())) {
6564 IsLinkageLookup =
true;
6566 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6567 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6569 CreateBuiltins =
true;
6571 if (IsLinkageLookup) {
6613 bool AllowForCompatibility =
false;
6616 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6617 TemplateParamParent->isDeclScope(TPD);
6620 AllowForCompatibility);
6637 (TemplateParamLists.size() == 0 || R->isFunctionType()))
6650 bool AddToScope =
true;
6652 if (TemplateParamLists.size()) {
6658 }
else if (R->isFunctionType()) {
6674 if (
New->getDeclName() && AddToScope)
6677 if (
OpenMP().isInOpenMPDeclareTargetContext())
6688 bool &SizeIsNegative,
6689 llvm::APSInt &Oversized) {
6694 SizeIsNegative =
false;
6697 if (T->isDependentType())
6703 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6708 if (FixedType.
isNull())
return FixedType;
6709 FixedType = Context.getPointerType(FixedType);
6710 return Qs.
apply(Context, FixedType);
6712 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6713 QualType Inner = PTy->getInnerType();
6717 if (FixedType.
isNull())
return FixedType;
6718 FixedType = Context.getParenType(FixedType);
6719 return Qs.
apply(Context, FixedType);
6729 SizeIsNegative, Oversized);
6739 llvm::APSInt Res =
Result.Val.getInt();
6742 if (Res.isSigned() && Res.isNegative()) {
6743 SizeIsNegative =
true;
6748 unsigned ActiveSizeBits =
6752 : Res.getActiveBits();
6754 Oversized = std::move(Res);
6758 QualType FoldedArrayType = Context.getConstantArrayType(
6760 return Qs.
apply(Context, FoldedArrayType);
6785 TypeLoc DstElemTL = DstATL.getElementLoc();
6804 bool &SizeIsNegative,
6805 llvm::APSInt &Oversized) {
6808 SizeIsNegative, Oversized);
6811 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6819 unsigned FailedFoldDiagID) {
6820 bool SizeIsNegative;
6821 llvm::APSInt Oversized;
6823 TInfo,
Context, SizeIsNegative, Oversized);
6825 Diag(Loc, diag::ext_vla_folded_to_constant);
6832 Diag(Loc, diag::err_typecheck_negative_array_size);
6833 else if (Oversized.getBoolValue())
6835 Oversized, 10, Oversized.isSigned(),
false,
6837 else if (FailedFoldDiagID)
6838 Diag(Loc, FailedFoldDiagID);
6850 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6855 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6864 diag::err_virtual_non_function);
6868 diag::err_explicit_non_function);
6872 diag::err_noreturn_non_function);
6893 ? diag::warn_ms_inline_non_function
6894 : diag::err_inline_non_function)
6898 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6903 diag::err_deduction_guide_invalid_specifier)
6912 if (!NewTD)
return nullptr;
6933 if (T->isVariablyModifiedType()) {
6937 bool SizeIsNegative;
6938 llvm::APSInt Oversized;
6949 else if (T->isVariableArrayType())
6951 else if (Oversized.getBoolValue())
6988 switch (II->getNotableIdentifierID()) {
6989 case tok::NotableIdentifierKind::FILE:
6992 case tok::NotableIdentifierKind::jmp_buf:
6993 Context.setjmp_bufDecl(NewTD);
6995 case tok::NotableIdentifierKind::sigjmp_buf:
6996 Context.setsigjmp_bufDecl(NewTD);
6998 case tok::NotableIdentifierKind::ucontext_t:
6999 Context.setucontext_tDecl(NewTD);
7001 case tok::NotableIdentifierKind::float_t:
7002 case tok::NotableIdentifierKind::double_t:
7003 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7040 if (Context.getLangOpts().CPlusPlus) {
7064 if (!OuterContext->
Equals(PrevOuterContext))
7073 if (!SS.
isSet())
return;
7100 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7109 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7110 if (VD->hasInit()) {
7111 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7112 assert(VD->isThisDeclarationADefinition() &&
7113 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7115 VD->dropAttr<AliasAttr>();
7124 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7127 diag::err_attribute_selectany_non_extern_data);
7134 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7137 diag::warn_attribute_hybrid_patchable_non_extern);
7143 auto *VD = dyn_cast<VarDecl>(&ND);
7144 bool IsAnonymousNS =
false;
7147 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7148 while (NS && !IsAnonymousNS) {
7150 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7157 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7159 (!AnonNSInMicrosoftMode &&
7170 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7171 FD = FD->getMostRecentDecl();
7176 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7182 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7183 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7184 int NoImplicitObjectError = -1;
7186 NoImplicitObjectError = 0;
7187 else if (MD->isStatic())
7188 NoImplicitObjectError = 1;
7189 else if (MD->isExplicitObjectMemberFunction())
7190 NoImplicitObjectError = 2;
7191 if (NoImplicitObjectError != -1) {
7192 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7193 << NoImplicitObjectError << A->getRange();
7195 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7197 }
else if (MD->getReturnType()->isVoidType()) {
7201 err_lifetimebound_implicit_object_parameter_void_return_type);
7206 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7211 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7213 S.
Diag(A->getLocation(),
7214 diag::err_lifetimebound_parameter_void_return_type);
7222 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7223 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7243 bool IsSpecialization,
7244 bool IsDefinition) {
7248 bool IsTemplate =
false;
7249 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7250 OldDecl = OldTD->getTemplatedDecl();
7252 if (!IsSpecialization)
7253 IsDefinition =
false;
7255 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7256 NewDecl = NewTD->getTemplatedDecl();
7260 if (!OldDecl || !NewDecl)
7263 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7264 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7265 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7266 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7270 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7271 (NewExportAttr && !NewExportAttr->isInherited());
7277 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7279 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7281 bool JustWarn =
false;
7283 auto *VD = dyn_cast<VarDecl>(OldDecl);
7284 if (VD && !VD->getDescribedVarTemplate())
7286 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7298 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7299 : diag::err_attribute_dll_redeclaration;
7302 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7315 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7317 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7320 IsStaticDataMember = VD->isStaticDataMember();
7321 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7323 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7324 IsInline = FD->isInlined();
7325 IsQualifiedFriend = FD->getQualifier() &&
7329 if (OldImportAttr && !HasNewAttr &&
7330 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7332 if (IsMicrosoftABI && IsDefinition) {
7333 if (IsSpecialization) {
7336 diag::err_attribute_dllimport_function_specialization_definition);
7337 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7338 NewDecl->
dropAttr<DLLImportAttr>();
7341 diag::warn_redeclaration_without_import_attribute)
7344 NewDecl->
dropAttr<DLLImportAttr>();
7345 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7346 S.
Context, NewImportAttr->getRange()));
7348 }
else if (IsMicrosoftABI && IsSpecialization) {
7349 assert(!IsDefinition);
7353 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7354 << NewDecl << OldImportAttr;
7356 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7357 OldDecl->
dropAttr<DLLImportAttr>();
7358 NewDecl->
dropAttr<DLLImportAttr>();
7360 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7363 OldDecl->
dropAttr<DLLImportAttr>();
7364 NewDecl->
dropAttr<DLLImportAttr>();
7366 diag::warn_dllimport_dropped_from_inline_function)
7367 << NewDecl << OldImportAttr;
7374 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7376 !NewImportAttr && !NewExportAttr) {
7377 if (
const DLLExportAttr *ParentExportAttr =
7378 MD->getParent()->getAttr<DLLExportAttr>()) {
7379 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7380 NewAttr->setInherited(
true);
7432 return D->isExternC();
7449 llvm_unreachable(
"Unexpected context");
7459 llvm_unreachable(
"Unexpected context");
7504 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7505 return FD->isExternC();
7506 if (
const auto *VD = dyn_cast<VarDecl>(D))
7507 return VD->isExternC();
7509 llvm_unreachable(
"Unknown type of decl!");
7520 if (R->isImageType() || R->isPipeType()) {
7522 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7534 if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7536 diag::err_invalid_type_for_program_scope_var)
7546 QualType NR = R.getCanonicalType();
7565 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7574 if (R->isEventT()) {
7582 if (R->isSamplerT()) {
7597 R.isConstQualified())) {
7598 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7608template <
typename AttrTy>
7611 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7612 AttrTy *Clone = Attribute->clone(S.
Context);
7613 Clone->setInherited(
true);
7641 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7643 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7650 "NewD is not a function or variable");
7659 if (IdentName ==
nullptr)
7663 auto &Label = PendingName->second;
7669 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7679 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7698 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7702 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7704 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7714 const auto &TI =
Context.getTargetInfo();
7715 bool HasSizeMismatch;
7717 if (!TI.isValidGCCRegisterName(Label))
7718 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7719 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7721 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7722 else if (HasSizeMismatch)
7723 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7726 if (!
R->isIntegralType(
Context) && !
R->isPointerType()) {
7728 diag::err_asm_unsupported_register_type)
7743 bool IsPlaceholderVariable =
false;
7749 if (!Decomp.bindings().empty()) {
7750 II = Decomp.bindings()[0].Name;
7764 IsPlaceholderVariable =
true;
7772 if (IsPlaceholderVariable)
7786 bool IsLocalExternDecl = SC ==
SC_Extern &&
7805 : diag::warn_deprecated_register)
7828 const AutoType *AT = TL.getTypePtr();
7832 bool IsMemberSpecialization =
false;
7833 bool IsVariableTemplateSpecialization =
false;
7835 bool IsVariableTemplate =
false;
7843 if (R->getContainedDeducedType())
7864 false, IsMemberSpecialization,
Invalid);
7866 if (TemplateParams) {
7873 if (!TemplateParams->
size() &&
7878 diag::err_template_variable_noparams)
7882 TemplateParams =
nullptr;
7890 IsVariableTemplateSpecialization =
true;
7894 IsVariableTemplate =
true;
7902 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7907 "should have a 'template<>' for this decl");
7910 bool IsExplicitSpecialization =
7921 (IsExplicitSpecialization || IsMemberSpecialization)) {
7923 diag::ext_explicit_specialization_storage_class)
7929 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7935 if (Ctxt->isFunctionOrMethod()) {
7936 FunctionOrMethod = Ctxt;
7939 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7941 AnonStruct = ParentDecl;
7945 if (FunctionOrMethod) {
7949 diag::err_static_data_member_not_allowed_in_local_class)
7950 << Name << RD->getDeclName() << RD->getTagKind();
7951 }
else if (AnonStruct) {
7956 diag::err_static_data_member_not_allowed_in_anon_struct)
7959 }
else if (RD->isUnion()) {
7963 diag_compat::static_data_member_in_union)
7981 diag::err_static_out_of_line)
7994 diag::err_storage_class_for_static_member)
7999 llvm_unreachable(
"C storage class in c++!");
8003 if (IsVariableTemplateSpecialization) {
8005 TemplateParamLists.size() > 0
8006 ? TemplateParamLists[0]->getTemplateLoc()
8009 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8024 if (IsVariableTemplate) {
8027 TemplateParams, NewVD);
8033 if (R->getContainedDeducedType())
8048 unsigned VDTemplateParamLists =
8049 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8050 if (TemplateParamLists.size() > VDTemplateParamLists)
8052 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8059 }
else if (
CurContext->isFunctionOrMethod()) {
8062 diag::err_inline_declaration_block_scope) << Name
8067 : diag::compat_pre_cxx17_inline_variable);
8078 if (IsLocalExternDecl) {
8081 B->setLocalExternDecl();
8086 bool EmitTLSUnsupportedError =
false;
8099 diag::err_thread_non_global)
8101 else if (!
Context.getTargetInfo().isTLSSupported()) {
8106 EmitTLSUnsupportedError =
true;
8113 diag::err_thread_unsupported);
8124 diag::err_constexpr_wrong_decl_kind)
8125 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8135 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8142 diag::err_constinit_local_variable);
8146 ConstInitAttr::Keyword_constinit));
8164 diag::warn_static_local_in_extern_inline);
8170 if (IsVariableTemplateSpecialization)
8175 else if (IsMemberSpecialization)
8190 B->setModulePrivate();
8200 diag::err_opencl_unknown_type_specifier)
8210 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8211 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8229 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8256 if (R->isFunctionPointerType())
8261 if (EmitTLSUnsupportedError &&
8264 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8266 diag::err_thread_unsupported);
8268 if (EmitTLSUnsupportedError &&
8275 (NewVD->
hasAttr<CUDASharedAttr>() ||
8276 NewVD->
hasAttr<CUDAConstantAttr>())) {
8284 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8285 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8290 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8297 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8309 IsMemberSpecialization ||
8310 IsVariableTemplateSpecialization);
8324 if (IsMemberSpecialization && !IsVariableTemplate &&
8325 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8342 !IsVariableTemplateSpecialization) {
8350 if (!IsPlaceholderVariable)
8381 if (PrevVarTemplate &&
8402 Decl *ManglingContextDecl;
8403 std::tie(MCtx, ManglingContextDecl) =
8495 return !Diags.
isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8507 NamedDecl *ShadowedDecl = R.getFoundDecl();
8521 NamedDecl *ShadowedDecl = R.getFoundDecl();
8530 NamedDecl *ShadowedDecl = R.getFoundDecl();
8539 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8540 if (
const auto *MD =
8544 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8550 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8553 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8558 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8559 if (shadowedVar->isExternC()) {
8562 for (
auto *I : shadowedVar->redecls())
8563 if (I->isFileVarDecl()) {
8571 unsigned WarningDiag = diag::warn_decl_shadow;
8574 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8580 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8586 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8592 ->ShadowingDecls.push_back({D, VD});
8603 ->ShadowingDecls.push_back({D, ShadowedDecl});
8609 bool HasLocalStorage =
false;
8610 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8611 HasLocalStorage = VD->hasLocalStorage();
8612 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8616 if (HasLocalStorage) {
8621 ParentDC && !ParentDC->
Equals(OldDC);
8662 Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8664 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8671 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8677 Diag(Shadow.VD->getLocation(),
8678 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8679 : diag::warn_decl_shadow)
8680 << Shadow.VD->getDeclName()
8683 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8684 << Shadow.VD->getDeclName() << 0;
8687 Diag(Shadow.VD->getLocation(),
8689 : diag::warn_decl_shadow_uncaptured_local)
8690 << Shadow.VD->getDeclName()
8716 auto *DRE = dyn_cast<DeclRefExpr>(E);
8720 auto I = ShadowingDecls.find(D);
8721 if (I == ShadowingDecls.end())
8723 const NamedDecl *ShadowedDecl = I->second;
8725 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8730 ShadowingDecls.erase(I);
8738 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8797 assert(Prev &&
"should have found a previous declaration to diagnose");
8799 Prev = FD->getFirstDecl();
8803 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8825 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8837 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8857 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8867 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8875 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8891 if (T->isUndeducedType())
8897 if (T->isObjCObjectType()) {
8900 T =
Context.getObjCObjectPointerType(T);
8931 if (NewVD->
hasAttr<BlocksAttr>()) {
8936 if (T->isBlockPointerType()) {
8939 if (!T.isConstQualified()) {
8940 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8946 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8955 if (!T->isSamplerT() && !T->isDependentType() &&
8962 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8963 <<
Scope <<
"global or constant";
8965 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8966 <<
Scope <<
"constant";
8980 bool AllowFunctionScopeLocalVariables =
8983 "__cl_clang_function_scope_local_variables",
getLangOpts());
8984 if (AllowFunctionScopeLocalVariables) {
8991 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9003 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9028 && !NewVD->
hasAttr<BlocksAttr>()) {
9039 if (T->isWebAssemblyTableType()) {
9050 const auto *ATy = dyn_cast<ConstantArrayType>(T.getTypePtr());
9051 if (!ATy || ATy->getZExtSize() != 0) {
9053 diag::err_typecheck_wasm_table_must_have_zero_length);
9063 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9066 ArrayT && ArrayT->isZeroSize()) {
9072 bool isVM = T->isVariablyModifiedType();
9073 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9079 bool SizeIsNegative;
9080 llvm::APSInt Oversized;
9085 FixedT = FixedTInfo->
getType();
9086 else if (FixedTInfo) {
9092 if ((!FixedTInfo || FixedT.
isNull()) && T->isVariableArrayType()) {
9125 if (T->isVoidType()) {
9137 !T.isWebAssemblyReferenceType() && !T->isHLSLSpecificType()) {
9143 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9156 !T->isDependentType() &&
9158 diag::err_constexpr_var_non_literal)) {
9164 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9174 llvm::StringMap<bool> CallerFeatureMap;
9175 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9177 CallerFeatureMap)) {
9185 llvm::StringMap<bool> CallerFeatureMap;
9186 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9191 if (T.hasAddressSpace() &&
9225 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9230 Name =
Context.DeclarationNames.getCXXDestructorName(
9231 Context.getCanonicalTagType(BaseRecord));
9236 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9243 if (Overridden.insert(BaseMD).second) {
9263 return !Overridden.empty();
9269 struct ActOnFDArgs {
9283 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9284 CXXRecordDecl *Parent)
9285 : Context(Context), OriginalFD(TypoFD),
9288 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9292 SmallVector<unsigned, 1> MismatchedParams;
9294 CDeclEnd = candidate.
end();
9295 CDecl != CDeclEnd; ++CDecl) {
9296 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9300 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9301 CXXRecordDecl *Parent = MD->getParent();
9304 }
else if (!ExpectedParent) {
9313 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9314 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9318 ASTContext &Context;
9319 FunctionDecl *OriginalFD;
9320 CXXRecordDecl *ExpectedParent;
9340 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9348 IsLocalFriend ? diag::err_no_matching_local_friend :
9350 diag::err_member_decl_does_not_match;
9362 "Cannot have an ambiguity in previous-declaration lookup");
9364 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9366 if (!Prev.
empty()) {
9375 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9376 NearMatches.push_back(std::make_pair(FD, ParamNum));
9384 IsLocalFriend ?
nullptr : NewDC))) {
9391 CDeclEnd = Correction.
end();
9392 CDecl != CDeclEnd; ++CDecl) {
9412 ExtraArgs.S, ExtraArgs.D,
9415 ExtraArgs.AddToScope);
9423 Decl *Canonical =
Result->getCanonicalDecl();
9426 if ((*I)->getCanonicalDecl() == Canonical)
9433 SemaRef.
PDiag(IsLocalFriend
9434 ? diag::err_no_matching_local_friend_suggest
9435 : diag::err_member_decl_does_not_match_suggest)
9436 << Name << NewDC << IsDefinition);
9449 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9452 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9458 bool NewFDisConst = NewMD && NewMD->
isConst();
9461 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9462 NearMatch != NearMatchEnd; ++NearMatch) {
9465 bool FDisConst = MD && MD->
isConst();
9466 bool IsMember = MD || !IsLocalFriend;
9469 if (
unsigned Idx = NearMatch->second) {
9473 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9474 : diag::note_local_decl_close_param_match)
9477 }
else if (FDisConst != NewFDisConst) {
9479 diag::note_member_def_close_const_match)
9484 else if (FTI.hasMethodTypeQualifiers() &&
9485 FTI.getConstQualifierLoc().isValid())
9489 IsMember ? diag::note_member_def_close_match
9490 : diag::note_local_decl_close_match);
9498 default: llvm_unreachable(
"Unknown storage class!");
9503 diag::err_typecheck_sclass_func);
9520 diag::err_static_block_func);
9536 bool &IsVirtualOkay) {
9550 diag::err_c23_constexpr_not_variable);
9553 diag::err_constexpr_wrong_decl_kind)
9554 <<
static_cast<int>(ConstexprKind);
9575 (!R->getAsAdjusted<
FunctionType>() && R->isFunctionProtoType());
9578 "Strict prototypes are required");
9599 "Constructors can only be declared in a member context");
9605 isInline,
false, ConstexprKind,
9616 false, ConstexprKind,
9617 TrailingRequiresClause);
9620 if (
Record->isBeingDefined())
9629 IsVirtualOkay =
true;
9641 true, ConstexprKind, TrailingRequiresClause);
9647 diag::err_conv_function_not_member);
9655 IsVirtualOkay =
true;
9660 TrailingRequiresClause);
9687 IsVirtualOkay = !Ret->isStatic();
9701 true , ConstexprKind, TrailingRequiresClause);
9718 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9726 if (Names.end() !=
Match)
9731 }
while (DesugaredTy != Ty);
9770 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9772 bool IsStandardLayoutType =
true;
9778 if (!CXXRec->hasDefinition())
9779 CXXRec = CXXRec->getTemplateInstantiationPattern();
9780 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9781 IsStandardLayoutType =
false;
9784 !IsStandardLayoutType)
9832 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9846 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9859 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9868 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9885 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9893 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9894 PT = Typedef->desugar();
9916 HistoryStack.push_back(
nullptr);
9921 VisitStack.push_back(PD);
9922 assert(VisitStack.back() &&
"First decl null?");
9925 const Decl *
Next = VisitStack.pop_back_val();
9927 assert(!HistoryStack.empty());
9929 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9930 ValidTypes.insert(Hist->getType().getTypePtr());
9939 HistoryStack.push_back(Field);
9941 QualType FieldTy = Field->getType();
9945 "Unexpected type.");
9954 VisitStack.push_back(
nullptr);
9956 for (
const auto *FD : RD->
fields()) {
9967 VisitStack.push_back(FD);
9978 S.
Diag(Param->getLocation(),
9979 diag::err_record_with_pointers_kernel_param)
9983 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9986 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
9987 << PD->getDeclName();
9992 I = HistoryStack.begin() + 1,
9993 E = HistoryStack.end();
10006 }
while (!VisitStack.empty());
10023 (LangOpts.CPlusPlus &&
10033 unsigned BuiltinID) {
10034 switch (BuiltinID) {
10035 case Builtin::BI__GetExceptionInfo:
10039 case Builtin::BIaddressof:
10040 case Builtin::BI__addressof:
10041 case Builtin::BIforward:
10042 case Builtin::BIforward_like:
10043 case Builtin::BImove:
10044 case Builtin::BImove_if_noexcept:
10045 case Builtin::BIas_const: {
10050 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10062 bool &AddToScope) {
10065 assert(R->isFunctionType());
10070 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10072 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10073 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10074 TemplateParamLists.back() = Invented;
10076 TemplateParamLists.push_back(Invented);
10086 diag::err_invalid_thread)
10094 bool isFriend =
false;
10096 bool isMemberSpecialization =
false;
10097 bool isFunctionTemplateSpecialization =
false;
10099 bool HasExplicitTemplateArgs =
false;
10102 bool isVirtualOkay =
false;
10109 if (!NewFD)
return nullptr;
10119 if (IsLocalExternDecl)
10129 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10157 if (isVirtual && Parent->isUnion()) {
10161 if ((Parent->isClass() || Parent->isStruct()) &&
10162 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10165 if (
auto *Def = Parent->getDefinition())
10166 Def->setInitMethod(
true);
10171 isMemberSpecialization =
false;
10172 isFunctionTemplateSpecialization =
false;
10187 isMemberSpecialization,
Invalid);
10188 if (TemplateParams) {
10193 if (TemplateParams->
size() > 0) {
10201 }
else if (TemplateId) {
10218 Name, TemplateParams,
10224 if (TemplateParamLists.size() > 1) {
10231 isFunctionTemplateSpecialization =
true;
10233 if (TemplateParamLists.size() > 0)
10253 << Name << RemoveRange
10259 HasExplicitTemplateArgs =
true;
10266 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10272 if (TemplateParamLists.size() > 0)
10277 if (isFriend && TemplateId)
10278 isFunctionTemplateSpecialization =
true;
10284 if (isFunctionTemplateSpecialization && TemplateId) {
10285 HasExplicitTemplateArgs =
true;
10316 if (!isVirtualOkay) {
10318 diag::err_virtual_non_function);
10322 diag::err_virtual_out_of_class)
10328 diag::err_virtual_member_function_template)
10347 diag::err_inline_declaration_block_scope) << Name
10361 diag::err_explicit_out_of_class)
10368 diag::err_explicit_non_ctor_or_conv_function)
10386 <<
static_cast<int>(ConstexprKind);
10397 diag::err_invalid_consteval_decl_kind)
10405 if (isFunctionTemplateSpecialization) {
10408 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10454 if (!isFriend && SC !=
SC_None) {
10462 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10464 diag::ext_explicit_specialization_storage_class)
10471 "Out-of-line member function should be a CXXMethodDecl");
10488 ? diag::ext_static_out_of_line
10489 : diag::err_static_out_of_line)
10514 PendingInlineFuncDecls.insert(NewFD);
10521 isMemberSpecialization ||
10522 isFunctionTemplateSpecialization);
10533 llvm::MapVector<IdentifierInfo *, AsmLabelAttr *>::iterator I =
10560 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10562 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10563 Param->setDeclContext(NewFD);
10564 Params.push_back(Param);
10566 if (Param->isInvalidDecl())
10579 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10584 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10589 DeclContext *TagDC = TD->getLexicalDeclContext();
10593 TD->setDeclContext(NewFD);
10601 if (TagDC != PrototypeTagContext)
10602 TD->setLexicalDeclContext(TagDC);
10616 for (
const auto &AI : FT->param_types()) {
10619 Param->setScopeInfo(0, Params.size());
10620 Params.push_back(Param);
10623 assert(R->isFunctionNoProtoType() && NewFD->
getNumParams() == 0 &&
10624 "Should not need args for typedef of non-prototype fn");
10628 NewFD->setParams(Params);
10653 !NewFD->
hasAttr<SectionAttr>())
10654 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10660 !NewFD->
hasAttr<SectionAttr>()) {
10661 NewFD->
addAttr(SectionAttr::CreateImplicit(
10663 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10674 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10675 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10680 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10689 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10690 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10691 !NewTVA->isDefaultVersion() &&
10692 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10694 AddToScope =
false;
10706 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10721 isMemberSpecialization,
10728 "previous declaration set still overloaded");
10740 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10763 diag::ext_operator_new_delete_declared_inline)
10790 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10802 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10810 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10814 Diag(TRC->getBeginLoc(),
10815 diag::err_constrained_non_templated_function);
10832 if (isFunctionTemplateSpecialization) {
10833 bool isDependentSpecialization =
false;
10838 isDependentSpecialization =
10840 (HasExplicitTemplateArgs &&
10841 TemplateSpecializationType::
10842 anyInstantiationDependentTemplateArguments(
10844 assert((!isDependentSpecialization ||
10845 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10846 "dependent friend function specialization without template "
10852 isDependentSpecialization =
10857 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10858 if (isDependentSpecialization) {
10865 NewFD, ExplicitTemplateArgs,
Previous))
10886 isMemberSpecialization,
10895 "previous declaration set still overloaded");
10936 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10982 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10983 AddToScope = ExtraArgs.AddToScope;
10992 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10993 AddToScope = ExtraArgs.AddToScope;
10999 !isFriend && !isFunctionTemplateSpecialization &&
11000 !isMemberSpecialization) {
11018 if (NewFD->
hasAttr<HLSLShaderAttr>())
11026 if (
unsigned BuiltinID = II->getBuiltinID()) {
11027 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11028 if (!InStdNamespace &&
11033 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11034 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11041 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11043 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11048 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11060 if (NewFD->
hasAttr<OverloadableAttr>() &&
11063 diag::err_attribute_overloadable_no_prototype)
11065 NewFD->
dropAttr<OverloadableAttr>();
11098 isMemberSpecialization ||
11099 isFunctionTemplateSpecialization,
11110 Context.setcudaConfigureCallDecl(NewFD);
11112 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11118 Context.setcudaGetParameterBufferDecl(NewFD);
11120 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11126 Context.setcudaLaunchDeviceDecl(NewFD);
11177 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11197 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11199 QualType ElemTy = PipeTy->getElementType();
11201 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11207 if (
Context.getTargetInfo().getTriple().isWasm()) {
11209 Diag(Param->getTypeSpecStartLoc(),
11210 diag::err_wasm_table_as_function_parameter);
11218 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11219 if (NewFD->
hasAttr<ConstructorAttr>()) {
11220 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11222 NewFD->
dropAttr<AvailabilityAttr>();
11224 if (NewFD->
hasAttr<DestructorAttr>()) {
11225 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11227 NewFD->
dropAttr<AvailabilityAttr>();
11238 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11242 Diag(NBA->getLocation(),
11243 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11244 << NBA->getSpelling();
11247 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11248 << NBA->getSpelling();
11257 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11281 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11285 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11296 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11297 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11307 bool IsDefinition) {
11310 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11312 return SectionAttr::CreateImplicit(
11314 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11362 auto *VD = dyn_cast<ValueDecl>(D);
11363 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11364 return !VD || !PrevVD ||
11366 PrevVD->getType());
11374 const auto *TA = FD->
getAttr<TargetAttr>();
11375 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11377 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11390 for (
const auto &Feat : ParseInfo.
Features) {
11391 auto BareFeat = StringRef{Feat}.substr(1);
11392 if (Feat[0] ==
'-') {
11394 <<
Feature << (
"no-" + BareFeat).str();
11414 for (
auto &Feat : ParseInfo.
Features)
11415 Feats.push_back(StringRef{Feat}.substr(1));
11418 TVA->getFeatures(Feats);
11420 for (
const auto &Feat : Feats) {
11440 case attr::ArmLocallyStreaming:
11445 case attr::NonNull:
11446 case attr::NoThrow:
11455 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11456 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11457 <<
static_cast<unsigned>(MVKind) << A;
11459 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11464 switch (A->getKind()) {
11465 case attr::CPUDispatch:
11466 case attr::CPUSpecific:
11469 return Diagnose(S, A);
11473 return Diagnose(S, A);
11475 case attr::TargetVersion:
11478 return Diagnose(S, A);
11480 case attr::TargetClones:
11483 return Diagnose(S, A);
11487 return Diagnose(S, A);
11500 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11501 enum DoesntSupport {
11508 DefaultedFuncs = 6,
11509 ConstexprFuncs = 7,
11510 ConstevalFuncs = 8,
11522 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11525 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11533 if (!TemplatesSupported &&
11535 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11538 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11539 if (NewCXXFD->isVirtual())
11540 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11544 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11548 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11553 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11557 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11561 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11562 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11566 QualType NewReturnType = NewType->getReturnType();
11569 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11582 bool ArmStreamingCCMismatched =
false;
11583 if (OldFPT && NewFPT) {
11590 ArmStreamingCCMismatched =
true;
11593 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11596 QualType OldReturnType = OldType->getReturnType();
11598 if (OldReturnType != NewReturnType)
11599 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11602 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11605 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11608 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11631 bool IsCPUSpecificCPUDispatchMVKind =
11635 if (CausesMV && OldFD &&
11643 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11650 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11652 S.
PDiag(diag::note_multiversioning_caused_here)),
11654 S.
PDiag(diag::err_multiversion_doesnt_support)
11655 <<
static_cast<unsigned>(MVKind)),
11657 S.
PDiag(diag::err_multiversion_diff)),
11659 !IsCPUSpecificCPUDispatchMVKind,
11672 "Function lacks multiversion attribute");
11673 const auto *TA = FD->
getAttr<TargetAttr>();
11674 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11677 if (TA && !TA->isDefaultVersion())
11714 To->
addAttr(TargetVersionAttr::CreateImplicit(
11725 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11726 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11727 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11728 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11730 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11739 if (NewTA && !NewTA->isDefaultVersion() &&
11740 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11757 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11758 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11767 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11775 OldTA->getFeaturesStr());
11779 NewTA->getFeaturesStr());
11782 if (OldParsed == NewParsed) {
11790 for (
const auto *FD : OldFD->
redecls()) {
11791 const auto *CurTA = FD->
getAttr<TargetAttr>();
11792 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11796 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11797 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11799 << (NewTA ? 0 : 2);
11800 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11847 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11863 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11864 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11871 NewTA->getFeaturesStr());
11876 NewTVA->getFeatures(NewFeats);
11877 llvm::sort(NewFeats);
11880 bool UseMemberUsingDeclRules =
11883 bool MayNeedOverloadableChecks =
11892 if (MayNeedOverloadableChecks &&
11893 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11896 switch (NewMVKind) {
11899 "Only target_clones can be omitted in subsequent declarations");
11902 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11903 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11912 CurTA->getFeaturesStr());
11914 if (CurParsed == NewParsed) {
11923 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11924 if (CurTVA->getName() == NewTVA->getName()) {
11931 CurTVA->getFeatures(CurFeats);
11932 llvm::sort(CurFeats);
11934 if (CurFeats == NewFeats) {
11940 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11942 if (NewFeats.empty())
11945 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11947 CurClones->getFeatures(CurFeats, I);
11948 llvm::sort(CurFeats);
11950 if (CurFeats == NewFeats) {
11961 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11962 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11963 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11964 !std::equal(CurClones->featuresStrs_begin(),
11965 CurClones->featuresStrs_end(),
11966 NewClones->featuresStrs_begin())) {
11972 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11974 CurTVA->getFeatures(CurFeats);
11975 llvm::sort(CurFeats);
11978 if (CurFeats.empty())
11981 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11983 NewClones->getFeatures(NewFeats, I);
11984 llvm::sort(NewFeats);
11986 if (CurFeats == NewFeats) {
12002 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
12003 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12008 CurFD->
hasAttr<CPUDispatchAttr>()) {
12009 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12011 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12012 NewCPUDisp->cpus_begin(),
12014 return Cur->getName() == New->getName();
12029 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12031 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12032 NewCPUSpec->cpus_begin(),
12034 return Cur->getName() == New->getName();
12045 if (CurII == NewII) {
12115 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12116 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12117 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12118 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12119 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12129 NewTVA->isDefaultVersion())) {
12130 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12138 if (NewTA && TI.
getTriple().isAArch64())
12165 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12178 if (OldFD->
isUsed(
false)) {
12180 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12202 bool IsPure = NewFD->
hasAttr<PureAttr>();
12203 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12206 if (!IsPure && !IsConst)
12213 if (IsPure && IsConst) {
12223 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12229 bool IsMemberSpecialization,
12232 "Variably modified return types are not handled here");
12237 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12242 bool MayNeedOverloadableChecks =
false;
12254 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12256 OldDecl = Candidate;
12259 MayNeedOverloadableChecks =
true;
12284 OldDecl =
Previous.getFoundDecl();
12285 MergeTypeWithPrevious =
false;
12288 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12289 NewFD->
hasAttr<OverloadableAttr>()) {
12291 MayNeedOverloadableChecks =
true;
12303 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12354 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12355 if (!OldMD || !OldMD->
isStatic()) {
12390 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12391 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12394 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12403 NewFD->
setAccess(OldTemplateDecl->getAccess());
12404 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12409 if (IsMemberSpecialization &&
12412 assert(OldTemplateDecl->isMemberSpecialization());
12415 if (OldFD->isDeleted()) {
12417 assert(OldFD->getCanonicalDecl() == OldFD);
12419 OldFD->setDeletedAsWritten(
false);
12433 !NewFD->
getAttr<OverloadableAttr>()) {
12437 return ND->hasAttr<OverloadableAttr>();
12439 "Non-redecls shouldn't happen without overloadable present");
12442 const auto *FD = dyn_cast<FunctionDecl>(ND);
12443 return FD && !FD->
hasAttr<OverloadableAttr>();
12446 if (OtherUnmarkedIter !=
Previous.end()) {
12448 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12449 Diag((*OtherUnmarkedIter)->getLocation(),
12450 diag::note_attribute_overloadable_prev_overload)
12460 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12463 if (NewFD->
hasAttr<SYCLExternalAttr>())
12473 dyn_cast<CXXDestructorDecl>(NewFD)) {
12481 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12486 Context.DeclarationNames.getCXXDestructorName(ClassType);
12493 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12494 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12500 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12506 if (!
Method->isFunctionTemplateSpecialization() &&
12507 !
Method->getDescribedFunctionTemplate() &&
12508 Method->isCanonicalDecl()) {
12515 diag::err_constrained_virtual_method);
12550 if (R->isIncompleteType() && !R->isVoidType())
12553 else if (!R.isPODType(
Context) && !R->isVoidType() &&
12554 !R->isObjCObjectPointerType())
12555 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12568 auto HasNoexcept = [&](
QualType T) ->
bool {
12573 T = RT->getPointeeType();
12574 else if (T->isAnyPointerType())
12575 T = T->getPointeeType();
12577 T = MPT->getPointeeType();
12579 if (FPT->isNothrow())
12585 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12586 for (
QualType T : FPT->param_types())
12587 AnyNoexcept |= HasNoexcept(T);
12590 diag::warn_cxx17_compat_exception_spec_in_signature)
12595 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12597 if (!Parm->getType()->isDependentType() &&
12598 Parm->hasAttr<CUDAGridConstantAttr>() &&
12599 !(IsKernel && Parm->getType().isConstQualified()))
12600 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12601 diag::err_cuda_grid_constant_not_allowed);
12607 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12617 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12628 ? diag::err_static_main : diag::warn_static_main)
12636 Diag(NoreturnLoc, diag::ext_noreturn_main);
12637 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12649 << FD->
hasAttr<DeviceKernelAttr>();
12654 if (FD->
hasAttr<SYCLExternalAttr>()) {
12656 << FD->
getAttr<SYCLExternalAttr>();
12667 assert(T->isFunctionType() &&
"function decl is not of function type");
12689 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12714 Diag(start, diag::warn_main_in_named_module)
12726 bool HasExtraParameters = (nparams > 3);
12737 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12738 HasExtraParameters =
false;
12740 if (HasExtraParameters) {
12753 for (
unsigned i = 0; i < nparams; ++i) {
12756 bool mismatch =
true;
12773 mismatch = !qs.
empty();
12802 if (T.isOSCygMing())
12807 if (T.isOSWindows() && T.getArch() == llvm::Triple::x86)
12815 assert(T->isFunctionType() &&
"function decl is not of function type");
12824 if (FD->
getName() !=
"DllMain")
12831 FT =
Context.adjustFunctionType(
12836 FT =
Context.adjustFunctionType(FT,
12858 if (
Init->isValueDependent()) {
12859 assert(
Init->containsErrors() &&
12860 "Dependent code should only occur in error-recovery path.");
12863 const Expr *Culprit;
12864 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12872 if (
auto ALE = dyn_cast<ObjCArrayLiteral>(
Init)) {
12873 for (
auto *Elm : ALE->elements()) {
12874 if (!Elm->isConstantInitializer(
Context)) {
12875 Diag(Elm->getExprLoc(),
12876 diag::err_objc_literal_nonconstant_at_file_scope)
12883 if (
auto DLE = dyn_cast<ObjCDictionaryLiteral>(
Init)) {
12884 for (
size_t I = 0, N = DLE->getNumElements(); I != N; ++I) {
12891 diag::err_objc_literal_nonconstant_at_file_scope)
12898 diag::err_objc_literal_nonconstant_at_file_scope)
12906 diag::err_objc_literal_nonconstant_at_file_scope)
12918 class SelfReferenceChecker
12924 bool isReferenceType;
12925 bool isInCXXOperatorCall;
12933 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12934 S(S), OrigDecl(OrigDecl) {
12937 isReferenceType =
false;
12938 isInCXXOperatorCall =
false;
12939 isInitList =
false;
12940 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12941 isPODType = VD->getType().isPODType(S.
Context);
12943 isReferenceType = VD->getType()->isReferenceType();
12950 void CheckExpr(Expr *E) {
12951 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12959 InitFieldIndex.push_back(0);
12960 for (
auto *Child : InitList->
children()) {
12962 ++InitFieldIndex.back();
12964 InitFieldIndex.pop_back();
12969 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12970 llvm::SmallVector<FieldDecl*, 4> Fields;
12972 bool ReferenceField =
false;
12975 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12976 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12979 Fields.push_back(FD);
12981 ReferenceField =
true;
12982 Base = ME->getBase()->IgnoreParenImpCasts();
12986 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12987 if (!DRE || DRE->
getDecl() != OrigDecl)
12991 if (CheckReference && !ReferenceField)
12995 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12996 for (
const FieldDecl *I : llvm::reverse(Fields))
12997 UsedFieldIndex.push_back(I->getFieldIndex());
13002 for (
auto UsedIter = UsedFieldIndex.begin(),
13003 UsedEnd = UsedFieldIndex.end(),
13004 OrigIter = InitFieldIndex.begin(),
13005 OrigEnd = InitFieldIndex.end();
13006 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
13007 if (*UsedIter < *OrigIter)
13009 if (*UsedIter > *OrigIter)
13014 HandleDeclRefExpr(DRE);
13021 void HandleValue(Expr *E) {
13023 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
13024 HandleDeclRefExpr(DRE);
13028 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
13029 Visit(CO->getCond());
13030 HandleValue(CO->getTrueExpr());
13031 HandleValue(CO->getFalseExpr());
13035 if (BinaryConditionalOperator *BCO =
13036 dyn_cast<BinaryConditionalOperator>(E)) {
13037 Visit(BCO->getCond());
13038 HandleValue(BCO->getFalseExpr());
13042 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
13043 if (Expr *SE = OVE->getSourceExpr())
13048 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
13049 if (BO->getOpcode() == BO_Comma) {
13050 Visit(BO->getLHS());
13051 HandleValue(BO->getRHS());
13064 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13068 Base = ME->getBase()->IgnoreParenImpCasts();
13070 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13071 HandleDeclRefExpr(DRE);
13080 void VisitDeclRefExpr(DeclRefExpr *E) {
13081 if (isReferenceType)
13082 HandleDeclRefExpr(E);
13085 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13091 Inherited::VisitImplicitCastExpr(E);
13094 void VisitMemberExpr(MemberExpr *E) {
13096 if (CheckInitListMemberExpr(E,
true ))
13105 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13106 bool Warn = (MD && !MD->
isStatic());
13108 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13111 Base = ME->getBase()->IgnoreParenImpCasts();
13114 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13116 HandleDeclRefExpr(DRE);
13125 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13126 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13130 return Inherited::VisitCXXOperatorCallExpr(E);
13134 HandleValue(Arg->IgnoreParenImpCasts());
13138 if (!isInCXXOperatorCall) {
13139 Inherited::VisitLambdaExpr(E);
13144 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13145 HandleDeclRefExpr(DRE);
13150 void VisitUnaryOperator(UnaryOperator *E) {
13164 Inherited::VisitUnaryOperator(E);
13167 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13169 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13171 Expr *ArgExpr = E->
getArg(0);
13172 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13173 if (ILE->getNumInits() == 1)
13174 ArgExpr = ILE->getInit(0);
13175 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13176 if (ICE->getCastKind() == CK_NoOp)
13177 ArgExpr = ICE->getSubExpr();
13178 HandleValue(ArgExpr);
13181 Inherited::VisitCXXConstructExpr(E);
13184 void VisitCallExpr(CallExpr *E) {
13187 HandleValue(E->
getArg(0));
13191 Inherited::VisitCallExpr(E);
13194 void VisitBinaryOperator(BinaryOperator *E) {
13196 HandleValue(E->
getLHS());
13201 Inherited::VisitBinaryOperator(E);
13207 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13212 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13214 if (OrigDecl != ReferenceDecl)
return;
13216 if (isReferenceType) {
13217 diag = diag::warn_uninit_self_reference_in_reference_init;
13219 diag = diag::warn_static_self_reference_in_init;
13223 diag = diag::warn_uninit_self_reference_in_init;
13237 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13247 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13248 VD && VD->isConstexpr() && VD->isFileVarDecl())
13256 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13257 if (ICE->getCastKind() == CK_LValueToRValue)
13258 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13259 if (DRE->
getDecl() == OrigDecl)
13262 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13269 struct VarDeclOrName {
13271 DeclarationName Name;
13273 friend const Sema::SemaDiagnosticBuilder &
13274 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13275 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13285 bool IsInitCapture = !VDecl;
13287 "init captures are expected to be deduced prior to initialization");
13289 VarDeclOrName VN{VDecl, Name};
13292 assert(
Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13296 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13297 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13298 << (int)
Deduced->getContainedAutoType()->getKeyword()
13305 assert(VDecl &&
"no init for init capture deduction?");
13320 DeduceInits =
Init;
13322 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13324 DeduceInits = PL->exprs();
13327 assert(VDecl &&
"non-auto type for init capture deduction?");
13338 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13339 DeduceInits = IL->inits();
13343 if (DeduceInits.empty()) {
13346 Diag(
Init->getBeginLoc(), IsInitCapture
13347 ? diag::err_init_capture_no_expression
13348 : diag::err_auto_var_init_no_expression)
13349 << VN <<
Type << Range;
13353 if (DeduceInits.size() > 1) {
13354 Diag(DeduceInits[1]->getBeginLoc(),
13355 IsInitCapture ? diag::err_init_capture_multiple_expressions
13356 : diag::err_auto_var_init_multiple_expressions)
13357 << VN <<
Type << Range;
13361 Expr *DeduceInit = DeduceInits[0];
13363 Diag(
Init->getBeginLoc(), IsInitCapture
13364 ? diag::err_init_capture_paren_braces
13365 : diag::err_auto_var_init_paren_braces)
13371 bool DefaultedAnyToId =
false;
13373 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13375 if (
Result.isInvalid()) {
13379 DefaultedAnyToId =
true;
13389 Type.getQualifiers());
13397 if (!IsInitCapture)
13400 Diag(Range.getBegin(),
13401 diag::err_init_capture_deduction_failure_from_init_list)
13407 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13422 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13425 return DeducedType;
13430 assert(!
Init || !
Init->containsErrors());
13434 if (DeducedType.
isNull()) {
13443 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13467 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13468 Init = EWC->getSubExpr();
13470 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13471 Init = CE->getSubExpr();
13476 "shouldn't be called if type doesn't have a non-trivial C struct");
13477 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13478 for (
auto *I : ILE->inits()) {
13479 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13480 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13506bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13512 return FD->
hasAttr<UnavailableAttr>();
13515struct DiagNonTrivalCUnionDefaultInitializeVisitor
13522 DiagNonTrivalCUnionDefaultInitializeVisitor(
13525 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13528 const FieldDecl *FD,
bool InNonTrivialUnion) {
13531 InNonTrivialUnion);
13532 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13535 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13536 bool InNonTrivialUnion) {
13537 if (InNonTrivialUnion)
13539 << 1 << 0 << QT << FD->
getName();
13542 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13543 if (InNonTrivialUnion)
13545 << 1 << 0 << QT << FD->
getName();
13548 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13550 if (RD->isUnion()) {
13551 if (OrigLoc.isValid()) {
13552 bool IsUnion =
false;
13553 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13554 IsUnion = OrigRD->isUnion();
13555 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13556 << 0 << OrigTy << IsUnion << UseContext;
13558 OrigLoc = SourceLocation();
13560 InNonTrivialUnion =
true;
13563 if (InNonTrivialUnion)
13564 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13567 for (
const FieldDecl *FD : RD->fields())
13568 if (!shouldIgnoreForRecordTriviality(FD))
13569 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13572 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13577 SourceLocation OrigLoc;
13582struct DiagNonTrivalCUnionDestructedTypeVisitor
13585 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13587 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13588 SourceLocation OrigLoc,
13591 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13594 const FieldDecl *FD,
bool InNonTrivialUnion) {
13597 InNonTrivialUnion);
13598 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13601 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13602 bool InNonTrivialUnion) {
13603 if (InNonTrivialUnion)
13605 << 1 << 1 << QT << FD->
getName();
13608 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13609 if (InNonTrivialUnion)
13611 << 1 << 1 << QT << FD->
getName();
13614 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13616 if (RD->isUnion()) {
13617 if (OrigLoc.isValid()) {
13618 bool IsUnion =
false;
13619 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13620 IsUnion = OrigRD->isUnion();
13621 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13622 << 1 << OrigTy << IsUnion << UseContext;
13624 OrigLoc = SourceLocation();
13626 InNonTrivialUnion =
true;
13629 if (InNonTrivialUnion)
13630 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13633 for (
const FieldDecl *FD : RD->fields())
13634 if (!shouldIgnoreForRecordTriviality(FD))
13635 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13638 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13639 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13640 bool InNonTrivialUnion) {}
13645 SourceLocation OrigLoc;
13650struct DiagNonTrivalCUnionCopyVisitor
13652 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13654 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13656 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13659 const FieldDecl *FD,
bool InNonTrivialUnion) {
13662 InNonTrivialUnion);
13663 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13666 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13667 bool InNonTrivialUnion) {
13668 if (InNonTrivialUnion)
13670 << 1 << 2 << QT << FD->
getName();
13673 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13674 if (InNonTrivialUnion)
13676 << 1 << 2 << QT << FD->
getName();
13679 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13681 if (RD->isUnion()) {
13682 if (OrigLoc.isValid()) {
13683 bool IsUnion =
false;
13684 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13685 IsUnion = OrigRD->isUnion();
13686 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13687 << 2 << OrigTy << IsUnion << UseContext;
13689 OrigLoc = SourceLocation();
13691 InNonTrivialUnion =
true;
13694 if (InNonTrivialUnion)
13695 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13698 for (
const FieldDecl *FD : RD->fields())
13699 if (!shouldIgnoreForRecordTriviality(FD))
13700 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13703 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13704 if (InNonTrivialUnion)
13706 << 1 << 2 << QT << FD->
getName();
13710 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13711 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13712 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13713 bool InNonTrivialUnion) {}
13718 SourceLocation OrigLoc;
13727 unsigned NonTrivialKind) {
13731 "shouldn't be called if type doesn't have a non-trivial C union");
13735 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13736 .visit(QT,
nullptr,
false);
13739 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13740 .visit(QT,
nullptr,
false);
13742 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13743 .visit(QT,
nullptr,
false);
13767 bool TargetIsInline = Dcl->
isInline();
13768 bool TargetWasTemplated =
13785 TargetWasTemplated =
13795 if (!TargetIsInline || TargetWasTemplated)
13805 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13806 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13812 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13813 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13835 T = T.getNonReferenceType();
13836 if (T->isFunctionType())
13838 if (!T.isConstant(Ctx))
13840 if (T->isPointerType())
13858 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13859 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13871 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13872 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13878 llvm::scope_exit ResetDeclForInitializer([
this]() {
13889 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13890 if (!
Method->isInvalidDecl()) {
13892 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13893 <<
Method->getDeclName() <<
Init->getSourceRange();
13894 Method->setInvalidDecl();
13899 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13901 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13910 if (
Expr *E = Recovery.
get())
13917 Context.AMDGPUFeaturePredicateTy) {
13919 diag::err_amdgcn_predicate_type_is_not_constructible)
13926 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13927 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13934 if (
Init->containsErrors()) {
13943 "decl should be invalidated when deduce fails");
13955 if (VDecl->
hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
13962 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13982 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13983 BaseDeclType = Array->getElementType();
13985 diag::err_typecheck_decl_incomplete_type)) {
13992 diag::err_abstract_type_in_decl,
14010 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
14019 if (Def != VDecl &&
14039 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
14042 diag::note_previous_initializer)
14067 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14068 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14074 if (!
HLSL().handleInitialization(VDecl,
Init))
14086 if (!
Result.isUsable()) {
14094 bool InitializedFromParenListExpr =
false;
14095 bool IsParenListInit =
false;
14102 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14104 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14105 InitializedFromParenListExpr =
true;
14106 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14107 Args = CXXDirectInit->getInitExprs();
14108 InitializedFromParenListExpr =
true;
14115 if (!
Result.isUsable()) {
14135 IsParenListInit = !InitSeq.
steps().empty() &&
14139 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14141 Context.getAsIncompleteArrayType(VDeclType) &&
14142 Context.getAsIncompleteArrayType(
Init->getType())) {
14171 if (VDecl->
hasAttr<BlocksAttr>())
14184 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14185 Init->getBeginLoc()))
14186 FSI->markSafeWeakUse(
Init);
14207 if (!
Result.isUsable()) {
14247 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14248 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14250 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14285 <<
Init->getSourceRange();
14301 diag::ext_in_class_initializer_float_type_cxx11)
14302 << DclT <<
Init->getSourceRange();
14304 diag::note_in_class_initializer_float_type_cxx11)
14307 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14308 << DclT <<
Init->getSourceRange();
14311 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14312 <<
Init->getSourceRange();
14319 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14320 << DclT <<
Init->getSourceRange()
14326 << DclT <<
Init->getSourceRange();
14339 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14347 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14360 if (!InitType.
isNull() &&
14378 if (InitializedFromParenListExpr) {
14379 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14402 VarDecl *VD = dyn_cast<VarDecl>(D);
14406 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14407 for (
auto *BD : DD->bindings())
14408 BD->setInvalidDecl();
14421 Context.getBaseElementType(Ty),
14422 diag::err_typecheck_decl_incomplete_type)) {
14429 diag::err_abstract_type_in_decl,
14444 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14448 Diag(Var->getLocation(),
14449 diag::err_amdgcn_predicate_type_is_not_constructible)
14451 Var->setInvalidDecl();
14456 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14457 Var->setInvalidDecl();
14473 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14474 !Var->isThisDeclarationADemotedDefinition()) {
14475 if (Var->isStaticDataMember()) {
14479 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14480 Diag(Var->getLocation(),
14481 diag::err_constexpr_static_mem_var_requires_init)
14483 Var->setInvalidDecl();
14487 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14488 Var->setInvalidDecl();
14495 if (!Var->isInvalidDecl() &&
14497 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14498 bool HasConstExprDefaultConstructor =
false;
14499 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14500 for (
auto *Ctor : RD->ctors()) {
14501 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14502 Ctor->getMethodQualifiers().getAddressSpace() ==
14504 HasConstExprDefaultConstructor =
true;
14508 if (!HasConstExprDefaultConstructor) {
14509 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14510 Var->setInvalidDecl();
14516 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14517 Diag(Var->getLocation(), diag::err_specialization_const);
14518 Var->setInvalidDecl();
14522 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14523 if (Var->getStorageClass() ==
SC_Extern) {
14524 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14526 Var->setInvalidDecl();
14530 diag::err_typecheck_decl_incomplete_type)) {
14531 Var->setInvalidDecl();
14534 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14535 if (!RD->hasTrivialDefaultConstructor()) {
14536 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14537 Var->setInvalidDecl();
14547 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14554 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14570 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14572 diag::err_typecheck_decl_incomplete_type))
14573 Var->setInvalidDecl();
14578 diag::err_abstract_type_in_decl,
14580 Var->setInvalidDecl();
14583 Diag(Var->getLocation(), diag::warn_private_extern);
14584 Diag(Var->getLocation(), diag::note_private_extern);
14587 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14588 !Var->isInvalidDecl())
14599 if (!Var->isInvalidDecl()) {
14603 Var->getLocation(), ArrayT->getElementType(),
14604 diag::err_array_incomplete_or_sizeless_type))
14605 Var->setInvalidDecl();
14607 if (Var->getStorageClass() ==
SC_Static) {
14617 if (Var->isFirstDecl())
14619 diag::ext_typecheck_decl_incomplete_type,
14625 if (!Var->isInvalidDecl())
14636 if (Var->isConstexpr())
14637 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14640 Diag(Var->getLocation(),
14641 diag::err_typecheck_incomplete_array_needs_initializer);
14642 Var->setInvalidDecl();
14649 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14650 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14659 if (Var->isInvalidDecl())
14662 if (!Var->hasAttr<AliasAttr>()) {
14665 diag::err_typecheck_decl_incomplete_type)) {
14666 Var->setInvalidDecl();
14675 diag::err_abstract_type_in_decl,
14677 Var->setInvalidDecl();
14684 unsigned DiagID = diag::warn_default_init_const_unsafe;
14685 if (Var->getStorageDuration() ==
SD_Static ||
14686 Var->getStorageDuration() ==
SD_Thread)
14687 DiagID = diag::warn_default_init_const;
14689 bool EmitCppCompat = !
Diags.isIgnored(
14690 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14691 Var->getLocation());
14693 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14707 if (
const auto *CXXRecord =
14708 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14712 if (!CXXRecord->isPOD())
14757 }
else if (
Init.isInvalid()) {
14775 VarDecl *VD = dyn_cast<VarDecl>(D);
14834 const char *PrevSpec;
14859 Context.getAttributedType(
Attr, MethodType, MethodType);
14870 if (var->isInvalidDecl())
return;
14877 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14879 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14881 var->setInvalidDecl();
14889 var->hasLocalStorage()) {
14890 switch (var->getType().getObjCLifetime()) {
14903 if (var->hasLocalStorage() &&
14912 if (var->isThisDeclarationADefinition() &&
14913 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14914 var->isExternallyVisible() && var->hasLinkage() &&
14915 !var->isInline() && !var->getDescribedVarTemplate() &&
14919 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14920 var->getLocation())) {
14922 VarDecl *prev = var->getPreviousDecl();
14927 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14928 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14934 std::optional<bool> CacheHasConstInit;
14935 const Expr *CacheCulprit =
nullptr;
14936 auto checkConstInit = [&]()
mutable {
14937 const Expr *
Init = var->getInit();
14938 if (
Init->isInstantiationDependent())
14941 if (!CacheHasConstInit)
14942 CacheHasConstInit = var->getInit()->isConstantInitializer(
14943 Context, var->getType()->isReferenceType(), &CacheCulprit);
14944 return *CacheHasConstInit;
14948 if (var->getType().isDestructedType()) {
14952 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14954 Diag(var->getLocation(), diag::note_use_thread_local);
14956 if (!checkConstInit()) {
14964 Diag(var->getLocation(), diag::note_use_thread_local);
14970 if (!var->getType()->isStructureType() && var->hasInit() &&
14973 unsigned NumInits = ILE->getNumInits();
14975 for (
unsigned I = 0; I < NumInits; ++I) {
14976 const auto *
Init = ILE->getInit(I);
14979 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14983 unsigned NumConcat = SL->getNumConcatenated();
14987 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14988 bool OnlyOneMissingComma =
true;
14989 for (
unsigned J = I + 1; J < NumInits; ++J) {
14990 const auto *
Init = ILE->getInit(J);
14993 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14994 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14995 OnlyOneMissingComma =
false;
15000 if (OnlyOneMissingComma) {
15002 for (
unsigned i = 0; i < NumConcat - 1; ++i)
15004 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
15006 Diag(SL->getStrTokenLoc(1),
15007 diag::warn_concatenated_literal_array_init)
15009 Diag(SL->getBeginLoc(),
15010 diag::note_concatenated_string_literal_silence);
15021 if (var->hasAttr<BlocksAttr>())
15025 bool GlobalStorage = var->hasGlobalStorage();
15026 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
15028 bool HasConstInit =
true;
15031 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
15036 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
15037 (GlobalStorage || var->isConstexpr() ||
15038 var->mightBeUsableInConstantExpressions(
Context))) {
15050 HasConstInit = checkConstInit();
15054 if (HasConstInit) {
15055 if (var->isStaticDataMember() && !var->isInline() &&
15056 var->getLexicalDeclContext()->isRecord() &&
15057 type->isIntegralOrEnumerationType()) {
15062 diag::ext_in_class_initializer_non_constant)
15063 <<
Init->getSourceRange();
15066 (void)var->checkForConstantInitialization(Notes);
15068 }
else if (CacheCulprit) {
15069 Notes.emplace_back(CacheCulprit->
getExprLoc(),
15070 PDiag(diag::note_invalid_subexpr_in_const_expr));
15075 HasConstInit = var->checkForConstantInitialization(Notes);
15078 if (HasConstInit) {
15080 }
else if (var->isConstexpr()) {
15084 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15085 diag::note_invalid_subexpr_in_const_expr) {
15086 DiagLoc = Notes[0].first;
15089 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15090 << var <<
Init->getSourceRange();
15091 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15092 Diag(Notes[I].first, Notes[I].second);
15093 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15094 auto *
Attr = var->getAttr<ConstInitAttr>();
15095 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15096 <<
Init->getSourceRange();
15099 for (
auto &it : Notes)
15100 Diag(it.first, it.second);
15101 }
else if (var->isStaticDataMember() && !var->isInline() &&
15102 var->getLexicalDeclContext()->isRecord()) {
15103 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15104 <<
Init->getSourceRange();
15105 for (
auto &it : Notes)
15106 Diag(it.first, it.second);
15107 var->setInvalidDecl();
15108 }
else if (IsGlobal &&
15110 var->getLocation())) {
15119 if (!checkConstInit())
15120 Diag(var->getLocation(), diag::warn_global_constructor)
15121 <<
Init->getSourceRange();
15127 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15132 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15133 std::optional<QualType::NonConstantStorageReason> Reason;
15134 if (HasConstInit &&
15135 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15141 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15148 var->getType().isConstQualified()) {
15150 NonConstNonReferenceType) &&
15151 "This case should've already been handled elsewhere");
15152 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15153 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15159 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15161 SectionAttr::Declspec_allocate));
15163 var->dropAttr<SectionAttr>();
15178 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15179 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15186 if (!
type->isDependentType())
15192 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty() &&
15193 (ModuleScopes.back().Module->isHeaderLikeModule() ||
15196 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15199 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15210 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15211 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15221 NewAttr->setInherited(
true);
15223 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15224 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15225 NewAttr->setInherited(
true);
15230 if (!FD->
hasAttr<DLLExportAttr>())
15233 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15234 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15235 NewAttr->setInherited(
true);
15246 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15251 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15264 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15276 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15280 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15284 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15288 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15293 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15294 for (
auto *BD : DD->bindings()) {
15299 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15322 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15329 bool IsClassTemplateMember =
15331 Context->getDescribedClassTemplate();
15334 IsClassTemplateMember
15335 ? diag::warn_attribute_dllimport_static_field_definition
15336 : diag::err_attribute_dllimport_static_field_definition);
15337 Diag(IA->getLocation(), diag::note_attribute);
15338 if (!IsClassTemplateMember)
15366 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15386 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15390 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15392 if (!MagicValueExpr) {
15395 std::optional<llvm::APSInt> MagicValueInt;
15397 Diag(I->getRange().getBegin(),
15398 diag::err_type_tag_for_datatype_not_ice)
15402 if (MagicValueInt->getActiveBits() > 64) {
15403 Diag(I->getRange().getBegin(),
15404 diag::err_type_tag_for_datatype_too_large)
15408 uint64_t MagicValue = MagicValueInt->getZExtValue();
15411 I->getMatchingCType(),
15412 I->getLayoutCompatible(),
15413 I->getMustBeNull());
15418 auto *VD = dyn_cast<VarDecl>(DD);
15419 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15431 bool DiagnosedMultipleDecomps =
false;
15433 bool DiagnosedNonDeducedAuto =
false;
15435 for (
Decl *D : Group) {
15440 if (
auto *VD = dyn_cast<VarDecl>(D);
15441 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15442 VD->hasGlobalStorage())
15446 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15447 if (!FirstDeclaratorInGroup)
15448 FirstDeclaratorInGroup = DD;
15449 if (!FirstDecompDeclaratorInGroup)
15450 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15453 FirstNonDeducedAutoInGroup = DD;
15455 if (FirstDeclaratorInGroup != DD) {
15458 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15460 diag::err_decomp_decl_not_alone)
15462 << DD->getSourceRange();
15463 DiagnosedMultipleDecomps =
true;
15469 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15471 diag::err_auto_non_deduced_not_alone)
15472 << FirstNonDeducedAutoInGroup->
getType()
15475 << DD->getSourceRange();
15476 DiagnosedNonDeducedAuto =
true;
15481 Decls.push_back(D);
15487 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15489 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15501 if (Group.size() > 1) {
15503 VarDecl *DeducedDecl =
nullptr;
15504 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15505 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15509 if (!DT || DT->getDeducedType().isNull())
15512 Deduced = DT->getDeducedType();
15514 }
else if (!
Context.hasSameType(DT->getDeducedType(),
Deduced)) {
15515 auto *AT = dyn_cast<AutoType>(DT);
15517 diag::err_auto_different_deductions)
15519 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15543 if (Group.empty() || !Group[0])
15546 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15547 Group[0]->getLocation()) &&
15548 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15549 Group[0]->getLocation()))
15552 if (Group.size() >= 2) {
15560 Decl *MaybeTagDecl = Group[0];
15562 Group = Group.slice(1);
15615 const auto *VD = dyn_cast<ValueDecl>(D);
15629 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15631 Diag(TD->getLocation(), diag::note_declared_at);
15637 if (!ExplicitThisLoc.
isValid())
15640 "explicit parameter in non-cplusplus mode");
15642 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15654 LSI->ExplicitObjectParameter = P;
15677 ? diag::ext_register_storage_class
15678 : diag::warn_deprecated_register)
15684 diag::err_invalid_storage_class_in_func_decl)
15693 diag::err_invalid_storage_class_in_func_decl);
15705 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15726 PrevDecl =
nullptr;
15743 diag::err_hlsl_incomplete_resource_array_in_function_param);
15755 New->setInvalidDecl();
15774 Diag(
New->getLocation(), diag::err_module_private_local)
15778 if (
New->hasAttr<BlocksAttr>()) {
15779 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15794 T,
Context.getTrivialTypeSourceInfo(T, Loc),
15796 Param->setImplicit();
15809 !
Parameter->getIdentifier()->isPlaceholder()) {
15810 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15818 if (
LangOpts.NumLargeByValueCopy == 0)
15824 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15825 if (Size >
LangOpts.NumLargeByValueCopy)
15833 if (T->isDependentType() || !T.isPODType(
Context))
15835 unsigned Size =
Context.getTypeSizeInChars(T).getQuantity();
15836 if (Size >
LangOpts.NumLargeByValueCopy)
15849 T->isObjCLifetimeType()) {
15856 if (T->isArrayType()) {
15857 if (!T.isConstQualified()) {
15861 NameLoc, diag::err_arc_array_param_no_ownership, T,
false));
15863 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15868 lifetime = T->getObjCARCImplicitLifetime();
15870 T =
Context.getLifetimeQualifiedType(T, lifetime);
15875 if (T->isArrayType() && !T.hasAddressSpace()) {
15881 T =
Context.getAddrSpaceQualType(T, ImplAS);
15888 Context.getAdjustedParameterType(T),
15889 TSInfo, SC,
nullptr);
15894 if (
New->isParameterPack())
15896 CSI->LocalPacks.push_back(
New);
15898 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15899 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15906 if (T->isObjCObjectType()) {
15910 diag::err_object_cannot_be_passed_returned_by_value) << 1 << T
15912 T =
Context.getObjCObjectPointerType(T);
15917 if (T.getPointerAuth()) {
15918 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) << T << 1;
15919 New->setInvalidDecl();
15933 !(T->isFunctionPointerType() &&
15939 Diag(NameLoc, diag::err_arg_with_address_space);
15940 New->setInvalidDecl();
15944 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15945 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15946 New->setInvalidDecl();
15967 for (
int i = FTI.
NumParams; i != 0; ) {
15972 llvm::raw_svector_ostream(Code)
15983 const char* PrevSpec;
15986 DiagID,
Context.getPrintingPolicy());
16015 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
16017 ParentScope, D, TemplateParameterLists, Bases);
16023 if (!Bases.empty())
16031 Consumer.HandleInlineFunctionDefinition(D);
16040 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
16043 PossiblePrototype = Prev;
16067 if (II->isStr(
"main") || II->isStr(
"efi_main"))
16086 if (FD->
hasAttr<DeviceKernelAttr>())
16135 bool DefinitionVisible =
false;
16139 !
Definition->getTemplateParameterLists().empty())) {
16142 if (!DefinitionVisible) {
16143 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16157 Diag(
Definition->getLocation(), diag::note_previous_definition);
16166 LSI->
Lambda = LambdaClass;
16205 for (
const auto &
C : LambdaClass->
captures()) {
16206 if (
C.capturesVariable()) {
16210 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16212 true,
C.getLocation(),
16213 C.isPackExpansion()
16215 I->getType(),
false);
16217 }
else if (
C.capturesThis()) {
16243 FD = FunTmpl->getTemplatedDecl();
16254 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16259 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16264 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16265 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16266 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16267 !
Attr->isDefaultVersion()) {
16276 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16278 Ctor->isDefaultConstructor() &&
16279 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16324 "There should be an active template instantiation on the stack "
16325 "when instantiating a generic lambda!");
16335 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16336 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16351 diag::err_func_def_incomplete_result) ||
16353 diag::err_abstract_type_in_decl,
16369 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16373 "parameters should not be in newly created FD yet");
16376 if (NonParmDecl->getDeclName())
16381 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16382 for (
auto *EI : ED->enumerators())
16390 Param->setOwningFunction(FD);
16393 if (Param->getIdentifier() && FnBodyScope) {
16430 assert(!FD->
hasAttr<DLLExportAttr>());
16431 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16461 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
16462 if (!SKEPAttr->isInvalidAttr()) {
16482 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16483 FD = TD->getTemplatedDecl();
16484 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16496 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16497 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16498 if (!NRVOCandidate->isNRVOVariable()) {
16499 Diag(Returns[I]->getRetValue()->getExprLoc(),
16500 diag::warn_not_eliding_copy_on_return);
16520 Outer.Fun.hasTrailingReturnType()) {
16538 if (FD->isConstexpr())
16543 if (FD->getReturnType()->getContainedDeducedType())
16546 return Consumer.shouldSkipFunctionBody(D);
16553 FD->setHasSkippedBody();
16566 S.PopExpressionEvaluationContext();
16571 bool IsLambda =
false;
16575 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16577 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16578 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16592 return It->second = R;
16597 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16599 if (IsOrNestedInEscapingBlock(P.second))
16600 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16615 methodHasName(FD,
"get_return_object_on_allocation_failure");
16625 if (!FD->
hasAttr<CoroWrapperAttr>())
16630 bool RetainFunctionScopeInfo) {
16657 SYCLKernelEntryPointAttr *SKEPAttr =
16658 FD->
getAttr<SYCLKernelEntryPointAttr>();
16660 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16661 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16662 SKEPAttr->setInvalidAttr();
16664 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16665 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16666 SKEPAttr->setInvalidAttr();
16668 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16669 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16670 SKEPAttr->setInvalidAttr();
16672 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16673 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16674 SKEPAttr->setInvalidAttr();
16682 if (Body && !SKEPAttr->isInvalidAttr()) {
16712 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16714 Diag(SEAttr->getLocation(),
16715 diag::err_sycl_external_invalid_deleted_function)
16745 Expr *Dummy =
nullptr;
16756 if (LSI->HasImplicitReturnType) {
16763 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16767 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16768 Proto->getExtProtoInfo()));
16801 dyn_cast<CXXDestructorDecl>(FD))
16821 if (PossiblePrototype) {
16825 TypeLoc TL = TI->getTypeLoc();
16828 diag::note_declaration_not_a_prototype)
16831 FTL.getRParenLoc(),
"void")
16839 if (LocInfo.first.isInvalid())
16843 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16847 if (LocInfo.second > Buffer.size())
16850 const char *LexStart = Buffer.data() + LocInfo.second;
16851 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16853 return StartTok.consume_front(
"const") &&
16855 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16858 auto findBeginLoc = [&]() {
16874 diag::note_static_for_internal_linkage)
16885 if (!PossiblePrototype)
16931 if (PossiblePrototype)
16933 diag::warn_non_prototype_changes_behavior)
16940 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16941 if (!CmpndBody->body_empty())
16942 Diag(CmpndBody->body_front()->getBeginLoc(),
16943 diag::warn_dispatch_body_ignored);
16945 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16953 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16954 Context.setNonKeyFunction(MD);
16970 "Function parsing confused");
16971 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16983 << MD->getSelector().getAsString();
16988 bool isDesignated =
16989 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16990 assert(isDesignated && InitMethod);
16991 (void)isDesignated;
16994 auto IFace = MD->getClassInterface();
16997 auto SuperD = IFace->getSuperClass();
17007 diag::warn_objc_designated_init_missing_super_call);
17009 diag::note_objc_designated_init_marked_here);
17017 diag::warn_objc_secondary_init_missing_init_call);
17032 else if (
AMDGPU().HasPotentiallyUnguardedBuiltinUsage(FD))
17037 "This should only be set for ObjC methods, which should have been "
17038 "handled in the block above.");
17053 if (!
Destructor->getParent()->isDependentType())
17071 ActivePolicy = &WP;
17074 if (!IsInstantiation && FD &&
17080 if (FD && FD->
hasAttr<NakedAttr>()) {
17084 bool RegisterVariables =
false;
17085 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
17086 for (
const auto *
Decl : DS->decls()) {
17087 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
17088 RegisterVariables =
17089 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
17090 if (!RegisterVariables)
17095 if (RegisterVariables)
17098 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
17099 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
17108 "Leftover temporaries in function");
17109 assert(!
Cleanup.exprNeedsCleanups() &&
17110 "Unaccounted cleanups in function");
17112 "Leftover expressions for odr-use checking");
17121 if (!IsInstantiation)
17124 if (!RetainFunctionScopeInfo)
17153 D = TD->getTemplatedDecl();
17165 assert(
LangOpts.implicitFunctionsAllowed() &&
17166 "Implicit function declarations aren't allowed in this language mode");
17173 Scope *BlockScope = S;
17181 Scope *ContextScope = BlockScope;
17185 ContextScope = ContextScope->
getParent();
17205 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17208 return ExternCPrev;
17214 if (II.
getName().starts_with(
"__builtin_"))
17215 diag_id = diag::warn_builtin_unknown;
17218 diag_id = diag::ext_implicit_function_decl_c99;
17220 diag_id = diag::warn_implicit_function_decl;
17228 if (S && !ExternCPrev &&
17235 Diag(Loc, diag_id) << &II;
17251 return ExternCPrev;
17259 Context.getPrintingPolicy());
17261 assert(!
Error &&
"Error setting up implicit decl!");
17304 bool IsNothrow =
false;
17316 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17334 if (!FD->
hasAttr<AllocSizeAttr>()) {
17335 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17346 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17347 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17371 unsigned FormatIdx;
17373 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17374 if (!FD->
hasAttr<FormatAttr>()) {
17375 const char *fmt =
"printf";
17377 if (FormatIdx < NumParams &&
17383 HasVAListArg ? 0 : FormatIdx+2,
17387 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17389 if (!FD->
hasAttr<FormatAttr>())
17391 &
Context.Idents.get(
"scanf"),
17393 HasVAListArg ? 0 : FormatIdx+2,
17399 if (!FD->
hasAttr<CallbackAttr>() &&
17400 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17401 FD->
addAttr(CallbackAttr::CreateImplicit(
17407 bool NoExceptions =
17409 bool ConstWithoutErrnoAndExceptions =
17410 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17411 bool ConstWithoutExceptions =
17412 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17413 if (!FD->
hasAttr<ConstAttr>() &&
17414 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17415 (!ConstWithoutErrnoAndExceptions ||
17417 (!ConstWithoutExceptions || NoExceptions))
17423 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17424 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17426 switch (BuiltinID) {
17427 case Builtin::BI__builtin_fma:
17428 case Builtin::BI__builtin_fmaf:
17429 case Builtin::BI__builtin_fmal:
17430 case Builtin::BIfma:
17431 case Builtin::BIfmaf:
17432 case Builtin::BIfmal:
17442 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17443 !FD->
hasAttr<NonNullAttr>()) {
17445 for (
int I : Indxs) {
17448 T =
Context.getAttributedType(attr::TypeNonNull, T, T);
17453 for (
int I : Indxs)
17454 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17455 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17456 ParamIndxs.size()));
17459 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17460 !FD->
hasAttr<ReturnsTwiceAttr>())
17463 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17465 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17467 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17470 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17475 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17482 switch (BuiltinID) {
17483 case Builtin::BImemalign:
17484 case Builtin::BIaligned_alloc:
17485 if (!FD->
hasAttr<AllocAlignAttr>())
17494 switch (BuiltinID) {
17495 case Builtin::BIcalloc:
17496 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17499 case Builtin::BImemalign:
17500 case Builtin::BIaligned_alloc:
17501 case Builtin::BIrealloc:
17505 case Builtin::BImalloc:
17525 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17541 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17544 if (!FD->
hasAttr<FormatAttr>())
17546 &
Context.Idents.get(
"printf"), 2,
17547 Name->
isStr(
"vasprintf") ? 0 : 3,
17551 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17554 if (!FD->
hasAttr<FormatArgAttr>())
17562 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17563 assert(!T.isNull() &&
"GetTypeForDeclarator() returned null type");
17566 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17567 TInfo =
Context.getTrivialTypeSourceInfo(T);
17620 if (T->isDependentType())
17630 if (T->isAtomicType())
17631 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17634 std::optional<unsigned> QualSelect;
17636 QualSelect = diag::CVQualList::Both;
17638 QualSelect = diag::CVQualList::Const;
17640 QualSelect = diag::CVQualList::Volatile;
17643 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17645 T = T.getAtomicUnqualifiedType();
17650 if (BT->isInteger())
17653 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17654 << T << T->isBitIntType();
17658 QualType EnumUnderlyingTy,
bool IsFixed,
17660 if (IsScoped != Prev->
isScoped()) {
17661 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17667 if (IsFixed && Prev->
isFixed()) {
17670 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17673 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17679 }
else if (IsFixed != Prev->
isFixed()) {
17680 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17702 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17738 llvm_unreachable(
"invalid TTK");
17777 if (IsIgnoredLoc(NewTagLoc))
17780 auto IsIgnored = [&](
const TagDecl *Tag) {
17781 return IsIgnoredLoc(Tag->getLocation());
17798 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17806 if (isDefinition) {
17814 bool previousMismatch =
false;
17816 if (I->getTagKind() !=
NewTag) {
17821 if (!previousMismatch) {
17822 previousMismatch =
true;
17823 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17827 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17840 if (PrevDef && IsIgnored(PrevDef))
17844 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17851 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17881 if (!Namespace || Namespace->isAnonymousNamespace())
17884 Namespaces.push_back(II);
17887 if (Lookup == Namespace)
17894 llvm::raw_svector_ostream OS(Insertion);
17897 std::reverse(Namespaces.begin(), Namespaces.end());
17898 for (
auto *II : Namespaces)
17899 OS << II->getName() <<
"::";
17912 if (OldDC->
Equals(NewDC))
17931 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17932 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17937 "Nameless record must be a definition!");
17942 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17945 bool isMemberSpecialization =
false;
17946 bool IsInjectedClassName =
false;
17952 if (TemplateParameterLists.size() > 0 ||
17956 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17973 !isMemberSpecialization)
17974 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17977 if (TemplateParams) {
17979 Diag(KWLoc, diag::err_enum_template);
17983 if (TemplateParams->
size() > 0) {
17992 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17993 AS, ModulePrivateLoc,
17995 TemplateParameterLists.data(), SkipBody);
18001 isMemberSpecialization =
true;
18005 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
18024 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
18025 assert(ScopedEnum || !ScopedEnumUsesClassTag);
18026 Diag(KWLoc, diag::note_enum_friend)
18027 << (ScopedEnum + ScopedEnumUsesClassTag);
18033 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
18034 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
18037 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum) ||
18041 EnumUnderlying =
Context.IntTy.getTypePtr();
18042 }
else if (UnderlyingType.
get()) {
18050 EnumUnderlying = TI;
18054 EnumUnderlying =
Context.IntTy.getTypePtr();
18058 EnumUnderlying =
Context.IntTy.getTypePtr();
18068 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
18069 TI && TI->
getType()->isAtomicType())
18072 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
18078 EnumUnderlying =
Context.IntTy.getTypePtr();
18084 bool isStdBadAlloc =
false;
18085 bool isStdAlignValT =
false;
18094 auto createTagFromNewDecl = [&]() ->
TagDecl * {
18104 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
18108 if (EnumUnderlying) {
18110 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18116 ?
Context.getPromotedIntegerType(EnumTy)
18137 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18153 goto CreateNewDecl;
18161 IsDependent =
true;
18190 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18192 IsDependent =
true;
18197 Diag(NameLoc, diag::err_not_tag_in_scope)
18198 << Kind << Name << DC << SS.
getRange();
18201 goto CreateNewDecl;
18249 bool FriendSawTagOutsideEnclosingNamespace =
false;
18256 FriendSawTagOutsideEnclosingNamespace =
true;
18265 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18267 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18298 Previous.getFoundDecl()->isTemplateParameter()) {
18307 if (Name->
isStr(
"bad_alloc")) {
18309 isStdBadAlloc =
true;
18316 }
else if (Name->
isStr(
"align_val_t")) {
18317 isStdAlignValT =
true;
18329 IsTemplateParamOrArg)) {
18330 if (
Invalid)
goto CreateNewDecl;
18413 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18414 if (Tag->getDeclName() == Name &&
18415 Tag->getDeclContext()->getRedeclContext()
18416 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18423 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18425 RD->isInjectedClassName()) {
18432 IsInjectedClassName =
true;
18439 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18440 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18443 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18445 *
this, OldTag->getDeclContext(), SearchDC))) {
18446 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18447 Diag(Shadow->getTargetDecl()->getLocation(),
18448 diag::note_using_decl_target);
18449 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18453 goto CreateNewDecl;
18457 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18463 SS.
isNotEmpty() || isMemberSpecialization)) {
18469 bool SafeToContinue =
18472 if (SafeToContinue)
18473 Diag(KWLoc, diag::err_use_with_wrong_tag)
18476 PrevTagDecl->getKindName());
18478 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18479 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18481 if (SafeToContinue)
18482 Kind = PrevTagDecl->getTagKind();
18495 return PrevTagDecl;
18499 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18500 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18501 else if (
const Type *T =
18502 dyn_cast_if_present<const Type *>(EnumUnderlying))
18503 EnumUnderlyingTy =
QualType(T, 0);
18509 ScopedEnum, EnumUnderlyingTy,
18510 IsFixed, PrevEnum))
18520 Diag(NameLoc, diag::ext_member_redeclared);
18521 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18528 if (!Attrs.
empty()) {
18532 (PrevTagDecl->getFriendObjectKind() ==
18545 return PrevTagDecl;
18550 return PrevTagDecl;
18559 if (Def->isBeingDefined()) {
18560 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18561 Diag(PrevTagDecl->getLocation(),
18562 diag::note_previous_definition);
18570 bool IsExplicitSpecializationAfterInstantiation =
false;
18571 if (isMemberSpecialization) {
18573 IsExplicitSpecializationAfterInstantiation =
18574 RD->getTemplateSpecializationKind() !=
18576 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18577 IsExplicitSpecializationAfterInstantiation =
18578 ED->getTemplateSpecializationKind() !=
18587 bool HiddenDefVisible =
false;
18601 SkipBody->
New = createTagFromNewDecl();
18610 if (!HiddenDefVisible && Hidden)
18615 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18620 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18623 Diag(NameLoc, diag::err_redefinition) << Name;
18625 NameLoc.
isValid() ? NameLoc : KWLoc);
18644 SearchDC = PrevTagDecl->getDeclContext();
18672 Diag(NameLoc, diag::err_tag_reference_non_tag)
18673 << PrevDecl << NTK << Kind;
18679 SS.
isNotEmpty() || isMemberSpecialization)) {
18685 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18691 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18694 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18695 << Name << Kind << TND->getUnderlyingType();
18703 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18735 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18736 ScopedEnumUsesClassTag, IsFixed);
18740 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18748 if (IsFixed && ED->
isFixed()) {
18751 }
else if (PrevDecl &&
18753 Diag(Loc, diag::ext_forward_ref_enum_def)
18757 unsigned DiagID = diag::ext_forward_ref_enum;
18759 DiagID = diag::ext_ms_forward_ref_enum;
18761 DiagID = diag::err_forward_ref_enum;
18766 if (EnumUnderlying) {
18768 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18774 ?
Context.getPromotedIntegerType(EnumTy)
18776 assert(ED->
isComplete() &&
"enum with type should be complete");
18786 cast_or_null<CXXRecordDecl>(PrevDecl));
18792 cast_or_null<RecordDecl>(PrevDecl));
18798 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18804 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18806 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18813 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18826 isMemberSpecialization))
18830 if (TemplateParameterLists.size() > 0) {
18831 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18850 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18856 if (ModulePrivateLoc.
isValid()) {
18857 if (isMemberSpecialization)
18858 Diag(
New->getLocation(), diag::err_module_private_specialization)
18865 New->setModulePrivate();
18885 Diag(Loc, diag::err_type_defined_in_param_type)
18891 }
else if (!PrevDecl) {
18895 Diag(Loc, diag::warn_decl_in_param_list)
18901 New->setInvalidDecl();
18923 New->startDefinition();
18925 New->setCompleteDefinition();
18926 New->demoteThisDefinitionToDeclaration();
18954 if (!
New->isInvalidDecl() &&
18955 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18962 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18975 if (isMemberSpecialization && !
New->isInvalidDecl())
18982 if (
New->isBeingDefined())
18983 if (
auto RD = dyn_cast<RecordDecl>(
New))
18984 RD->completeDefinition();
18986 }
else if (SkipBody && SkipBody->
ShouldSkip) {
19020 bool IsFinalSpelledSealed,
19028 if (!
Record->getIdentifier())
19036 IsFinalSpelledSealed
19037 ? FinalAttr::Keyword_sealed
19038 : FinalAttr::Keyword_final));
19056 "Broken injected-class-name");
19063 Tag->setBraceRange(BraceRange);
19066 if (Tag->isBeingDefined()) {
19067 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
19068 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19069 RD->completeDefinition();
19072 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
19074 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
19075 auto *Def = RD->getDefinition();
19076 assert(Def &&
"The record is expected to have a completed definition");
19077 unsigned NumInitMethods = 0;
19078 for (
auto *
Method : Def->methods()) {
19079 if (!
Method->getIdentifier())
19081 if (
Method->getName() ==
"__init")
19084 if (NumInitMethods > 1 || !Def->hasInitMethod())
19085 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
19103 Tag->setTopLevelDeclInObjCContainer();
19106 if (!Tag->isInvalidDecl())
19107 Consumer.HandleTagDeclDefinition(Tag);
19111 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
19117 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
19121 if (llvm::any_of(RD->
fields(),
19122 [](
const FieldDecl *FD) { return FD->isBitField(); }))
19123 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
19130 Tag->setInvalidDecl();
19133 if (Tag->isBeingDefined()) {
19134 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19135 RD->completeDefinition();
19148 QualType FieldTy,
bool IsMsStruct,
19159 diag::err_field_incomplete_or_sizeless))
19162 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19164 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19174 llvm::APSInt
Value;
19179 BitWidth = ICE.
get();
19182 if (
Value == 0 && FieldName)
19183 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19186 if (
Value.isSigned() &&
Value.isNegative()) {
19188 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19190 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19197 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19202 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19203 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19204 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19208 bool CStdConstraintViolation =
19210 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19211 if (CStdConstraintViolation || MSBitfieldViolation) {
19212 unsigned DiagWidth =
19213 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19214 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19216 << !CStdConstraintViolation << DiagWidth;
19222 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19223 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19266 TInfo =
Context.getTrivialTypeSourceInfo(T, Loc);
19277 diag::err_invalid_thread)
19285 switch (
Previous.getResultKind()) {
19292 PrevDecl =
Previous.getRepresentativeDecl();
19306 PrevDecl =
nullptr;
19310 PrevDecl =
nullptr;
19317 TSSL, AS, PrevDecl, &D);
19320 Record->setInvalidDecl();
19339 bool Mutable,
Expr *BitWidth,
19345 bool InvalidDecl =
false;
19350 if (T.isNull() || T->containsErrors()) {
19351 InvalidDecl =
true;
19357 bool isIncomplete =
19361 diag::err_field_incomplete_or_sizeless);
19362 if (isIncomplete) {
19364 Record->setInvalidDecl();
19365 InvalidDecl =
true;
19370 Record->setInvalidDecl();
19371 InvalidDecl =
true;
19377 if (T.hasAddressSpace() || T->isDependentAddressSpaceType() ||
19378 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19379 Diag(Loc, diag::err_field_with_address_space);
19380 Record->setInvalidDecl();
19381 InvalidDecl =
true;
19387 if (T->isEventT() || T->isImageType() || T->isSamplerT() ||
19388 T->isBlockPointerType()) {
19389 Diag(Loc, diag::err_opencl_type_struct_or_union_field) << T;
19390 Record->setInvalidDecl();
19391 InvalidDecl =
true;
19396 "__cl_clang_bitfields",
LangOpts)) {
19397 Diag(Loc, diag::err_opencl_bitfields);
19398 InvalidDecl =
true;
19404 T.hasQualifiers()) {
19405 InvalidDecl =
true;
19406 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19411 if (!InvalidDecl && T->isVariablyModifiedType()) {
19413 TInfo, T, Loc, diag::err_typecheck_field_variable_size))
19414 InvalidDecl =
true;
19419 diag::err_abstract_type_in_decl,
19421 InvalidDecl =
true;
19424 BitWidth =
nullptr;
19430 InvalidDecl =
true;
19431 BitWidth =
nullptr;
19436 if (!InvalidDecl && Mutable) {
19437 unsigned DiagID = 0;
19438 if (T->isReferenceType())
19439 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19440 : diag::err_mutable_reference;
19441 else if (T.isConstQualified())
19442 DiagID = diag::err_mutable_const;
19448 Diag(ErrLoc, DiagID);
19449 if (DiagID != diag::ext_mutable_reference) {
19451 InvalidDecl =
true;
19463 BitWidth, Mutable, InitStyle);
19472 Diag(Loc, diag::err_duplicate_member) << II;
19478 if (
Record->isUnion()) {
19480 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19495 const bool HaveMSExt =
19500 HaveMSExt ? diag::ext_union_member_of_reference_type
19501 : diag::err_union_member_of_reference_type)
19521 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19524 if (T.isObjCGCWeak())
19525 Diag(Loc, diag::warn_attribute_weak_on_field);
19528 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19545 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19556 if (RDecl->hasNonTrivialCopyConstructor())
19558 else if (!RDecl->hasTrivialDefaultConstructor())
19560 else if (RDecl->hasNonTrivialCopyAssignment())
19562 else if (RDecl->hasNonTrivialDestructor())
19567 RDecl->hasObjectMember()) {
19575 if (!FD->
hasAttr<UnavailableAttr>())
19576 FD->
addAttr(UnavailableAttr::CreateImplicit(
19577 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19584 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19585 : diag::err_illegal_union_or_anon_struct_member)
19597 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19600 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19608 if (!CD->IsClassExtension())
19625 AllIvarDecls.push_back(Ivar);
19637 if (!
Record->hasUserDeclaredDestructor()) {
19645 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19646 if (DD->isInvalidDecl())
19650 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19664 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19668 Msg = diag::err_ambiguous_destructor;
19673 Msg = diag::err_no_viable_destructor;
19684 Record->setInvalidDecl();
19691 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19735 if (!Method->getTrailingRequiresClause())
19736 SatisfactionStatus.push_back(
true);
19740 SatisfactionStatus.push_back(
false);
19742 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19746 for (
size_t i = 0; i < Methods.size(); i++) {
19747 if (!SatisfactionStatus[i])
19755 bool AnotherMethodIsMoreConstrained =
false;
19756 for (
size_t j = 0; j < Methods.size(); j++) {
19757 if (i == j || !SatisfactionStatus[j])
19771 AnotherMethodIsMoreConstrained =
true;
19775 AnotherMethodIsMoreConstrained)) {
19778 AnotherMethodIsMoreConstrained =
true;
19780 if (AnotherMethodIsMoreConstrained)
19785 if (!AnotherMethodIsMoreConstrained) {
19786 Method->setIneligibleOrNotSelected(
false);
19787 Record->addedEligibleSpecialMemberFunction(Method,
19788 1 << llvm::to_underlying(CSM));
19802 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19804 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19806 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19810 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19811 if (CD->isInvalidDecl())
19813 if (CD->isDefaultConstructor())
19814 DefaultConstructors.push_back(MD);
19815 else if (CD->isCopyConstructor())
19816 CopyConstructors.push_back(MD);
19817 else if (CD->isMoveConstructor())
19818 MoveConstructors.push_back(MD);
19820 CopyAssignmentOperators.push_back(MD);
19822 MoveAssignmentOperators.push_back(MD);
19840 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19841 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19854 if (
const auto *TD = dyn_cast<TagDecl>(D))
19855 return !TD->isCompleteDefinition();
19870 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19877 assert(EnclosingDecl &&
"missing record or interface decl");
19886 case Decl::ObjCCategory:
19889 case Decl::ObjCImplementation:
19897 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19901 unsigned NumNamedMembers = 0;
19903 for (
const auto *I :
Record->decls()) {
19904 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19905 if (IFD->getDeclName())
19912 const FieldDecl *PreviousField =
nullptr;
19922 RecFields.push_back(FD);
19942 bool IsLastField = (i + 1 == Fields.end());
19957 unsigned DiagID = 0;
19958 if (!
Record->isUnion() && !IsLastField) {
19961 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19965 }
else if (
Record->isUnion())
19967 ? diag::ext_flexible_array_union_ms
19968 : diag::ext_flexible_array_union_gnu;
19969 else if (NumNamedMembers < 1)
19971 ? diag::ext_flexible_array_empty_aggregate_ms
19972 : diag::ext_flexible_array_empty_aggregate_gnu;
19982 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19996 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
20003 Record->setHasFlexibleArrayMember(
true);
20012 diag::err_incomplete_type)
20015 diag::err_field_incomplete_or_sizeless))) {
20021 if (
Record && RD->hasFlexibleArrayMember()) {
20024 Record->setHasFlexibleArrayMember(
true);
20025 if (!
Record->isUnion()) {
20042 diag::err_abstract_type_in_decl,
20047 if (
Record && RD->hasObjectMember())
20048 Record->setHasObjectMember(
true);
20049 if (
Record && RD->hasVolatileMember())
20050 Record->setHasVolatileMember(
true);
20069 FD->
addAttr(UnavailableAttr::CreateImplicit(
20070 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
20074 !
Record->hasObjectMember()) {
20077 Record->setHasObjectMember(
true);
20080 if (
const auto *RD = BaseType->getAsRecordDecl();
20081 RD && RD->hasObjectMember())
20082 Record->setHasObjectMember(
true);
20083 else if (BaseType->isObjCObjectPointerType() ||
20084 BaseType.isObjCGCStrong())
20085 Record->setHasObjectMember(
true);
20090 !shouldIgnoreForRecordTriviality(FD)) {
20093 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
20096 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
20100 Record->setNonTrivialToPrimitiveCopy(
true);
20102 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
20104 if (FD->
hasAttr<ExplicitInitAttr>())
20105 Record->setHasUninitializedExplicitInitFields(
true);
20107 Record->setNonTrivialToPrimitiveDestroy(
true);
20108 Record->setParamDestroyedInCallee(
true);
20110 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
20114 if (RD->getArgPassingRestrictions() ==
20116 Record->setArgPassingRestrictions(
20119 Record->setArgPassingRestrictions(
20123 Record->setArgPassingRestrictions(
20125 Record->setNonTrivialToPrimitiveCopy(
true);
20130 Record->setHasVolatileMember(
true);
20131 bool ReportMSBitfieldStoragePacking =
20132 Record && PreviousField &&
20133 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
20135 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
20139 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
20140 IsNonDependentBitField(PreviousField)) {
20144 if (FDStorageSize != PreviousFieldStorageSize) {
20146 diag::warn_ms_bitfield_mismatched_storage_packing)
20150 diag::note_ms_bitfield_mismatched_storage_size_previous)
20151 << PreviousField << PreviousField->
getType();
20161 bool Completed =
false;
20166 Record->setInvalidDecl();
20170 if (!CXXRecord->isInvalidDecl()) {
20173 I = CXXRecord->conversion_begin(),
20174 E = CXXRecord->conversion_end(); I != E; ++I)
20175 I.setAccess((*I)->getAccess());
20181 if (!CXXRecord->isDependentType()) {
20182 if (!CXXRecord->isInvalidDecl()) {
20186 if (CXXRecord->getNumVBases()) {
20188 CXXRecord->getFinalOverriders(FinalOverriders);
20190 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20191 MEnd = FinalOverriders.end();
20194 SOEnd = M->second.end();
20195 SO != SOEnd; ++SO) {
20196 assert(SO->second.size() > 0 &&
20197 "Virtual function without overriding functions?");
20198 if (SO->second.size() == 1)
20205 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20207 Diag(M->first->getLocation(),
20208 diag::note_overridden_virtual_function);
20210 OM = SO->second.begin(),
20211 OMEnd = SO->second.end();
20213 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20214 << (
const NamedDecl *)M->first << OM->Method->getParent();
20216 Record->setInvalidDecl();
20219 CXXRecord->completeDefinition(&FinalOverriders);
20229 Record->completeDefinition();
20238 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20239 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20240 EntirelyFunctionPointers(
Record)))) {
20244 Record->reorderDecls(NewDeclOrdering);
20249 auto *Dtor = CXXRecord->getDestructor();
20250 if (Dtor && Dtor->isImplicit() &&
20252 CXXRecord->setImplicitDestructorIsDeleted();
20257 if (
Record->hasAttrs()) {
20260 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20262 IA->getRange(), IA->getBestCase(),
20263 IA->getInheritanceModel());
20269 bool CheckForZeroSize;
20271 CheckForZeroSize =
true;
20276 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20278 CXXRecord->isCLike();
20280 if (CheckForZeroSize) {
20281 bool ZeroSize =
true;
20282 bool IsEmpty =
true;
20283 unsigned NonBitFields = 0;
20285 E =
Record->field_end();
20286 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20288 if (I->isUnnamedBitField()) {
20289 if (!I->isZeroLengthBitField())
20293 QualType FieldType = I->getType();
20295 !
Context.getTypeSizeInChars(FieldType).isZero())
20305 diag::warn_zero_size_struct_union_in_extern_c :
20306 diag::warn_zero_size_struct_union_compat)
20307 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20314 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20315 : diag::ext_no_named_members_in_struct_union)
20323 ID->setEndOfDefinitionLoc(RBrac);
20325 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20327 ID->addDecl(ClsFields[i]);
20331 if (ID->getSuperClass())
20334 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20335 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20336 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20342 IMPDecl->setIvarLBraceLoc(LBrac);
20343 IMPDecl->setIvarRBraceLoc(RBrac);
20345 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20353 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20357 Diag(ClsFields[i]->getLocation(),
20358 diag::err_duplicate_ivar_declaration);
20359 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20365 Diag(ClsFields[i]->getLocation(),
20366 diag::err_duplicate_ivar_declaration);
20367 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20373 CDecl->addDecl(ClsFields[i]);
20375 CDecl->setIvarLBraceLoc(LBrac);
20376 CDecl->setIvarRBraceLoc(RBrac);
20388 assert((T->isIntegralType(Context) ||
20389 T->isEnumeralType()) &&
"Integral type required!");
20390 const unsigned NumTypes = 4;
20391 QualType SignedIntegralTypes[NumTypes] = {
20392 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20394 QualType UnsignedIntegralTypes[NumTypes] = {
20395 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20396 Context.UnsignedLongLongTy
20399 unsigned BitWidth = Context.getTypeSize(T);
20401 : UnsignedIntegralTypes;
20402 for (
unsigned I = 0; I != NumTypes; ++I)
20403 if (Context.getTypeSize(Types[I]) > BitWidth)
20414 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20415 llvm::APSInt EnumVal(IntWidth);
20435 EltTy =
Enum->getIntegerType();
20441 Val = Converted.
get();
20448 if (
Enum->isComplete()) {
20449 EltTy =
Enum->getIntegerType();
20455 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20458 .isWindowsMSVCEnvironment()) {
20459 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20461 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20484 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20486 ? diag::warn_c17_compat_enum_value_not_int
20487 : diag::ext_c23_enum_value_not_int)
20489 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20501 if (
Enum->isDependentType())
20503 else if (!LastEnumConst) {
20512 if (
Enum->isFixed()) {
20513 EltTy =
Enum->getIntegerType();
20522 EltTy = LastEnumConst->
getType();
20525 if (EnumVal < LastEnumConst->getInitVal()) {
20537 if (T.isNull() ||
Enum->isFixed()) {
20541 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20543 if (
Enum->isFixed())
20545 Diag(IdLoc, diag::err_enumerator_wrapped)
20549 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20560 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20572 ? diag::warn_c17_compat_enum_value_not_int
20573 : diag::ext_c23_enum_value_not_int)
20574 << 1 <<
toString(EnumVal, 10) << 1;
20576 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20579 : diag::ext_c23_enum_value_not_int)
20580 << 1 <<
toString(EnumVal, 10) << 1;
20588 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20607 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20615 Skip.Previous = Hidden;
20629 cast_or_null<EnumConstantDecl>(lastEnumConst);
20646 PrevDecl =
nullptr;
20673 "Received TagDecl when not in C++!");
20676 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20678 Diag(IdLoc, diag::err_redefinition) << Id;
20711 if (!BO->isAdditiveOp())
20719 InitExpr = BO->getLHS();
20723 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20743 if (!
Enum->getIdentifier())
20747 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20756 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20759 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20763 llvm::APSInt Val = D->getInitVal();
20764 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20767 DuplicatesVector DupVector;
20768 ValueToVectorMap EnumMap;
20772 for (
auto *Element : Elements) {
20786 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20789 if (EnumMap.size() == 0)
20793 for (
auto *Element : Elements) {
20799 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20800 if (Iter == EnumMap.end())
20803 DeclOrVector& Entry = Iter->second;
20810 auto Vec = std::make_unique<ECDVector>();
20812 Vec->push_back(ECD);
20819 DupVector.emplace_back(std::move(Vec));
20825 if (*Vec->begin() == ECD)
20828 Vec->push_back(ECD);
20832 for (
const auto &Vec : DupVector) {
20833 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20836 auto *FirstECD = Vec->front();
20837 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20838 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20839 << FirstECD->getSourceRange();
20843 for (
auto *ECD : llvm::drop_begin(*Vec))
20844 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20845 << ECD <<
toString(ECD->getInitVal(), 10)
20846 << ECD->getSourceRange();
20851 bool AllowMask)
const {
20852 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20856 llvm::APInt &FlagBits = R.first->second;
20860 const auto &EVal = E->getInitVal();
20862 if (EVal.isPowerOf2())
20863 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20875 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20876 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20883 bool HasBitwiseOp =
false;
20888 for (
const auto *ECD :
Enum->enumerators()) {
20889 const Expr *InitExpr = ECD->getInitExpr();
20895 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20899 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20900 HasBitwiseOp =
true;
20901 }
else if (Op == BO_LT || Op == BO_GT) {
20904 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20906 if (IntLiteral->getValue() == 1)
20907 SuspiciousCompares.push_back(BinOp);
20915 if (HasBitwiseOp) {
20916 for (
const auto *BinOp : SuspiciousCompares) {
20917 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20922 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20923 << BinOp->getOpcodeStr() << SuggestedOp;
20925 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20941 if (
Enum->isDependentType()) {
20942 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20944 cast_or_null<EnumConstantDecl>(Elements[i]);
20945 if (!ECD)
continue;
20956 unsigned NumNegativeBits = 0;
20957 unsigned NumPositiveBits = 0;
20958 bool MembersRepresentableByInt =
20959 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20963 unsigned BestWidth;
20984 if (
Enum->isComplete()) {
20985 BestType =
Enum->getIntegerType();
20986 if (
Context.isPromotableIntegerType(BestType))
20987 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20989 BestPromotionType = BestType;
20991 BestWidth =
Context.getIntWidth(BestType);
20993 bool EnumTooLarge =
Context.computeBestEnumTypes(
20994 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20995 BestWidth =
Context.getIntWidth(BestType);
20997 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
21002 for (
auto *D : Elements) {
21003 auto *ECD = cast_or_null<EnumConstantDecl>(D);
21004 if (!ECD)
continue;
21013 llvm::APSInt InitVal = ECD->getInitVal();
21021 MembersRepresentableByInt) {
21029 NewWidth =
Context.getTargetInfo().getIntWidth();
21031 }
else if (ECD->getType() == BestType) {
21039 ECD->setType(EnumType);
21043 NewWidth = BestWidth;
21048 InitVal = InitVal.extOrTrunc(NewWidth);
21049 InitVal.setIsSigned(NewSign);
21050 ECD->setInitVal(
Context, InitVal);
21053 if (ECD->getInitExpr() &&
21054 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
21056 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
21065 ECD->setType(EnumType);
21067 ECD->setType(NewTy);
21070 Enum->completeDefinition(BestType, BestPromotionType,
21071 NumPositiveBits, NumNegativeBits);
21076 if (
Enum->isClosedFlag()) {
21077 for (
Decl *D : Elements) {
21079 if (!ECD)
continue;
21082 if (InitVal != 0 && !InitVal.isPowerOf2() &&
21090 if (
Enum->hasAttrs())
21129 AsmLabelAttr *
Attr =
21130 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
21140 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
21153 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
21169 if (!PrevDecl->
hasAttr<AliasAttr>())
21170 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21179 assert(FD &&
"Expected non-null FunctionDecl");
21186 FD->
hasAttr<SYCLKernelEntryPointAttr>() ||
21187 FD->
hasAttr<SYCLExternalAttr>()))
21191 auto IsEmittedForExternalSymbol = [
this, FD]() {
21203 if (
LangOpts.OpenMPIsTargetDevice) {
21206 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21213 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21217 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21218 if (IsEmittedForExternalSymbol())
21224 }
else if (
LangOpts.OpenMP > 45) {
21228 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21231 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21250 if (IsEmittedForExternalSymbol())
21255 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
21257 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
21260 Spec->getTemplateSpecializationKind();
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static bool isDeclExternC(const T &D)
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
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...
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
ExprResult DefaultLvalueConversion(Expr *E)
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
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, SourceLoc