62#include "llvm/ADT/ArrayRef.h"
63#include "llvm/ADT/STLForwardCompat.h"
64#include "llvm/ADT/ScopeExit.h"
65#include "llvm/ADT/SmallPtrSet.h"
66#include "llvm/ADT/SmallString.h"
67#include "llvm/ADT/StringExtras.h"
68#include "llvm/ADT/StringRef.h"
69#include "llvm/Support/SaveAndRestore.h"
70#include "llvm/TargetParser/Triple.h"
74#include <unordered_map>
81 Decl *Group[2] = { OwnedType, Ptr };
92 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
93 bool AllowTemplates =
false,
94 bool AllowNonTemplates =
true)
95 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
96 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
97 WantExpressionKeywords =
false;
98 WantCXXNamedCasts =
false;
99 WantRemainingKeywords =
false;
102 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
104 if (!AllowInvalidDecl && ND->isInvalidDecl())
108 return AllowTemplates;
114 if (AllowNonTemplates)
119 if (AllowTemplates) {
120 auto *RD = dyn_cast<CXXRecordDecl>(ND);
121 if (!RD || !RD->isInjectedClassName())
124 return RD->getDescribedClassTemplate() ||
131 return !WantClassName && candidate.
isKeyword();
134 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
135 return std::make_unique<TypeNameValidatorCCC>(*
this);
139 bool AllowInvalidDecl;
142 bool AllowNonTemplates;
149 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
150 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
152 FoundRD->isInjectedClassName() &&
156 ? diag::ext_out_of_line_qualified_id_type_names_constructor
157 : diag::err_out_of_line_qualified_id_type_names_constructor)
167enum class UnqualifiedTypeNameLookupResult {
178static UnqualifiedTypeNameLookupResult
183 return UnqualifiedTypeNameLookupResult::NotFound;
185 UnqualifiedTypeNameLookupResult FoundTypeDecl =
186 UnqualifiedTypeNameLookupResult::NotFound;
190 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
191 Base.getType().getCanonicalType())) {
194 if (!TST->isDependentType())
196 auto *TD = TST->getTemplateName().getAsTemplateDecl();
199 if (
auto *BasePrimaryTemplate =
200 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
202 BaseRD = BasePrimaryTemplate;
203 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
205 CTD->findPartialSpecialization(
Base.getType()))
214 return UnqualifiedTypeNameLookupResult::FoundNonType;
215 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
217 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
219 case UnqualifiedTypeNameLookupResult::FoundNonType:
220 return UnqualifiedTypeNameLookupResult::FoundNonType;
221 case UnqualifiedTypeNameLookupResult::FoundType:
222 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
224 case UnqualifiedTypeNameLookupResult::NotFound:
231 return FoundTypeDecl;
239 UnqualifiedTypeNameLookupResult FoundTypeDecl =
240 UnqualifiedTypeNameLookupResult::NotFound;
242 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
246 RD = dyn_cast<CXXRecordDecl>(DC);
250 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
256 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
276 bool HasTrailingDot,
ParsedType ObjectTypePtr,
277 bool IsCtorOrDtorName,
278 bool WantNontrivialTypeSourceInfo,
279 bool IsClassTemplateDeductionContext,
282 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
284 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
310 if (IsImplicitTypename) {
315 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
324 if (WantNontrivialTypeSourceInfo)
360 if (ObjectTypePtr &&
Result.empty()) {
384 switch (
Result.getResultKind()) {
387 TypeNameValidatorCCC CCC(
true, isClassName,
388 AllowDeducedTemplate);
394 bool MemberOfUnknownSpecialization;
403 if (Correction && (NNS || NewII != &II) &&
409 Template, MemberOfUnknownSpecialization))) {
411 isClassName, HasTrailingDot, ObjectTypePtr,
413 WantNontrivialTypeSourceInfo,
414 IsClassTemplateDeductionContext);
417 PDiag(diag::err_unknown_type_or_class_name_suggest)
418 <<
Result.getLookupName() << isClassName);
421 *CorrectedII = NewII;
426 Result.suppressDiagnostics();
442 Result.suppressDiagnostics();
452 Result.suppressDiagnostics();
458 Res != ResEnd; ++Res) {
467 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
479 Result.suppressDiagnostics();
490 IIDecl =
Result.getFoundDecl();
491 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
495 assert(IIDecl &&
"Didn't find decl");
498 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
504 if (FoundUsingShadow) {
508 if (!WantNontrivialTypeSourceInfo)
514 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
518 if (!WantNontrivialTypeSourceInfo)
524 TL.setNameLoc(NameLoc);
525 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
529 if (!WantNontrivialTypeSourceInfo)
535 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
539 if (!WantNontrivialTypeSourceInfo)
546 T =
Context.getTypeDeclType(TD);
547 if (!WantNontrivialTypeSourceInfo)
558 if (
auto *TD = dyn_cast_or_null<TemplateDecl>(
562 if (!ShorthandTy.
isNull())
569 if (!HasTrailingDot) {
572 if (!WantNontrivialTypeSourceInfo)
577 TL.setNameEndLoc(NameLoc);
580 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
584 }
else if (AllowDeducedTemplate) {
586 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
595 TL.setNameLoc(NameLoc);
603 Result.suppressDiagnostics();
612 auto *ND = dyn_cast<NamespaceDecl>(DC);
613 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
615 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
620 llvm_unreachable(
"something isn't in TU scope?");
631 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
632 if (MD->getParent()->hasAnyDependentBases())
640 bool IsTemplateTypeArg) {
641 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
644 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
653 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
662 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
690 R.suppressDiagnostics();
693 switch (TD->getTagKind()) {
720 if (
Context.hasSameUnqualifiedType(T,
Base.getType()))
734 bool IsTemplateName) {
739 SuggestedType =
nullptr;
743 TypeNameValidatorCCC CCC(
false,
false,
750 bool CanRecover = !IsTemplateName;
751 if (Corrected.isKeyword()) {
754 PDiag(IsTemplateName ? diag::err_no_template_suggest
755 : diag::err_unknown_typename_suggest)
757 II = Corrected.getCorrectionAsIdentifierInfo();
760 if (!SS || !SS->
isSet()) {
762 PDiag(IsTemplateName ? diag::err_no_template_suggest
763 : diag::err_unknown_typename_suggest)
766 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
767 bool DroppedSpecifier =
768 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
771 ? diag::err_no_member_template_suggest
772 : diag::err_unknown_nested_typename_suggest)
773 << II << DC << DroppedSpecifier << SS->
getRange(),
776 llvm_unreachable(
"could not have corrected a typo here");
783 if (Corrected.getCorrectionSpecifier())
788 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
789 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
802 bool MemberOfUnknownSpecialization;
804 Name,
nullptr,
true, TemplateResult,
815 Diag(IILoc, IsTemplateName ? diag::err_no_template
816 : diag::err_unknown_typename)
819 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
820 : diag::err_typename_nested_not_found)
826 unsigned DiagID = diag::err_typename_missing;
828 DiagID = diag::ext_typename_missing;
839 "Invalid scope specifier has already been diagnosed");
846 bool CheckTemplate = R.getSema().getLangOpts().CPlusPlus &&
847 NextToken.
is(tok::less);
867 StringRef FixItTagName;
868 switch (Tag->getTagKind()) {
870 FixItTagName =
"class ";
874 FixItTagName =
"enum ";
878 FixItTagName =
"struct ";
882 FixItTagName =
"__interface ";
886 FixItTagName =
"union ";
890 StringRef TagName = FixItTagName.drop_back();
891 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
892 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
897 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
912 const Token &NextToken,
917 assert(NextToken.
isNot(tok::coloncolon) &&
918 "parse nested name specifiers before calling ClassifyName");
959 bool SecondTry =
false;
960 bool IsFilteredTemplateName =
false;
963 switch (
Result.getResultKind()) {
967 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
1013 if (!SecondTry && CCC) {
1018 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1019 unsigned QualifiedDiag = diag::err_no_member_suggest;
1022 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1025 UnqualifiedDiag = diag::err_no_template_suggest;
1026 QualifiedDiag = diag::err_no_member_template_suggest;
1027 }
else if (UnderlyingFirstDecl &&
1031 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1032 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1038 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1039 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1040 Name->
getName() == CorrectedStr;
1043 << DroppedSpecifier << SS.
getRange());
1047 Name = Corrected.getCorrectionAsIdentifierInfo();
1050 if (Corrected.isKeyword())
1056 Result.setLookupName(Corrected.getCorrection());
1078 Result.suppressDiagnostics();
1120 if (!
Result.isAmbiguous()) {
1121 IsFilteredTemplateName =
true;
1131 (IsFilteredTemplateName ||
1147 if (!IsFilteredTemplateName)
1150 bool IsFunctionTemplate;
1154 IsFunctionTemplate =
true;
1157 }
else if (!
Result.empty()) {
1165 dyn_cast<UsingShadowDecl>(*
Result.begin());
1166 assert(!FoundUsingShadow ||
1175 IsFunctionTemplate =
true;
1179 if (IsFunctionTemplate) {
1183 Result.suppressDiagnostics();
1195 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1207 TTL.setNameLoc(NameLoc);
1234 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1235 Class = Alias->getClassInterface();
1241 if (NextToken.
is(tok::period)) {
1244 Result.suppressDiagnostics();
1254 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1260 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1273 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1274 if ((NextToken.
is(tok::identifier) ||
1276 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1288 if (
Result.isSingleResult() && !ADL &&
1293 Result.suppressDiagnostics();
1313 bool IsAddressOfOperand) {
1316 NameInfo, IsAddressOfOperand,
1323 const Token &NextToken) {
1325 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1341 if ((*ULE->decls_begin())->isCXXClassMember()) {
1343 SS.
Adopt(ULE->getQualifierLoc());
1348 Result.setNamingClass(ULE->getNamingClass());
1349 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1350 Result.addDecl(*I, I.getAccess());
1383 "The next DeclContext should be lexically contained in the current one.");
1389 assert(
CurContext &&
"DeclContext imbalance!");
1392 assert(
CurContext &&
"Popped translation unit!");
1402 assert(
CurContext &&
"skipping definition of undefined tag");
1430 assert(!S->
getEntity() &&
"scope already has entity");
1463 "expected to be initializing a template parameter scope");
1491 cast<Decl>(DC)->getDescribedTemplateParams()) {
1492 unsigned DCDepth = TPL->getDepth() + 1;
1493 if (DCDepth > ScopeDepth)
1495 if (ScopeDepth == DCDepth)
1514 "The next DeclContext should be lexically contained in the current one.");
1518 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1521 if (Param->getIdentifier()) {
1531 assert(
CurContext &&
"DeclContext imbalance!");
1533 assert(
CurContext &&
"Popped translation unit!");
1547 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1562 return ND->
hasAttr<OverloadableAttr>();
1565 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1600 for (; I != IEnd; ++I) {
1633 bool AllowInlineNamespace)
const {
1634 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1641 if (ScopeDC->getPrimaryContext() == TargetDC)
1653 bool ConsiderLinkage,
1654 bool AllowInlineNamespace) {
1672 if (
auto *VD = dyn_cast<VarDecl>(D))
1674 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1676 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1690 if (
New->getFriendObjectKind() &&
1731 if (NewIsModuleInterface || OldIsModuleInterface) {
1735 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1737 << NewIsModuleInterface
1739 << OldIsModuleInterface
1742 New->setInvalidDecl();
1755 if (!
New->getLexicalDeclContext()
1756 ->getNonTransparentContext()
1757 ->isFileContext() ||
1763 bool IsNewExported =
New->isInExportDeclContext();
1767 if (!IsNewExported && !IsOldExported)
1779 New->getOwningModule()->isImplicitGlobalModule())
1782 assert(IsNewExported);
1790 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1808 "New and Old are not the same definition, we should diagnostic it "
1809 "immediately instead of checking it.");
1812 "We shouldn't see unreachable definitions here.");
1860 return OldM == NewM;
1897 return CD->isCopyConstructor();
1904 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1905 if (!RD->hasNameForLinkage())
1934 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1940 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1943 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1948 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1952 if (FD->doesThisDeclarationHaveABody() &&
1953 Context.DeclMustBeEmitted(FD))
1955 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1962 if (
Context.DeclMustBeEmitted(VD))
1965 if (VD->isStaticDataMember() &&
1968 if (VD->isStaticDataMember() &&
1970 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1973 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1982 return mightHaveNonExternalLinkage(D);
1989 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1995 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2010 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2014 bool IsAllIgnored =
true;
2015 for (
const auto *BD : DD->bindings()) {
2016 if (BD->isReferenced())
2018 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2019 BD->hasAttr<UnusedAttr>());
2032 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2042 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2045 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2046 if (!WithinFunction)
2057 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2060 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2061 Init = Cleanups->getSubExpr();
2063 const auto *Ty = VD->getType().getTypePtr();
2068 if (TT->getDecl()->hasAttr<UnusedAttr>())
2074 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2075 MTE && MTE->getExtendingDecl()) {
2076 Ty = VD->getType().getNonReferenceType().getTypePtr();
2077 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2082 if (Ty->isIncompleteType() || Ty->isDependentType())
2087 Ty = Ty->getBaseElementTypeUnsafe();
2089 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2090 if (Tag->hasAttr<UnusedAttr>())
2093 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2094 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2098 const auto *Construct =
2099 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2100 if (Construct && !Construct->isElidable()) {
2102 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2103 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2109 if (
Init->isTypeDependent()) {
2111 if (!Ctor->isTrivial())
2152 for (
auto *TmpD : D->
decls()) {
2153 if (
const auto *T = dyn_cast<TypedefNameDecl>(TmpD))
2155 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2169 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2181 DiagID = diag::warn_unused_exception_param;
2183 DiagID = diag::warn_unused_label;
2185 DiagID = diag::warn_unused_variable;
2204 if (Ty->isReferenceType() || Ty->isDependentType())
2207 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2208 if (Tag->hasAttr<UnusedAttr>())
2212 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2213 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)
2250 unsigned DiagID =
isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2251 : diag::warn_unused_but_set_variable;
2261 bool Diagnose =
false;
2265 Diagnose = L->
getStmt() ==
nullptr;
2276 "Scope shouldn't contain decls!");
2283 std::optional<SourceLocation> PreviousDeclLoc;
2288 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2293 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2296 for (
auto *TmpD : S->
decls()) {
2297 assert(TmpD &&
"This decl didn't get pushed??");
2305 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2307 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2316 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2327 auto ShadowI = ShadowingDecls.find(D);
2328 if (ShadowI != ShadowingDecls.end()) {
2329 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2330 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2331 PDiag(diag::warn_ctor_parm_shadows_field)
2332 << D << FD << FD->getParent());
2334 ShadowingDecls.erase(ShadowI);
2338 llvm::sort(DeclDiags,
2339 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2344 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2346 for (
const LocAndDiag &D : DeclDiags) {
2348 if (D.PreviousDeclLoc)
2349 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2373 return "ucontext.h";
2375 llvm_unreachable(
"unhandled error kind");
2386 Parent->
addDecl(CLinkageDecl);
2387 Parent = CLinkageDecl;
2391 if (
Context.BuiltinInfo.isImmediate(ID)) {
2393 "consteval builtins should only be available in C++20 mode");
2402 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2408 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2411 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2413 Params.push_back(parm);
2415 New->setParams(Params);
2423 Scope *S,
bool ForRedeclaration,
2430 if (!ForRedeclaration)
2436 Context.BuiltinInfo.allowTypeMismatch(ID))
2442 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2443 <<
Context.BuiltinInfo.getName(ID);
2449 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2451 <<
Context.BuiltinInfo.getName(ID);
2455 if (!ForRedeclaration &&
2456 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2457 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2458 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2459 : diag::ext_implicit_lib_function_decl)
2460 <<
Context.BuiltinInfo.getName(ID) << R;
2461 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2462 Diag(Loc, diag::note_include_header_or_declare)
2463 << Header <<
Context.BuiltinInfo.getName(ID);
2499 while (Filter.hasNext()) {
2508 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2510 Decl->getUnderlyingType()))
2515 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2516 Decl->getAnonDeclWithTypedefName())
2528 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2529 OldType = OldTypedef->getUnderlyingType();
2531 OldType =
Context.getTypeDeclType(Old);
2537 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2541 New->setInvalidDecl();
2545 if (OldType != NewType &&
2548 !
Context.hasSameType(OldType, NewType)) {
2550 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2551 << Kind << NewType << OldType;
2554 New->setInvalidDecl();
2564 if (
New->isInvalidDecl())
return;
2570 switch (TypeID->getLength()) {
2574 if (!TypeID->isStr(
"id"))
2577 if (!T->isPointerType())
2579 if (!T->isVoidPointerType()) {
2584 Context.setObjCIdRedefinitionType(T);
2586 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2591 if (!TypeID->isStr(
"Class"))
2593 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2595 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2599 if (!TypeID->isStr(
"SEL"))
2601 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2603 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2613 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2614 <<
New->getDeclName();
2620 return New->setInvalidDecl();
2625 return New->setInvalidDecl();
2627 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2628 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2629 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2632 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2636 if (OldTD->isModed())
2637 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2638 OldTD->getUnderlyingType());
2640 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2696 Diag(
New->getLocation(), diag::err_redefinition)
2697 <<
New->getDeclName();
2699 return New->setInvalidDecl();
2714 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2717 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2718 <<
New->getDeclName();
2725 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2727 for (
auto *ECD : ED->enumerators()) {
2738 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2739 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2740 for (
const auto *i : D->
attrs())
2741 if (i->getKind() == A->
getKind()) {
2757 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2758 return VD->isThisDeclarationADefinition();
2759 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2760 return TD->isCompleteDefinition() || TD->isBeingDefined();
2771 AlignedAttr *OldAlignasAttr =
nullptr;
2772 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2773 unsigned OldAlign = 0;
2781 if (I->isAlignmentDependent())
2787 unsigned Align = I->getAlignment(S.
Context);
2788 if (Align > OldAlign) {
2790 OldStrictestAlignAttr = I;
2795 AlignedAttr *NewAlignasAttr =
nullptr;
2796 unsigned NewAlign = 0;
2797 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2798 if (I->isAlignmentDependent())
2804 unsigned Align = I->getAlignment(S.
Context);
2805 if (Align > NewAlign)
2809 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2817 if (OldAlign == 0 || NewAlign == 0) {
2830 if (OldAlign != NewAlign) {
2831 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2834 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2847 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2849 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2853 bool AnyAdded =
false;
2856 if (OldAlign > NewAlign) {
2857 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2858 Clone->setInherited(
true);
2859 New->addAttr(Clone);
2864 if (OldAlignasAttr && !NewAlignasAttr &&
2865 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2866 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2867 Clone->setInherited(
true);
2868 New->addAttr(Clone);
2875#define WANT_DECL_MERGE_LOGIC
2876#include "clang/Sema/AttrParsedAttrImpl.inc"
2877#undef WANT_DECL_MERGE_LOGIC
2884 if (!DiagnoseMutualExclusions(S, D,
Attr))
2895 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2897 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2898 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2899 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2900 AA->getPriority(), AA->getEnvironment());
2901 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2903 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2905 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2907 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2909 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2911 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2912 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2914 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2916 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2917 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2919 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2921 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2923 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2925 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2927 IA->getInheritanceModel());
2928 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2937 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2939 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2941 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2943 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2954 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2955 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2956 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2958 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2960 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2962 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2964 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2966 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2969 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2972 WS->getSpelledArgsCount());
2973 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2975 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2980 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2984 else if (
const auto *PA = dyn_cast<PersonalityAttr>(
Attr))
2999 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
3000 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
3004 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
3010 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
3012 if (FD->isDefined(Def,
true))
3019 for (
const auto *Attribute : D->
attrs())
3020 if (Attribute->getKind() == Kind)
3028 if (!
New->hasAttrs())
3032 if (!Def || Def ==
New)
3036 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3037 Attr *NewAttribute = NewAttributes[I];
3046 NewAttributes.erase(NewAttributes.begin() + I);
3054 ? diag::err_alias_after_tentative
3055 : diag::err_redefinition;
3057 if (
Diag == diag::err_redefinition)
3067 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3103 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3104 if (AA->isAlignas()) {
3115 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3117 NewAttributes.erase(NewAttributes.begin() + I);
3127 diag::err_loader_uninitialized_redeclaration);
3129 NewAttributes.erase(NewAttributes.begin() + I);
3152 diag::err_sycl_entry_point_after_definition)
3165 diag::warn_attribute_precede_definition);
3167 NewAttributes.erase(NewAttributes.begin() + I);
3173 const ConstInitAttr *CIAttr,
3174 bool AttrBeforeInit) {
3181 std::string SuitableSpelling;
3183 SuitableSpelling = std::string(
3185 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3187 InsertLoc, {tok::l_square, tok::l_square,
3188 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3189 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3190 tok::r_square, tok::r_square}));
3191 if (SuitableSpelling.empty())
3193 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3194 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3195 tok::r_paren, tok::r_paren}));
3196 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3197 SuitableSpelling =
"constinit";
3198 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3199 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3200 if (SuitableSpelling.empty())
3201 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3202 SuitableSpelling +=
" ";
3204 if (AttrBeforeInit) {
3207 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3210 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3214 S.
Diag(CIAttr->getLocation(),
3215 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3216 : diag::warn_require_const_init_added_too_late)
3219 << CIAttr->isConstinit()
3227 UsedAttr *NewAttr = OldAttr->clone(
Context);
3228 NewAttr->setInherited(
true);
3229 New->addAttr(NewAttr);
3232 RetainAttr *NewAttr = OldAttr->clone(
Context);
3233 NewAttr->setInherited(
true);
3234 New->addAttr(NewAttr);
3243 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3244 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3245 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3253 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3256 if (InitDecl == NewVD) {
3260 if (OldConstInit && OldConstInit->isConstinit())
3263 }
else if (NewConstInit) {
3267 if (InitDecl && InitDecl != NewVD) {
3270 NewVD->dropAttr<ConstInitAttr>();
3278 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3279 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3280 if (!OldA->isEquivalent(NewA)) {
3282 Diag(
New->getLocation(), diag::err_different_asm_label);
3283 Diag(OldA->getLocation(), diag::note_previous_declaration);
3285 }
else if (Old->
isUsed()) {
3288 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3294 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3295 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3296 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3297 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3298 Diag(NewAbiTagAttr->getLocation(),
3299 diag::err_new_abi_tag_on_redeclaration)
3301 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3305 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3311 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3312 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3314 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3321 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3322 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3324 Diag(
New->getLocation(), diag::warn_mismatched_section)
3332 bool foundAny =
New->hasAttrs();
3362 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3375 if (!foundAny)
New->dropAttrs();
3380 checkAttrIsTypeDependent(D, A);
3391 newAttr->setInherited(
true);
3413 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3428 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3429 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3430 S.
Diag(CDA->getLocation(),
3431 diag::err_carries_dependency_missing_on_first_decl) << 1;
3439 diag::note_carries_dependency_missing_first_decl) << 1;
3458 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3459 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3467 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3499 if (*Oldnullability != *Newnullability) {
3500 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3517 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3518 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3519 if (OldParamDT && NewParamDT &&
3520 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3521 QualType OldParamOT = OldParamDT->getOriginalType();
3522 QualType NewParamOT = NewParamDT->getOriginalType();
3525 << NewParam << NewParamOT;
3536struct GNUCompatibleParamWarning {
3537 ParmVarDecl *OldParm;
3538 ParmVarDecl *NewParm;
3539 QualType PromotedType;
3546template <
typename T>
3547static std::pair<diag::kind, SourceLocation>
3551 if (Old->isThisDeclarationADefinition())
3552 PrevDiag = diag::note_previous_definition;
3553 else if (Old->isImplicit()) {
3554 PrevDiag = diag::note_previous_implicit_declaration;
3555 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3556 if (FD->getBuiltinID())
3557 PrevDiag = diag::note_previous_builtin_declaration;
3560 OldLocation =
New->getLocation();
3562 PrevDiag = diag::note_previous_declaration;
3563 return std::make_pair(PrevDiag, OldLocation);
3571 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3572 !LangOpts.CPlusPlus &&
3578 const AttributedType *AT = T->getAs<AttributedType>();
3579 while (AT && !AT->isCallingConv())
3580 AT = AT->getModifiedType()->getAs<AttributedType>();
3584template <
typename T>
3598template<
typename T>
static bool isExternC(T *D) {
return D->isExternC(); }
3605template<
typename ExpectedDecl>
3627 !Old->getDeclContext()->getRedeclContext()->Equals(
3628 New->getDeclContext()->getRedeclContext()) &&
3633 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3646 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3647 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3650 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3651 AttrA->isDynamic() == AttrB->isDynamic();
3677 if (NamedDC->Equals(SemaDC))
3680 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3682 "unexpected context for redeclaration");
3693 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3694 FixSemaDC(FD->getDescribedFunctionTemplate());
3695 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3696 FixSemaDC(VD->getDescribedVarTemplate());
3700 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3708 Diag(
New->getLocation(), diag::err_using_decl_friend);
3709 Diag(Shadow->getTargetDecl()->getLocation(),
3710 diag::note_using_decl_target);
3711 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3719 New->getDescribedFunctionTemplate()) {
3731 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3732 <<
New->getDeclName();
3756 std::tie(PrevDiag, OldLocation) =
3766 !
New->getTemplateSpecializationInfo() &&
3769 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3770 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3772 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3773 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3778 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3779 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3780 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3783 New->dropAttr<InternalLinkageAttr>();
3786 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3787 if (!Old->
hasAttr<ErrorAttr>()) {
3788 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3790 New->dropAttr<ErrorAttr>();
3798 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3799 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3800 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3809 const Decl *DiagOld = Old;
3811 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3812 const auto *A = D->getAttr<OverloadableAttr>();
3813 return A && !A->isImplicit();
3822 diag::note_attribute_overloadable_prev_overload)
3826 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3828 New->dropAttr<OverloadableAttr>();
3835 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3837 Diag(OldLocation, diag::note_previous_declaration);
3860 bool RequiresAdjustment =
false;
3862 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3868 if (!NewCCExplicit) {
3872 RequiresAdjustment =
true;
3880 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3884 RequiresAdjustment =
true;
3888 Diag(
New->getLocation(), diag::err_cconv_change)
3891 << (!FirstCCExplicit ?
"" :
3895 Diag(
First->getLocation(), diag::note_previous_declaration);
3903 RequiresAdjustment =
true;
3915 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3916 FPT2->getParamTypes(), EPI2);
3918 New->setType(NewQType);
3927 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3930 Diag(OldLocation, diag::note_previous_declaration);
3935 RequiresAdjustment =
true;
3941 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3942 <<
"'ns_returns_retained'";
3943 Diag(OldLocation, diag::note_previous_declaration);
3948 RequiresAdjustment =
true;
3954 AnyX86NoCallerSavedRegistersAttr *
Attr =
3955 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3956 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3957 Diag(OldLocation, diag::note_previous_declaration);
3962 RequiresAdjustment =
true;
3965 if (RequiresAdjustment) {
3969 NewQType =
Context.getCanonicalType(
New->getType());
3974 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3982 if (
New->hasAttr<GNUInlineAttr>() &&
3991 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
3992 <<
New->getDeclName();
3993 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3997 QualType OldQTypeForComparison = OldQType;
3998 if (
Context.hasAnyFunctionEffects()) {
4000 const auto NewFX =
New->getFunctionEffects();
4001 if (OldFX != NewFX) {
4003 for (
const auto &Diff : Diffs) {
4004 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
4006 diag::warn_mismatched_func_effect_redeclaration)
4007 << Diff.effectName();
4018 if (!MergeErrs.empty())
4025 NewFPT->getParamTypes(), EPI);
4027 New->setType(ModQT);
4028 NewQType =
New->getType();
4033 EPI = OldFPT->getExtProtoInfo();
4035 OldQTypeForComparison =
Context.getFunctionType(
4036 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4038 if (OldFX.empty()) {
4049 NewQType =
Context.getCanonicalType(
New->getType());
4057 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4058 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4060 OldDeclaredReturnType)) {
4065 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4067 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4068 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4069 <<
New <<
New->getReturnTypeSourceRange();
4071 !Old->
hasAttr<OverloadableAttr>() &&
4072 !
New->hasAttr<OverloadableAttr>())
4073 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4075 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4076 <<
New->getReturnTypeSourceRange();
4077 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4087 if (OldReturnType != NewReturnType) {
4091 if (OldAT && OldAT->isDeduced()) {
4092 QualType DT = OldAT->getDeducedType();
4103 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4105 if (OldMethod && NewMethod) {
4112 bool IsClassScopeExplicitSpecialization =
4118 !IsClassScopeExplicitSpecialization) {
4123 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4124 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4135 NewDiag = diag::err_constructor_redeclared;
4137 NewDiag = diag::err_destructor_redeclared;
4139 NewDiag = diag::err_conv_function_redeclared;
4141 NewDiag = diag::err_member_redeclared;
4143 Diag(
New->getLocation(), NewDiag);
4145 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4146 <<
New <<
New->getType();
4148 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4161 diag::err_definition_of_implicitly_declared_member)
4167 diag::err_definition_of_explicitly_defaulted_member)
4190 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4191 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4192 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4201 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4202 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4203 Diag(CDA->getLocation(),
4204 diag::err_carries_dependency_missing_on_first_decl) << 0;
4206 diag::note_carries_dependency_missing_first_decl) << 0;
4214 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4215 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4216 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4231 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4245 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4246 Diag(OldLocation, PrevDiag);
4248 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4249 Diag(OldLocation, PrevDiag);
4256 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4264 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4274 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4302 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4306 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4324 if (
New->hasWrittenPrototype()) {
4336 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4337 if (WithoutProto ==
New)
4338 IsWithoutProtoADef = NewDeclIsDefn;
4340 IsWithProtoADef = NewDeclIsDefn;
4342 diag::warn_non_prototype_changes_behavior)
4343 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4344 << (WithoutProto == Old) << IsWithProtoADef;
4354 !IsWithoutProtoADef)
4360 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4365 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4368 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4369 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4370 OldProto->getParamTypes(),
4371 OldProto->getExtProtoInfo());
4372 New->setType(NewQType);
4373 New->setHasInheritedPrototype();
4377 for (
const auto &ParamType : OldProto->param_types()) {
4380 ParamType,
nullptr,
SC_None,
nullptr);
4381 Param->setScopeInfo(0, Params.size());
4382 Param->setImplicit();
4383 Params.push_back(Param);
4386 New->setParams(Params);
4395 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4422 NewProto->getReturnType());
4423 bool LooseCompatible = !MergedReturn.isNull();
4425 LooseCompatible && Idx != End; ++Idx) {
4429 NewProto->getParamType(Idx))) {
4430 ArgTypes.push_back(NewParm->
getType());
4434 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4435 NewProto->getParamType(Idx) };
4436 Warnings.push_back(Warn);
4437 ArgTypes.push_back(NewParm->
getType());
4439 LooseCompatible =
false;
4442 if (LooseCompatible) {
4443 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4444 Diag(Warnings[Warn].NewParm->getLocation(),
4445 diag::ext_param_promoted_not_compatible_with_prototype)
4446 << Warnings[Warn].PromotedType
4447 << Warnings[Warn].OldParm->getType();
4448 if (Warnings[Warn].OldParm->getLocation().isValid())
4449 Diag(Warnings[Warn].OldParm->getLocation(),
4450 diag::note_previous_declaration);
4453 if (MergeTypeWithOld)
4454 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4471 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4472 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4473 Diag(OldLocation, diag::note_previous_builtin_declaration)
4478 PrevDiag = diag::note_previous_builtin_declaration;
4481 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4482 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4487 Scope *S,
bool MergeTypeWithOld) {
4493 New->setIsPureVirtual();
4502 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4516 if (!Merged.isNull() && MergeTypeWithOld)
4517 New->setType(Merged);
4541 ni != ne && oi != oe; ++ni, ++oi)
4550 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4551 ? diag::err_redefinition_different_type
4552 : diag::err_redeclaration_different_type)
4557 std::tie(PrevDiag, OldLocation)
4559 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4560 New->setInvalidDecl();
4564 bool MergeTypeWithOld) {
4570 if (
New->getType()->isUndeducedType()) {
4592 QualType PrevVDTy = PrevVD->getType();
4596 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4604 MergedT =
New->getType();
4615 else if (
New->getType()->isObjCObjectPointerType() &&
4617 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4632 if ((
New->getType()->isDependentType() ||
4637 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4646 if (MergeTypeWithOld)
4647 New->setType(MergedT);
4681 if (
New->isInvalidDecl())
4694 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4698 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4700 return New->setInvalidDecl();
4702 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4705 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4707 return New->setInvalidDecl();
4711 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4712 <<
New->getDeclName();
4714 New->getLocation());
4715 return New->setInvalidDecl();
4727 return New->setInvalidDecl();
4734 Diag(
New->getLocation(), diag::err_duplicate_member)
4735 <<
New->getIdentifier();
4737 New->setInvalidDecl();
4743 if (
New->hasAttr<WeakImportAttr>())
4746 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4749 New->dropAttr<WeakImportAttr>();
4754 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4755 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4756 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4759 New->dropAttr<InternalLinkageAttr>();
4764 if (MostRecent != Old) {
4767 if (
New->isInvalidDecl())
4772 if (
New->isInvalidDecl())
4777 std::tie(PrevDiag, OldLocation) =
4782 !
New->isStaticDataMember() &&
4785 Diag(
New->getLocation(), diag::ext_static_non_static)
4786 <<
New->getDeclName();
4787 Diag(OldLocation, PrevDiag);
4789 Diag(
New->getLocation(), diag::err_static_non_static)
4790 <<
New->getDeclName();
4791 Diag(OldLocation, PrevDiag);
4792 return New->setInvalidDecl();
4806 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4807 !
New->isStaticDataMember() &&
4809 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4810 Diag(OldLocation, PrevDiag);
4811 return New->setInvalidDecl();
4815 if (
New->hasExternalStorage() &&
4817 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4818 Diag(OldLocation, PrevDiag);
4819 return New->setInvalidDecl();
4822 !
New->hasExternalStorage()) {
4823 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4824 Diag(OldLocation, PrevDiag);
4825 return New->setInvalidDecl();
4835 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4838 !
New->getLexicalDeclContext()->isRecord())) {
4839 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4840 Diag(OldLocation, PrevDiag);
4841 return New->setInvalidDecl();
4849 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4850 Diag(Def->getLocation(), diag::note_previous_definition);
4864 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4865 Diag(OldLocation, PrevDiag);
4866 }
else if (!
New->getTLSKind()) {
4867 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4868 Diag(OldLocation, PrevDiag);
4874 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4876 Diag(OldLocation, PrevDiag);
4886 diag::warn_deprecated_redundant_constexpr_static_def);
4899 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4906 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4907 Diag(OldLocation, PrevDiag);
4908 New->setInvalidDecl();
4917 New->setPreviousDecl(Old);
4927 New->setImplicitlyInline();
4932 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4934 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4935 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4936 auto &HSI =
PP.getHeaderSearchInfo();
4937 StringRef HdrFilename =
4940 auto noteFromModuleOrInclude = [&](
Module *Mod,
4946 if (IncLoc.isValid()) {
4948 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4954 Diag(IncLoc, diag::note_redefinition_include_same_file)
4955 << HdrFilename.str();
4965 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4973 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4989 New->getDescribedVarTemplate() ||
New->getNumTemplateParameterLists() ||
4990 New->getDeclContext()->isDependentContext() ||
4991 New->hasAttr<SelectAnyAttr>())) {
4994 New->demoteThisDefinitionToDeclaration();
5002 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
5004 New->setInvalidDecl();
5030 if (!
Context.getLangOpts().CPlusPlus)
5036 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5039 Context.getManglingNumberContext(Tag->getParent());
5048 Decl *ManglingContextDecl;
5049 std::tie(MCtx, ManglingContextDecl) =
5059struct NonCLikeKind {
5071 explicit operator bool() {
return Kind !=
None; }
5079 return {NonCLikeKind::Invalid, {}};
5086 return {NonCLikeKind::BaseClass,
5098 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5099 if (FD->hasInClassInitializer()) {
5100 auto *
Init = FD->getInClassInitializer();
5101 return {NonCLikeKind::DefaultMemberInit,
5117 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5125 if (MemberRD->isLambda())
5126 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5130 if (MemberRD->isThisDeclarationADefinition()) {
5136 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5153 Context.getCanonicalTagType(TagFromDeclSpec))) {
5155 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5166 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5170 if (NonCLike || ChangesLinkage) {
5171 if (NonCLike.Kind == NonCLikeKind::Invalid)
5174 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5175 if (ChangesLinkage) {
5177 if (NonCLike.Kind == NonCLikeKind::None)
5178 DiagID = diag::err_typedef_changes_linkage;
5180 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5186 TextToInsert +=
' ';
5189 Diag(FixitLoc, DiagID)
5192 if (NonCLike.Kind != NonCLikeKind::None) {
5193 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5194 << NonCLike.Kind - 1 << NonCLike.Range;
5197 << NewTD << isa<TypeAliasDecl>(NewTD);
5222 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5223 if (ED->isScopedUsingClassTag())
5230 llvm_unreachable(
"unexpected type specifier");
5238 bool IsExplicitInstantiation,
5241 Decl *TagD =
nullptr;
5259 Tag = CTD->getTemplatedDecl();
5264 Tag->setFreeStanding();
5265 if (Tag->isInvalidDecl())
5274 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5311 "Friend ellipsis but not friend-specified?");
5314 bool DeclaresAnything =
true;
5318 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5321 Record->getDeclContext()->isRecord()) {
5335 DeclaresAnything =
false;
5354 if ((Tag && Tag->getDeclName()) ||
5364 DeclaresAnything =
false;
5376 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5377 !
Enum->isInvalidDecl())
5378 DeclaresAnything =
false;
5386 DeclaresAnything =
false;
5390 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5392 << Tag->getTagKind()
5405 if (!DeclaresAnything) {
5408 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5409 ? diag::err_no_declarators
5410 : diag::ext_no_declarators)
5423 unsigned DiagID = diag::warn_standalone_specifier;
5425 DiagID = diag::ext_standalone_specifier;
5466 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5467 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5469 DiagnosticId = diag::warn_attribute_ignored;
5470 else if (AL.isRegularKeywordAttribute())
5471 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5473 DiagnosticId = diag::warn_declspec_attribute_ignored;
5474 Diag(AL.getLoc(), DiagnosticId)
5478 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5479 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5502 NamedDecl *PrevDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
5503 assert(PrevDecl &&
"Expected a non-null Decl");
5516 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5518 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5524 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5534 if (
Record->isAnonymousStructOrUnion())
5539 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5573 for (
auto *D : AnonRecord->
decls()) {
5596 unsigned OldChainingSize = Chaining.size();
5598 Chaining.append(IF->chain_begin(), IF->chain_end());
5600 Chaining.push_back(VD);
5602 assert(Chaining.size() >= 2);
5605 for (
unsigned i = 0; i < Chaining.size(); i++)
5606 NamedChain[i] = Chaining[i];
5610 VD->
getType(), {NamedChain, Chaining.size()});
5624 Chaining.resize(OldChainingSize);
5638 "Parser allowed 'typedef' as storage class VarDecl.");
5639 switch (StorageClassSpec) {
5653 llvm_unreachable(
"unknown storage class specifier");
5657 assert(
Record->hasInClassInitializer());
5659 for (
const auto *I :
Record->decls()) {
5660 const auto *FD = dyn_cast<FieldDecl>(I);
5661 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5662 FD = IFD->getAnonField();
5663 if (FD && FD->hasInClassInitializer())
5664 return FD->getLocation();
5667 llvm_unreachable(
"couldn't find in-class initializer");
5675 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5695 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5697 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5699 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5705 const char *PrevSpec =
nullptr;
5717 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5722 PrevSpec, DiagID, Policy);
5730 diag::err_anonymous_union_with_storage_spec)
5736 PrevSpec, DiagID,
Context.getPrintingPolicy());
5744 <<
Record->isUnion() <<
"const"
5748 diag::ext_anonymous_struct_union_qualified)
5749 <<
Record->isUnion() <<
"volatile"
5753 diag::ext_anonymous_struct_union_qualified)
5754 <<
Record->isUnion() <<
"restrict"
5758 diag::ext_anonymous_struct_union_qualified)
5759 <<
Record->isUnion() <<
"_Atomic"
5763 diag::ext_anonymous_struct_union_qualified)
5764 <<
Record->isUnion() <<
"__unaligned"
5774 for (
auto *Mem :
Record->decls()) {
5776 if (Mem->isInvalidDecl())
5779 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5783 assert(FD->getAccess() !=
AS_none);
5785 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5797 }
else if (Mem->isImplicit()) {
5804 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5805 if (!MemRecord->isAnonymousStructOrUnion() &&
5806 MemRecord->getDeclName()) {
5809 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5813 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5821 Diag(MemRecord->getLocation(),
5822 diag::ext_anonymous_record_with_anonymous_type)
5832 unsigned DK = diag::err_anonymous_record_bad_member;
5834 DK = diag::err_anonymous_record_with_type;
5836 DK = diag::err_anonymous_record_with_function;
5838 DK = diag::err_anonymous_record_with_static;
5842 DK == diag::err_anonymous_record_with_type)
5843 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5846 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5862 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5883 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5887 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5903 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5909 Record->getLocation(),
nullptr,
5925 Record->setAnonymousStructOrUnion(
true);
5936 Chain.push_back(Anon);
5942 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5945 Decl *ManglingContextDecl;
5946 std::tie(MCtx, ManglingContextDecl) =
5965 assert(
Record &&
"expected a record!");
5970 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5978 nullptr, RecTy, TInfo,
5990 Chain.push_back(Anon);
5994 diag::err_field_incomplete_or_sizeless) ||
5999 ParentDecl->setInvalidDecl();
6036 diag::err_deduction_guide_name_not_class_template)
6056 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6066 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6067 Context.getCanonicalType(Ty)));
6078 Context.getCanonicalType(Ty)));
6099 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6111 Context.getCanonicalType(Ty)));
6119 return Context.getNameForTemplate(TName, TNameLoc);
6124 llvm_unreachable(
"Unknown name kind");
6152 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6157 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6165 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6166 (DeclTyName && DeclTyName == DefTyName))
6167 Params.push_back(Idx);
6194#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6195#include "clang/Basic/TransformTypeTraits.def"
6200 if (T.isNull() || !T->isInstantiationDependentType())
break;
6210 if (!TSI)
return true;
6223 if (Result.isInvalid())
return true;
6268 << D << static_cast<int>(Status);
6279 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6280 llvm::omp::TraitProperty::
6281 implementation_extension_bind_to_declaration))
6306 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6317 bool IsMemberSpecialization) {
6318 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6319 "without nested-name-specifier");
6335 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6336 : diag::err_member_extra_qualification)
6340 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6348 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6350 Diag(Loc, diag::err_member_qualification)
6353 Diag(Loc, diag::err_invalid_declarator_global_scope)
6356 Diag(Loc, diag::err_invalid_declarator_in_function)
6359 Diag(Loc, diag::err_invalid_declarator_in_block)
6363 Diag(Loc, diag::err_export_non_namespace_scope_name)
6370 Diag(Loc, diag::err_invalid_declarator_scope)
6378 Diag(Loc, diag::err_member_qualification)
6405 Diag(Loc, diag::ext_template_after_declarative_nns)
6410 TL = std::exchange(NextTL,
TypeLoc())) {
6412 switch (TL.getTypeLocClass()) {
6413 case TypeLoc::TemplateSpecialization: {
6415 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6416 if (
auto *T = TST.getTypePtr(); T->isDependentType() && T->isTypeAlias())
6417 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6418 << TST.getLocalSourceRange();
6421 case TypeLoc::Decltype:
6422 case TypeLoc::PackIndexing: {
6423 const Type *T = TL.getTypePtr();
6430 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6431 << T->isDecltypeType() << TL.getSourceRange();
6434 case TypeLoc::DependentName:
6441 if (TemplateKeywordLoc.
isValid())
6442 Diag(Loc, diag::ext_template_after_declarative_nns)
6483 diag::err_template_qualified_declarator_no_match)
6490 if (!IsDependentContext &&
6497 diag::err_member_def_undefined_record)
6518 if (EnteringContext && IsDependentContext &&
6519 TemplateParamLists.size() != 0) {
6538 bool IsLinkageLookup =
false;
6539 bool CreateBuiltins =
false;
6552 R->isFunctionType())) {
6553 IsLinkageLookup =
true;
6555 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6556 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6558 CreateBuiltins =
true;
6560 if (IsLinkageLookup) {
6602 bool AllowForCompatibility =
false;
6605 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6606 TemplateParamParent->isDeclScope(TPD);
6609 AllowForCompatibility);
6626 (TemplateParamLists.size() == 0 || R->isFunctionType()))
6639 bool AddToScope =
true;
6641 if (TemplateParamLists.size()) {
6647 }
else if (R->isFunctionType()) {
6663 if (
New->getDeclName() && AddToScope)
6666 if (
OpenMP().isInOpenMPDeclareTargetContext())
6677 bool &SizeIsNegative,
6678 llvm::APSInt &Oversized) {
6683 SizeIsNegative =
false;
6686 if (T->isDependentType())
6692 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6697 if (FixedType.
isNull())
return FixedType;
6698 FixedType = Context.getPointerType(FixedType);
6699 return Qs.
apply(Context, FixedType);
6701 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6702 QualType Inner = PTy->getInnerType();
6706 if (FixedType.
isNull())
return FixedType;
6707 FixedType = Context.getParenType(FixedType);
6708 return Qs.
apply(Context, FixedType);
6718 SizeIsNegative, Oversized);
6728 llvm::APSInt Res = Result.Val.getInt();
6731 if (Res.isSigned() && Res.isNegative()) {
6732 SizeIsNegative =
true;
6737 unsigned ActiveSizeBits =
6741 : Res.getActiveBits();
6743 Oversized = std::move(Res);
6747 QualType FoldedArrayType = Context.getConstantArrayType(
6749 return Qs.
apply(Context, FoldedArrayType);
6774 TypeLoc DstElemTL = DstATL.getElementLoc();
6793 bool &SizeIsNegative,
6794 llvm::APSInt &Oversized) {
6797 SizeIsNegative, Oversized);
6800 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6808 unsigned FailedFoldDiagID) {
6809 bool SizeIsNegative;
6810 llvm::APSInt Oversized;
6812 TInfo,
Context, SizeIsNegative, Oversized);
6814 Diag(Loc, diag::ext_vla_folded_to_constant);
6821 Diag(Loc, diag::err_typecheck_negative_array_size);
6822 else if (Oversized.getBoolValue())
6824 Oversized, 10, Oversized.isSigned(),
false,
6826 else if (FailedFoldDiagID)
6827 Diag(Loc, FailedFoldDiagID);
6839 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6844 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6853 diag::err_virtual_non_function);
6857 diag::err_explicit_non_function);
6861 diag::err_noreturn_non_function);
6882 ? diag::warn_ms_inline_non_function
6883 : diag::err_inline_non_function)
6887 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6892 diag::err_deduction_guide_invalid_specifier)
6901 if (!NewTD)
return nullptr;
6922 if (T->isVariablyModifiedType()) {
6926 bool SizeIsNegative;
6927 llvm::APSInt Oversized;
6938 else if (T->isVariableArrayType())
6940 else if (Oversized.getBoolValue())
6977 switch (II->getNotableIdentifierID()) {
6978 case tok::NotableIdentifierKind::FILE:
6981 case tok::NotableIdentifierKind::jmp_buf:
6982 Context.setjmp_bufDecl(NewTD);
6984 case tok::NotableIdentifierKind::sigjmp_buf:
6985 Context.setsigjmp_bufDecl(NewTD);
6987 case tok::NotableIdentifierKind::ucontext_t:
6988 Context.setucontext_tDecl(NewTD);
6990 case tok::NotableIdentifierKind::float_t:
6991 case tok::NotableIdentifierKind::double_t:
6992 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7029 if (Context.getLangOpts().CPlusPlus) {
7053 if (!OuterContext->
Equals(PrevOuterContext))
7062 if (!SS.
isSet())
return;
7068 if (
Type.hasAddressSpace())
7084 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
7085 auto OrigTy = DT->getOriginalType();
7086 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
7089 OrigTy =
Context.getAddrSpaceQualType(OrigTy, ImplAS);
7116 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7125 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7126 if (VD->hasInit()) {
7127 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7128 assert(VD->isThisDeclarationADefinition() &&
7129 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7131 VD->dropAttr<AliasAttr>();
7140 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7143 diag::err_attribute_selectany_non_extern_data);
7150 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7153 diag::warn_attribute_hybrid_patchable_non_extern);
7159 auto *VD = dyn_cast<VarDecl>(&ND);
7160 bool IsAnonymousNS =
false;
7163 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7164 while (NS && !IsAnonymousNS) {
7166 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7173 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7175 (!AnonNSInMicrosoftMode &&
7186 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7187 FD = FD->getMostRecentDecl();
7192 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7198 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7199 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7200 int NoImplicitObjectError = -1;
7202 NoImplicitObjectError = 0;
7203 else if (MD->isStatic())
7204 NoImplicitObjectError = 1;
7205 else if (MD->isExplicitObjectMemberFunction())
7206 NoImplicitObjectError = 2;
7207 if (NoImplicitObjectError != -1) {
7208 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7209 << NoImplicitObjectError << A->getRange();
7211 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7213 }
else if (MD->getReturnType()->isVoidType()) {
7217 err_lifetimebound_implicit_object_parameter_void_return_type);
7222 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7227 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7229 S.
Diag(A->getLocation(),
7230 diag::err_lifetimebound_parameter_void_return_type);
7238 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7239 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7259 bool IsSpecialization,
7260 bool IsDefinition) {
7264 bool IsTemplate =
false;
7265 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7266 OldDecl = OldTD->getTemplatedDecl();
7268 if (!IsSpecialization)
7269 IsDefinition =
false;
7271 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7272 NewDecl = NewTD->getTemplatedDecl();
7276 if (!OldDecl || !NewDecl)
7279 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7280 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7281 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7282 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7286 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7287 (NewExportAttr && !NewExportAttr->isInherited());
7293 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7295 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7297 bool JustWarn =
false;
7299 auto *VD = dyn_cast<VarDecl>(OldDecl);
7300 if (VD && !VD->getDescribedVarTemplate())
7302 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7314 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7315 : diag::err_attribute_dll_redeclaration;
7318 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7331 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7333 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7336 IsStaticDataMember = VD->isStaticDataMember();
7337 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7339 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7340 IsInline = FD->isInlined();
7341 IsQualifiedFriend = FD->getQualifier() &&
7345 if (OldImportAttr && !HasNewAttr &&
7346 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7348 if (IsMicrosoftABI && IsDefinition) {
7349 if (IsSpecialization) {
7352 diag::err_attribute_dllimport_function_specialization_definition);
7353 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7354 NewDecl->
dropAttr<DLLImportAttr>();
7357 diag::warn_redeclaration_without_import_attribute)
7360 NewDecl->
dropAttr<DLLImportAttr>();
7361 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7362 S.
Context, NewImportAttr->getRange()));
7364 }
else if (IsMicrosoftABI && IsSpecialization) {
7365 assert(!IsDefinition);
7369 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7370 << NewDecl << OldImportAttr;
7372 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7373 OldDecl->
dropAttr<DLLImportAttr>();
7374 NewDecl->
dropAttr<DLLImportAttr>();
7376 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7379 OldDecl->
dropAttr<DLLImportAttr>();
7380 NewDecl->
dropAttr<DLLImportAttr>();
7382 diag::warn_dllimport_dropped_from_inline_function)
7383 << NewDecl << OldImportAttr;
7390 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7392 !NewImportAttr && !NewExportAttr) {
7393 if (
const DLLExportAttr *ParentExportAttr =
7394 MD->getParent()->getAttr<DLLExportAttr>()) {
7395 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7396 NewAttr->setInherited(
true);
7448 return D->isExternC();
7465 llvm_unreachable(
"Unexpected context");
7475 llvm_unreachable(
"Unexpected context");
7520 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7521 return FD->isExternC();
7522 if (
const auto *VD = dyn_cast<VarDecl>(D))
7523 return VD->isExternC();
7525 llvm_unreachable(
"Unknown type of decl!");
7536 if (R->isImageType() || R->isPipeType()) {
7538 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7550 if (R->isReserveIDT() || R->isClkEventT() || R->isEventT()) {
7552 diag::err_invalid_type_for_program_scope_var)
7562 QualType NR = R.getCanonicalType();
7581 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7590 if (R->isEventT()) {
7598 if (R->isSamplerT()) {
7613 R.isConstQualified())) {
7614 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7624template <
typename AttrTy>
7627 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7628 AttrTy *Clone = Attribute->clone(S.
Context);
7629 Clone->setInherited(
true);
7657 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7659 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7666 "NewD is not a function or variable");
7675 if (IdentName ==
nullptr)
7679 auto &Label = PendingName->second;
7685 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7695 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7714 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7718 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7720 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7730 const auto &TI =
Context.getTargetInfo();
7731 bool HasSizeMismatch;
7733 if (!TI.isValidGCCRegisterName(Label))
7734 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7735 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7737 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7738 else if (HasSizeMismatch)
7739 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7742 if (!
R->isIntegralType(
Context) && !
R->isPointerType()) {
7744 diag::err_asm_unsupported_register_type)
7759 bool IsPlaceholderVariable =
false;
7765 if (!Decomp.bindings().empty()) {
7766 II = Decomp.bindings()[0].Name;
7780 IsPlaceholderVariable =
true;
7788 if (IsPlaceholderVariable)
7802 bool IsLocalExternDecl = SC ==
SC_Extern &&
7821 : diag::warn_deprecated_register)
7844 const AutoType *AT = TL.getTypePtr();
7848 bool IsMemberSpecialization =
false;
7849 bool IsVariableTemplateSpecialization =
false;
7851 bool IsVariableTemplate =
false;
7859 if (R->getContainedDeducedType())
7880 false, IsMemberSpecialization,
Invalid);
7882 if (TemplateParams) {
7889 if (!TemplateParams->
size() &&
7894 diag::err_template_variable_noparams)
7898 TemplateParams =
nullptr;
7906 IsVariableTemplateSpecialization =
true;
7910 IsVariableTemplate =
true;
7918 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7923 "should have a 'template<>' for this decl");
7926 bool IsExplicitSpecialization =
7937 (IsExplicitSpecialization || IsMemberSpecialization)) {
7939 diag::ext_explicit_specialization_storage_class)
7945 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7951 if (Ctxt->isFunctionOrMethod()) {
7952 FunctionOrMethod = Ctxt;
7955 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7957 AnonStruct = ParentDecl;
7961 if (FunctionOrMethod) {
7965 diag::err_static_data_member_not_allowed_in_local_class)
7966 << Name << RD->getDeclName() << RD->getTagKind();
7967 }
else if (AnonStruct) {
7972 diag::err_static_data_member_not_allowed_in_anon_struct)
7975 }
else if (RD->isUnion()) {
7979 diag_compat::static_data_member_in_union)
7997 diag::err_static_out_of_line)
8010 diag::err_storage_class_for_static_member)
8015 llvm_unreachable(
"C storage class in c++!");
8019 if (IsVariableTemplateSpecialization) {
8021 TemplateParamLists.size() > 0
8022 ? TemplateParamLists[0]->getTemplateLoc()
8025 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8040 if (IsVariableTemplate) {
8043 TemplateParams, NewVD);
8049 if (R->getContainedDeducedType())
8064 unsigned VDTemplateParamLists =
8065 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8066 if (TemplateParamLists.size() > VDTemplateParamLists)
8068 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8075 }
else if (
CurContext->isFunctionOrMethod()) {
8078 diag::err_inline_declaration_block_scope) << Name
8083 : diag::compat_pre_cxx17_inline_variable);
8094 if (IsLocalExternDecl) {
8097 B->setLocalExternDecl();
8102 bool EmitTLSUnsupportedError =
false;
8115 diag::err_thread_non_global)
8117 else if (!
Context.getTargetInfo().isTLSSupported()) {
8122 EmitTLSUnsupportedError =
true;
8129 diag::err_thread_unsupported);
8140 diag::err_constexpr_wrong_decl_kind)
8141 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8151 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8158 diag::err_constinit_local_variable);
8162 ConstInitAttr::Keyword_constinit));
8180 diag::warn_static_local_in_extern_inline);
8186 if (IsVariableTemplateSpecialization)
8191 else if (IsMemberSpecialization)
8206 B->setModulePrivate();
8216 diag::err_opencl_unknown_type_specifier)
8226 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8227 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8243 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8268 if (R->isFunctionPointerType())
8273 if (EmitTLSUnsupportedError &&
8276 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8278 diag::err_thread_unsupported);
8280 if (EmitTLSUnsupportedError &&
8287 (NewVD->
hasAttr<CUDASharedAttr>() ||
8288 NewVD->
hasAttr<CUDAConstantAttr>())) {
8296 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8297 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8302 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8309 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8321 IsMemberSpecialization ||
8322 IsVariableTemplateSpecialization);
8336 if (IsMemberSpecialization && !IsVariableTemplate &&
8337 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8354 !IsVariableTemplateSpecialization) {
8362 if (!IsPlaceholderVariable)
8393 if (PrevVarTemplate &&
8414 Decl *ManglingContextDecl;
8415 std::tie(MCtx, ManglingContextDecl) =
8507 return !Diags.
isIgnored(diag::warn_decl_shadow, R.getNameLoc());
8519 NamedDecl *ShadowedDecl = R.getFoundDecl();
8533 NamedDecl *ShadowedDecl = R.getFoundDecl();
8542 NamedDecl *ShadowedDecl = R.getFoundDecl();
8551 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8552 if (
const auto *MD =
8556 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8562 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8565 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8570 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8571 if (shadowedVar->isExternC()) {
8574 for (
auto *I : shadowedVar->redecls())
8575 if (I->isFileVarDecl()) {
8583 unsigned WarningDiag = diag::warn_decl_shadow;
8586 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8592 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8598 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8604 ->ShadowingDecls.push_back({D, VD});
8615 ->ShadowingDecls.push_back({D, ShadowedDecl});
8621 bool HasLocalStorage =
false;
8622 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8623 HasLocalStorage = VD->hasLocalStorage();
8624 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8628 if (HasLocalStorage) {
8633 ParentDC && !ParentDC->
Equals(OldDC);
8674 Diag(R.getNameLoc(), WarningDiag) << Name << Kind << OldDC;
8676 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8683 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8689 Diag(Shadow.VD->getLocation(),
8690 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8691 : diag::warn_decl_shadow)
8692 << Shadow.VD->getDeclName()
8695 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8696 << Shadow.VD->getDeclName() << 0;
8699 Diag(Shadow.VD->getLocation(),
8701 : diag::warn_decl_shadow_uncaptured_local)
8702 << Shadow.VD->getDeclName()
8728 auto *DRE = dyn_cast<DeclRefExpr>(E);
8732 auto I = ShadowingDecls.find(D);
8733 if (I == ShadowingDecls.end())
8735 const NamedDecl *ShadowedDecl = I->second;
8737 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8742 ShadowingDecls.erase(I);
8750 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8809 assert(Prev &&
"should have found a previous declaration to diagnose");
8811 Prev = FD->getFirstDecl();
8815 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8837 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8849 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8869 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8879 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) << T;
8887 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8903 if (T->isUndeducedType())
8909 if (T->isObjCObjectType()) {
8912 T =
Context.getObjCObjectPointerType(T);
8943 if (NewVD->
hasAttr<BlocksAttr>()) {
8948 if (T->isBlockPointerType()) {
8951 if (!T.isConstQualified()) {
8952 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8958 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8967 if (!T->isSamplerT() && !T->isDependentType() &&
8974 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8975 <<
Scope <<
"global or constant";
8977 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8978 <<
Scope <<
"constant";
8992 bool AllowFunctionScopeLocalVariables =
8995 "__cl_clang_function_scope_local_variables",
getLangOpts());
8996 if (AllowFunctionScopeLocalVariables) {
9003 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9015 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9040 && !NewVD->
hasAttr<BlocksAttr>()) {
9051 if (T->isWebAssemblyTableType()) {
9062 const auto *ATy = dyn_cast<ConstantArrayType>(T.getTypePtr());
9063 if (!ATy || ATy->getZExtSize() != 0) {
9065 diag::err_typecheck_wasm_table_must_have_zero_length);
9075 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9078 ArrayT && ArrayT->isZeroSize()) {
9084 bool isVM = T->isVariablyModifiedType();
9085 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9091 bool SizeIsNegative;
9092 llvm::APSInt Oversized;
9097 FixedT = FixedTInfo->
getType();
9098 else if (FixedTInfo) {
9104 if ((!FixedTInfo || FixedT.
isNull()) && T->isVariableArrayType()) {
9137 if (T->isVoidType()) {
9155 !T.isWebAssemblyReferenceType() && !T->isHLSLSpecificType()) {
9161 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9174 !T->isDependentType() &&
9176 diag::err_constexpr_var_non_literal)) {
9182 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9192 llvm::StringMap<bool> CallerFeatureMap;
9193 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9195 CallerFeatureMap)) {
9203 llvm::StringMap<bool> CallerFeatureMap;
9204 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9209 if (T.hasAddressSpace() &&
9243 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9248 Name =
Context.DeclarationNames.getCXXDestructorName(
9249 Context.getCanonicalTagType(BaseRecord));
9254 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9261 if (Overridden.insert(BaseMD).second) {
9278 return !Overridden.empty();
9284 struct ActOnFDArgs {
9298 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9299 CXXRecordDecl *Parent)
9300 : Context(Context), OriginalFD(TypoFD),
9303 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9307 SmallVector<unsigned, 1> MismatchedParams;
9309 CDeclEnd = candidate.
end();
9310 CDecl != CDeclEnd; ++CDecl) {
9311 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9315 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9316 CXXRecordDecl *Parent = MD->getParent();
9319 }
else if (!ExpectedParent) {
9328 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9329 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9333 ASTContext &Context;
9334 FunctionDecl *OriginalFD;
9335 CXXRecordDecl *ExpectedParent;
9355 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9363 IsLocalFriend ? diag::err_no_matching_local_friend :
9365 diag::err_member_decl_does_not_match;
9377 "Cannot have an ambiguity in previous-declaration lookup");
9379 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9381 if (!Prev.
empty()) {
9390 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9391 NearMatches.push_back(std::make_pair(FD, ParamNum));
9399 IsLocalFriend ?
nullptr : NewDC))) {
9406 CDeclEnd = Correction.
end();
9407 CDecl != CDeclEnd; ++CDecl) {
9427 ExtraArgs.S, ExtraArgs.D,
9430 ExtraArgs.AddToScope);
9441 if ((*I)->getCanonicalDecl() == Canonical)
9448 SemaRef.
PDiag(IsLocalFriend
9449 ? diag::err_no_matching_local_friend_suggest
9450 : diag::err_member_decl_does_not_match_suggest)
9451 << Name << NewDC << IsDefinition);
9464 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9467 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9473 bool NewFDisConst = NewMD && NewMD->
isConst();
9476 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9477 NearMatch != NearMatchEnd; ++NearMatch) {
9480 bool FDisConst = MD && MD->
isConst();
9481 bool IsMember = MD || !IsLocalFriend;
9484 if (
unsigned Idx = NearMatch->second) {
9488 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9489 : diag::note_local_decl_close_param_match)
9492 }
else if (FDisConst != NewFDisConst) {
9494 diag::note_member_def_close_const_match)
9499 else if (FTI.hasMethodTypeQualifiers() &&
9500 FTI.getConstQualifierLoc().isValid())
9504 IsMember ? diag::note_member_def_close_match
9505 : diag::note_local_decl_close_match);
9513 default: llvm_unreachable(
"Unknown storage class!");
9518 diag::err_typecheck_sclass_func);
9535 diag::err_static_block_func);
9551 bool &IsVirtualOkay) {
9565 diag::err_c23_constexpr_not_variable);
9568 diag::err_constexpr_wrong_decl_kind)
9569 <<
static_cast<int>(ConstexprKind);
9590 (!R->getAsAdjusted<
FunctionType>() && R->isFunctionProtoType());
9593 "Strict prototypes are required");
9614 "Constructors can only be declared in a member context");
9620 isInline,
false, ConstexprKind,
9631 false, ConstexprKind,
9632 TrailingRequiresClause);
9635 if (
Record->isBeingDefined())
9644 IsVirtualOkay =
true;
9656 true, ConstexprKind, TrailingRequiresClause);
9662 diag::err_conv_function_not_member);
9670 IsVirtualOkay =
true;
9675 TrailingRequiresClause);
9702 IsVirtualOkay = !Ret->isStatic();
9716 true , ConstexprKind, TrailingRequiresClause);
9733 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9741 if (Names.end() !=
Match)
9746 }
while (DesugaredTy != Ty);
9785 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9787 bool IsStandardLayoutType =
true;
9793 if (!CXXRec->hasDefinition())
9794 CXXRec = CXXRec->getTemplateInstantiationPattern();
9795 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9796 IsStandardLayoutType =
false;
9799 !IsStandardLayoutType)
9847 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9861 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9874 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9883 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9900 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9908 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9909 PT = Typedef->desugar();
9931 HistoryStack.push_back(
nullptr);
9936 VisitStack.push_back(PD);
9937 assert(VisitStack.back() &&
"First decl null?");
9940 const Decl *
Next = VisitStack.pop_back_val();
9942 assert(!HistoryStack.empty());
9944 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9945 ValidTypes.insert(Hist->getType().getTypePtr());
9954 HistoryStack.push_back(Field);
9956 QualType FieldTy = Field->getType();
9960 "Unexpected type.");
9969 VisitStack.push_back(
nullptr);
9971 for (
const auto *FD : RD->
fields()) {
9982 VisitStack.push_back(FD);
9993 S.
Diag(Param->getLocation(),
9994 diag::err_record_with_pointers_kernel_param)
9998 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
10001 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
10002 << PD->getDeclName();
10007 I = HistoryStack.begin() + 1,
10008 E = HistoryStack.end();
10021 }
while (!VisitStack.empty());
10038 (LangOpts.CPlusPlus &&
10048 unsigned BuiltinID) {
10049 switch (BuiltinID) {
10050 case Builtin::BI__GetExceptionInfo:
10054 case Builtin::BIaddressof:
10055 case Builtin::BI__addressof:
10056 case Builtin::BIforward:
10057 case Builtin::BIforward_like:
10058 case Builtin::BImove:
10059 case Builtin::BImove_if_noexcept:
10060 case Builtin::BIas_const: {
10065 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10077 bool &AddToScope) {
10080 assert(R->isFunctionType());
10085 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10087 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10088 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10089 TemplateParamLists.back() = Invented;
10091 TemplateParamLists.push_back(Invented);
10101 diag::err_invalid_thread)
10109 bool isFriend =
false;
10111 bool isMemberSpecialization =
false;
10112 bool isFunctionTemplateSpecialization =
false;
10114 bool HasExplicitTemplateArgs =
false;
10117 bool isVirtualOkay =
false;
10124 if (!NewFD)
return nullptr;
10134 if (IsLocalExternDecl)
10144 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10172 if (isVirtual && Parent->isUnion()) {
10176 if ((Parent->isClass() || Parent->isStruct()) &&
10177 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10180 if (
auto *Def = Parent->getDefinition())
10181 Def->setInitMethod(
true);
10186 isMemberSpecialization =
false;
10187 isFunctionTemplateSpecialization =
false;
10202 isMemberSpecialization,
Invalid);
10203 if (TemplateParams) {
10208 if (TemplateParams->
size() > 0) {
10216 }
else if (TemplateId) {
10233 Name, TemplateParams,
10239 if (TemplateParamLists.size() > 1) {
10246 isFunctionTemplateSpecialization =
true;
10248 if (TemplateParamLists.size() > 0)
10268 << Name << RemoveRange
10274 HasExplicitTemplateArgs =
true;
10281 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10287 if (TemplateParamLists.size() > 0)
10292 if (isFriend && TemplateId)
10293 isFunctionTemplateSpecialization =
true;
10299 if (isFunctionTemplateSpecialization && TemplateId) {
10300 HasExplicitTemplateArgs =
true;
10331 if (!isVirtualOkay) {
10333 diag::err_virtual_non_function);
10337 diag::err_virtual_out_of_class)
10343 diag::err_virtual_member_function_template)
10362 diag::err_inline_declaration_block_scope) << Name
10376 diag::err_explicit_out_of_class)
10383 diag::err_explicit_non_ctor_or_conv_function)
10401 <<
static_cast<int>(ConstexprKind);
10412 diag::err_invalid_consteval_decl_kind)
10420 if (isFunctionTemplateSpecialization) {
10423 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10469 if (!isFriend && SC !=
SC_None) {
10477 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10479 diag::ext_explicit_specialization_storage_class)
10486 "Out-of-line member function should be a CXXMethodDecl");
10503 ? diag::ext_static_out_of_line
10504 : diag::err_static_out_of_line)
10529 PendingInlineFuncDecls.insert(NewFD);
10536 isMemberSpecialization ||
10537 isFunctionTemplateSpecialization);
10546 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10571 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10573 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10574 Param->setDeclContext(NewFD);
10575 Params.push_back(Param);
10577 if (Param->isInvalidDecl())
10590 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10595 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10600 DeclContext *TagDC = TD->getLexicalDeclContext();
10604 TD->setDeclContext(NewFD);
10612 if (TagDC != PrototypeTagContext)
10613 TD->setLexicalDeclContext(TagDC);
10627 for (
const auto &AI : FT->param_types()) {
10630 Param->setScopeInfo(0, Params.size());
10631 Params.push_back(Param);
10634 assert(R->isFunctionNoProtoType() && NewFD->
getNumParams() == 0 &&
10635 "Should not need args for typedef of non-prototype fn");
10639 NewFD->setParams(Params);
10664 !NewFD->
hasAttr<SectionAttr>())
10665 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10671 !NewFD->
hasAttr<SectionAttr>()) {
10672 NewFD->
addAttr(SectionAttr::CreateImplicit(
10674 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10685 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10686 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10691 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10700 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10701 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10702 !NewTVA->isDefaultVersion() &&
10703 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10705 AddToScope =
false;
10717 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10732 isMemberSpecialization,
10739 "previous declaration set still overloaded");
10751 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10774 diag::ext_operator_new_delete_declared_inline)
10801 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10813 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10821 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10825 Diag(TRC->getBeginLoc(),
10826 diag::err_constrained_non_templated_function);
10843 if (isFunctionTemplateSpecialization) {
10844 bool isDependentSpecialization =
false;
10849 isDependentSpecialization =
10851 (HasExplicitTemplateArgs &&
10852 TemplateSpecializationType::
10853 anyInstantiationDependentTemplateArguments(
10855 assert((!isDependentSpecialization ||
10856 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10857 "dependent friend function specialization without template "
10863 isDependentSpecialization =
10868 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10869 if (isDependentSpecialization) {
10876 NewFD, ExplicitTemplateArgs,
Previous))
10897 isMemberSpecialization,
10906 "previous declaration set still overloaded");
10947 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10993 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10994 AddToScope = ExtraArgs.AddToScope;
11003 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
11004 AddToScope = ExtraArgs.AddToScope;
11010 !isFriend && !isFunctionTemplateSpecialization &&
11011 !isMemberSpecialization) {
11029 if (NewFD->
hasAttr<HLSLShaderAttr>())
11037 if (
unsigned BuiltinID = II->getBuiltinID()) {
11038 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11039 if (!InStdNamespace &&
11044 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11045 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11052 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11054 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11059 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11071 if (NewFD->
hasAttr<OverloadableAttr>() &&
11074 diag::err_attribute_overloadable_no_prototype)
11076 NewFD->
dropAttr<OverloadableAttr>();
11109 isMemberSpecialization ||
11110 isFunctionTemplateSpecialization,
11121 Context.setcudaConfigureCallDecl(NewFD);
11123 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11129 Context.setcudaGetParameterBufferDecl(NewFD);
11131 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11137 Context.setcudaLaunchDeviceDecl(NewFD);
11188 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11208 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11210 QualType ElemTy = PipeTy->getElementType();
11212 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11218 if (
Context.getTargetInfo().getTriple().isWasm()) {
11220 Diag(Param->getTypeSpecStartLoc(),
11221 diag::err_wasm_table_as_function_parameter);
11229 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11230 if (NewFD->
hasAttr<ConstructorAttr>()) {
11231 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11233 NewFD->
dropAttr<AvailabilityAttr>();
11235 if (NewFD->
hasAttr<DestructorAttr>()) {
11236 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11238 NewFD->
dropAttr<AvailabilityAttr>();
11249 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11253 Diag(NBA->getLocation(),
11254 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11255 << NBA->getSpelling();
11258 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11259 << NBA->getSpelling();
11268 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11292 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11296 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11307 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11308 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11318 bool IsDefinition) {
11321 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11323 return SectionAttr::CreateImplicit(
11325 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11373 auto *VD = dyn_cast<ValueDecl>(D);
11374 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11375 return !VD || !PrevVD ||
11377 PrevVD->getType());
11385 const auto *TA = FD->
getAttr<TargetAttr>();
11386 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11388 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11401 for (
const auto &Feat : ParseInfo.
Features) {
11402 auto BareFeat = StringRef{Feat}.substr(1);
11403 if (Feat[0] ==
'-') {
11405 <<
Feature << (
"no-" + BareFeat).str();
11425 for (
auto &Feat : ParseInfo.
Features)
11426 Feats.push_back(StringRef{Feat}.substr(1));
11429 TVA->getFeatures(Feats);
11431 for (
const auto &Feat : Feats) {
11451 case attr::ArmLocallyStreaming:
11456 case attr::NonNull:
11457 case attr::NoThrow:
11466 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11467 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11468 <<
static_cast<unsigned>(MVKind) << A;
11470 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11475 switch (A->getKind()) {
11476 case attr::CPUDispatch:
11477 case attr::CPUSpecific:
11480 return Diagnose(S, A);
11484 return Diagnose(S, A);
11486 case attr::TargetVersion:
11489 return Diagnose(S, A);
11491 case attr::TargetClones:
11494 return Diagnose(S, A);
11498 return Diagnose(S, A);
11511 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11512 enum DoesntSupport {
11519 DefaultedFuncs = 6,
11520 ConstexprFuncs = 7,
11521 ConstevalFuncs = 8,
11533 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11536 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11544 if (!TemplatesSupported &&
11546 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11549 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11550 if (NewCXXFD->isVirtual())
11551 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11555 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11559 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11564 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11568 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11572 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11573 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11577 QualType NewReturnType = NewType->getReturnType();
11580 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11593 bool ArmStreamingCCMismatched =
false;
11594 if (OldFPT && NewFPT) {
11601 ArmStreamingCCMismatched =
true;
11604 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11607 QualType OldReturnType = OldType->getReturnType();
11609 if (OldReturnType != NewReturnType)
11610 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11613 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11616 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11619 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11642 bool IsCPUSpecificCPUDispatchMVKind =
11646 if (CausesMV && OldFD &&
11654 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11661 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11663 S.
PDiag(diag::note_multiversioning_caused_here)),
11665 S.
PDiag(diag::err_multiversion_doesnt_support)
11666 <<
static_cast<unsigned>(MVKind)),
11668 S.
PDiag(diag::err_multiversion_diff)),
11670 !IsCPUSpecificCPUDispatchMVKind,
11683 "Function lacks multiversion attribute");
11684 const auto *TA = FD->
getAttr<TargetAttr>();
11685 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11688 if (TA && !TA->isDefaultVersion())
11725 To->
addAttr(TargetVersionAttr::CreateImplicit(
11736 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11737 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11738 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11739 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11741 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11750 if (NewTA && !NewTA->isDefaultVersion() &&
11751 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11768 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11769 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11778 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11786 OldTA->getFeaturesStr());
11790 NewTA->getFeaturesStr());
11793 if (OldParsed == NewParsed) {
11801 for (
const auto *FD : OldFD->
redecls()) {
11802 const auto *CurTA = FD->
getAttr<TargetAttr>();
11803 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11807 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11808 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11810 << (NewTA ? 0 : 2);
11811 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11858 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11874 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11875 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11882 NewTA->getFeaturesStr());
11887 NewTVA->getFeatures(NewFeats);
11888 llvm::sort(NewFeats);
11891 bool UseMemberUsingDeclRules =
11894 bool MayNeedOverloadableChecks =
11903 if (MayNeedOverloadableChecks &&
11904 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11907 switch (NewMVKind) {
11910 "Only target_clones can be omitted in subsequent declarations");
11913 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11914 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11923 CurTA->getFeaturesStr());
11925 if (CurParsed == NewParsed) {
11934 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11935 if (CurTVA->getName() == NewTVA->getName()) {
11942 CurTVA->getFeatures(CurFeats);
11943 llvm::sort(CurFeats);
11945 if (CurFeats == NewFeats) {
11951 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11953 if (NewFeats.empty())
11956 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11958 CurClones->getFeatures(CurFeats, I);
11959 llvm::sort(CurFeats);
11961 if (CurFeats == NewFeats) {
11972 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11973 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11974 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11975 !std::equal(CurClones->featuresStrs_begin(),
11976 CurClones->featuresStrs_end(),
11977 NewClones->featuresStrs_begin())) {
11983 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11985 CurTVA->getFeatures(CurFeats);
11986 llvm::sort(CurFeats);
11989 if (CurFeats.empty())
11992 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11994 NewClones->getFeatures(NewFeats, I);
11995 llvm::sort(NewFeats);
11997 if (CurFeats == NewFeats) {
12013 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
12014 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12019 CurFD->
hasAttr<CPUDispatchAttr>()) {
12020 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12022 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12023 NewCPUDisp->cpus_begin(),
12025 return Cur->getName() == New->getName();
12040 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12042 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12043 NewCPUSpec->cpus_begin(),
12045 return Cur->getName() == New->getName();
12056 if (CurII == NewII) {
12126 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12127 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12128 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12129 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12130 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12140 NewTVA->isDefaultVersion())) {
12141 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12149 if (NewTA && TI.
getTriple().isAArch64())
12176 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12189 if (OldFD->
isUsed(
false)) {
12191 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12213 bool IsPure = NewFD->
hasAttr<PureAttr>();
12214 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12217 if (!IsPure && !IsConst)
12224 if (IsPure && IsConst) {
12234 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12240 bool IsMemberSpecialization,
12243 "Variably modified return types are not handled here");
12248 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12253 bool MayNeedOverloadableChecks =
false;
12265 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12267 OldDecl = Candidate;
12270 MayNeedOverloadableChecks =
true;
12295 OldDecl =
Previous.getFoundDecl();
12296 MergeTypeWithPrevious =
false;
12299 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12300 NewFD->
hasAttr<OverloadableAttr>()) {
12302 MayNeedOverloadableChecks =
true;
12314 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12365 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12366 if (!OldMD || !OldMD->
isStatic()) {
12401 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12402 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12405 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12414 NewFD->
setAccess(OldTemplateDecl->getAccess());
12415 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12420 if (IsMemberSpecialization &&
12423 assert(OldTemplateDecl->isMemberSpecialization());
12426 if (OldFD->isDeleted()) {
12428 assert(OldFD->getCanonicalDecl() == OldFD);
12430 OldFD->setDeletedAsWritten(
false);
12444 !NewFD->
getAttr<OverloadableAttr>()) {
12448 return ND->hasAttr<OverloadableAttr>();
12450 "Non-redecls shouldn't happen without overloadable present");
12453 const auto *FD = dyn_cast<FunctionDecl>(ND);
12454 return FD && !FD->
hasAttr<OverloadableAttr>();
12457 if (OtherUnmarkedIter !=
Previous.end()) {
12459 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12460 Diag((*OtherUnmarkedIter)->getLocation(),
12461 diag::note_attribute_overloadable_prev_overload)
12471 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12474 if (NewFD->
hasAttr<SYCLExternalAttr>())
12484 dyn_cast<CXXDestructorDecl>(NewFD)) {
12492 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12497 Context.DeclarationNames.getCXXDestructorName(ClassType);
12504 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12505 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12511 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12517 if (!
Method->isFunctionTemplateSpecialization() &&
12518 !
Method->getDescribedFunctionTemplate() &&
12519 Method->isCanonicalDecl()) {
12526 diag::err_constrained_virtual_method);
12561 if (R->isIncompleteType() && !R->isVoidType())
12564 else if (!R.isPODType(
Context) && !R->isVoidType() &&
12565 !R->isObjCObjectPointerType())
12566 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12579 auto HasNoexcept = [&](
QualType T) ->
bool {
12584 T = RT->getPointeeType();
12585 else if (T->isAnyPointerType())
12586 T = T->getPointeeType();
12588 T = MPT->getPointeeType();
12590 if (FPT->isNothrow())
12596 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12597 for (
QualType T : FPT->param_types())
12598 AnyNoexcept |= HasNoexcept(T);
12601 diag::warn_cxx17_compat_exception_spec_in_signature)
12606 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12608 if (!Parm->getType()->isDependentType() &&
12609 Parm->hasAttr<CUDAGridConstantAttr>() &&
12610 !(IsKernel && Parm->getType().isConstQualified()))
12611 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12612 diag::err_cuda_grid_constant_not_allowed);
12618 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12628 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12639 ? diag::err_static_main : diag::warn_static_main)
12647 Diag(NoreturnLoc, diag::ext_noreturn_main);
12648 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12660 << FD->
hasAttr<DeviceKernelAttr>();
12665 if (FD->
hasAttr<SYCLExternalAttr>()) {
12667 << FD->
getAttr<SYCLExternalAttr>();
12678 assert(T->isFunctionType() &&
"function decl is not of function type");
12700 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12725 Diag(start, diag::warn_main_in_named_module)
12737 bool HasExtraParameters = (nparams > 3);
12748 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12749 HasExtraParameters =
false;
12751 if (HasExtraParameters) {
12764 for (
unsigned i = 0; i < nparams; ++i) {
12767 bool mismatch =
true;
12784 mismatch = !qs.
empty();
12813 if (T.isOSCygMing())
12818 if (T.isOSWindows() && T.getArch() == llvm::Triple::x86)
12826 assert(T->isFunctionType() &&
"function decl is not of function type");
12835 if (FD->
getName() !=
"DllMain")
12842 FT =
Context.adjustFunctionType(
12847 FT =
Context.adjustFunctionType(FT,
12869 if (
Init->isValueDependent()) {
12870 assert(
Init->containsErrors() &&
12871 "Dependent code should only occur in error-recovery path.");
12874 const Expr *Culprit;
12875 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12884 class SelfReferenceChecker
12890 bool isReferenceType;
12891 bool isInCXXOperatorCall;
12899 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12900 S(S), OrigDecl(OrigDecl) {
12903 isReferenceType =
false;
12904 isInCXXOperatorCall =
false;
12905 isInitList =
false;
12906 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12907 isPODType = VD->getType().isPODType(S.
Context);
12909 isReferenceType = VD->getType()->isReferenceType();
12916 void CheckExpr(Expr *E) {
12917 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12925 InitFieldIndex.push_back(0);
12926 for (
auto *Child : InitList->
children()) {
12928 ++InitFieldIndex.back();
12930 InitFieldIndex.pop_back();
12935 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12936 llvm::SmallVector<FieldDecl*, 4> Fields;
12938 bool ReferenceField =
false;
12941 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12942 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12945 Fields.push_back(FD);
12947 ReferenceField =
true;
12948 Base = ME->getBase()->IgnoreParenImpCasts();
12952 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12953 if (!DRE || DRE->
getDecl() != OrigDecl)
12957 if (CheckReference && !ReferenceField)
12961 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12962 for (
const FieldDecl *I : llvm::reverse(Fields))
12963 UsedFieldIndex.push_back(I->getFieldIndex());
12968 for (
auto UsedIter = UsedFieldIndex.begin(),
12969 UsedEnd = UsedFieldIndex.end(),
12970 OrigIter = InitFieldIndex.begin(),
12971 OrigEnd = InitFieldIndex.end();
12972 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12973 if (*UsedIter < *OrigIter)
12975 if (*UsedIter > *OrigIter)
12980 HandleDeclRefExpr(DRE);
12987 void HandleValue(Expr *E) {
12989 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12990 HandleDeclRefExpr(DRE);
12994 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12995 Visit(CO->getCond());
12996 HandleValue(CO->getTrueExpr());
12997 HandleValue(CO->getFalseExpr());
13001 if (BinaryConditionalOperator *BCO =
13002 dyn_cast<BinaryConditionalOperator>(E)) {
13003 Visit(BCO->getCond());
13004 HandleValue(BCO->getFalseExpr());
13008 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
13009 if (Expr *SE = OVE->getSourceExpr())
13014 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
13015 if (BO->getOpcode() == BO_Comma) {
13016 Visit(BO->getLHS());
13017 HandleValue(BO->getRHS());
13030 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13034 Base = ME->getBase()->IgnoreParenImpCasts();
13036 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13037 HandleDeclRefExpr(DRE);
13046 void VisitDeclRefExpr(DeclRefExpr *E) {
13047 if (isReferenceType)
13048 HandleDeclRefExpr(E);
13051 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13057 Inherited::VisitImplicitCastExpr(E);
13060 void VisitMemberExpr(MemberExpr *E) {
13062 if (CheckInitListMemberExpr(E,
true ))
13071 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13072 bool Warn = (MD && !MD->
isStatic());
13074 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13077 Base = ME->getBase()->IgnoreParenImpCasts();
13080 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13082 HandleDeclRefExpr(DRE);
13091 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13092 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13096 return Inherited::VisitCXXOperatorCallExpr(E);
13100 HandleValue(Arg->IgnoreParenImpCasts());
13104 if (!isInCXXOperatorCall) {
13105 Inherited::VisitLambdaExpr(E);
13110 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13111 HandleDeclRefExpr(DRE);
13116 void VisitUnaryOperator(UnaryOperator *E) {
13130 Inherited::VisitUnaryOperator(E);
13133 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13135 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13137 Expr *ArgExpr = E->
getArg(0);
13138 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13139 if (ILE->getNumInits() == 1)
13140 ArgExpr = ILE->getInit(0);
13141 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13142 if (ICE->getCastKind() == CK_NoOp)
13143 ArgExpr = ICE->getSubExpr();
13144 HandleValue(ArgExpr);
13147 Inherited::VisitCXXConstructExpr(E);
13150 void VisitCallExpr(CallExpr *E) {
13153 HandleValue(E->
getArg(0));
13157 Inherited::VisitCallExpr(E);
13160 void VisitBinaryOperator(BinaryOperator *E) {
13162 HandleValue(E->
getLHS());
13167 Inherited::VisitBinaryOperator(E);
13173 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13178 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13180 if (OrigDecl != ReferenceDecl)
return;
13182 if (isReferenceType) {
13183 diag = diag::warn_uninit_self_reference_in_reference_init;
13185 diag = diag::warn_static_self_reference_in_init;
13189 diag = diag::warn_uninit_self_reference_in_init;
13203 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13213 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13214 VD && VD->isConstexpr() && VD->isFileVarDecl())
13222 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13223 if (ICE->getCastKind() == CK_LValueToRValue)
13224 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13225 if (DRE->
getDecl() == OrigDecl)
13228 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13235 struct VarDeclOrName {
13237 DeclarationName Name;
13239 friend const Sema::SemaDiagnosticBuilder &
13240 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13241 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13251 bool IsInitCapture = !VDecl;
13253 "init captures are expected to be deduced prior to initialization");
13255 VarDeclOrName VN{VDecl, Name};
13258 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13262 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13263 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13264 << (int)Deduced->getContainedAutoType()->getKeyword()
13271 assert(VDecl &&
"no init for init capture deduction?");
13286 DeduceInits =
Init;
13288 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13290 DeduceInits = PL->exprs();
13293 assert(VDecl &&
"non-auto type for init capture deduction?");
13304 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13305 DeduceInits = IL->inits();
13309 if (DeduceInits.empty()) {
13312 Diag(
Init->getBeginLoc(), IsInitCapture
13313 ? diag::err_init_capture_no_expression
13314 : diag::err_auto_var_init_no_expression)
13315 << VN <<
Type << Range;
13319 if (DeduceInits.size() > 1) {
13320 Diag(DeduceInits[1]->getBeginLoc(),
13321 IsInitCapture ? diag::err_init_capture_multiple_expressions
13322 : diag::err_auto_var_init_multiple_expressions)
13323 << VN <<
Type << Range;
13327 Expr *DeduceInit = DeduceInits[0];
13329 Diag(
Init->getBeginLoc(), IsInitCapture
13330 ? diag::err_init_capture_paren_braces
13331 : diag::err_auto_var_init_paren_braces)
13337 bool DefaultedAnyToId =
false;
13339 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13341 if (
Result.isInvalid()) {
13345 DefaultedAnyToId =
true;
13355 Type.getQualifiers());
13363 if (!IsInitCapture)
13366 Diag(Range.getBegin(),
13367 diag::err_init_capture_deduction_failure_from_init_list)
13373 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13388 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13391 return DeducedType;
13396 assert(!
Init || !
Init->containsErrors());
13400 if (DeducedType.
isNull()) {
13409 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13433 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13434 Init = EWC->getSubExpr();
13436 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13437 Init = CE->getSubExpr();
13442 "shouldn't be called if type doesn't have a non-trivial C struct");
13443 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13444 for (
auto *I : ILE->inits()) {
13445 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13446 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13472bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13478 return FD->
hasAttr<UnavailableAttr>();
13481struct DiagNonTrivalCUnionDefaultInitializeVisitor
13488 DiagNonTrivalCUnionDefaultInitializeVisitor(
13491 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13494 const FieldDecl *FD,
bool InNonTrivialUnion) {
13497 InNonTrivialUnion);
13498 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13501 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13502 bool InNonTrivialUnion) {
13503 if (InNonTrivialUnion)
13505 << 1 << 0 << QT << FD->
getName();
13508 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13509 if (InNonTrivialUnion)
13511 << 1 << 0 << QT << FD->
getName();
13514 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13516 if (RD->isUnion()) {
13517 if (OrigLoc.isValid()) {
13518 bool IsUnion =
false;
13519 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13520 IsUnion = OrigRD->isUnion();
13521 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13522 << 0 << OrigTy << IsUnion << UseContext;
13524 OrigLoc = SourceLocation();
13526 InNonTrivialUnion =
true;
13529 if (InNonTrivialUnion)
13530 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13533 for (
const FieldDecl *FD : RD->fields())
13534 if (!shouldIgnoreForRecordTriviality(FD))
13535 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13538 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13543 SourceLocation OrigLoc;
13548struct DiagNonTrivalCUnionDestructedTypeVisitor
13551 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13553 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13554 SourceLocation OrigLoc,
13557 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13560 const FieldDecl *FD,
bool InNonTrivialUnion) {
13563 InNonTrivialUnion);
13564 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13567 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13568 bool InNonTrivialUnion) {
13569 if (InNonTrivialUnion)
13571 << 1 << 1 << QT << FD->
getName();
13574 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13575 if (InNonTrivialUnion)
13577 << 1 << 1 << QT << FD->
getName();
13580 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13582 if (RD->isUnion()) {
13583 if (OrigLoc.isValid()) {
13584 bool IsUnion =
false;
13585 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13586 IsUnion = OrigRD->isUnion();
13587 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13588 << 1 << OrigTy << IsUnion << UseContext;
13590 OrigLoc = SourceLocation();
13592 InNonTrivialUnion =
true;
13595 if (InNonTrivialUnion)
13596 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13599 for (
const FieldDecl *FD : RD->fields())
13600 if (!shouldIgnoreForRecordTriviality(FD))
13601 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13604 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13605 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13606 bool InNonTrivialUnion) {}
13611 SourceLocation OrigLoc;
13616struct DiagNonTrivalCUnionCopyVisitor
13618 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13620 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13622 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13625 const FieldDecl *FD,
bool InNonTrivialUnion) {
13628 InNonTrivialUnion);
13629 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13632 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13633 bool InNonTrivialUnion) {
13634 if (InNonTrivialUnion)
13636 << 1 << 2 << QT << FD->
getName();
13639 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13640 if (InNonTrivialUnion)
13642 << 1 << 2 << QT << FD->
getName();
13645 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13647 if (RD->isUnion()) {
13648 if (OrigLoc.isValid()) {
13649 bool IsUnion =
false;
13650 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13651 IsUnion = OrigRD->isUnion();
13652 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13653 << 2 << OrigTy << IsUnion << UseContext;
13655 OrigLoc = SourceLocation();
13657 InNonTrivialUnion =
true;
13660 if (InNonTrivialUnion)
13661 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13664 for (
const FieldDecl *FD : RD->fields())
13665 if (!shouldIgnoreForRecordTriviality(FD))
13666 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13669 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13670 if (InNonTrivialUnion)
13672 << 1 << 2 << QT << FD->
getName();
13676 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13677 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13678 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13679 bool InNonTrivialUnion) {}
13684 SourceLocation OrigLoc;
13693 unsigned NonTrivialKind) {
13697 "shouldn't be called if type doesn't have a non-trivial C union");
13701 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13702 .visit(QT,
nullptr,
false);
13705 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13706 .visit(QT,
nullptr,
false);
13708 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13709 .visit(QT,
nullptr,
false);
13733 bool TargetIsInline = Dcl->
isInline();
13734 bool TargetWasTemplated =
13751 TargetWasTemplated =
13761 if (!TargetIsInline || TargetWasTemplated)
13771 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13772 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13778 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13779 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13801 T = T.getNonReferenceType();
13802 if (T->isFunctionType())
13804 if (!T.isConstant(Ctx))
13806 if (T->isPointerType())
13824 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13825 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13837 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13838 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13844 llvm::scope_exit ResetDeclForInitializer([
this]() {
13855 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13856 if (!
Method->isInvalidDecl()) {
13858 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13859 <<
Method->getDeclName() <<
Init->getSourceRange();
13860 Method->setInvalidDecl();
13865 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13867 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13876 if (
Expr *E = Recovery.
get())
13882 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13883 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13890 if (
Init->containsErrors()) {
13899 "decl should be invalidated when deduce fails");
13911 if (VDecl->
hasAttr<HLSLGroupSharedAddressSpaceAttr>()) {
13918 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13938 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13939 BaseDeclType = Array->getElementType();
13941 diag::err_typecheck_decl_incomplete_type)) {
13948 diag::err_abstract_type_in_decl,
13966 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
13975 if (Def != VDecl &&
13995 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13998 diag::note_previous_initializer)
14023 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14024 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14030 if (!
HLSL().handleInitialization(VDecl,
Init))
14042 if (!
Result.isUsable()) {
14050 bool InitializedFromParenListExpr =
false;
14051 bool IsParenListInit =
false;
14058 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14060 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14061 InitializedFromParenListExpr =
true;
14062 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14063 Args = CXXDirectInit->getInitExprs();
14064 InitializedFromParenListExpr =
true;
14071 if (!
Result.isUsable()) {
14091 IsParenListInit = !InitSeq.
steps().empty() &&
14095 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14097 Context.getAsIncompleteArrayType(VDeclType) &&
14098 Context.getAsIncompleteArrayType(
Init->getType())) {
14127 if (VDecl->
hasAttr<BlocksAttr>())
14140 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14141 Init->getBeginLoc()))
14142 FSI->markSafeWeakUse(
Init);
14163 if (!
Result.isUsable()) {
14203 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14204 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14206 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14241 <<
Init->getSourceRange();
14257 diag::ext_in_class_initializer_float_type_cxx11)
14258 << DclT <<
Init->getSourceRange();
14260 diag::note_in_class_initializer_float_type_cxx11)
14263 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14264 << DclT <<
Init->getSourceRange();
14267 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14268 <<
Init->getSourceRange();
14275 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14276 << DclT <<
Init->getSourceRange()
14282 << DclT <<
Init->getSourceRange();
14295 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14303 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14316 if (!InitType.
isNull() &&
14334 if (InitializedFromParenListExpr) {
14335 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14358 VarDecl *VD = dyn_cast<VarDecl>(D);
14362 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14363 for (
auto *BD : DD->bindings())
14364 BD->setInvalidDecl();
14377 Context.getBaseElementType(Ty),
14378 diag::err_typecheck_decl_incomplete_type)) {
14385 diag::err_abstract_type_in_decl,
14400 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14405 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14406 Var->setInvalidDecl();
14422 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14423 !Var->isThisDeclarationADemotedDefinition()) {
14424 if (Var->isStaticDataMember()) {
14428 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14429 Diag(Var->getLocation(),
14430 diag::err_constexpr_static_mem_var_requires_init)
14432 Var->setInvalidDecl();
14436 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14437 Var->setInvalidDecl();
14444 if (!Var->isInvalidDecl() &&
14446 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14447 bool HasConstExprDefaultConstructor =
false;
14448 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14449 for (
auto *Ctor : RD->ctors()) {
14450 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14451 Ctor->getMethodQualifiers().getAddressSpace() ==
14453 HasConstExprDefaultConstructor =
true;
14457 if (!HasConstExprDefaultConstructor) {
14458 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14459 Var->setInvalidDecl();
14465 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14466 Diag(Var->getLocation(), diag::err_specialization_const);
14467 Var->setInvalidDecl();
14471 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14472 if (Var->getStorageClass() ==
SC_Extern) {
14473 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14475 Var->setInvalidDecl();
14479 diag::err_typecheck_decl_incomplete_type)) {
14480 Var->setInvalidDecl();
14483 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14484 if (!RD->hasTrivialDefaultConstructor()) {
14485 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14486 Var->setInvalidDecl();
14496 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14503 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14519 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14521 diag::err_typecheck_decl_incomplete_type))
14522 Var->setInvalidDecl();
14527 diag::err_abstract_type_in_decl,
14529 Var->setInvalidDecl();
14532 Diag(Var->getLocation(), diag::warn_private_extern);
14533 Diag(Var->getLocation(), diag::note_private_extern);
14536 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14537 !Var->isInvalidDecl())
14548 if (!Var->isInvalidDecl()) {
14552 Var->getLocation(), ArrayT->getElementType(),
14553 diag::err_array_incomplete_or_sizeless_type))
14554 Var->setInvalidDecl();
14556 if (Var->getStorageClass() ==
SC_Static) {
14566 if (Var->isFirstDecl())
14568 diag::ext_typecheck_decl_incomplete_type,
14574 if (!Var->isInvalidDecl())
14585 if (Var->isConstexpr())
14586 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14589 Diag(Var->getLocation(),
14590 diag::err_typecheck_incomplete_array_needs_initializer);
14591 Var->setInvalidDecl();
14598 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14599 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14608 if (Var->isInvalidDecl())
14611 if (!Var->hasAttr<AliasAttr>()) {
14614 diag::err_typecheck_decl_incomplete_type)) {
14615 Var->setInvalidDecl();
14624 diag::err_abstract_type_in_decl,
14626 Var->setInvalidDecl();
14633 unsigned DiagID = diag::warn_default_init_const_unsafe;
14634 if (Var->getStorageDuration() ==
SD_Static ||
14635 Var->getStorageDuration() ==
SD_Thread)
14636 DiagID = diag::warn_default_init_const;
14638 bool EmitCppCompat = !
Diags.isIgnored(
14639 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14640 Var->getLocation());
14642 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14656 if (
const auto *CXXRecord =
14657 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14661 if (!CXXRecord->isPOD())
14706 }
else if (
Init.isInvalid()) {
14724 VarDecl *VD = dyn_cast<VarDecl>(D);
14783 const char *PrevSpec;
14808 Context.getAttributedType(
Attr, MethodType, MethodType);
14819 if (var->isInvalidDecl())
return;
14826 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14828 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14830 var->setInvalidDecl();
14838 var->hasLocalStorage()) {
14839 switch (var->getType().getObjCLifetime()) {
14852 if (var->hasLocalStorage() &&
14861 if (var->isThisDeclarationADefinition() &&
14862 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14863 var->isExternallyVisible() && var->hasLinkage() &&
14864 !var->isInline() && !var->getDescribedVarTemplate() &&
14868 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14869 var->getLocation())) {
14871 VarDecl *prev = var->getPreviousDecl();
14876 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14877 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14883 std::optional<bool> CacheHasConstInit;
14884 const Expr *CacheCulprit =
nullptr;
14885 auto checkConstInit = [&]()
mutable {
14886 const Expr *
Init = var->getInit();
14887 if (
Init->isInstantiationDependent())
14890 if (!CacheHasConstInit)
14891 CacheHasConstInit = var->getInit()->isConstantInitializer(
14892 Context, var->getType()->isReferenceType(), &CacheCulprit);
14893 return *CacheHasConstInit;
14897 if (var->getType().isDestructedType()) {
14901 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14903 Diag(var->getLocation(), diag::note_use_thread_local);
14905 if (!checkConstInit()) {
14913 Diag(var->getLocation(), diag::note_use_thread_local);
14919 if (!var->getType()->isStructureType() && var->hasInit() &&
14922 unsigned NumInits = ILE->getNumInits();
14924 for (
unsigned I = 0; I < NumInits; ++I) {
14925 const auto *
Init = ILE->getInit(I);
14928 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14932 unsigned NumConcat = SL->getNumConcatenated();
14936 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14937 bool OnlyOneMissingComma =
true;
14938 for (
unsigned J = I + 1; J < NumInits; ++J) {
14939 const auto *
Init = ILE->getInit(J);
14942 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14943 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14944 OnlyOneMissingComma =
false;
14949 if (OnlyOneMissingComma) {
14951 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14953 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
14955 Diag(SL->getStrTokenLoc(1),
14956 diag::warn_concatenated_literal_array_init)
14958 Diag(SL->getBeginLoc(),
14959 diag::note_concatenated_string_literal_silence);
14970 if (var->hasAttr<BlocksAttr>())
14974 bool GlobalStorage = var->hasGlobalStorage();
14975 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14977 bool HasConstInit =
true;
14980 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14985 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14986 (GlobalStorage || var->isConstexpr() ||
14987 var->mightBeUsableInConstantExpressions(
Context))) {
14999 HasConstInit = checkConstInit();
15003 if (HasConstInit) {
15004 if (var->isStaticDataMember() && !var->isInline() &&
15005 var->getLexicalDeclContext()->isRecord() &&
15006 type->isIntegralOrEnumerationType()) {
15011 diag::ext_in_class_initializer_non_constant)
15012 <<
Init->getSourceRange();
15015 (void)var->checkForConstantInitialization(Notes);
15017 }
else if (CacheCulprit) {
15018 Notes.emplace_back(CacheCulprit->
getExprLoc(),
15019 PDiag(diag::note_invalid_subexpr_in_const_expr));
15024 HasConstInit = var->checkForConstantInitialization(Notes);
15027 if (HasConstInit) {
15029 }
else if (var->isConstexpr()) {
15033 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15034 diag::note_invalid_subexpr_in_const_expr) {
15035 DiagLoc = Notes[0].first;
15038 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15039 << var <<
Init->getSourceRange();
15040 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15041 Diag(Notes[I].first, Notes[I].second);
15042 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15043 auto *
Attr = var->getAttr<ConstInitAttr>();
15044 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15045 <<
Init->getSourceRange();
15048 for (
auto &it : Notes)
15049 Diag(it.first, it.second);
15050 }
else if (var->isStaticDataMember() && !var->isInline() &&
15051 var->getLexicalDeclContext()->isRecord()) {
15052 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15053 <<
Init->getSourceRange();
15054 for (
auto &it : Notes)
15055 Diag(it.first, it.second);
15056 var->setInvalidDecl();
15057 }
else if (IsGlobal &&
15059 var->getLocation())) {
15068 if (!checkConstInit())
15069 Diag(var->getLocation(), diag::warn_global_constructor)
15070 <<
Init->getSourceRange();
15076 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15081 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15082 std::optional<QualType::NonConstantStorageReason> Reason;
15083 if (HasConstInit &&
15084 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15090 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15097 var->getType().isConstQualified()) {
15099 NonConstNonReferenceType) &&
15100 "This case should've already been handled elsewhere");
15101 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15102 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15108 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15110 SectionAttr::Declspec_allocate));
15112 var->dropAttr<SectionAttr>();
15127 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15128 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15135 if (!
type->isDependentType())
15141 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15142 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15145 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15156 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15157 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15167 NewAttr->setInherited(
true);
15169 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15170 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15171 NewAttr->setInherited(
true);
15176 if (!FD->
hasAttr<DLLExportAttr>())
15179 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15180 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15181 NewAttr->setInherited(
true);
15192 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15197 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15210 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15222 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15226 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15230 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15234 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15239 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15240 for (
auto *BD : DD->bindings()) {
15245 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15268 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15275 bool IsClassTemplateMember =
15277 Context->getDescribedClassTemplate();
15280 IsClassTemplateMember
15281 ? diag::warn_attribute_dllimport_static_field_definition
15282 : diag::err_attribute_dllimport_static_field_definition);
15283 Diag(IA->getLocation(), diag::note_attribute);
15284 if (!IsClassTemplateMember)
15312 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15332 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15336 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15338 if (!MagicValueExpr) {
15341 std::optional<llvm::APSInt> MagicValueInt;
15343 Diag(I->getRange().getBegin(),
15344 diag::err_type_tag_for_datatype_not_ice)
15348 if (MagicValueInt->getActiveBits() > 64) {
15349 Diag(I->getRange().getBegin(),
15350 diag::err_type_tag_for_datatype_too_large)
15354 uint64_t MagicValue = MagicValueInt->getZExtValue();
15357 I->getMatchingCType(),
15358 I->getLayoutCompatible(),
15359 I->getMustBeNull());
15364 auto *VD = dyn_cast<VarDecl>(DD);
15365 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15377 bool DiagnosedMultipleDecomps =
false;
15379 bool DiagnosedNonDeducedAuto =
false;
15381 for (
Decl *D : Group) {
15386 if (
auto *VD = dyn_cast<VarDecl>(D);
15387 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15388 VD->hasGlobalStorage())
15392 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15393 if (!FirstDeclaratorInGroup)
15394 FirstDeclaratorInGroup = DD;
15395 if (!FirstDecompDeclaratorInGroup)
15396 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15399 FirstNonDeducedAutoInGroup = DD;
15401 if (FirstDeclaratorInGroup != DD) {
15404 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15406 diag::err_decomp_decl_not_alone)
15408 << DD->getSourceRange();
15409 DiagnosedMultipleDecomps =
true;
15415 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15417 diag::err_auto_non_deduced_not_alone)
15418 << FirstNonDeducedAutoInGroup->
getType()
15421 << DD->getSourceRange();
15422 DiagnosedNonDeducedAuto =
true;
15427 Decls.push_back(D);
15433 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15435 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15447 if (Group.size() > 1) {
15449 VarDecl *DeducedDecl =
nullptr;
15450 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15451 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15455 if (!DT || DT->getDeducedType().isNull())
15458 Deduced = DT->getDeducedType();
15460 }
else if (!
Context.hasSameType(DT->getDeducedType(), Deduced)) {
15461 auto *AT = dyn_cast<AutoType>(DT);
15463 diag::err_auto_different_deductions)
15464 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
15465 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15489 if (Group.empty() || !Group[0])
15492 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15493 Group[0]->getLocation()) &&
15494 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15495 Group[0]->getLocation()))
15498 if (Group.size() >= 2) {
15506 Decl *MaybeTagDecl = Group[0];
15508 Group = Group.slice(1);
15561 const auto *VD = dyn_cast<ValueDecl>(D);
15575 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15577 Diag(TD->getLocation(), diag::note_declared_at);
15583 if (!ExplicitThisLoc.
isValid())
15586 "explicit parameter in non-cplusplus mode");
15588 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15600 LSI->ExplicitObjectParameter = P;
15623 ? diag::ext_register_storage_class
15624 : diag::warn_deprecated_register)
15630 diag::err_invalid_storage_class_in_func_decl)
15639 diag::err_invalid_storage_class_in_func_decl);
15651 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15672 PrevDecl =
nullptr;
15689 diag::err_hlsl_incomplete_resource_array_in_function_param);
15701 New->setInvalidDecl();
15720 Diag(
New->getLocation(), diag::err_module_private_local)
15724 if (
New->hasAttr<BlocksAttr>()) {
15725 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15741 T,
Context.getTrivialTypeSourceInfo(T, Loc),
15743 Param->setImplicit();
15756 !
Parameter->getIdentifier()->isPlaceholder()) {
15757 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15765 if (
LangOpts.NumLargeByValueCopy == 0)
15771 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15772 if (Size >
LangOpts.NumLargeByValueCopy)
15780 if (T->isDependentType() || !T.isPODType(
Context))
15782 unsigned Size =
Context.getTypeSizeInChars(T).getQuantity();
15783 if (Size >
LangOpts.NumLargeByValueCopy)
15796 T->isObjCLifetimeType()) {
15803 if (T->isArrayType()) {
15804 if (!T.isConstQualified()) {
15808 NameLoc, diag::err_arc_array_param_no_ownership, T,
false));
15810 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15815 lifetime = T->getObjCARCImplicitLifetime();
15817 T =
Context.getLifetimeQualifiedType(T, lifetime);
15821 Context.getAdjustedParameterType(T),
15822 TSInfo, SC,
nullptr);
15827 if (
New->isParameterPack())
15829 CSI->LocalPacks.push_back(
New);
15831 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15832 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15839 if (T->isObjCObjectType()) {
15843 diag::err_object_cannot_be_passed_returned_by_value) << 1 << T
15845 T =
Context.getObjCObjectPointerType(T);
15850 if (T.getPointerAuth()) {
15851 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) << T << 1;
15852 New->setInvalidDecl();
15866 !(T->isFunctionPointerType() &&
15872 Diag(NameLoc, diag::err_arg_with_address_space);
15873 New->setInvalidDecl();
15877 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15878 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15879 New->setInvalidDecl();
15900 for (
int i = FTI.
NumParams; i != 0; ) {
15905 llvm::raw_svector_ostream(Code)
15916 const char* PrevSpec;
15919 DiagID,
Context.getPrintingPolicy());
15948 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15950 ParentScope, D, TemplateParameterLists, Bases);
15956 if (!Bases.empty())
15964 Consumer.HandleInlineFunctionDefinition(D);
15973 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15976 PossiblePrototype = Prev;
16000 if (II->isStr(
"main") || II->isStr(
"efi_main"))
16019 if (FD->
hasAttr<DeviceKernelAttr>())
16068 bool DefinitionVisible =
false;
16072 Definition->getNumTemplateParameterLists())) {
16075 if (!DefinitionVisible) {
16076 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16090 Diag(
Definition->getLocation(), diag::note_previous_definition);
16099 LSI->
Lambda = LambdaClass;
16138 for (
const auto &
C : LambdaClass->
captures()) {
16139 if (
C.capturesVariable()) {
16143 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16145 true,
C.getLocation(),
16146 C.isPackExpansion()
16148 I->getType(),
false);
16150 }
else if (
C.capturesThis()) {
16176 FD = FunTmpl->getTemplatedDecl();
16187 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16192 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16197 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16198 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16199 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16200 !
Attr->isDefaultVersion()) {
16209 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16211 Ctor->isDefaultConstructor() &&
16212 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16254 "There should be an active template instantiation on the stack "
16255 "when instantiating a generic lambda!");
16265 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16266 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16281 diag::err_func_def_incomplete_result) ||
16283 diag::err_abstract_type_in_decl,
16299 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16303 "parameters should not be in newly created FD yet");
16306 if (NonParmDecl->getDeclName())
16311 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16312 for (
auto *EI : ED->enumerators())
16320 Param->setOwningFunction(FD);
16323 if (Param->getIdentifier() && FnBodyScope) {
16360 assert(!FD->
hasAttr<DLLExportAttr>());
16361 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16391 const auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
16392 if (!SKEPAttr->isInvalidAttr()) {
16412 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16413 FD = TD->getTemplatedDecl();
16414 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16426 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16427 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16428 if (!NRVOCandidate->isNRVOVariable()) {
16429 Diag(Returns[I]->getRetValue()->getExprLoc(),
16430 diag::warn_not_eliding_copy_on_return);
16450 Outer.Fun.hasTrailingReturnType()) {
16468 if (FD->isConstexpr())
16473 if (FD->getReturnType()->getContainedDeducedType())
16476 return Consumer.shouldSkipFunctionBody(D);
16483 FD->setHasSkippedBody();
16496 S.PopExpressionEvaluationContext();
16501 bool IsLambda =
false;
16505 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16507 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16508 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16522 return It->second = R;
16527 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16529 if (IsOrNestedInEscapingBlock(P.second))
16530 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16545 methodHasName(FD,
"get_return_object_on_allocation_failure");
16555 if (!FD->
hasAttr<CoroWrapperAttr>())
16560 bool RetainFunctionScopeInfo) {
16587 SYCLKernelEntryPointAttr *SKEPAttr =
16588 FD->
getAttr<SYCLKernelEntryPointAttr>();
16590 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16591 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16592 SKEPAttr->setInvalidAttr();
16594 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16595 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16596 SKEPAttr->setInvalidAttr();
16598 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16599 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16600 SKEPAttr->setInvalidAttr();
16602 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16603 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16604 SKEPAttr->setInvalidAttr();
16612 if (Body && !SKEPAttr->isInvalidAttr()) {
16642 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16644 Diag(SEAttr->getLocation(),
16645 diag::err_sycl_external_invalid_deleted_function)
16675 Expr *Dummy =
nullptr;
16686 if (LSI->HasImplicitReturnType) {
16693 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16697 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16698 Proto->getExtProtoInfo()));
16731 dyn_cast<CXXDestructorDecl>(FD))
16751 if (PossiblePrototype) {
16755 TypeLoc TL = TI->getTypeLoc();
16758 diag::note_declaration_not_a_prototype)
16761 FTL.getRParenLoc(),
"void")
16769 if (LocInfo.first.isInvalid())
16773 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16777 if (LocInfo.second > Buffer.size())
16780 const char *LexStart = Buffer.data() + LocInfo.second;
16781 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16783 return StartTok.consume_front(
"const") &&
16785 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16788 auto findBeginLoc = [&]() {
16804 diag::note_static_for_internal_linkage)
16815 if (!PossiblePrototype)
16861 if (PossiblePrototype)
16863 diag::warn_non_prototype_changes_behavior)
16870 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16871 if (!CmpndBody->body_empty())
16872 Diag(CmpndBody->body_front()->getBeginLoc(),
16873 diag::warn_dispatch_body_ignored);
16875 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16883 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16884 Context.setNonKeyFunction(MD);
16900 "Function parsing confused");
16901 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16913 << MD->getSelector().getAsString();
16918 bool isDesignated =
16919 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16920 assert(isDesignated && InitMethod);
16921 (void)isDesignated;
16924 auto IFace = MD->getClassInterface();
16927 auto SuperD = IFace->getSuperClass();
16937 diag::warn_objc_designated_init_missing_super_call);
16939 diag::note_objc_designated_init_marked_here);
16947 diag::warn_objc_secondary_init_missing_init_call);
16963 "This should only be set for ObjC methods, which should have been "
16964 "handled in the block above.");
16979 if (!
Destructor->getParent()->isDependentType())
16997 ActivePolicy = &WP;
17000 if (!IsInstantiation && FD &&
17006 if (FD && FD->
hasAttr<NakedAttr>()) {
17010 bool RegisterVariables =
false;
17011 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
17012 for (
const auto *
Decl : DS->decls()) {
17013 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
17014 RegisterVariables =
17015 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
17016 if (!RegisterVariables)
17021 if (RegisterVariables)
17024 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
17025 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
17034 "Leftover temporaries in function");
17035 assert(!
Cleanup.exprNeedsCleanups() &&
17036 "Unaccounted cleanups in function");
17038 "Leftover expressions for odr-use checking");
17047 if (!IsInstantiation)
17050 if (!RetainFunctionScopeInfo)
17079 D = TD->getTemplatedDecl();
17091 assert(
LangOpts.implicitFunctionsAllowed() &&
17092 "Implicit function declarations aren't allowed in this language mode");
17099 Scope *BlockScope = S;
17107 Scope *ContextScope = BlockScope;
17111 ContextScope = ContextScope->
getParent();
17131 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17134 return ExternCPrev;
17140 if (II.
getName().starts_with(
"__builtin_"))
17141 diag_id = diag::warn_builtin_unknown;
17144 diag_id = diag::ext_implicit_function_decl_c99;
17146 diag_id = diag::warn_implicit_function_decl;
17154 if (S && !ExternCPrev &&
17161 Diag(Loc, diag_id) << &II;
17177 return ExternCPrev;
17185 Context.getPrintingPolicy());
17187 assert(!
Error &&
"Error setting up implicit decl!");
17230 bool IsNothrow =
false;
17242 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17260 if (!FD->
hasAttr<AllocSizeAttr>()) {
17261 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17272 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17273 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17297 unsigned FormatIdx;
17299 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17300 if (!FD->
hasAttr<FormatAttr>()) {
17301 const char *fmt =
"printf";
17303 if (FormatIdx < NumParams &&
17309 HasVAListArg ? 0 : FormatIdx+2,
17313 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17315 if (!FD->
hasAttr<FormatAttr>())
17317 &
Context.Idents.get(
"scanf"),
17319 HasVAListArg ? 0 : FormatIdx+2,
17325 if (!FD->
hasAttr<CallbackAttr>() &&
17326 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17327 FD->
addAttr(CallbackAttr::CreateImplicit(
17333 bool NoExceptions =
17335 bool ConstWithoutErrnoAndExceptions =
17336 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17337 bool ConstWithoutExceptions =
17338 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17339 if (!FD->
hasAttr<ConstAttr>() &&
17340 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17341 (!ConstWithoutErrnoAndExceptions ||
17343 (!ConstWithoutExceptions || NoExceptions))
17349 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17350 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17352 switch (BuiltinID) {
17353 case Builtin::BI__builtin_fma:
17354 case Builtin::BI__builtin_fmaf:
17355 case Builtin::BI__builtin_fmal:
17356 case Builtin::BIfma:
17357 case Builtin::BIfmaf:
17358 case Builtin::BIfmal:
17368 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17369 !FD->
hasAttr<NonNullAttr>()) {
17371 for (
int I : Indxs) {
17374 T =
Context.getAttributedType(attr::TypeNonNull, T, T);
17379 for (
int I : Indxs)
17380 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17381 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17382 ParamIndxs.size()));
17385 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17386 !FD->
hasAttr<ReturnsTwiceAttr>())
17389 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17391 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17393 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17396 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17401 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17408 switch (BuiltinID) {
17409 case Builtin::BImemalign:
17410 case Builtin::BIaligned_alloc:
17411 if (!FD->
hasAttr<AllocAlignAttr>())
17420 switch (BuiltinID) {
17421 case Builtin::BIcalloc:
17422 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17425 case Builtin::BImemalign:
17426 case Builtin::BIaligned_alloc:
17427 case Builtin::BIrealloc:
17431 case Builtin::BImalloc:
17451 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17467 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17470 if (!FD->
hasAttr<FormatAttr>())
17472 &
Context.Idents.get(
"printf"), 2,
17473 Name->
isStr(
"vasprintf") ? 0 : 3,
17477 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17480 if (!FD->
hasAttr<FormatArgAttr>())
17488 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17489 assert(!T.isNull() &&
"GetTypeForDeclarator() returned null type");
17492 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17493 TInfo =
Context.getTrivialTypeSourceInfo(T);
17546 if (T->isDependentType())
17556 if (T->isAtomicType())
17557 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17560 std::optional<unsigned> QualSelect;
17562 QualSelect = diag::CVQualList::Both;
17564 QualSelect = diag::CVQualList::Const;
17566 QualSelect = diag::CVQualList::Volatile;
17569 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17571 T = T.getAtomicUnqualifiedType();
17576 if (BT->isInteger())
17579 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17580 << T << T->isBitIntType();
17584 QualType EnumUnderlyingTy,
bool IsFixed,
17586 if (IsScoped != Prev->
isScoped()) {
17587 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17593 if (IsFixed && Prev->
isFixed()) {
17596 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17599 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17605 }
else if (IsFixed != Prev->
isFixed()) {
17606 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17628 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17664 llvm_unreachable(
"invalid TTK");
17703 if (IsIgnoredLoc(NewTagLoc))
17706 auto IsIgnored = [&](
const TagDecl *Tag) {
17707 return IsIgnoredLoc(Tag->getLocation());
17724 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17732 if (isDefinition) {
17740 bool previousMismatch =
false;
17742 if (I->getTagKind() !=
NewTag) {
17747 if (!previousMismatch) {
17748 previousMismatch =
true;
17749 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17753 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17766 if (PrevDef && IsIgnored(PrevDef))
17770 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17777 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17807 if (!Namespace || Namespace->isAnonymousNamespace())
17810 Namespaces.push_back(II);
17813 if (Lookup == Namespace)
17820 llvm::raw_svector_ostream OS(Insertion);
17823 std::reverse(Namespaces.begin(), Namespaces.end());
17824 for (
auto *II : Namespaces)
17825 OS << II->getName() <<
"::";
17838 if (OldDC->
Equals(NewDC))
17857 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17858 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17863 "Nameless record must be a definition!");
17868 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17871 bool isMemberSpecialization =
false;
17872 bool IsInjectedClassName =
false;
17878 if (TemplateParameterLists.size() > 0 ||
17882 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17899 !isMemberSpecialization)
17900 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17903 if (TemplateParams) {
17905 Diag(KWLoc, diag::err_enum_template);
17909 if (TemplateParams->
size() > 0) {
17918 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17919 AS, ModulePrivateLoc,
17921 TemplateParameterLists.data(), SkipBody);
17927 isMemberSpecialization =
true;
17931 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17950 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17951 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17952 Diag(KWLoc, diag::note_enum_friend)
17953 << (ScopedEnum + ScopedEnumUsesClassTag);
17959 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17960 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17963 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17966 EnumUnderlying =
Context.IntTy.getTypePtr();
17967 }
else if (UnderlyingType.
get()) {
17975 EnumUnderlying = TI;
17979 EnumUnderlying =
Context.IntTy.getTypePtr();
17983 EnumUnderlying =
Context.IntTy.getTypePtr();
17993 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
17994 TI && TI->
getType()->isAtomicType())
17997 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
18003 EnumUnderlying =
Context.IntTy.getTypePtr();
18009 bool isStdBadAlloc =
false;
18010 bool isStdAlignValT =
false;
18019 auto createTagFromNewDecl = [&]() ->
TagDecl * {
18029 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
18033 if (EnumUnderlying) {
18035 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18041 ?
Context.getPromotedIntegerType(EnumTy)
18062 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18078 goto CreateNewDecl;
18086 IsDependent =
true;
18115 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18117 IsDependent =
true;
18122 Diag(NameLoc, diag::err_not_tag_in_scope)
18123 << Kind << Name << DC << SS.
getRange();
18126 goto CreateNewDecl;
18174 bool FriendSawTagOutsideEnclosingNamespace =
false;
18181 FriendSawTagOutsideEnclosingNamespace =
true;
18190 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18192 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18223 Previous.getFoundDecl()->isTemplateParameter()) {
18232 if (Name->
isStr(
"bad_alloc")) {
18234 isStdBadAlloc =
true;
18241 }
else if (Name->
isStr(
"align_val_t")) {
18242 isStdAlignValT =
true;
18254 IsTemplateParamOrArg)) {
18255 if (
Invalid)
goto CreateNewDecl;
18338 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18339 if (Tag->getDeclName() == Name &&
18340 Tag->getDeclContext()->getRedeclContext()
18341 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18348 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18350 RD->isInjectedClassName()) {
18357 IsInjectedClassName =
true;
18364 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18365 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18368 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18370 *
this, OldTag->getDeclContext(), SearchDC))) {
18371 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18372 Diag(Shadow->getTargetDecl()->getLocation(),
18373 diag::note_using_decl_target);
18374 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18378 goto CreateNewDecl;
18382 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18388 SS.
isNotEmpty() || isMemberSpecialization)) {
18394 bool SafeToContinue =
18397 if (SafeToContinue)
18398 Diag(KWLoc, diag::err_use_with_wrong_tag)
18401 PrevTagDecl->getKindName());
18403 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18404 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18406 if (SafeToContinue)
18407 Kind = PrevTagDecl->getTagKind();
18420 return PrevTagDecl;
18424 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18425 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18426 else if (
const Type *T =
18427 dyn_cast_if_present<const Type *>(EnumUnderlying))
18428 EnumUnderlyingTy =
QualType(T, 0);
18434 ScopedEnum, EnumUnderlyingTy,
18435 IsFixed, PrevEnum))
18445 Diag(NameLoc, diag::ext_member_redeclared);
18446 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18453 if (!Attrs.
empty()) {
18457 (PrevTagDecl->getFriendObjectKind() ==
18470 return PrevTagDecl;
18475 return PrevTagDecl;
18484 if (Def->isBeingDefined()) {
18485 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18486 Diag(PrevTagDecl->getLocation(),
18487 diag::note_previous_definition);
18495 bool IsExplicitSpecializationAfterInstantiation =
false;
18496 if (isMemberSpecialization) {
18498 IsExplicitSpecializationAfterInstantiation =
18499 RD->getTemplateSpecializationKind() !=
18501 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18502 IsExplicitSpecializationAfterInstantiation =
18503 ED->getTemplateSpecializationKind() !=
18512 bool HiddenDefVisible =
false;
18526 SkipBody->
New = createTagFromNewDecl();
18535 if (!HiddenDefVisible && Hidden)
18540 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18545 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18548 Diag(NameLoc, diag::err_redefinition) << Name;
18550 NameLoc.
isValid() ? NameLoc : KWLoc);
18569 SearchDC = PrevTagDecl->getDeclContext();
18597 Diag(NameLoc, diag::err_tag_reference_non_tag)
18598 << PrevDecl << NTK << Kind;
18604 SS.
isNotEmpty() || isMemberSpecialization)) {
18610 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18616 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18619 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18620 << Name << Kind << TND->getUnderlyingType();
18628 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18660 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18661 ScopedEnumUsesClassTag, IsFixed);
18665 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18673 if (IsFixed && ED->
isFixed()) {
18676 }
else if (PrevDecl &&
18678 Diag(Loc, diag::ext_forward_ref_enum_def)
18682 unsigned DiagID = diag::ext_forward_ref_enum;
18684 DiagID = diag::ext_ms_forward_ref_enum;
18686 DiagID = diag::err_forward_ref_enum;
18691 if (EnumUnderlying) {
18693 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18699 ?
Context.getPromotedIntegerType(EnumTy)
18701 assert(ED->
isComplete() &&
"enum with type should be complete");
18711 cast_or_null<CXXRecordDecl>(PrevDecl));
18717 cast_or_null<RecordDecl>(PrevDecl));
18723 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18729 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18731 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18738 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18751 isMemberSpecialization))
18755 if (TemplateParameterLists.size() > 0) {
18756 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18775 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18781 if (ModulePrivateLoc.
isValid()) {
18782 if (isMemberSpecialization)
18783 Diag(
New->getLocation(), diag::err_module_private_specialization)
18790 New->setModulePrivate();
18810 Diag(Loc, diag::err_type_defined_in_param_type)
18816 }
else if (!PrevDecl) {
18820 Diag(Loc, diag::warn_decl_in_param_list)
18826 New->setInvalidDecl();
18848 New->startDefinition();
18850 New->setCompleteDefinition();
18851 New->demoteThisDefinitionToDeclaration();
18879 if (!
New->isInvalidDecl() &&
18880 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18887 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18900 if (isMemberSpecialization && !
New->isInvalidDecl())
18907 if (
New->isBeingDefined())
18908 if (
auto RD = dyn_cast<RecordDecl>(
New))
18909 RD->completeDefinition();
18911 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18945 bool IsFinalSpelledSealed,
18953 if (!
Record->getIdentifier())
18961 IsFinalSpelledSealed
18962 ? FinalAttr::Keyword_sealed
18963 : FinalAttr::Keyword_final));
18981 "Broken injected-class-name");
18988 Tag->setBraceRange(BraceRange);
18991 if (Tag->isBeingDefined()) {
18992 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18993 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18994 RD->completeDefinition();
18997 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18999 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
19000 auto *Def = RD->getDefinition();
19001 assert(Def &&
"The record is expected to have a completed definition");
19002 unsigned NumInitMethods = 0;
19003 for (
auto *
Method : Def->methods()) {
19004 if (!
Method->getIdentifier())
19006 if (
Method->getName() ==
"__init")
19009 if (NumInitMethods > 1 || !Def->hasInitMethod())
19010 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
19028 Tag->setTopLevelDeclInObjCContainer();
19031 if (!Tag->isInvalidDecl())
19032 Consumer.HandleTagDeclDefinition(Tag);
19036 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
19042 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
19046 if (llvm::any_of(RD->
fields(),
19047 [](
const FieldDecl *FD) { return FD->isBitField(); }))
19048 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
19055 Tag->setInvalidDecl();
19058 if (Tag->isBeingDefined()) {
19059 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
19060 RD->completeDefinition();
19073 QualType FieldTy,
bool IsMsStruct,
19084 diag::err_field_incomplete_or_sizeless))
19087 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19089 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19099 llvm::APSInt
Value;
19104 BitWidth = ICE.
get();
19107 if (
Value == 0 && FieldName)
19108 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19111 if (
Value.isSigned() &&
Value.isNegative()) {
19113 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19115 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19122 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19127 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19128 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19129 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19133 bool CStdConstraintViolation =
19135 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19136 if (CStdConstraintViolation || MSBitfieldViolation) {
19137 unsigned DiagWidth =
19138 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19139 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19141 << !CStdConstraintViolation << DiagWidth;
19147 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19148 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19191 TInfo =
Context.getTrivialTypeSourceInfo(T, Loc);
19202 diag::err_invalid_thread)
19210 switch (
Previous.getResultKind()) {
19217 PrevDecl =
Previous.getRepresentativeDecl();
19231 PrevDecl =
nullptr;
19235 PrevDecl =
nullptr;
19242 TSSL, AS, PrevDecl, &D);
19245 Record->setInvalidDecl();
19264 bool Mutable,
Expr *BitWidth,
19270 bool InvalidDecl =
false;
19275 if (T.isNull() || T->containsErrors()) {
19276 InvalidDecl =
true;
19282 bool isIncomplete =
19286 diag::err_field_incomplete_or_sizeless);
19287 if (isIncomplete) {
19289 Record->setInvalidDecl();
19290 InvalidDecl =
true;
19295 Record->setInvalidDecl();
19296 InvalidDecl =
true;
19302 if (T.hasAddressSpace() || T->isDependentAddressSpaceType() ||
19303 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19304 Diag(Loc, diag::err_field_with_address_space);
19305 Record->setInvalidDecl();
19306 InvalidDecl =
true;
19312 if (T->isEventT() || T->isImageType() || T->isSamplerT() ||
19313 T->isBlockPointerType()) {
19314 Diag(Loc, diag::err_opencl_type_struct_or_union_field) << T;
19315 Record->setInvalidDecl();
19316 InvalidDecl =
true;
19321 "__cl_clang_bitfields",
LangOpts)) {
19322 Diag(Loc, diag::err_opencl_bitfields);
19323 InvalidDecl =
true;
19329 T.hasQualifiers()) {
19330 InvalidDecl =
true;
19331 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19336 if (!InvalidDecl && T->isVariablyModifiedType()) {
19338 TInfo, T, Loc, diag::err_typecheck_field_variable_size))
19339 InvalidDecl =
true;
19344 diag::err_abstract_type_in_decl,
19346 InvalidDecl =
true;
19349 BitWidth =
nullptr;
19355 InvalidDecl =
true;
19356 BitWidth =
nullptr;
19361 if (!InvalidDecl && Mutable) {
19362 unsigned DiagID = 0;
19363 if (T->isReferenceType())
19364 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19365 : diag::err_mutable_reference;
19366 else if (T.isConstQualified())
19367 DiagID = diag::err_mutable_const;
19373 Diag(ErrLoc, DiagID);
19374 if (DiagID != diag::ext_mutable_reference) {
19376 InvalidDecl =
true;
19388 BitWidth, Mutable, InitStyle);
19397 Diag(Loc, diag::err_duplicate_member) << II;
19403 if (
Record->isUnion()) {
19405 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19420 const bool HaveMSExt =
19425 HaveMSExt ? diag::ext_union_member_of_reference_type
19426 : diag::err_union_member_of_reference_type)
19446 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19449 if (T.isObjCGCWeak())
19450 Diag(Loc, diag::warn_attribute_weak_on_field);
19453 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19470 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19481 if (RDecl->hasNonTrivialCopyConstructor())
19483 else if (!RDecl->hasTrivialDefaultConstructor())
19485 else if (RDecl->hasNonTrivialCopyAssignment())
19487 else if (RDecl->hasNonTrivialDestructor())
19492 RDecl->hasObjectMember()) {
19500 if (!FD->
hasAttr<UnavailableAttr>())
19501 FD->
addAttr(UnavailableAttr::CreateImplicit(
19502 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19509 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19510 : diag::err_illegal_union_or_anon_struct_member)
19522 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19525 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19533 if (!CD->IsClassExtension())
19550 AllIvarDecls.push_back(Ivar);
19562 if (!
Record->hasUserDeclaredDestructor()) {
19570 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19571 if (DD->isInvalidDecl())
19575 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19589 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19593 Msg = diag::err_ambiguous_destructor;
19598 Msg = diag::err_no_viable_destructor;
19609 Record->setInvalidDecl();
19616 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19660 if (!Method->getTrailingRequiresClause())
19661 SatisfactionStatus.push_back(
true);
19665 SatisfactionStatus.push_back(
false);
19667 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19671 for (
size_t i = 0; i < Methods.size(); i++) {
19672 if (!SatisfactionStatus[i])
19680 bool AnotherMethodIsMoreConstrained =
false;
19681 for (
size_t j = 0; j < Methods.size(); j++) {
19682 if (i == j || !SatisfactionStatus[j])
19696 AnotherMethodIsMoreConstrained =
true;
19700 AnotherMethodIsMoreConstrained)) {
19703 AnotherMethodIsMoreConstrained =
true;
19705 if (AnotherMethodIsMoreConstrained)
19710 if (!AnotherMethodIsMoreConstrained) {
19711 Method->setIneligibleOrNotSelected(
false);
19712 Record->addedEligibleSpecialMemberFunction(Method,
19713 1 << llvm::to_underlying(CSM));
19727 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19729 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19731 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19735 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19736 if (CD->isInvalidDecl())
19738 if (CD->isDefaultConstructor())
19739 DefaultConstructors.push_back(MD);
19740 else if (CD->isCopyConstructor())
19741 CopyConstructors.push_back(MD);
19742 else if (CD->isMoveConstructor())
19743 MoveConstructors.push_back(MD);
19745 CopyAssignmentOperators.push_back(MD);
19747 MoveAssignmentOperators.push_back(MD);
19765 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19766 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19779 if (
const auto *TD = dyn_cast<TagDecl>(D))
19780 return !TD->isCompleteDefinition();
19795 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19802 assert(EnclosingDecl &&
"missing record or interface decl");
19811 case Decl::ObjCCategory:
19814 case Decl::ObjCImplementation:
19822 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19826 unsigned NumNamedMembers = 0;
19828 for (
const auto *I :
Record->decls()) {
19829 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19830 if (IFD->getDeclName())
19837 const FieldDecl *PreviousField =
nullptr;
19847 RecFields.push_back(FD);
19867 bool IsLastField = (i + 1 == Fields.end());
19882 unsigned DiagID = 0;
19883 if (!
Record->isUnion() && !IsLastField) {
19886 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19890 }
else if (
Record->isUnion())
19892 ? diag::ext_flexible_array_union_ms
19893 : diag::ext_flexible_array_union_gnu;
19894 else if (NumNamedMembers < 1)
19896 ? diag::ext_flexible_array_empty_aggregate_ms
19897 : diag::ext_flexible_array_empty_aggregate_gnu;
19907 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19921 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19928 Record->setHasFlexibleArrayMember(
true);
19937 diag::err_incomplete_type)
19940 diag::err_field_incomplete_or_sizeless))) {
19946 if (
Record && RD->hasFlexibleArrayMember()) {
19949 Record->setHasFlexibleArrayMember(
true);
19950 if (!
Record->isUnion()) {
19967 diag::err_abstract_type_in_decl,
19972 if (
Record && RD->hasObjectMember())
19973 Record->setHasObjectMember(
true);
19974 if (
Record && RD->hasVolatileMember())
19975 Record->setHasVolatileMember(
true);
19994 FD->
addAttr(UnavailableAttr::CreateImplicit(
19995 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19999 !
Record->hasObjectMember()) {
20002 Record->setHasObjectMember(
true);
20005 if (
const auto *RD = BaseType->getAsRecordDecl();
20006 RD && RD->hasObjectMember())
20007 Record->setHasObjectMember(
true);
20008 else if (BaseType->isObjCObjectPointerType() ||
20009 BaseType.isObjCGCStrong())
20010 Record->setHasObjectMember(
true);
20015 !shouldIgnoreForRecordTriviality(FD)) {
20018 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
20021 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
20025 Record->setNonTrivialToPrimitiveCopy(
true);
20027 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
20029 if (FD->
hasAttr<ExplicitInitAttr>())
20030 Record->setHasUninitializedExplicitInitFields(
true);
20032 Record->setNonTrivialToPrimitiveDestroy(
true);
20033 Record->setParamDestroyedInCallee(
true);
20035 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
20039 if (RD->getArgPassingRestrictions() ==
20041 Record->setArgPassingRestrictions(
20044 Record->setArgPassingRestrictions(
20048 Record->setArgPassingRestrictions(
20050 Record->setNonTrivialToPrimitiveCopy(
true);
20055 Record->setHasVolatileMember(
true);
20056 bool ReportMSBitfieldStoragePacking =
20057 Record && PreviousField &&
20058 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
20060 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
20064 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
20065 IsNonDependentBitField(PreviousField)) {
20069 if (FDStorageSize != PreviousFieldStorageSize) {
20071 diag::warn_ms_bitfield_mismatched_storage_packing)
20075 diag::note_ms_bitfield_mismatched_storage_size_previous)
20076 << PreviousField << PreviousField->
getType();
20086 bool Completed =
false;
20091 Record->setInvalidDecl();
20095 if (!CXXRecord->isInvalidDecl()) {
20098 I = CXXRecord->conversion_begin(),
20099 E = CXXRecord->conversion_end(); I != E; ++I)
20100 I.setAccess((*I)->getAccess());
20106 if (!CXXRecord->isDependentType()) {
20107 if (!CXXRecord->isInvalidDecl()) {
20111 if (CXXRecord->getNumVBases()) {
20113 CXXRecord->getFinalOverriders(FinalOverriders);
20115 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20116 MEnd = FinalOverriders.end();
20119 SOEnd = M->second.end();
20120 SO != SOEnd; ++SO) {
20121 assert(SO->second.size() > 0 &&
20122 "Virtual function without overriding functions?");
20123 if (SO->second.size() == 1)
20130 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20132 Diag(M->first->getLocation(),
20133 diag::note_overridden_virtual_function);
20135 OM = SO->second.begin(),
20136 OMEnd = SO->second.end();
20138 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20139 << (
const NamedDecl *)M->first << OM->Method->getParent();
20141 Record->setInvalidDecl();
20144 CXXRecord->completeDefinition(&FinalOverriders);
20154 Record->completeDefinition();
20163 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20164 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20165 EntirelyFunctionPointers(
Record)))) {
20169 Record->reorderDecls(NewDeclOrdering);
20174 auto *Dtor = CXXRecord->getDestructor();
20175 if (Dtor && Dtor->isImplicit() &&
20177 CXXRecord->setImplicitDestructorIsDeleted();
20182 if (
Record->hasAttrs()) {
20185 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20187 IA->getRange(), IA->getBestCase(),
20188 IA->getInheritanceModel());
20194 bool CheckForZeroSize;
20196 CheckForZeroSize =
true;
20201 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20203 CXXRecord->isCLike();
20205 if (CheckForZeroSize) {
20206 bool ZeroSize =
true;
20207 bool IsEmpty =
true;
20208 unsigned NonBitFields = 0;
20210 E =
Record->field_end();
20211 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20213 if (I->isUnnamedBitField()) {
20214 if (!I->isZeroLengthBitField())
20218 QualType FieldType = I->getType();
20220 !
Context.getTypeSizeInChars(FieldType).isZero())
20230 diag::warn_zero_size_struct_union_in_extern_c :
20231 diag::warn_zero_size_struct_union_compat)
20232 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20239 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20240 : diag::ext_no_named_members_in_struct_union)
20248 ID->setEndOfDefinitionLoc(RBrac);
20250 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20252 ID->addDecl(ClsFields[i]);
20256 if (ID->getSuperClass())
20259 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20260 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20261 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20267 IMPDecl->setIvarLBraceLoc(LBrac);
20268 IMPDecl->setIvarRBraceLoc(RBrac);
20270 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20278 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20282 Diag(ClsFields[i]->getLocation(),
20283 diag::err_duplicate_ivar_declaration);
20284 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20290 Diag(ClsFields[i]->getLocation(),
20291 diag::err_duplicate_ivar_declaration);
20292 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20298 CDecl->addDecl(ClsFields[i]);
20300 CDecl->setIvarLBraceLoc(LBrac);
20301 CDecl->setIvarRBraceLoc(RBrac);
20313 assert((T->isIntegralType(Context) ||
20314 T->isEnumeralType()) &&
"Integral type required!");
20315 const unsigned NumTypes = 4;
20316 QualType SignedIntegralTypes[NumTypes] = {
20317 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20319 QualType UnsignedIntegralTypes[NumTypes] = {
20320 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20321 Context.UnsignedLongLongTy
20324 unsigned BitWidth = Context.getTypeSize(T);
20326 : UnsignedIntegralTypes;
20327 for (
unsigned I = 0; I != NumTypes; ++I)
20328 if (Context.getTypeSize(Types[I]) > BitWidth)
20339 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20340 llvm::APSInt EnumVal(IntWidth);
20360 EltTy =
Enum->getIntegerType();
20366 Val = Converted.
get();
20373 if (
Enum->isComplete()) {
20374 EltTy =
Enum->getIntegerType();
20380 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20383 .isWindowsMSVCEnvironment()) {
20384 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20386 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20409 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20411 ? diag::warn_c17_compat_enum_value_not_int
20412 : diag::ext_c23_enum_value_not_int)
20414 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20426 if (
Enum->isDependentType())
20428 else if (!LastEnumConst) {
20437 if (
Enum->isFixed()) {
20438 EltTy =
Enum->getIntegerType();
20447 EltTy = LastEnumConst->
getType();
20450 if (EnumVal < LastEnumConst->getInitVal()) {
20462 if (T.isNull() ||
Enum->isFixed()) {
20466 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20468 if (
Enum->isFixed())
20470 Diag(IdLoc, diag::err_enumerator_wrapped)
20474 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20485 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20497 ? diag::warn_c17_compat_enum_value_not_int
20498 : diag::ext_c23_enum_value_not_int)
20499 << 1 <<
toString(EnumVal, 10) << 1;
20501 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20504 : diag::ext_c23_enum_value_not_int)
20505 << 1 <<
toString(EnumVal, 10) << 1;
20513 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20532 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20540 Skip.Previous = Hidden;
20554 cast_or_null<EnumConstantDecl>(lastEnumConst);
20571 PrevDecl =
nullptr;
20598 "Received TagDecl when not in C++!");
20601 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20603 Diag(IdLoc, diag::err_redefinition) << Id;
20636 if (!BO->isAdditiveOp())
20644 InitExpr = BO->getLHS();
20648 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20668 if (!
Enum->getIdentifier())
20672 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20681 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20684 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20688 llvm::APSInt Val = D->getInitVal();
20689 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20692 DuplicatesVector DupVector;
20693 ValueToVectorMap EnumMap;
20697 for (
auto *Element : Elements) {
20711 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20714 if (EnumMap.size() == 0)
20718 for (
auto *Element : Elements) {
20724 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20725 if (Iter == EnumMap.end())
20728 DeclOrVector& Entry = Iter->second;
20735 auto Vec = std::make_unique<ECDVector>();
20737 Vec->push_back(ECD);
20744 DupVector.emplace_back(std::move(Vec));
20750 if (*Vec->begin() == ECD)
20753 Vec->push_back(ECD);
20757 for (
const auto &Vec : DupVector) {
20758 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20761 auto *FirstECD = Vec->front();
20762 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20763 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20764 << FirstECD->getSourceRange();
20768 for (
auto *ECD : llvm::drop_begin(*Vec))
20769 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20770 << ECD <<
toString(ECD->getInitVal(), 10)
20771 << ECD->getSourceRange();
20776 bool AllowMask)
const {
20777 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20781 llvm::APInt &FlagBits = R.first->second;
20785 const auto &EVal = E->getInitVal();
20787 if (EVal.isPowerOf2())
20788 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20800 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20801 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20808 bool HasBitwiseOp =
false;
20813 for (
const auto *ECD :
Enum->enumerators()) {
20814 const Expr *InitExpr = ECD->getInitExpr();
20820 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20824 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20825 HasBitwiseOp =
true;
20826 }
else if (Op == BO_LT || Op == BO_GT) {
20829 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20831 if (IntLiteral->getValue() == 1)
20832 SuspiciousCompares.push_back(BinOp);
20840 if (HasBitwiseOp) {
20841 for (
const auto *BinOp : SuspiciousCompares) {
20842 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20847 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20848 << BinOp->getOpcodeStr() << SuggestedOp;
20850 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20866 if (
Enum->isDependentType()) {
20867 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20869 cast_or_null<EnumConstantDecl>(Elements[i]);
20870 if (!ECD)
continue;
20881 unsigned NumNegativeBits = 0;
20882 unsigned NumPositiveBits = 0;
20883 bool MembersRepresentableByInt =
20884 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20888 unsigned BestWidth;
20909 if (
Enum->isComplete()) {
20910 BestType =
Enum->getIntegerType();
20911 if (
Context.isPromotableIntegerType(BestType))
20912 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20914 BestPromotionType = BestType;
20916 BestWidth =
Context.getIntWidth(BestType);
20918 bool EnumTooLarge =
Context.computeBestEnumTypes(
20919 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20920 BestWidth =
Context.getIntWidth(BestType);
20922 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20927 for (
auto *D : Elements) {
20928 auto *ECD = cast_or_null<EnumConstantDecl>(D);
20929 if (!ECD)
continue;
20938 llvm::APSInt InitVal = ECD->getInitVal();
20946 MembersRepresentableByInt) {
20954 NewWidth =
Context.getTargetInfo().getIntWidth();
20956 }
else if (ECD->getType() == BestType) {
20964 ECD->setType(EnumType);
20968 NewWidth = BestWidth;
20973 InitVal = InitVal.extOrTrunc(NewWidth);
20974 InitVal.setIsSigned(NewSign);
20975 ECD->setInitVal(
Context, InitVal);
20978 if (ECD->getInitExpr() &&
20979 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20981 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20990 ECD->setType(EnumType);
20992 ECD->setType(NewTy);
20995 Enum->completeDefinition(BestType, BestPromotionType,
20996 NumPositiveBits, NumNegativeBits);
21001 if (
Enum->isClosedFlag()) {
21002 for (
Decl *D : Elements) {
21004 if (!ECD)
continue;
21007 if (InitVal != 0 && !InitVal.isPowerOf2() &&
21015 if (
Enum->hasAttrs())
21054 AsmLabelAttr *
Attr =
21055 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
21065 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
21078 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
21094 if (!PrevDecl->
hasAttr<AliasAttr>())
21095 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21104 assert(FD &&
"Expected non-null FunctionDecl");
21111 FD->
hasAttr<SYCLKernelEntryPointAttr>() ||
21112 FD->
hasAttr<SYCLExternalAttr>()))
21116 auto IsEmittedForExternalSymbol = [
this, FD]() {
21128 if (
LangOpts.OpenMPIsTargetDevice) {
21131 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21138 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21142 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21143 if (IsEmittedForExternalSymbol())
21149 }
else if (
LangOpts.OpenMP > 45) {
21153 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21156 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21175 if (IsEmittedForExternalSymbol())
21180 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
21182 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
21185 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)
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Architecture Architecture
llvm::MachO::Record Record
static bool isExternC(const NamedDecl *ND)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to ARM.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static void diagnoseImplicitlyRetainedSelf(Sema &S)
static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D)
static UnqualifiedTypeNameLookupResult lookupUnqualifiedTypeNameInBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc, const CXXRecordDecl *RD)
Tries to perform unqualified lookup of the type decls in bases for dependent class.
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool isMainVar(DeclarationName Name, VarDecl *VD)
static bool PreviousDeclsHaveMultiVersionAttribute(const FunctionDecl *FD)
static ParsedType recoverFromTypeInKnownDependentBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc)
static void mergeParamDeclTypes(ParmVarDecl *NewParam, const ParmVarDecl *OldParam, Sema &S)
static void checkHybridPatchableAttr(Sema &S, NamedDecl &ND)
static void adjustDeclContextForDeclaratorDecl(DeclaratorDecl *NewD, DeclaratorDecl *OldD)
If necessary, adjust the semantic declaration context for a qualified declaration to name the correct...
static bool isResultTypeOrTemplate(LookupResult &R, const Token &NextToken)
Determine whether the given result set contains either a type name or.
static void FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL)
static bool AllowOverloadingOfFunction(const LookupResult &Previous, ASTContext &Context, const FunctionDecl *New)
Determine whether overloading is allowed for a new function declaration considering prior declaration...
static TypeSourceInfo * TryToFixInvalidVariablyModifiedTypeSourceInfo(TypeSourceInfo *TInfo, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID, ASTContext::GetBuiltinTypeError Error)
static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D)
static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS, ExpectedDecl *New)
Check whether a redeclaration of an entity introduced by a using-declaration is valid,...
static ShadowedDeclKind computeShadowedDeclKind(const NamedDecl *ShadowedDecl, const DeclContext *OldDC)
Determine what kind of declaration we're shadowing.
static void checkIsValidOpenCLKernelParameter(Sema &S, Declarator &D, ParmVarDecl *Param, llvm::SmallPtrSetImpl< const Type * > &ValidTypes)
static void mergeParamDeclAttributes(ParmVarDecl *newDecl, const ParmVarDecl *oldDecl, Sema &S)
mergeParamDeclAttributes - Copy attributes from the old parameter to the new one.
static bool CheckC23ConstexprVarType(Sema &SemaRef, SourceLocation VarLoc, QualType T)
static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a mulitversion function declaration.
static bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old)
Merge alignment attributes from Old to New, taking into account the special semantics of C11's _Align...
static bool mergeTypeWithPrevious(Sema &S, VarDecl *NewVD, VarDecl *OldVD, LookupResult &Previous)
static void CheckConstPureAttributesUsage(Sema &S, FunctionDecl *NewFD)
static bool FindPossiblePrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool MultiVersionTypesCompatible(FunctionDecl *Old, FunctionDecl *New)
static NestedNameSpecifier synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC)
static void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx, FixItHint &Hint)
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P, SourceLocation ExplicitThisLoc)
static void checkLifetimeBoundAttr(Sema &S, NamedDecl &ND)
static void patchDefaultTargetVersion(FunctionDecl *From, FunctionDecl *To)
static bool isFunctionDefinitionDiscarded(Sema &S, FunctionDecl *FD)
Given that we are within the definition of the given function, will that definition behave like C99's...
static void CheckForDuplicateEnumValues(Sema &S, ArrayRef< Decl * > Elements, EnumDecl *Enum, QualType EnumType)
static unsigned GetDiagnosticTypeSpecifierID(const DeclSpec &DS)
static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old)
checkNewAttributesAfterDef - If we already have a definition, check that there are no new attributes ...
static bool isClassCompatTagKind(TagTypeKind Tag)
Determine if tag kind is a class-key compatible with class for redeclaration (class,...
static bool hasIdenticalPassObjectSizeAttrs(const FunctionDecl *A, const FunctionDecl *B)
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND)
static bool hasSimilarParameters(ASTContext &Context, FunctionDecl *Declaration, FunctionDecl *Definition, SmallVectorImpl< unsigned > &Params)
hasSimilarParameters - Determine whether the C++ functions Declaration and Definition have "nearly" m...
static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD)
Determine whether a class is C-like, according to the rules of C++ [dcl.typedef] for anonymous classe...
static unsigned propagateAttribute(ParmVarDecl *To, const ParmVarDecl *From, Sema &S)
static FunctionDecl * CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, DeclContext *DC, QualType &R, TypeSourceInfo *TInfo, StorageClass SC, bool &IsVirtualOkay)
static Scope * getTagInjectionScope(Scope *S, const LangOptions &LangOpts)
Find the Scope in which a tag is implicitly declared if we see an elaborated type specifier in the sp...
static bool methodHasName(const FunctionDecl *FD, StringRef Name)
static std::pair< diag::kind, SourceLocation > getNoteDiagForInvalidRedeclaration(const T *Old, const T *New)
static bool checkForConflictWithNonVisibleExternC(Sema &S, const T *ND, LookupResult &Previous)
Apply special rules for handling extern "C" declarations.
static bool DeclHasAttr(const Decl *D, const Attr *A)
DeclhasAttr - returns true if decl Declaration already has the target attribute.
static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty)
static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit)
static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags, const LookupResult &R)
static FixItHint createFriendTagNNSFixIt(Sema &SemaRef, NamedDecl *ND, Scope *S, SourceLocation NameLoc)
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
static bool CheckAnonMemberRedeclaration(Sema &SemaRef, Scope *S, DeclContext *Owner, DeclarationName Name, SourceLocation NameLoc, bool IsUnion, StorageClass SC)
We are trying to inject an anonymous member into the given scope; check if there's an existing declar...
static bool checkGlobalOrExternCConflict(Sema &S, const T *ND, bool IsGlobal, LookupResult &Previous)
Check for conflict between this global or extern "C" declaration and previous global or extern "C" de...
static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts, const NamedDecl *D)
static bool isStdBuiltin(ASTContext &Ctx, FunctionDecl *FD, unsigned BuiltinID)
Determine whether a declaration matches a known function in namespace std.
static bool InjectAnonymousStructOrUnionMembers(Sema &SemaRef, Scope *S, DeclContext *Owner, RecordDecl *AnonRecord, AccessSpecifier AS, StorageClass SC, SmallVectorImpl< NamedDecl * > &Chaining)
InjectAnonymousStructOrUnionMembers - Inject the members of the anonymous struct or union AnonRecord ...
@ InvalidAddrSpacePtrKernelParam
static bool isFromSystemHeader(SourceManager &SM, const Decl *D)
Returns true if the declaration is declared in a system header or from a system macro.
static SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const ValueDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context, CXXMethodDecl *M1, CXXMethodDecl *M2, CXXSpecialMemberKind CSM)
[class.mem.special]p5 Two special member functions are of the same kind if:
static const CXXRecordDecl * findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC)
Find the parent class with dependent bases of the innermost enclosing method context.
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record)
[class.dtor]p4: At the end of the definition of a class, overload resolution is performed among the p...
static bool shouldConsiderLinkage(const VarDecl *VD)
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record)
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD, const FunctionDecl *NewFD, bool CausesMV, MultiVersionKind MVKind)
static DeclContext * getTagInjectionContext(DeclContext *DC)
Find the DeclContext in which a tag is implicitly declared if we see an elaborated type specifier in ...
static bool EquivalentArrayTypes(QualType Old, QualType New, const ASTContext &Ctx)
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New)
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for redeclaration diagnostic message.
static void checkInheritableAttr(Sema &S, NamedDecl &ND)
static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver)
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl *Old)
static NamedDecl * DiagnoseInvalidRedeclaration(Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD, ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S)
Generate diagnostics for an invalid function redeclaration.
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, DeclarationName Name)
RebuildDeclaratorInCurrentInstantiation - Checks whether the given declarator needs to be rebuilt in ...
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record, ArrayRef< CXXMethodDecl * > Methods, CXXSpecialMemberKind CSM)
[class.mem.special]p6: An eligible special member function is a special member function for which:
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc)
static bool hasParsedAttr(Scope *S, const Declarator &PD, ParsedAttr::Kind Kind)
ShadowedDeclKind
Enum describing the select options in diag::warn_decl_shadow.
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S)
static void CheckForComparisonInEnumInitializer(SemaBase &Sema, const EnumDecl *Enum)
static void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
static bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
static void checkWeakAttr(Sema &S, NamedDecl &ND)
static void checkModularFormatAttr(Sema &S, NamedDecl &ND)
static void checkSelectAnyAttr(Sema &S, NamedDecl &ND)
static bool isImplicitInstantiation(NamedDecl *D)
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT)
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent, SourceLocation DefaultInitLoc)
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S)
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD)
Returns true if there hasn't been any invalid type diagnosed.
static void RemoveUsingDecls(LookupResult &R)
Removes using shadow declarations not at class scope from the lookup results.
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S, CXXRecordDecl *Record)
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind, MultiVersionKind MVKind)
static bool looksMutable(QualType T, const ASTContext &Ctx)
static bool isUsingDeclNotAtClassScope(NamedDecl *D)
static void propagateAttributes(ParmVarDecl *To, const ParmVarDecl *From, F &&propagator)
static const NamedDecl * getDefinition(const Decl *D)
static QualType TryToFixInvalidVariablyModifiedType(QualType T, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static bool hasDeducedAuto(DeclaratorDecl *DD)
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT)
static QualType getCoreType(QualType Ty)
static bool isMainFileLoc(const Sema &S, SourceLocation Loc)
static bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, AvailabilityMergeKind AMK)
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD)
Check the target or target_version attribute of the function for MultiVersion validity.
static bool isOutOfScopePreviousDeclaration(NamedDecl *, DeclContext *, ASTContext &)
Determines whether the given declaration is an out-of-scope previous declaration.
static StorageClass StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS)
StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to a VarDecl::StorageClass.
static bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a new function declaration being added to an existing multiversioned declaratio...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void checkAliasAttr(Sema &S, NamedDecl &ND)
static void filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl, LookupResult &Previous)
Typedef declarations don't have linkage, but they still denote the same entity if their types are the...
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum)
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T)
static void checkWeakRefAttr(Sema &S, NamedDecl &ND)
static bool isIncompleteDeclExternC(Sema &S, const T *D)
Determine whether a variable is extern "C" prior to attaching an initializer.
static bool isAttributeTargetADefinition(Decl *D)
static Attr * getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD)
Return a CodeSegAttr from a containing class.
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D)
Check for this common pattern:
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC, DeclContext *NewDC)
Determine whether a tag originally declared in context OldDC can be redeclared with an unqualified na...
static bool isRecordType(QualType T)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
static CharSourceRange getRange(const CharSourceRange &EditRange, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeMacroExpansion)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
@ GE_Missing_type
Missing a type.
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
TypeLoc getElementLoc() const
SourceLocation getRBracketLoc() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
@ AS_Declspec
__declspec(...)
SourceRange getRange() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
AttributeFactory & getFactory() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
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)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
bool isAnyOperatorDelete() const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Expr * getAsmLabel() const
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
void setRedeclaration(bool Val)
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
void takeAttributesAppending(ParsedAttributes &attrs)
takeAttributesAppending - Takes attributes from the given ParsedAttributes set and add them to this d...
void setInvalidType(bool Val=true)
TemplateParameterList * getInventedTemplateParameterList() const
The template parameter list generated from the explicit template parameters along with any invented t...
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
const ParsedAttributesView & getDeclarationAttributes() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool hasInitializer() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
const Expr * getInitExpr() const
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
bool isComplete() const
Returns true if this can be considered a complete type.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
void setEnumKeyRange(SourceRange Range)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withRegParm(unsigned RegParm) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
bool getCmseNSCallAttr() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
iterator - Iterate over the decls of a specified declaration name.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
step_iterator step_begin() const
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
Describes an entity that is being initialized.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
bool isResolvedMSAsmLabel() const
LabelStmt * getStmt() const
bool isMSAsmLabel() const
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i....
bool isCompatibleWithMSVC() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static SourceLocation findLocationAfterToken(SourceLocation loc, tok::TokenKind TKind, const SourceManager &SM, const LangOptions &LangOpts, bool SkipTrailingWhitespaceAndNewLine)
Checks that the given token is the first token that occurs after the given location (this excludes co...
Visibility getVisibility() const
Linkage getLinkage() const
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
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.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
The collection of all-type qualifiers we support.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
ObjCLifetime getObjCLifetime() const
Represents a struct/union/class.
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
void setMemberSpecialization()
Note that this member template is a specialization.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
void setNRVOCandidate(const VarDecl *Var)
Set the variable that might be used for the named return value optimization.
Scope - A scope is a transient data structure that is used while parsing the program.
void setEntity(DeclContext *E)
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
unsigned getDepth() const
Returns the depth of this scope. The translation-unit has scope depth 0.
unsigned getNextFunctionPrototypeIndex()
Return the number of parameters declared in this function prototype, increasing it by one for the nex...
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isTypeAliasScope() const
Determine whether this scope is a type alias scope.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
void setLookupEntity(DeclContext *E)
unsigned getMSLastManglingNumber() const
DeclContext * getEntity() const
Get the entity corresponding to this scope.
unsigned getMSCurManglingNumber() const
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
unsigned getFunctionPrototypeDepth() const
Returns the number of function prototype scopes in this scope chain.
bool isCompoundStmtScope() const
Determine whether this scope is a compound statement scope.
bool containedInPrototypeScope() const
containedInPrototypeScope - Return true if this or a parent scope is a FunctionPrototypeScope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
bool isFunctionPrototypeScope() const
isFunctionPrototypeScope - Return true if this scope is a function prototype scope.
bool hasUnrecoverableErrorOccurred() const
Determine whether any unrecoverable errors have occurred within this scope.
Scope * getTemplateParamParent()
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
@ DeclScope
This is a scope that can contain a declaration.
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void CheckEntryPoint(FunctionDecl *FD)
HLSLVkConstantIdAttr * mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, int Id)
HLSLNumThreadsAttr * mergeNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z)
void deduceAddressSpace(VarDecl *Decl)
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)
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...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
PragmaClangSection PragmaClangRodataSection
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
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...
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.
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD)
AddOverriddenMethods - See if a method overrides any in the base classes, and if so,...
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
PragmaClangSection PragmaClangTextSection
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
PragmaClangSection PragmaClangDataSection
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)
ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name, SourceLocation NameLoc)
Act on the result of classifying a name as an undeclared (ADL-only) non-type declaration.
void ActOnPragmaRedefineExtname(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaRedefineExtname - Called on well formed #pragma redefine_extname oldname newname.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
MaybeODRUseExprSet MaybeODRUseExprs
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
TopLevelStmtDecl * ActOnStartTopLevelStmtDecl(Scope *S)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
@ FirstDecl
Parsing the first decl in a TU.
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
Decl * ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, RecordDecl *&AnonRecord)
ParsedFreeStandingDeclSpec - This method is invoked when a declspec with no declarator (e....
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context)
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC pragma optimize in scope, consider changing t...
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
static bool CanBeGetReturnObject(const FunctionDecl *FD)
NamespaceDecl * getStdNamespace() const
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
void addLifetimeBoundToImplicitThis(CXXMethodDecl *MD)
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
PragmaStack< StringLiteral * > DataSegStack
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
@ TPC_FriendFunctionTemplate
@ TPC_ClassTemplateMember
@ TPC_FriendFunctionTemplateDefinition
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
friend class InitializationSequence
bool GloballyUniqueObjectMightBeAccidentallyDuplicated(const VarDecl *Dcl)
Certain globally-unique variables might be accidentally duplicated if built into multiple shared libr...
void DiagnoseUnusedDecl(const NamedDecl *ND)
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void ActOnUninitializedDecl(Decl *dcl)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
Decl * ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth)
ActOnField - Each field of a C struct/union is passed into this in order to create a FieldDecl object...
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
PragmaClangSection PragmaClangBSSSection
Decl * ActOnDeclarator(Scope *S, Declarator &D)
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
void CheckVariableDeclarationType(VarDecl *NewVD)
OpaquePtr< TemplateName > TemplateTy
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
llvm::SmallPtrSet< const NamedDecl *, 4 > TypoCorrectedFunctionDefinitions
The function definitions which were renamed as part of typo-correction to match their respective decl...
void AddSectionMSAllocText(FunctionDecl *FD)
Only called on function definitions; if there is a #pragma alloc_text that decides which code section...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
IdentifierResolver IdResolver
bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val, bool AllowMask) const
IsValueInFlagEnum - Determine if a value is allowed as part of a flag enum.
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
TemplateNameKindForDiagnostics
Describes the detailed kind of a template name. Used in diagnostics.
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
AvailabilityAttr * mergeAvailabilityAttr(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)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
static TagDecl * castFromDeclContext(const DeclContext *DC)
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
SourceLocation getInnerLocStart() const
Return SourceLocation representing start of source range ignoring outer template declarations.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Exposes information about the current target.
virtual bool validateCpuIs(StringRef Name) const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
virtual bool validateCpuSupports(StringRef Name) const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
bool supportsMultiVersioning() const
Identify whether this target supports multiversioning of functions, which requires support for cpu_su...
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getRAngleLoc() const
SourceLocation getTemplateLoc() const
Token - This structure provides full information about a lexed token.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isOneOf(Ts... Ks) const
bool isNot(tok::TokenKind K) const
A declaration that models statements at global scope.
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Represents a declaration of a type.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isStructureType() const
bool isDependentSizedArrayType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isIncompleteArrayType() const
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
bool isVariableArrayType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isOpenCLSpecificType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
RecordDecl * castAsRecordDecl() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool containsErrors() const
Whether this type is an error type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isFunctionProtoType() const
bool isObjCIdType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjCObjectType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isMemberFunctionPointerType() const
bool isFloatingType() const
bool isAnyPointerType() const
bool hasAutoForTrailingReturnType() const
Determine whether this type was written with a leading 'auto' corresponding to a trailing return type...
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isReserveIDT() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
void setTypeSourceInfo(TypeSourceInfo *newType)
Wrapper for source info for typedefs.
TypedefNameDecl * getDecl() const
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SmallVectorImpl< NamedDecl * >::const_iterator const_decl_iterator
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
unsigned getEditDistance(bool Normalized=true) const
Gets the "edit distance" of the typo correction from the typo.
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setCorrectionDecl(NamedDecl *CDecl)
Clears the list of NamedDecls before adding the new one.
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
Represents a C++ unqualified-id that has been parsed.
struct OFI OperatorFunctionId
When Kind == IK_OperatorFunctionId, the overloaded operator that we parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
UnionParsedType ConstructorName
When Kind == IK_ConstructorName, the class-name of the type whose constructor is being referenced.
SourceLocation EndLocation
The location of the last token that describes this unqualified-id.
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Wrapper for source info for unresolved typename using decls.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Wrapper for source info for types used via transparent aliases.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setCXXForRangeDecl(bool FRD)
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isCXXCondDecl() const
@ ListInit
Direct list-initialization (C++11)
@ ParenListInit
Parenthesized list-initialization (C++20)
@ CallInit
Call-style initialization (C++98)
void setStorageClass(StorageClass SC)
void setPreviousDeclInSameBlockScope(bool Same)
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
void setConstexpr(bool IC)
@ TLS_Static
TLS with a known-constant initializer.
@ TLS_Dynamic
TLS with a dynamic initializer.
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
@ TentativeDefinition
This declaration is a tentative definition.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
VarTemplateDecl * getInstantiatedFromMemberTemplate() const
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Captures information about a #pragma weak directive.
void disableCheckFallThrough()
ValueDecl * getVariable() const
bool isVariableCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
void addVLATypeCapture(SourceLocation Loc, const VariableArrayType *VLAType, QualType CaptureType)
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
void addThisCapture(bool isNested, SourceLocation Loc, QualType CaptureType, bool ByCopy)
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Retains information about a function, method, or block that is currently being parsed.
bool UsesFPIntrin
Whether this function uses constrained floating point intrinsics.
void addByrefBlockVar(VarDecl *VD)
bool NeedsScopeChecking() const
bool ObjCShouldCallSuper
A flag that is set when parsing a method that must call super's implementation, such as -dealloc,...
bool ObjCWarnForNoInitDelegation
This starts true for a secondary initializer method and will be set to false if there is an invocatio...
bool HasPotentialAvailabilityViolations
Whether we make reference to a declaration that could be unavailable.
Expr * SYCLKernelLaunchIdExpr
An unresolved identifier lookup expression for an implicit call to a SYCL kernel launch function in a...
bool ObjCWarnForNoDesignatedInitChain
This starts true for a method marked as designated initializer and will be set to false if there is a...
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
TemplateParameterList * GLTemplateParameterList
If this is a generic lambda, and the template parameter list has been created (from the TemplateParam...
ParmVarDecl * ExplicitObjectParameter
llvm::SmallVector< ShadowedOuterDecl, 4 > ShadowingDecls
CXXRecordDecl * Lambda
The class that describes the lambda.
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
bool Mutable
Whether this is a mutable lambda.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
Public enums and private classes that are part of the SourceManager implementation.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
constexpr bool isInitializedByPipeline(LangAS AS)
bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD)
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool randomizeStructureLayout(const ASTContext &Context, RecordDecl *RD, llvm::SmallVectorImpl< Decl * > &FinalOrdering)
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ GVA_AvailableExternally
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
int hasAttribute(AttributeCommonInfo::Syntax Syntax, llvm::StringRef ScopeName, llvm::StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts, bool CheckPlugins)
Return the version number associated with the attribute if we recognize and implement the attribute s...
ConstexprSpecKind
Define the kind of constexpr specifier.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
std::pair< FileID, unsigned > FileIDAndOffset
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ TemplateTemplateArgument
@ DefaultInitializedObject
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool DeclAttrsMatchCUDAMode(const LangOptions &LangOpts, Decl *D)
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
bool isDiscardableGVALinkage(GVALinkage L)
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Complete
The translation unit is a complete translation unit.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
bool isExternalFormalLinkage(Linkage L)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Enumerator
Enumerator value with fixed underlying type.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ArrayRef< NamedDecl * > getDeclsInPrototype() const
Get the non-parameter decls defined within this function prototype.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
const IdentifierInfo * Ident
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
EvalResult is a struct with detailed info about an evaluated expression.
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const
SourceLocation SymbolLocations[3]
The source locations of the individual tokens that name the operator, e.g., the "new",...
OverloadedOperatorKind Operator
The kind of overloaded operator.