59#include "llvm/ADT/STLForwardCompat.h"
60#include "llvm/ADT/SmallString.h"
61#include "llvm/ADT/StringExtras.h"
62#include "llvm/TargetParser/Triple.h"
67#include <unordered_map>
74 Decl *Group[2] = { OwnedType, Ptr };
85 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
86 bool AllowTemplates =
false,
87 bool AllowNonTemplates =
true)
88 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
89 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
90 WantExpressionKeywords =
false;
91 WantCXXNamedCasts =
false;
92 WantRemainingKeywords =
false;
97 if (!AllowInvalidDecl && ND->isInvalidDecl())
101 return AllowTemplates;
103 bool IsType = isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND);
107 if (AllowNonTemplates)
112 if (AllowTemplates) {
113 auto *RD = dyn_cast<CXXRecordDecl>(ND);
114 if (!RD || !RD->isInjectedClassName())
116 RD = cast<CXXRecordDecl>(RD->getDeclContext());
117 return RD->getDescribedClassTemplate() ||
118 isa<ClassTemplateSpecializationDecl>(RD);
124 return !WantClassName && candidate.
isKeyword();
127 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
128 return std::make_unique<TypeNameValidatorCCC>(*
this);
132 bool AllowInvalidDecl;
135 bool AllowNonTemplates;
141enum class UnqualifiedTypeNameLookupResult {
152static UnqualifiedTypeNameLookupResult
157 return UnqualifiedTypeNameLookupResult::NotFound;
159 UnqualifiedTypeNameLookupResult FoundTypeDecl =
160 UnqualifiedTypeNameLookupResult::NotFound;
163 if (
auto *BaseTT =
Base.getType()->getAs<
TagType>())
164 BaseRD = BaseTT->getAsCXXRecordDecl();
168 if (!TST || !TST->isDependentType())
170 auto *TD = TST->getTemplateName().getAsTemplateDecl();
173 if (
auto *BasePrimaryTemplate =
174 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
176 BaseRD = BasePrimaryTemplate;
177 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
179 CTD->findPartialSpecialization(
Base.getType()))
187 if (!isa<TypeDecl>(ND))
188 return UnqualifiedTypeNameLookupResult::FoundNonType;
189 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
191 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
193 case UnqualifiedTypeNameLookupResult::FoundNonType:
194 return UnqualifiedTypeNameLookupResult::FoundNonType;
195 case UnqualifiedTypeNameLookupResult::FoundType:
196 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
198 case UnqualifiedTypeNameLookupResult::NotFound:
205 return FoundTypeDecl;
213 UnqualifiedTypeNameLookupResult FoundTypeDecl =
214 UnqualifiedTypeNameLookupResult::NotFound;
216 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
220 RD = dyn_cast<CXXRecordDecl>(DC);
224 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
230 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
252 bool WantNontrivialTypeSourceInfo =
true) {
254 case Type::DeducedTemplateSpecialization:
256 case Type::InjectedClassName:
259 case Type::UnresolvedUsing:
264 case Type::ObjCInterface:
265 case Type::ObjCTypeParam:
266 case Type::TemplateTypeParm:
269 llvm_unreachable(
"Unexpected Type Class");
277 if (!WantNontrivialTypeSourceInfo)
281 Builder.pushTypeSpec(
T).setNameLoc(NameLoc);
290 bool HasTrailingDot,
ParsedType ObjectTypePtr,
291 bool IsCtorOrDtorName,
292 bool WantNontrivialTypeSourceInfo,
293 bool IsClassTemplateDeductionContext,
297 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
299 !isClassName && !HasTrailingDot;
324 !isClassName && !IsCtorOrDtorName)
326 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
327 if (IsImplicitTypename) {
330 Diag(QualifiedLoc, diag::warn_cxx17_compat_implicit_typename);
332 Diag(QualifiedLoc, diag::ext_implicit_typename)
339 if (WantNontrivialTypeSourceInfo)
372 if (ObjectTypePtr &&
Result.empty()) {
396 switch (
Result.getResultKind()) {
399 TypeNameValidatorCCC CCC(
true, isClassName,
400 AllowDeducedTemplate);
405 bool MemberOfUnknownSpecialization;
414 if (Correction && (NNS || NewII != &II) &&
420 Template, MemberOfUnknownSpecialization))) {
422 isClassName, HasTrailingDot, ObjectTypePtr,
424 WantNontrivialTypeSourceInfo,
425 IsClassTemplateDeductionContext);
428 PDiag(diag::err_unknown_type_or_class_name_suggest)
429 <<
Result.getLookupName() << isClassName);
432 *CorrectedII = NewII;
437 Result.suppressDiagnostics();
453 Result.suppressDiagnostics();
463 Result.suppressDiagnostics();
469 Res != ResEnd; ++Res) {
471 if (isa<TypeDecl, ObjCInterfaceDecl, UnresolvedUsingIfExistsDecl>(
478 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
490 Result.suppressDiagnostics();
501 IIDecl =
Result.getFoundDecl();
502 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
506 assert(IIDecl &&
"Didn't find decl");
509 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
513 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
514 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
515 if (!isClassName && !IsCtorOrDtorName && LookupRD && FoundRD &&
516 FoundRD->isInjectedClassName() &&
518 Diag(NameLoc, diag::err_out_of_line_qualified_id_type_names_constructor)
529 FoundUsingShadow =
nullptr;
530 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
534 }
else if (AllowDeducedTemplate) {
536 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
543 FoundUsingShadow =
nullptr;
549 Result.suppressDiagnostics();
553 if (FoundUsingShadow)
556 return buildNamedType(*
this, SS,
T, NameLoc, WantNontrivialTypeSourceInfo);
564 auto *ND = dyn_cast<NamespaceDecl>(DC);
565 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
567 else if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
569 RD->getTypeForDecl());
570 else if (isa<TranslationUnitDecl>(DC))
573 llvm_unreachable(
"something isn't in TU scope?");
584 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
585 if (MD->getParent()->hasAnyDependentBases())
593 bool IsTemplateTypeArg) {
594 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
597 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
606 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
612 RD->getTypeForDecl());
616 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
647 switch (TD->getTagKind()) {
675 return S->isFunctionPrototypeScope();
685 bool IsTemplateName) {
690 SuggestedType =
nullptr;
694 TypeNameValidatorCCC CCC(
false,
false,
701 bool CanRecover = !IsTemplateName;
702 if (Corrected.isKeyword()) {
705 PDiag(IsTemplateName ? diag::err_no_template_suggest
706 : diag::err_unknown_typename_suggest)
708 II = Corrected.getCorrectionAsIdentifierInfo();
711 if (!SS || !SS->
isSet()) {
713 PDiag(IsTemplateName ? diag::err_no_template_suggest
714 : diag::err_unknown_typename_suggest)
717 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
718 bool DroppedSpecifier =
719 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
722 ? diag::err_no_member_template_suggest
723 : diag::err_unknown_nested_typename_suggest)
724 << II << DC << DroppedSpecifier << SS->
getRange(),
727 llvm_unreachable(
"could not have corrected a typo here");
734 if (Corrected.getCorrectionSpecifier())
739 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
740 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
750 Name.setIdentifier(II, IILoc);
753 bool MemberOfUnknownSpecialization;
755 Name,
nullptr,
true, TemplateResult,
766 Diag(IILoc, IsTemplateName ? diag::err_no_template
767 : diag::err_unknown_typename)
770 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
771 : diag::err_typename_nested_not_found)
777 unsigned DiagID = diag::err_typename_missing;
779 DiagID = diag::ext_typename_missing;
786 *SS, *II, IILoc).
get();
789 "Invalid scope specifier has already been diagnosed");
797 NextToken.
is(tok::less);
800 if (isa<TypeDecl>(*I) || isa<ObjCInterfaceDecl>(*I))
803 if (CheckTemplate && isa<TemplateDecl>(*I))
817 StringRef FixItTagName;
818 switch (Tag->getTagKind()) {
820 FixItTagName =
"class ";
824 FixItTagName =
"enum ";
828 FixItTagName =
"struct ";
832 FixItTagName =
"__interface ";
836 FixItTagName =
"union ";
840 StringRef TagName = FixItTagName.drop_back();
841 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
842 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
847 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
862 const Token &NextToken,
867 assert(NextToken.
isNot(tok::coloncolon) &&
868 "parse nested name specifiers before calling ClassifyName");
909 bool SecondTry =
false;
910 bool IsFilteredTemplateName =
false;
913 switch (
Result.getResultKind()) {
917 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
963 if (!SecondTry && CCC) {
968 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
969 unsigned QualifiedDiag = diag::err_no_member_suggest;
972 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
974 UnderlyingFirstDecl && isa<TemplateDecl>(UnderlyingFirstDecl)) {
975 UnqualifiedDiag = diag::err_no_template_suggest;
976 QualifiedDiag = diag::err_no_member_template_suggest;
977 }
else if (UnderlyingFirstDecl &&
978 (isa<TypeDecl>(UnderlyingFirstDecl) ||
979 isa<ObjCInterfaceDecl>(UnderlyingFirstDecl) ||
980 isa<ObjCCompatibleAliasDecl>(UnderlyingFirstDecl))) {
981 UnqualifiedDiag = diag::err_unknown_typename_suggest;
982 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
988 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
989 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
990 Name->getName() == CorrectedStr;
993 << DroppedSpecifier << SS.
getRange());
997 Name = Corrected.getCorrectionAsIdentifierInfo();
1000 if (Corrected.isKeyword())
1006 Result.setLookupName(Corrected.getCorrection());
1028 Result.suppressDiagnostics();
1070 if (!
Result.isAmbiguous()) {
1071 IsFilteredTemplateName =
true;
1081 (IsFilteredTemplateName ||
1097 if (!IsFilteredTemplateName)
1100 bool IsFunctionTemplate;
1104 IsFunctionTemplate =
true;
1107 }
else if (!
Result.empty()) {
1111 IsFunctionTemplate = isa<FunctionTemplateDecl>(TD);
1112 IsVarTemplate = isa<VarTemplateDecl>(TD);
1115 dyn_cast<UsingShadowDecl>(*
Result.begin());
1116 assert(!FoundUsingShadow ||
1117 TD == cast<TemplateDecl>(FoundUsingShadow->
getTargetDecl()));
1125 IsFunctionTemplate =
true;
1129 if (IsFunctionTemplate) {
1133 Result.suppressDiagnostics();
1144 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found))
1160 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1161 Class = Alias->getClassInterface();
1167 if (NextToken.
is(tok::period)) {
1170 Result.suppressDiagnostics();
1180 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1186 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1199 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1200 if ((NextToken.
is(tok::identifier) ||
1202 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1214 if (
Result.isSingleResult() && !ADL &&
1219 Result.suppressDiagnostics();
1239 bool IsAddressOfOperand) {
1242 NameInfo, IsAddressOfOperand,
1249 const Token &NextToken) {
1251 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1266 auto *ULE = cast<UnresolvedLookupExpr>(
E);
1267 if ((*ULE->decls_begin())->isCXXClassMember()) {
1269 SS.
Adopt(ULE->getQualifierLoc());
1274 Result.setNamingClass(ULE->getNamingClass());
1275 for (
auto I = ULE->decls_begin(),
E = ULE->decls_end(); I !=
E; ++I)
1276 Result.addDecl(*I, I.getAccess());
1289 auto *TD = Name.getAsTemplateDecl();
1292 if (isa<ClassTemplateDecl>(TD))
1294 if (isa<FunctionTemplateDecl>(TD))
1296 if (isa<VarTemplateDecl>(TD))
1298 if (isa<TypeAliasTemplateDecl>(TD))
1300 if (isa<TemplateTemplateParmDecl>(TD))
1302 if (isa<ConceptDecl>(TD))
1309 "The next DeclContext should be lexically contained in the current one.");
1315 assert(
CurContext &&
"DeclContext imbalance!");
1318 assert(
CurContext &&
"Popped translation unit!");
1328 assert(
CurContext &&
"skipping definition of undefined tag");
1356 assert(!S->getEntity() &&
"scope already has entity");
1359 Scope *Ancestor = S->getParent();
1367 if (S->getParent()->isTemplateParamScope()) {
1375 assert(S->getEntity() ==
CurContext &&
"Context imbalance!");
1379 Scope *Ancestor = S->getParent();
1388 assert(S->isTemplateParamScope() &&
1389 "expected to be initializing a template parameter scope");
1413 for (; S && S->isTemplateParamScope(); S = S->getParent(), --ScopeDepth) {
1417 cast<Decl>(DC)->getDescribedTemplateParams()) {
1418 unsigned DCDepth = TPL->getDepth() + 1;
1419 if (DCDepth > ScopeDepth)
1421 if (ScopeDepth == DCDepth)
1426 S->setLookupEntity(SearchDCAfterScope);
1440 "The next DeclContext should be lexically contained in the current one.");
1444 for (
unsigned P = 0, NumParams = FD->
getNumParams();
P < NumParams; ++
P) {
1457 assert(
CurContext &&
"DeclContext imbalance!");
1459 assert(
CurContext &&
"Popped translation unit!");
1488 return ND->
hasAttr<OverloadableAttr>();
1491 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1500 while (S->getEntity() && S->getEntity()->isTransparentContext())
1515 if (isa<FunctionDecl>(
D) &&
1516 cast<FunctionDecl>(
D)->isFunctionTemplateSpecialization())
1519 if (isa<UsingEnumDecl>(
D) &&
D->getDeclName().isEmpty()) {
1526 for (; I != IEnd; ++I) {
1527 if (S->isDeclScope(*I) &&
D->declarationReplaces(*I)) {
1538 if (isa<LabelDecl>(
D) && !cast<LabelDecl>(
D)->isGnuLocal()) {
1545 if (!S->isDeclScope(*I))
1559 bool AllowInlineNamespace)
const {
1567 if (ScopeDC->getPrimaryContext() == TargetDC)
1569 }
while ((S = S->getParent()));
1579 bool ConsiderLinkage,
1580 bool AllowInlineNamespace) {
1638 if (NewIsModuleInterface || OldIsModuleInterface) {
1644 << NewIsModuleInterface
1646 << OldIsModuleInterface
1674 if (!IsNewExported && !IsOldExported)
1689 assert(IsNewExported);
1697 Diag(New->
getLocation(), diag::err_redeclaration_non_exported) << New << S;
1715 "New and Old are not the same definition, we should diagnostic it "
1716 "immediately instead of checking it.");
1719 "We shouldn't see unreachable definitions here.");
1767 return OldM == NewM;
1774 return isa<UsingShadowDecl>(
D) ||
1775 isa<UnresolvedUsingTypenameDecl>(
D) ||
1776 isa<UnresolvedUsingValueDecl>(
D);
1800 if (
D->doesThisDeclarationHaveABody())
1804 return CD->isCopyConstructor();
1805 return D->isCopyAssignmentOperator();
1811 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1812 if (!RD->hasNameForLinkage())
1818 return !
D->isExternallyVisible();
1847 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1850 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1855 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1859 if (FD->doesThisDeclarationHaveABody() &&
1862 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
1872 if (VD->isStaticDataMember() &&
1875 if (VD->isStaticDataMember() &&
1877 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1880 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1889 return mightHaveNonExternalLinkage(
D);
1902 if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
1917 if (
const auto *DD = dyn_cast<DecompositionDecl>(
D)) {
1921 bool IsAllPlaceholders =
true;
1922 for (
const auto *BD : DD->bindings()) {
1923 if (BD->isReferenced() || BD->hasAttr<UnusedAttr>())
1925 IsAllPlaceholders = IsAllPlaceholders && BD->isPlaceholderVar(LangOpts);
1927 if (IsAllPlaceholders)
1929 }
else if (!
D->getDeclName()) {
1935 if (
D->isPlaceholderVar(LangOpts))
1942 if (isa<LabelDecl>(
D))
1951 WithinFunction || (R->isLocalClass() && !R->isDependentType());
1952 if (!WithinFunction)
1955 if (isa<TypedefNameDecl>(
D))
1959 if (!isa<VarDecl>(
D) || isa<ParmVarDecl>(
D) || isa<ImplicitParamDecl>(
D))
1963 if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
1966 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
1967 Init = Cleanups->getSubExpr();
1969 const auto *Ty = VD->getType().getTypePtr();
1974 if (TT->getDecl()->hasAttr<UnusedAttr>())
1980 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
1981 MTE && MTE->getExtendingDecl()) {
1982 Ty = VD->getType().getNonReferenceType().getTypePtr();
1983 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
1988 if (Ty->isIncompleteType() || Ty->isDependentType())
1993 Ty = Ty->getBaseElementTypeUnsafe();
1996 const TagDecl *Tag = TT->getDecl();
1997 if (Tag->hasAttr<UnusedAttr>())
2000 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2001 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2005 const auto *Construct =
2006 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2007 if (Construct && !Construct->isElidable()) {
2009 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2010 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2016 if (
Init->isTypeDependent()) {
2018 if (!Ctor->isTrivial())
2024 if (isa<CXXUnresolvedConstructExpr>(
Init))
2038 if (isa<LabelDecl>(
D)) {
2056 if (
D->getTypeForDecl()->isDependentType())
2059 for (
auto *TmpD :
D->decls()) {
2060 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2062 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2076 if (
auto *TD = dyn_cast<TypedefNameDecl>(
D)) {
2087 if (isa<VarDecl>(
D) && cast<VarDecl>(
D)->isExceptionVariable())
2088 DiagID = diag::warn_unused_exception_param;
2089 else if (isa<LabelDecl>(
D))
2090 DiagID = diag::warn_unused_label;
2092 DiagID = diag::warn_unused_variable;
2111 if (Ty->isReferenceType() || Ty->isDependentType())
2115 const TagDecl *Tag = TT->getDecl();
2116 if (Tag->hasAttr<UnusedAttr>())
2120 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2121 RD && !RD->hasAttr<WarnUnusedAttr>())
2128 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2134 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2141 assert(iter->getSecond() >= 0 &&
2142 "Found a negative number of references to a VarDecl");
2143 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2153 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2154 if (!UnusedCXXCondDecl)
2158 unsigned DiagID = isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2159 : diag::warn_unused_but_set_variable;
2169 bool Diagnose =
false;
2173 Diagnose = L->
getStmt() ==
nullptr;
2182 if (S->decl_empty())
return;
2184 "Scope shouldn't contain decls!");
2191 std::optional<SourceLocation> PreviousDeclLoc;
2196 DeclDiags.push_back(LocAndDiag{
Loc, std::nullopt, std::move(PD)});
2201 DeclDiags.push_back(LocAndDiag{
Loc, PreviousDeclLoc, std::move(PD)});
2204 for (
auto *TmpD : S->decls()) {
2205 assert(TmpD &&
"This decl didn't get pushed??");
2207 assert(isa<NamedDecl>(TmpD) &&
"Decl isn't NamedDecl?");
2211 if (!S->hasUnrecoverableErrorOccurred()) {
2213 if (
const auto *RD = dyn_cast<RecordDecl>(
D))
2215 if (
VarDecl *VD = dyn_cast<VarDecl>(
D)) {
2221 if (!
D->getDeclName())
continue;
2235 auto ShadowI = ShadowingDecls.find(
D);
2236 if (ShadowI != ShadowingDecls.end()) {
2237 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2239 PDiag(diag::warn_ctor_parm_shadows_field)
2240 <<
D << FD << FD->getParent());
2242 ShadowingDecls.erase(ShadowI);
2246 llvm::sort(DeclDiags,
2247 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2252 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2254 for (
const LocAndDiag &
D : DeclDiags) {
2256 if (
D.PreviousDeclLoc)
2257 Diag(*
D.PreviousDeclLoc, diag::note_previous_declaration);
2263 (S->getEntity() && S->getEntity()->isTransparentContext()) ||
2281 return "ucontext.h";
2283 llvm_unreachable(
"unhandled error kind");
2294 Parent->addDecl(CLinkageDecl);
2301 "consteval builtins should only be available in C++20 mode");
2316 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2319 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2321 Params.push_back(parm);
2323 New->setParams(Params);
2331 Scope *S,
bool ForRedeclaration,
2338 if (!ForRedeclaration)
2350 Diag(
Loc, diag::warn_implicit_decl_no_jmp_buf)
2357 Diag(
Loc, diag::warn_implicit_decl_requires_sysheader)
2363 if (!ForRedeclaration &&
2367 : diag::ext_implicit_lib_function_decl)
2370 Diag(
Loc, diag::note_include_header_or_declare)
2407 while (Filter.hasNext()) {
2416 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2418 Decl->getUnderlyingType()))
2423 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2424 Decl->getAnonDeclWithTypedefName())
2436 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2437 OldType = OldTypedef->getUnderlyingType();
2444 int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0;
2445 Diag(New->
getLocation(), diag::err_redefinition_variably_modified_typedef)
2453 if (OldType != NewType &&
2457 int Kind = isa<TypeAliasDecl>(Old) ? 1 : 0;
2459 << Kind << NewType << OldType;
2478 switch (TypeID->getLength()) {
2482 if (!TypeID->isStr(
"id"))
2498 if (!TypeID->isStr(
"Class"))
2505 if (!TypeID->isStr(
"SEL"))
2532 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2533 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2536 if (OldTag && NewTag &&
2537 OldTag->getCanonicalDecl() != NewTag->getCanonicalDecl() &&
2542 if (OldTD->isModed())
2544 OldTD->getUnderlyingType());
2553 if (isa<EnumDecl>(NewTag)) {
2555 for (
auto *
D : NewTag->decls()) {
2556 auto *ED = cast<EnumConstantDecl>(
D);
2560 ED->getLexicalDeclContext()->removeDecl(ED);
2610 if (!isa<TypedefNameDecl>(Old))
2642 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2643 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2644 for (
const auto *i :
D->
attrs())
2645 if (i->getKind() == A->
getKind()) {
2647 if (Ann->getAnnotation() == cast<AnnotateAttr>(i)->getAnnotation())
2652 if (OA && isa<OwnershipAttr>(i))
2653 return OA->getOwnKind() == cast<OwnershipAttr>(i)->getOwnKind();
2661 if (
VarDecl *VD = dyn_cast<VarDecl>(
D))
2662 return VD->isThisDeclarationADefinition();
2663 if (
TagDecl *TD = dyn_cast<TagDecl>(
D))
2664 return TD->isCompleteDefinition() || TD->isBeingDefined();
2675 AlignedAttr *OldAlignasAttr =
nullptr;
2676 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2677 unsigned OldAlign = 0;
2685 if (I->isAlignmentDependent())
2691 unsigned Align = I->getAlignment(S.
Context);
2692 if (Align > OldAlign) {
2694 OldStrictestAlignAttr = I;
2699 AlignedAttr *NewAlignasAttr =
nullptr;
2700 unsigned NewAlign = 0;
2702 if (I->isAlignmentDependent())
2708 unsigned Align = I->getAlignment(S.
Context);
2709 if (Align > NewAlign)
2713 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2721 if (OldAlign == 0 || NewAlign == 0) {
2723 if (
ValueDecl *VD = dyn_cast<ValueDecl>(New))
2734 if (OldAlign != NewAlign) {
2735 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2738 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2753 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2757 bool AnyAdded =
false;
2760 if (OldAlign > NewAlign) {
2761 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2762 Clone->setInherited(
true);
2768 if (OldAlignasAttr && !NewAlignasAttr &&
2769 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2770 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2771 Clone->setInherited(
true);
2779#define WANT_DECL_MERGE_LOGIC
2780#include "clang/Sema/AttrParsedAttrImpl.inc"
2781#undef WANT_DECL_MERGE_LOGIC
2788 if (!DiagnoseMutualExclusions(S,
D,
Attr))
2799 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2801 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2802 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2803 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2804 AA->getPriority(), AA->getEnvironment());
2805 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2807 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2809 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2811 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2813 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2815 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2818 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2820 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2822 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2824 IA->getInheritanceModel());
2825 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2828 else if (S.
getLangOpts().CUDA && isa<FunctionDecl>(
D) &&
2829 (isa<CUDAHostAttr>(
Attr) || isa<CUDADeviceAttr>(
Attr) ||
2830 isa<CUDAGlobalAttr>(
Attr))) {
2834 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2836 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2838 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2840 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2842 else if (isa<AlignedAttr>(
Attr))
2846 else if ((isa<DeprecatedAttr>(
Attr) || isa<UnavailableAttr>(
Attr)) &&
2851 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2852 NewAttr = S.
mergeUuidAttr(
D, *UA, UA->getGuid(), UA->getGuidDecl());
2853 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2855 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2857 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2859 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2861 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2863 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2866 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2868 else if (isa<SuppressAttr>(
Attr))
2877 if (isa<MSInheritanceAttr>(NewAttr))
2886 if (
const TagDecl *TD = dyn_cast<TagDecl>(
D))
2887 return TD->getDefinition();
2888 if (
const VarDecl *VD = dyn_cast<VarDecl>(
D)) {
2896 if (FD->isDefined(Def,
true))
2903 for (
const auto *Attribute :
D->
attrs())
2904 if (Attribute->getKind() == Kind)
2916 if (!Def || Def == New)
2920 for (
unsigned I = 0,
E = NewAttributes.size(); I !=
E;) {
2921 const Attr *NewAttribute = NewAttributes[I];
2923 if (isa<AliasAttr>(NewAttribute) || isa<IFuncAttr>(NewAttribute)) {
2930 NewAttributes.erase(NewAttributes.begin() + I);
2935 VarDecl *VD = cast<VarDecl>(New);
2936 unsigned Diag = cast<VarDecl>(Def)->isThisDeclarationADefinition() ==
2938 ? diag::err_alias_after_tentative
2939 : diag::err_redefinition;
2941 if (
Diag == diag::err_redefinition)
2951 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
2964 if (isa<C11NoReturnAttr>(NewAttribute)) {
2968 }
else if (isa<UuidAttr>(NewAttribute)) {
2972 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
2973 if (AA->isAlignas()) {
2984 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
2986 NewAttributes.erase(NewAttributes.begin() + I);
2990 }
else if (isa<LoaderUninitializedAttr>(NewAttribute)) {
2996 diag::err_loader_uninitialized_redeclaration);
2998 NewAttributes.erase(NewAttributes.begin() + I);
3002 }
else if (isa<SelectAnyAttr>(NewAttribute) &&
3003 cast<VarDecl>(New)->isInline() &&
3004 !cast<VarDecl>(New)->isInlineSpecified()) {
3011 }
else if (isa<OMPDeclareVariantAttr>(NewAttribute)) {
3019 diag::warn_attribute_precede_definition);
3021 NewAttributes.erase(NewAttributes.begin() + I);
3027 const ConstInitAttr *CIAttr,
3028 bool AttrBeforeInit) {
3035 std::string SuitableSpelling;
3037 SuitableSpelling = std::string(
3039 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3041 InsertLoc, {tok::l_square, tok::l_square,
3042 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3043 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3044 tok::r_square, tok::r_square}));
3045 if (SuitableSpelling.empty())
3047 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3048 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3049 tok::r_paren, tok::r_paren}));
3050 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3051 SuitableSpelling =
"constinit";
3052 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3053 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3054 if (SuitableSpelling.empty())
3055 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3056 SuitableSpelling +=
" ";
3058 if (AttrBeforeInit) {
3061 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3064 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3068 S.
Diag(CIAttr->getLocation(),
3069 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3070 : diag::warn_require_const_init_added_too_late)
3073 << CIAttr->isConstinit()
3081 UsedAttr *NewAttr = OldAttr->clone(
Context);
3082 NewAttr->setInherited(
true);
3086 RetainAttr *NewAttr = OldAttr->clone(
Context);
3087 NewAttr->setInherited(
true);
3097 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3098 const auto *NewConstInit = New->
getAttr<ConstInitAttr>();
3099 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3100 const auto *OldVD = cast<VarDecl>(Old);
3101 auto *NewVD = cast<VarDecl>(New);
3107 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3110 if (InitDecl == NewVD) {
3114 if (OldConstInit && OldConstInit->isConstinit())
3117 }
else if (NewConstInit) {
3121 if (InitDecl && InitDecl != NewVD) {
3124 NewVD->dropAttr<ConstInitAttr>();
3132 if (AsmLabelAttr *NewA = New->
getAttr<AsmLabelAttr>()) {
3133 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3134 if (!OldA->isEquivalent(NewA)) {
3137 Diag(OldA->getLocation(), diag::note_previous_declaration);
3139 }
else if (Old->
isUsed()) {
3143 << isa<FunctionDecl>(Old) << New->
getAttr<AsmLabelAttr>()->
getRange();
3148 if (
const auto *NewAbiTagAttr = New->
getAttr<AbiTagAttr>()) {
3149 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3150 for (
const auto &NewTag : NewAbiTagAttr->tags()) {
3151 if (!llvm::is_contained(OldAbiTagAttr->tags(), NewTag)) {
3152 Diag(NewAbiTagAttr->getLocation(),
3153 diag::err_new_abi_tag_on_redeclaration)
3155 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3159 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3165 if (New->
hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3166 if (
auto *VD = dyn_cast<VarDecl>(New)) {
3168 Diag(New->
getLocation(), diag::warn_attribute_section_on_redeclaration);
3175 const auto *NewCSA = New->
getAttr<CodeSegAttr>();
3176 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3177 !NewCSA->isImplicit() && isa<CXXMethodDecl>(New)) {
3195 if (isa<DeprecatedAttr>(I) ||
3196 isa<UnavailableAttr>(I) ||
3197 isa<AvailabilityAttr>(I)) {
3212 if (isa<UsedAttr>(I) || isa<RetainAttr>(I))
3234 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3235 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3236 S.
Diag(CDA->getLocation(),
3237 diag::err_carries_dependency_missing_on_first_decl) << 1;
3245 diag::note_carries_dependency_missing_first_decl) << 1;
3253 const auto *NDAttr = newDecl->
getAttr<HLSLParamModifierAttr>();
3254 const auto *ODAttr = oldDecl->
getAttr<HLSLParamModifierAttr>();
3259 if (NDAttr && ODAttr &&
3260 NDAttr->getSpellingListIndex() != ODAttr->getSpellingListIndex()) {
3261 S.
Diag(newDecl->
getLocation(), diag::err_hlsl_param_qualifier_mismatch)
3262 << NDAttr << newDecl;
3271 bool foundAny = newDecl->
hasAttrs();
3280 cast<InheritableParamAttr>(I->clone(S.
Context));
3293 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3294 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3302 if (NoSizeInfo(Old) && NoSizeInfo(New))
3334 if (*Oldnullability != *Newnullability) {
3335 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3354 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3355 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3356 if (OldParamDT && NewParamDT &&
3357 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3358 QualType OldParamOT = OldParamDT->getOriginalType();
3359 QualType NewParamOT = NewParamDT->getOriginalType();
3362 << NewParam << NewParamOT;
3373struct GNUCompatibleParamWarning {
3383template <
typename T>
3384static std::pair<diag::kind, SourceLocation>
3388 if (Old->isThisDeclarationADefinition())
3389 PrevDiag = diag::note_previous_definition;
3390 else if (Old->isImplicit()) {
3391 PrevDiag = diag::note_previous_implicit_declaration;
3392 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3393 if (FD->getBuiltinID())
3394 PrevDiag = diag::note_previous_builtin_declaration;
3397 OldLocation = New->getLocation();
3399 PrevDiag = diag::note_previous_declaration;
3400 return std::make_pair(PrevDiag, OldLocation);
3408 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3409 !LangOpts.CPlusPlus &&
3421template <
typename T>
3442template<
typename ExpectedDecl>
3464 !Old->getDeclContext()->getRedeclContext()->Equals(
3465 New->getDeclContext()->getRedeclContext()) &&
3470 S.
Diag(New->getLocation(), diag::err_using_decl_conflict_reverse);
3483 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3484 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3487 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3488 AttrA->isDynamic() == AttrB->isDynamic();
3514 if (NamedDC->Equals(SemaDC))
3517 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3519 "unexpected context for redeclaration");
3530 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3531 FixSemaDC(FD->getDescribedFunctionTemplate());
3532 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3533 FixSemaDC(VD->getDescribedVarTemplate());
3537 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3544 Diag(Shadow->getTargetDecl()->getLocation(),
3545 diag::note_using_decl_target);
3546 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3555 if (checkUsingShadowRedecl<FunctionTemplateDecl>(*
this, Shadow,
3558 OldD = Old = cast<FunctionTemplateDecl>(Shadow->getTargetDecl())
3561 if (checkUsingShadowRedecl<FunctionDecl>(*
this, Shadow, New))
3563 OldD = Old = cast<FunctionDecl>(Shadow->getTargetDecl());
3591 std::tie(PrevDiag, OldLocation) =
3598 if (!isa<CXXMethodDecl>(New) && !isa<CXXMethodDecl>(Old) &&
3605 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3608 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3613 if (
const auto *ILA = New->
getAttr<InternalLinkageAttr>())
3614 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3618 New->
dropAttr<InternalLinkageAttr>();
3621 if (
auto *EA = New->
getAttr<ErrorAttr>()) {
3622 if (!Old->
hasAttr<ErrorAttr>()) {
3623 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3633 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3644 const Decl *DiagOld = Old;
3646 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *
D) {
3647 const auto *A = D->getAttr<OverloadableAttr>();
3648 return A && !A->isImplicit();
3652 DiagOld = OldIter == Old->
redecls_end() ? nullptr : *OldIter;
3657 diag::note_attribute_overloadable_prev_overload)
3672 Diag(OldLocation, diag::note_previous_declaration);
3691 const FunctionType *OldType = cast<FunctionType>(OldQType);
3692 const FunctionType *NewType = cast<FunctionType>(NewQType);
3695 bool RequiresAdjustment =
false;
3697 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3703 if (!NewCCExplicit) {
3707 RequiresAdjustment =
true;
3719 RequiresAdjustment =
true;
3726 << (!FirstCCExplicit ?
"" :
3730 Diag(
First->getLocation(), diag::note_previous_declaration);
3738 RequiresAdjustment =
true;
3748 Diag(OldLocation, diag::note_previous_declaration);
3753 RequiresAdjustment =
true;
3760 <<
"'ns_returns_retained'";
3761 Diag(OldLocation, diag::note_previous_declaration);
3766 RequiresAdjustment =
true;
3772 AnyX86NoCallerSavedRegistersAttr *
Attr =
3773 New->
getAttr<AnyX86NoCallerSavedRegistersAttr>();
3775 Diag(OldLocation, diag::note_previous_declaration);
3780 RequiresAdjustment =
true;
3783 if (RequiresAdjustment) {
3793 !New->
hasAttr<GNUInlineAttr>() &&
3802 if (New->
hasAttr<GNUInlineAttr>() &&
3813 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3817 QualType OldQTypeForComparison = OldQType;
3821 if (OldFX != NewFX) {
3823 for (
const auto &Diff : Diffs) {
3824 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *New, NewFX)) {
3826 diag::warn_mismatched_func_effect_redeclaration)
3827 << Diff.effectName();
3838 if (!MergeErrs.empty())
3845 NewFPT->getParamTypes(), EPI);
3853 EPI = OldFPT->getExtProtoInfo();
3856 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
3875 OldDeclaredReturnType)) {
3883 Diag(New->
getLocation(), diag::err_member_def_does_not_match_ret_type)
3888 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
3897 QualType NewReturnType = cast<FunctionType>(NewQType)->getReturnType();
3898 if (OldReturnType != NewReturnType) {
3914 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
3916 if (OldMethod && NewMethod) {
3923 bool IsClassScopeExplicitSpecialization =
3929 !IsClassScopeExplicitSpecialization) {
3935 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3945 if (isa<CXXConstructorDecl>(OldMethod))
3946 NewDiag = diag::err_constructor_redeclared;
3947 else if (isa<CXXDestructorDecl>(NewMethod))
3948 NewDiag = diag::err_destructor_redeclared;
3949 else if (isa<CXXConversionDecl>(NewMethod))
3950 NewDiag = diag::err_conv_function_redeclared;
3952 NewDiag = diag::err_member_redeclared;
3956 Diag(New->
getLocation(), diag::err_member_redeclared_in_instantiation)
3959 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3972 diag::err_definition_of_implicitly_declared_member)
3978 diag::err_definition_of_explicitly_defaulted_member)
4001 if (
const auto *NRA = New->
getAttr<CXX11NoReturnAttr>())
4002 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4003 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4012 const CarriesDependencyAttr *CDA = New->
getAttr<CarriesDependencyAttr>();
4013 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4014 Diag(CDA->getLocation(),
4015 diag::err_carries_dependency_missing_on_first_decl) << 0;
4017 diag::note_carries_dependency_missing_first_decl) << 0;
4030 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4045 Diag(OldLocation, PrevDiag);
4047 Diag(New->
getLocation(), diag::err_different_language_linkage) << New;
4048 Diag(OldLocation, PrevDiag);
4119 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4120 if (WithoutProto == New)
4121 IsWithoutProtoADef = NewDeclIsDefn;
4123 IsWithProtoADef = NewDeclIsDefn;
4125 diag::warn_non_prototype_changes_behavior)
4126 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4127 << (WithoutProto == Old) << IsWithProtoADef;
4137 !IsWithoutProtoADef)
4147 if (MergeTypeWithOld && isa<FunctionNoProtoType>(NewFuncType) &&
4148 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4151 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4153 OldProto->getParamTypes(),
4154 OldProto->getExtProtoInfo());
4160 for (
const auto &ParamType : OldProto->param_types()) {
4163 ParamType,
nullptr,
SC_None,
nullptr);
4166 Params.push_back(Param);
4169 New->setParams(Params);
4205 NewProto->getReturnType());
4206 bool LooseCompatible = !MergedReturn.
isNull();
4208 LooseCompatible && Idx != End; ++Idx) {
4212 NewProto->getParamType(Idx))) {
4213 ArgTypes.push_back(NewParm->
getType());
4217 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4218 NewProto->getParamType(Idx) };
4219 Warnings.push_back(Warn);
4220 ArgTypes.push_back(NewParm->
getType());
4222 LooseCompatible =
false;
4225 if (LooseCompatible) {
4226 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4227 Diag(Warnings[Warn].NewParm->getLocation(),
4228 diag::ext_param_promoted_not_compatible_with_prototype)
4229 << Warnings[Warn].PromotedType
4230 << Warnings[Warn].OldParm->getType();
4231 if (Warnings[Warn].OldParm->getLocation().isValid())
4232 Diag(Warnings[Warn].OldParm->getLocation(),
4233 diag::note_previous_declaration);
4236 if (MergeTypeWithOld)
4256 Diag(OldLocation, diag::note_previous_builtin_declaration)
4261 PrevDiag = diag::note_previous_builtin_declaration;
4265 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4270 Scope *S,
bool MergeTypeWithOld) {
4285 for (
unsigned i = 0, e = New->
getNumParams(); i != e; ++i) {
4299 if (!Merged.isNull() && MergeTypeWithOld)
4322 ni != ne && oi != oe; ++ni, ++oi)
4332 ? diag::err_redefinition_different_type
4333 : diag::err_redeclaration_different_type)
4338 std::tie(PrevDiag, OldLocation)
4340 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4345 bool MergeTypeWithOld) {
4373 QualType PrevVDTy = PrevVD->getType();
4427 if (MergeTypeWithOld)
4465 if (!shouldLinkPossiblyHiddenDecl(
Previous, New))
4475 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4479 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4480 if (checkUsingShadowRedecl<VarTemplateDecl>(*
this, Shadow, NewTemplate))
4483 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4486 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4487 if (checkUsingShadowRedecl<VarDecl>(*
this, Shadow, New))
4524 if (New->
hasAttr<WeakImportAttr>())
4535 if (
const auto *ILA = New->
getAttr<InternalLinkageAttr>())
4536 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4540 New->
dropAttr<InternalLinkageAttr>();
4545 if (MostRecent != Old) {
4558 std::tie(PrevDiag, OldLocation) =
4568 Diag(OldLocation, PrevDiag);
4572 Diag(OldLocation, PrevDiag);
4591 Diag(OldLocation, PrevDiag);
4599 Diag(OldLocation, PrevDiag);
4605 Diag(OldLocation, PrevDiag);
4621 Diag(OldLocation, PrevDiag);
4631 Diag(Def->getLocation(), diag::note_previous_definition);
4645 Diag(OldLocation, PrevDiag);
4648 Diag(OldLocation, PrevDiag);
4656 Diag(OldLocation, PrevDiag);
4666 diag::warn_deprecated_redundant_constexpr_static_def);
4675 Diag(New->
getLocation(), diag::err_different_language_linkage) << New;
4676 Diag(OldLocation, PrevDiag);
4706 StringRef HdrFilename =
4709 auto noteFromModuleOrInclude = [&](
Module *Mod,
4715 if (IncLoc.isValid()) {
4717 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4723 Diag(IncLoc, diag::note_redefinition_include_same_file)
4724 << HdrFilename.str();
4734 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4742 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4757 isa<VarTemplateSpecializationDecl>(New) ||
4793 ? S->getMSCurManglingNumber()
4794 : S->getMSLastManglingNumber();
4801 if (isa<CXXRecordDecl>(Tag->getParent())) {
4804 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
4816 Decl *ManglingContextDecl;
4817 std::tie(MCtx, ManglingContextDecl) =
4827struct NonCLikeKind {
4847 return {NonCLikeKind::Invalid, {}};
4854 return {NonCLikeKind::BaseClass,
4866 if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
4867 if (FD->hasInClassInitializer()) {
4868 auto *
Init = FD->getInClassInitializer();
4869 return {NonCLikeKind::DefaultMemberInit,
4877 if (isa<FriendDecl>(
D))
4882 if (isa<StaticAssertDecl>(
D) || isa<IndirectFieldDecl>(
D) ||
4885 auto *MemberRD = dyn_cast<CXXRecordDecl>(
D);
4893 if (MemberRD->isLambda())
4894 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
4898 if (MemberRD->isThisDeclarationADefinition()) {
4904 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
4934 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
4938 if (NonCLike || ChangesLinkage) {
4939 if (NonCLike.Kind == NonCLikeKind::Invalid)
4942 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
4943 if (ChangesLinkage) {
4945 if (NonCLike.Kind == NonCLikeKind::None)
4946 DiagID = diag::err_typedef_changes_linkage;
4948 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
4954 TextToInsert +=
' ';
4957 Diag(FixitLoc, DiagID)
4958 << isa<TypeAliasDecl>(NewTD)
4960 if (NonCLike.Kind != NonCLikeKind::None) {
4961 Diag(NonCLike.Range.getBegin(), diag::note_non_c_like_anon_struct)
4962 << NonCLike.Kind - 1 << NonCLike.Range;
4965 << NewTD << isa<TypeAliasDecl>(NewTD);
4987 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
4988 if (ED->isScopedUsingClassTag())
4995 llvm_unreachable(
"unexpected type specifier");
5003 bool IsExplicitInstantiation,
5006 Decl *TagD =
nullptr;
5021 if (isa<TagDecl>(TagD))
5022 Tag = cast<TagDecl>(TagD);
5024 Tag = CTD->getTemplatedDecl();
5029 Tag->setFreeStanding();
5030 if (Tag->isInvalidDecl())
5039 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5076 "Friend ellipsis but not friend-specified?");
5079 bool DeclaresAnything =
true;
5083 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5086 Record->getDeclContext()->isRecord()) {
5100 DeclaresAnything =
false;
5119 if ((Tag && Tag->getDeclName()) ||
5123 Record = dyn_cast<RecordDecl>(Tag);
5136 DeclaresAnything =
false;
5148 if (
Enum->enumerator_begin() ==
Enum->enumerator_end() &&
5149 !
Enum->getIdentifier() && !
Enum->isInvalidDecl())
5150 DeclaresAnything =
false;
5158 DeclaresAnything =
false;
5162 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5164 << llvm::to_underlying(Tag->getTagKind())
5177 if (!DeclaresAnything) {
5180 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5181 ? diag::err_no_declarators
5182 : diag::ext_no_declarators)
5195 unsigned DiagID = diag::warn_standalone_specifier;
5197 DiagID = diag::ext_standalone_specifier;
5238 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5239 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5241 DiagnosticId = diag::warn_attribute_ignored;
5242 else if (AL.isRegularKeywordAttribute())
5243 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5245 DiagnosticId = diag::warn_declspec_attribute_ignored;
5246 Diag(AL.getLoc(), DiagnosticId)
5250 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5251 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5270 RedeclarationKind::ForVisibleRedeclaration);
5275 assert(PrevDecl &&
"Expected a non-null Decl");
5288 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5290 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5296 if (
auto *RD = dyn_cast_if_present<RecordDecl>(
D))
5306 if (
Record->isAnonymousStructOrUnion())
5311 const NamedDecl *ND = dyn_cast<NamedDecl>(
D);
5345 for (
auto *
D : AnonRecord->
decls()) {
5346 if ((isa<FieldDecl>(
D) || isa<IndirectFieldDecl>(
D)) &&
5347 cast<NamedDecl>(
D)->getDeclName()) {
5363 unsigned OldChainingSize = Chaining.size();
5365 Chaining.append(IF->chain_begin(), IF->chain_end());
5367 Chaining.push_back(VD);
5369 assert(Chaining.size() >= 2);
5372 for (
unsigned i = 0; i < Chaining.size(); i++)
5373 NamedChain[i] = Chaining[i];
5377 VD->
getType(), {NamedChain, Chaining.size()});
5389 Chaining.resize(OldChainingSize);
5404 "Parser allowed 'typedef' as storage class VarDecl.");
5405 switch (StorageClassSpec) {
5419 llvm_unreachable(
"unknown storage class specifier");
5423 assert(
Record->hasInClassInitializer());
5425 for (
const auto *I :
Record->decls()) {
5426 const auto *FD = dyn_cast<FieldDecl>(I);
5427 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5428 FD = IFD->getAnonField();
5429 if (FD && FD->hasInClassInitializer())
5430 return FD->getLocation();
5433 llvm_unreachable(
"couldn't find in-class initializer");
5438 if (!
Parent->isUnion() || !
Parent->hasInClassInitializer())
5441 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5447 if (!
Parent->isUnion() || !
Parent->hasInClassInitializer())
5461 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5463 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5465 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5471 const char *PrevSpec =
nullptr;
5482 !cast<NamespaceDecl>(OwnerScope)->isAnonymousNamespace()))) {
5483 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5488 PrevSpec, DiagID, Policy);
5494 isa<RecordDecl>(Owner)) {
5496 diag::err_anonymous_union_with_storage_spec)
5510 <<
Record->isUnion() <<
"const"
5514 diag::ext_anonymous_struct_union_qualified)
5515 <<
Record->isUnion() <<
"volatile"
5519 diag::ext_anonymous_struct_union_qualified)
5520 <<
Record->isUnion() <<
"restrict"
5524 diag::ext_anonymous_struct_union_qualified)
5525 <<
Record->isUnion() <<
"_Atomic"
5529 diag::ext_anonymous_struct_union_qualified)
5530 <<
Record->isUnion() <<
"__unaligned"
5540 for (
auto *Mem :
Record->decls()) {
5542 if (Mem->isInvalidDecl())
5545 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5549 assert(FD->getAccess() !=
AS_none);
5551 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5563 }
else if (Mem->isImplicit()) {
5565 }
else if (isa<TagDecl>(Mem) && Mem->getDeclContext() !=
Record) {
5570 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5571 if (!MemRecord->isAnonymousStructOrUnion() &&
5572 MemRecord->getDeclName()) {
5575 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5579 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5587 Diag(MemRecord->getLocation(),
5588 diag::ext_anonymous_record_with_anonymous_type)
5591 }
else if (isa<AccessSpecDecl>(Mem)) {
5593 }
else if (isa<StaticAssertDecl>(Mem)) {
5598 unsigned DK = diag::err_anonymous_record_bad_member;
5599 if (isa<TypeDecl>(Mem))
5600 DK = diag::err_anonymous_record_with_type;
5601 else if (isa<FunctionDecl>(Mem))
5602 DK = diag::err_anonymous_record_with_function;
5603 else if (isa<VarDecl>(Mem))
5604 DK = diag::err_anonymous_record_with_static;
5608 DK == diag::err_anonymous_record_with_type)
5609 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5612 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5621 if (cast<CXXRecordDecl>(
Record)->hasInClassInitializer() &&
5624 cast<CXXRecordDecl>(
Record));
5628 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5649 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5653 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5669 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5675 Record->getLocation(),
nullptr,
5691 Record->setAnonymousStructOrUnion(
true);
5702 Chain.push_back(Anon);
5708 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5711 Decl *ManglingContextDecl;
5712 std::tie(MCtx, ManglingContextDecl) =
5731 assert(
Record &&
"expected a record!");
5736 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5738 auto *ParentDecl = cast<RecordDecl>(
CurContext);
5744 nullptr, RecTy, TInfo,
5756 Chain.push_back(Anon);
5760 diag::err_field_incomplete_or_sizeless) ||
5765 ParentDecl->setInvalidDecl();
5778 NameInfo.
setLoc(Name.StartLocation);
5780 switch (Name.getKind()) {
5784 NameInfo.
setName(Name.Identifier);
5800 if (!Template || !isa<ClassTemplateDecl>(Template)) {
5801 Diag(Name.StartLocation,
5802 diag::err_deduction_guide_name_not_class_template)
5816 Name.OperatorFunctionId.Operator));
5818 Name.OperatorFunctionId.SymbolLocations[0], Name.EndLocation));
5854 if (!CurClass || CurClass->
getIdentifier() != Name.TemplateId->Name)
5890 llvm_unreachable(
"Unknown name kind");
5918 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
5932 (DeclTyName && DeclTyName == DefTyName))
5933 Params.push_back(Idx);
5960#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
5961#include "clang/Basic/TransformTypeTraits.def"
5976 if (!TSI)
return true;
5989 if (
Result.isInvalid())
return true;
6000 for (
unsigned I = 0,
E =
D.getNumTypeObjects(); I !=
E; ++I) {
6034 << D << static_cast<int>(Status);
6045 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6046 llvm::omp::TraitProperty::
6047 implementation_extension_bind_to_declaration))
6072 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6083 bool IsMemberSpecialization) {
6084 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6085 "without nested-name-specifier");
6087 while (isa<LinkageSpecDecl>(Cur) || isa<CapturedDecl>(Cur))
6101 Diag(
Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6102 : diag::err_member_extra_qualification)
6106 Diag(
Loc, diag::warn_namespace_member_extra_qualification) << Name;
6114 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6116 Diag(
Loc, diag::err_member_qualification)
6118 else if (isa<TranslationUnitDecl>(DC))
6119 Diag(
Loc, diag::err_invalid_declarator_global_scope)
6121 else if (isa<FunctionDecl>(Cur))
6122 Diag(
Loc, diag::err_invalid_declarator_in_function)
6124 else if (isa<BlockDecl>(Cur))
6125 Diag(
Loc, diag::err_invalid_declarator_in_block)
6127 else if (isa<ExportDecl>(Cur)) {
6128 if (!isa<NamespaceDecl>(DC))
6129 Diag(
Loc, diag::err_export_non_namespace_scope_name)
6136 Diag(
Loc, diag::err_invalid_declarator_scope)
6137 << Name << cast<NamedDecl>(Cur) << cast<NamedDecl>(DC) << SS.
getRange();
6144 Diag(
Loc, diag::err_member_qualification)
6170 Diag(
Loc, diag::ext_template_after_declarative_nns)
6177 Diag(
Loc, diag::ext_template_after_declarative_nns)
6188 if (TST->isDependentType() && TST->isTypeAlias())
6189 Diag(
Loc, diag::ext_alias_template_in_declarative_nns)
6198 Diag(
Loc, diag::err_computed_type_in_declarative_nns)
6202 }
while ((SpecLoc = SpecLoc.
getPrefix()));
6215 if (
D.isDecompositionDeclarator()) {
6218 if (!
D.isInvalidType())
6226 if (
D.getCXXScopeSpec().isInvalid())
6228 else if (
D.getCXXScopeSpec().isSet()) {
6233 bool EnteringContext = !
D.getDeclSpec().isFriendSpecified();
6235 if (!DC || isa<EnumDecl>(DC)) {
6240 Diag(
D.getIdentifierLoc(),
6241 diag::err_template_qualified_declarator_no_match)
6242 <<
D.getCXXScopeSpec().getScopeRep()
6243 <<
D.getCXXScopeSpec().getRange();
6248 if (!IsDependentContext &&
6253 if (isa<CXXRecordDecl>(DC) && !cast<CXXRecordDecl>(DC)->
hasDefinition()) {
6254 Diag(
D.getIdentifierLoc(),
6255 diag::err_member_def_undefined_record)
6256 << Name << DC <<
D.getCXXScopeSpec().getRange();
6259 if (!
D.getDeclSpec().isFriendSpecified()) {
6262 ?
D.getName().TemplateId
6265 D.getIdentifierLoc(), TemplateId,
6276 if (EnteringContext && IsDependentContext &&
6277 TemplateParamLists.size() != 0) {
6295 if (!
D.getCXXScopeSpec().isSet()) {
6296 bool IsLinkageLookup =
false;
6297 bool CreateBuiltins =
false;
6311 IsLinkageLookup =
true;
6316 CreateBuiltins =
true;
6318 if (IsLinkageLookup) {
6321 RedeclarationKind::ForExternalRedeclaration);
6359 if (!
D.isInvalidType()) {
6360 bool AllowForCompatibility =
false;
6361 if (
Scope *DeclParent = S->getDeclParent();
6362 Scope *TemplateParamParent = S->getTemplateParamParent()) {
6363 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6364 TemplateParamParent->isDeclScope(TPD);
6367 AllowForCompatibility);
6393 S = S->getDeclParent();
6397 bool AddToScope =
true;
6399 if (TemplateParamLists.size()) {
6400 Diag(
D.getIdentifierLoc(), diag::err_template_typedef);
6422 if (
OpenMP().isInOpenMPDeclareTargetContext())
6433 bool &SizeIsNegative,
6434 llvm::APSInt &Oversized) {
6439 SizeIsNegative =
false;
6448 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6453 if (FixedType.
isNull())
return FixedType;
6455 return Qs.
apply(Context, FixedType);
6457 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6458 QualType Inner = PTy->getInnerType();
6462 if (FixedType.
isNull())
return FixedType;
6464 return Qs.
apply(Context, FixedType);
6474 SizeIsNegative, Oversized);
6484 llvm::APSInt Res =
Result.Val.getInt();
6487 if (Res.isSigned() && Res.isNegative()) {
6488 SizeIsNegative =
true;
6493 unsigned ActiveSizeBits =
6497 : Res.getActiveBits();
6505 return Qs.
apply(Context, FoldedArrayType);
6530 TypeLoc DstElemTL = DstATL.getElementLoc();
6549 bool &SizeIsNegative,
6550 llvm::APSInt &Oversized) {
6553 SizeIsNegative, Oversized);
6564 unsigned FailedFoldDiagID) {
6565 bool SizeIsNegative;
6566 llvm::APSInt Oversized;
6568 TInfo,
Context, SizeIsNegative, Oversized);
6570 Diag(
Loc, diag::ext_vla_folded_to_constant);
6577 Diag(
Loc, diag::err_typecheck_negative_array_size);
6578 else if (Oversized.getBoolValue())
6580 else if (FailedFoldDiagID)
6607 diag::err_virtual_non_function);
6611 diag::err_explicit_non_function);
6615 diag::err_noreturn_non_function);
6622 if (
D.getCXXScopeSpec().isSet()) {
6623 Diag(
D.getIdentifierLoc(), diag::err_qualified_typedef_declarator)
6624 <<
D.getCXXScopeSpec().getRange();
6633 if (
D.getDeclSpec().isInlineSpecified())
6634 Diag(
D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
6636 if (
D.getDeclSpec().hasConstexprSpecifier())
6637 Diag(
D.getDeclSpec().getConstexprSpecLoc(), diag::err_invalid_constexpr)
6638 << 1 <<
static_cast<int>(
D.getDeclSpec().getConstexprSpecifier());
6642 Diag(
D.getName().StartLocation,
6643 diag::err_deduction_guide_invalid_specifier)
6646 Diag(
D.getName().StartLocation, diag::err_typedef_not_identifier)
6652 if (!NewTD)
return nullptr;
6659 bool Redeclaration =
D.isRedeclaration();
6661 D.setRedeclaration(Redeclaration);
6676 if (S->getFnParent() ==
nullptr) {
6677 bool SizeIsNegative;
6678 llvm::APSInt Oversized;
6691 else if (Oversized.getBoolValue())
6715 Redeclaration =
true;
6721 if (ShadowedDecl && !Redeclaration)
6728 switch (II->getNotableIdentifierID()) {
6729 case tok::NotableIdentifierKind::FILE:
6732 case tok::NotableIdentifierKind::jmp_buf:
6735 case tok::NotableIdentifierKind::sigjmp_buf:
6738 case tok::NotableIdentifierKind::ucontext_t:
6741 case tok::NotableIdentifierKind::float_t:
6742 case tok::NotableIdentifierKind::double_t:
6743 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
6804 if (!OuterContext->
Equals(PrevOuterContext))
6813 if (!SS.
isSet())
return;
6818 if (
Decl->getType().hasAddressSpace())
6820 if (
Decl->getType()->isDependentType())
6832 Var->hasGlobalStorage())
6836 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
6837 auto OrigTy = DT->getOriginalType();
6838 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
6870 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
6877 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
6878 if (VD->hasInit()) {
6879 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
6880 assert(VD->isThisDeclarationADefinition() &&
6881 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
6883 VD->dropAttr<AliasAttr>();
6890 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
6893 diag::err_attribute_selectany_non_extern_data);
6898 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
6901 diag::warn_attribute_hybrid_patchable_non_extern);
6904 auto *VD = dyn_cast<VarDecl>(&ND);
6905 bool IsAnonymousNS =
false;
6908 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
6909 while (NS && !IsAnonymousNS) {
6911 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
6918 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
6920 (!AnonNSInMicrosoftMode &&
6929 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
6934 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
6940 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
6941 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
6942 int NoImplicitObjectError = -1;
6944 NoImplicitObjectError = 0;
6945 else if (MD->isStatic())
6946 NoImplicitObjectError = 1;
6947 else if (MD->isExplicitObjectMemberFunction())
6948 NoImplicitObjectError = 2;
6949 if (NoImplicitObjectError != -1) {
6950 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
6951 << NoImplicitObjectError << A->getRange();
6952 }
else if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) {
6953 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
6954 << isa<CXXDestructorDecl>(MD) << A->getRange();
6963 bool IsSpecialization,
6964 bool IsDefinition) {
6968 bool IsTemplate =
false;
6969 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
6970 OldDecl = OldTD->getTemplatedDecl();
6972 if (!IsSpecialization)
6973 IsDefinition =
false;
6975 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
6976 NewDecl = NewTD->getTemplatedDecl();
6980 if (!OldDecl || !NewDecl)
6983 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
6984 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
6985 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
6986 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
6990 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
6991 (NewExportAttr && !NewExportAttr->isInherited());
6997 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
6999 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7001 bool JustWarn =
false;
7003 auto *VD = dyn_cast<VarDecl>(OldDecl);
7004 if (VD && !VD->getDescribedVarTemplate())
7006 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7015 if (!isa<FunctionDecl>(OldDecl) || !NewImportAttr)
7018 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7019 : diag::err_attribute_dll_redeclaration;
7022 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7035 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7037 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7040 IsStaticDataMember = VD->isStaticDataMember();
7041 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7043 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7044 IsInline = FD->isInlined();
7045 IsQualifiedFriend = FD->getQualifier() &&
7049 if (OldImportAttr && !HasNewAttr &&
7050 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7052 if (IsMicrosoftABI && IsDefinition) {
7053 if (IsSpecialization) {
7056 diag::err_attribute_dllimport_function_specialization_definition);
7057 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7058 NewDecl->
dropAttr<DLLImportAttr>();
7061 diag::warn_redeclaration_without_import_attribute)
7064 NewDecl->
dropAttr<DLLImportAttr>();
7065 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7066 S.
Context, NewImportAttr->getRange()));
7068 }
else if (IsMicrosoftABI && IsSpecialization) {
7069 assert(!IsDefinition);
7073 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7074 << NewDecl << OldImportAttr;
7076 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7077 OldDecl->
dropAttr<DLLImportAttr>();
7078 NewDecl->
dropAttr<DLLImportAttr>();
7080 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7083 OldDecl->
dropAttr<DLLImportAttr>();
7084 NewDecl->
dropAttr<DLLImportAttr>();
7086 diag::warn_dllimport_dropped_from_inline_function)
7087 << NewDecl << OldImportAttr;
7094 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7096 !NewImportAttr && !NewExportAttr) {
7097 if (
const DLLExportAttr *ParentExportAttr =
7098 MD->getParent()->getAttr<DLLExportAttr>()) {
7099 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7100 NewAttr->setInherited(
true);
7144 if (!
D->isInExternCContext() ||
D->template hasAttr<OverloadableAttr>())
7148 if (S.
getLangOpts().CUDA && (
D->template hasAttr<CUDADeviceAttr>() ||
7149 D->template hasAttr<CUDAHostAttr>()))
7152 return D->isExternC();
7158 isa<OMPDeclareMapperDecl>(DC))
7167 if (isa<RequiresExprBodyDecl>(DC))
7169 llvm_unreachable(
"Unexpected context");
7175 isa<OMPDeclareReductionDecl>(DC) || isa<OMPDeclareMapperDecl>(DC))
7179 llvm_unreachable(
"Unexpected context");
7224 if (
const auto *FD = dyn_cast<FunctionDecl>(
D))
7225 return FD->isExternC();
7226 if (
const auto *VD = dyn_cast<VarDecl>(
D))
7227 return VD->isExternC();
7229 llvm_unreachable(
"Unknown type of decl!");
7242 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7256 diag::err_invalid_type_for_program_scope_var)
7285 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7318 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7328template <
typename AttrTy>
7331 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7332 AttrTy *Clone = Attribute->clone(S.
Context);
7333 Clone->setInherited(
true);
7361 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7363 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7370 return Name.getAsIdentifierInfo() &&
7371 Name.getAsIdentifierInfo()->isStr(
"main") &&
7385 bool IsPlaceholderVariable =
false;
7387 if (
D.isDecompositionDeclarator()) {
7390 auto &Decomp =
D.getDecompositionDeclarator();
7391 if (!Decomp.bindings().empty()) {
7392 II = Decomp.bindings()[0].Name;
7396 Diag(
D.getIdentifierLoc(), diag::err_bad_variable_name) << Name;
7406 IsPlaceholderVariable =
true;
7424 bool IsLocalExternDecl = SC ==
SC_Extern &&
7430 Diag(
D.getIdentifierLoc(), diag::err_mutable_nonmember);
7437 D.getDeclSpec().getStorageClassSpecLoc())) {
7441 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
7443 : diag::warn_deprecated_register)
7449 if (!DC->
isRecord() && S->getFnParent() ==
nullptr) {
7454 Diag(
D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);
7466 const AutoType *AT = TL.getTypePtr();
7470 bool IsMemberSpecialization =
false;
7471 bool IsVariableTemplateSpecialization =
false;
7473 bool IsVariableTemplate =
false;
7484 if (
D.isInvalidType())
7497 D.getCXXScopeSpec(),
7499 ?
D.getName().TemplateId
7502 false, IsMemberSpecialization,
Invalid);
7504 if (TemplateParams) {
7511 if (!TemplateParams->
size() &&
7516 diag::err_template_variable_noparams)
7520 TemplateParams =
nullptr;
7528 IsVariableTemplateSpecialization =
true;
7532 IsVariableTemplate =
true;
7535 Diag(
D.getIdentifierLoc(),
7537 ? diag::warn_cxx11_compat_variable_template
7538 : diag::ext_variable_template);
7543 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7548 "should have a 'template<>' for this decl");
7551 bool IsExplicitSpecialization =
7562 (IsExplicitSpecialization || IsMemberSpecialization)) {
7563 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
7564 diag::ext_explicit_specialization_storage_class)
7570 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7576 if (Ctxt->isFunctionOrMethod()) {
7577 FunctionOrMethod = Ctxt;
7580 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7582 AnonStruct = ParentDecl;
7586 if (FunctionOrMethod) {
7589 Diag(
D.getIdentifierLoc(),
7590 diag::err_static_data_member_not_allowed_in_local_class)
7591 << Name << RD->getDeclName()
7592 << llvm::to_underlying(RD->getTagKind());
7593 }
else if (AnonStruct) {
7597 Diag(
D.getIdentifierLoc(),
7598 diag::err_static_data_member_not_allowed_in_anon_struct)
7599 << Name << llvm::to_underlying(AnonStruct->
getTagKind());
7601 }
else if (RD->isUnion()) {
7604 Diag(
D.getIdentifierLoc(),
7606 ? diag::warn_cxx98_compat_static_data_member_in_union
7607 : diag::ext_static_data_member_in_union)
7613 Diag(
D.getIdentifierLoc(), diag::err_template_member)
7624 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
7625 diag::err_static_out_of_line)
7627 D.getDeclSpec().getStorageClassSpecLoc());
7637 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
7638 diag::err_storage_class_for_static_member)
7640 D.getDeclSpec().getStorageClassSpecLoc());
7643 llvm_unreachable(
"C storage class in c++!");
7647 if (IsVariableTemplateSpecialization) {
7649 TemplateParamLists.size() > 0
7650 ? TemplateParamLists[0]->getTemplateLoc()
7653 S,
D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
7657 NewVD = cast<VarDecl>(Res.
get());
7659 }
else if (
D.isDecompositionDeclarator()) {
7661 D.getIdentifierLoc(), R, TInfo, SC,
7665 D.getIdentifierLoc(), II, R, TInfo, SC);
7668 if (IsVariableTemplate) {
7671 TemplateParams, NewVD);
7680 if (
D.isInvalidType() ||
Invalid) {
7692 unsigned VDTemplateParamLists =
7693 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
7694 if (TemplateParamLists.size() > VDTemplateParamLists)
7696 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
7699 if (
D.getDeclSpec().isInlineSpecified()) {
7701 Diag(
D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
7705 Diag(
D.getDeclSpec().getInlineSpecLoc(),
7706 diag::err_inline_declaration_block_scope) << Name
7709 Diag(
D.getDeclSpec().getInlineSpecLoc(),
7711 : diag::ext_inline_variable);
7722 if (IsLocalExternDecl) {
7723 if (
D.isDecompositionDeclarator())
7725 B->setLocalExternDecl();
7730 bool EmitTLSUnsupportedError =
false;
7731 if (
DeclSpec::TSCS TSCS =
D.getDeclSpec().getThreadStorageClassSpec()) {
7742 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
7743 diag::err_thread_non_global)
7751 EmitTLSUnsupportedError =
true;
7757 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
7758 diag::err_thread_unsupported);
7763 switch (
D.getDeclSpec().getConstexprSpecifier()) {
7768 Diag(
D.getDeclSpec().getConstexprSpecLoc(),
7769 diag::err_constexpr_wrong_decl_kind)
7770 <<
static_cast<int>(
D.getDeclSpec().getConstexprSpecifier());
7786 Diag(
D.getDeclSpec().getConstexprSpecLoc(),
7787 diag::err_constinit_local_variable);
7790 ConstInitAttr::Create(
Context,
D.getDeclSpec().getConstexprSpecLoc(),
7791 ConstInitAttr::Keyword_constinit));
7804 if (SC ==
SC_Static && S->getFnParent() !=
nullptr &&
7808 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
7809 diag::warn_static_local_in_extern_inline);
7814 if (
D.getDeclSpec().isModulePrivateSpecified()) {
7815 if (IsVariableTemplateSpecialization)
7819 D.getDeclSpec().getModulePrivateSpecLoc());
7820 else if (IsMemberSpecialization)
7827 <<
SourceRange(
D.getDeclSpec().getModulePrivateSpecLoc())
7829 D.getDeclSpec().getModulePrivateSpecLoc());
7835 B->setModulePrivate();
7844 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
7845 diag::err_opencl_unknown_type_specifier)
7855 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
7856 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
7873 copyAttrFromTypedefToDecl<AllocSizeAttr>(*
this, NewVD, TT);
7877 if (EmitTLSUnsupportedError &&
7880 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
7881 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
7882 diag::err_thread_unsupported);
7884 if (EmitTLSUnsupportedError &&
7887 targetDiag(
D.getIdentifierLoc(), diag::err_thread_unsupported);
7890 if (SC ==
SC_None && S->getFnParent() !=
nullptr &&
7891 (NewVD->
hasAttr<CUDASharedAttr>() ||
7892 NewVD->
hasAttr<CUDAConstantAttr>())) {
7900 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
7901 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
7906 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
7914 if (S->getFnParent() !=
nullptr) {
7935 bool HasSizeMismatch;
7937 if (!TI.isValidGCCRegisterName(
Label))
7939 else if (!TI.validateGlobalRegisterVariable(
Label,
7943 else if (HasSizeMismatch)
7957 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
7970 NamedDecl *ShadowedDecl =
D.getCXXScopeSpec().isEmpty()
7978 D.getCXXScopeSpec().isNotEmpty() ||
7979 IsMemberSpecialization ||
7980 IsVariableTemplateSpecialization);
7994 if (IsMemberSpecialization && !IsVariableTemplate &&
7995 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8002 isa<FieldDecl>(
Previous.getFoundDecl()) &&
8003 D.getCXXScopeSpec().isSet()) {
8007 <<
D.getCXXScopeSpec().getRange();
8011 }
else if (
D.getCXXScopeSpec().isSet() &&
8012 !IsVariableTemplateSpecialization) {
8014 Diag(
D.getIdentifierLoc(), diag::err_no_member)
8016 <<
D.getCXXScopeSpec().getRange();
8020 if (!IsPlaceholderVariable)
8043 (
D.getCXXScopeSpec().isSet() && DC && DC->
isRecord() &&
8051 if (PrevVarTemplate &&
8058 if (!IsPlaceholderVariable && ShadowedDecl && !
D.isRedeclaration())
8071 Decl *ManglingContextDecl;
8072 std::tie(MCtx, ManglingContextDecl) =
8099 if (
D.isRedeclaration() && !
Previous.empty()) {
8102 D.isFunctionDefinition());
8134 if (isa<TypeAliasDecl>(ShadowedDecl))
8136 else if (isa<TypedefDecl>(ShadowedDecl))
8138 else if (isa<BindingDecl>(ShadowedDecl))
8140 else if (isa<RecordDecl>(OldDC))
8173 if (
D->hasGlobalStorage() && !
D->isStaticLocal())
8177 return isa<VarDecl, FieldDecl, BindingDecl>(ShadowedDecl) ? ShadowedDecl
8191 return isa<TypedefNameDecl>(ShadowedDecl) ? ShadowedDecl :
nullptr;
8200 return isa<VarDecl, FieldDecl, BindingDecl>(ShadowedDecl) ? ShadowedDecl
8208 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8216 if (isa<CXXConstructorDecl>(NewDC))
8217 if (
const auto PVD = dyn_cast<ParmVarDecl>(
D)) {
8220 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8225 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8226 if (shadowedVar->isExternC()) {
8229 for (
auto *I : shadowedVar->redecls())
8230 if (I->isFileVarDecl()) {
8238 unsigned WarningDiag = diag::warn_decl_shadow;
8240 if (isa<VarDecl>(
D) && NewDC && isa<CXXMethodDecl>(NewDC)) {
8241 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8243 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8245 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8251 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8257 ->ShadowingDecls.push_back({
D, VD});
8261 if (isa<FieldDecl>(ShadowedDecl)) {
8268 ->ShadowingDecls.push_back({
D, ShadowedDecl});
8272 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl);
8273 VD && VD->hasLocalStorage()) {
8277 ParentDC && !ParentDC->
Equals(OldDC);
8281 if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
8315 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8322 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8325 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8327 Diag(Shadow.VD->getLocation(),
8328 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8329 : diag::warn_decl_shadow)
8330 << Shadow.VD->getDeclName()
8333 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8334 << Shadow.VD->getDeclName() << 0;
8336 }
else if (isa<FieldDecl>(ShadowedDecl)) {
8337 Diag(Shadow.VD->getLocation(),
8339 : diag::warn_decl_shadow_uncaptured_local)
8340 << Shadow.VD->getDeclName()
8353 RedeclarationKind::ForVisibleRedeclaration);
8366 auto *DRE = dyn_cast<DeclRefExpr>(
E);
8369 const NamedDecl *
D = cast<NamedDecl>(DRE->getDecl()->getCanonicalDecl());
8370 auto I = ShadowingDecls.find(
D);
8371 if (I == ShadowingDecls.end())
8373 const NamedDecl *ShadowedDecl = I->second;
8375 Diag(
Loc, diag::warn_modifying_shadowing_decl) <<
D << OldDC;
8380 ShadowingDecls.erase(I);
8388 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8409 if (!isa<VarDecl>(ND))
8419 if (isa<VarDecl>(*I)) {
8429 if (isa<VarDecl>(*I)) {
8447 assert(Prev &&
"should have found a previous declaration to diagnose");
8449 Prev = FD->getFirstDecl();
8451 Prev = cast<VarDecl>(Prev)->getFirstDecl();
8453 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8475 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8487 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8507 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8517 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8523 if (llvm::any_of(RD->
fields(), [&SemaRef, VarLoc](
const FieldDecl *F) {
8524 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8580 if (NewVD->
hasAttr<BlocksAttr>()) {
8588 if (!
T.isConstQualified()) {
8589 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8595 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8611 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8612 <<
Scope <<
"global or constant";
8614 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8615 <<
Scope <<
"constant";
8631 if (FD && !FD->
hasAttr<OpenCLKernelAttr>()) {
8643 if (FD && FD->
hasAttr<OpenCLKernelAttr>()) {
8668 && !NewVD->
hasAttr<BlocksAttr>()) {
8690 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
8691 if (!ATy || ATy->getZExtSize() != 0) {
8693 diag::err_typecheck_wasm_table_must_have_zero_length);
8700 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
8706 bool SizeIsNegative;
8707 llvm::APSInt Oversized;
8712 FixedT = FixedTInfo->
getType();
8713 else if (FixedTInfo) {
8776 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
8791 diag::err_constexpr_var_non_literal)) {
8807 llvm::StringMap<bool> CallerFeatureMap;
8818 diag::err_sve_vector_in_non_streaming_function)
8828 llvm::StringMap<bool> CallerFeatureMap;
8874 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
8881 if (Overridden.insert(BaseMD).second) {
8898 return !Overridden.empty();
8904 struct ActOnFDArgs {
8920 : Context(Context), OriginalFD(TypoFD),
8923 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
8929 CDeclEnd = candidate.
end();
8930 CDecl != CDeclEnd; ++CDecl) {
8937 if (
Parent &&
Parent->getCanonicalDecl() == ExpectedParent)
8939 }
else if (!ExpectedParent) {
8948 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
8949 return std::make_unique<DifferentNameValidatorCCC>(*
this);
8975 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
8981 bool IsDefinition = ExtraArgs.D.isFunctionDefinition();
8983 IsLocalFriend ? diag::err_no_matching_local_friend :
8985 diag::err_member_decl_does_not_match;
8989 RedeclarationKind::ForVisibleRedeclaration);
8997 "Cannot have an ambiguity in previous-declaration lookup");
8999 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9001 if (!Prev.
empty()) {
9010 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9011 NearMatches.push_back(std::make_pair(FD, ParamNum));
9018 IsLocalFriend ?
nullptr : NewDC))) {
9021 ExtraArgs.D.getIdentifierLoc());
9025 CDeclEnd = Correction.
end();
9026 CDecl != CDeclEnd; ++CDecl) {
9033 bool wasRedeclaration = ExtraArgs.D.isRedeclaration();
9046 ExtraArgs.S, ExtraArgs.D,
9049 ExtraArgs.AddToScope);
9057 Decl *Canonical =
Result->getCanonicalDecl();
9060 if ((*I)->getCanonicalDecl() == Canonical)
9067 SemaRef.
PDiag(IsLocalFriend
9068 ? diag::err_no_matching_local_friend_suggest
9069 : diag::err_member_decl_does_not_match_suggest)
9070 << Name << NewDC << IsDefinition);
9075 ExtraArgs.D.SetIdentifier(Name.getAsIdentifierInfo(),
9076 ExtraArgs.D.getIdentifierLoc());
9077 ExtraArgs.D.setRedeclaration(wasRedeclaration);
9083 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9085 bool NewFDisConst =
false;
9087 NewFDisConst = NewMD->isConst();
9090 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9091 NearMatch != NearMatchEnd; ++NearMatch) {
9094 bool FDisConst = MD && MD->
isConst();
9095 bool IsMember = MD || !IsLocalFriend;
9098 if (
unsigned Idx = NearMatch->second) {
9102 SemaRef.
Diag(
Loc, IsMember ? diag::note_member_def_close_param_match
9103 : diag::note_local_decl_close_param_match)
9106 }
else if (FDisConst != NewFDisConst) {
9108 diag::note_member_def_close_const_match)
9110 if (
const auto &FTI = ExtraArgs.D.getFunctionTypeInfo(); !NewFDisConst)
9113 else if (FTI.hasMethodTypeQualifiers() &&
9114 FTI.getConstQualifierLoc().isValid())
9118 IsMember ? diag::note_member_def_close_match
9119 : diag::note_local_decl_close_match);
9126 switch (
D.getDeclSpec().getStorageClassSpec()) {
9127 default: llvm_unreachable(
"Unknown storage class!");
9131 SemaRef.
Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
9132 diag::err_typecheck_sclass_func);
9133 D.getMutableDeclSpec().ClearStorageClassSpecs();
9138 if (
D.getDeclSpec().isExternInLinkageSpec())
9148 SemaRef.
Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
9149 diag::err_static_block_func);
9165 bool &IsVirtualOkay) {
9170 bool isInline =
D.getDeclSpec().isInlineSpecified();
9178 SemaRef.
Diag(
D.getDeclSpec().getConstexprSpecLoc(),
9179 diag::err_c23_constexpr_not_variable);
9181 SemaRef.
Diag(
D.getDeclSpec().getConstexprSpecLoc(),
9182 diag::err_constexpr_wrong_decl_kind)
9183 <<
static_cast<int>(ConstexprKind);
9185 D.getMutableDeclSpec().ClearConstexprSpec();
9200 (
D.isFunctionDeclarator() &&
D.getFunctionTypeInfo().hasPrototype) ||
9201 (
D.getDeclSpec().isTypeRep() &&
9203 ->isFunctionProtoType()) ||
9207 "Strict prototypes are required");
9214 if (
D.isInvalidType())
9221 Expr *TrailingRequiresClause =
D.getTrailingRequiresClause();
9228 "Constructors can only be declared in a member context");
9234 isInline,
false, ConstexprKind,
9245 false, ConstexprKind,
9246 TrailingRequiresClause);
9249 if (
Record->isBeingDefined())
9258 IsVirtualOkay =
true;
9262 SemaRef.
Diag(
D.getIdentifierLoc(), diag::err_destructor_not_member);
9270 true, ConstexprKind, TrailingRequiresClause);
9275 SemaRef.
Diag(
D.getIdentifierLoc(),
9276 diag::err_conv_function_not_member);
9281 if (
D.isInvalidType())
9284 IsVirtualOkay =
true;
9289 TrailingRequiresClause);
9292 if (TrailingRequiresClause)
9294 diag::err_trailing_requires_clause_on_deduction_guide)
9306 if (Name.getAsIdentifierInfo() &&
9307 Name.getAsIdentifierInfo() == cast<CXXRecordDecl>(DC)->getIdentifier()){
9308 SemaRef.
Diag(
D.getIdentifierLoc(), diag::err_constructor_return_type)
9319 IsVirtualOkay = !Ret->isStatic();
9323 SemaRef.
getLangOpts().CPlusPlus &&
D.getDeclSpec().isFriendSpecified();
9333 true , ConstexprKind, TrailingRequiresClause);
9350 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9358 if (Names.end() != Match)
9363 }
while (DesugaredTy != Ty);
9402 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9404 bool IsStandardLayoutType =
true;
9410 if (!CXXRec->hasDefinition())
9412 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9413 IsStandardLayoutType =
false;
9416 !IsStandardLayoutType)
9464 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9478 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9525 S.
Diag(
Loc, diag::note_entity_declared_at) << PT;
9548 HistoryStack.push_back(
nullptr);
9557 VisitStack.push_back(RecTy->
getDecl());
9558 assert(VisitStack.back() &&
"First decl null?");
9561 const Decl *Next = VisitStack.pop_back_val();
9563 assert(!HistoryStack.empty());
9565 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9566 ValidTypes.insert(Hist->getType().getTypePtr());
9574 if (
const FieldDecl *Field = dyn_cast<FieldDecl>(Next)) {
9575 HistoryStack.push_back(Field);
9577 QualType FieldTy = Field->getType();
9581 "Unexpected type.");
9586 RD = cast<RecordDecl>(Next);
9590 VisitStack.push_back(
nullptr);
9592 for (
const auto *FD : RD->
fields()) {
9603 VisitStack.push_back(FD);
9615 diag::err_record_with_pointers_kernel_param)
9622 S.
Diag(OrigRecDecl->getLocation(), diag::note_within_field_of_type)
9623 << OrigRecDecl->getDeclName();
9628 I = HistoryStack.begin() + 1,
9629 E = HistoryStack.end();
9642 }
while (!VisitStack.empty());
9658 while (S->isClassScope() ||
9659 (LangOpts.CPlusPlus &&
9660 S->isFunctionPrototypeScope()) ||
9662 (S->getEntity() && S->getEntity()->isTransparentContext()))
9669 unsigned BuiltinID) {
9670 switch (BuiltinID) {
9671 case Builtin::BI__GetExceptionInfo:
9675 case Builtin::BIaddressof:
9676 case Builtin::BI__addressof:
9677 case Builtin::BIforward:
9678 case Builtin::BIforward_like:
9679 case Builtin::BImove:
9680 case Builtin::BImove_if_noexcept:
9681 case Builtin::BIas_const: {
9703 Diag(
D.getIdentifierLoc(), diag::err_function_decl_cmse_ns_call);
9706 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
9708 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
9709 Invented->getDepth() == TemplateParamLists.back()->getDepth())
9710 TemplateParamLists.back() = Invented;
9712 TemplateParamLists.push_back(Invented);
9720 if (
DeclSpec::TSCS TSCS =
D.getDeclSpec().getThreadStorageClassSpec())
9721 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
9722 diag::err_invalid_thread)
9725 if (
D.isFirstDeclarationOfMember())
9727 R, !(
D.isStaticMember() ||
D.isExplicitObjectMemberFunction()),
9728 D.isCtorOrDtor(),
D.getIdentifierLoc());
9730 bool isFriend =
false;
9732 bool isMemberSpecialization =
false;
9733 bool isFunctionTemplateSpecialization =
false;
9735 bool HasExplicitTemplateArgs =
false;
9738 bool isVirtualOkay =
false;
9745 if (!NewFD)
return nullptr;
9755 if (IsLocalExternDecl)
9764 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
9768 bool isInline =
D.getDeclSpec().isInlineSpecified();
9769 bool isVirtual =
D.getDeclSpec().isVirtualSpecified();
9770 bool hasExplicit =
D.getDeclSpec().hasExplicitSpecifier();
9771 isFriend =
D.getDeclSpec().isFriendSpecified();
9772 if (isFriend && !isInline &&
D.isFunctionDefinition()) {
9787 if (
Parent->isInterface() && cast<CXXMethodDecl>(NewFD)->isUserProvided())
9792 if (isVirtual &&
Parent->isUnion()) {
9793 Diag(
D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_in_union);
9797 Parent->hasAttr<SYCLSpecialClassAttr>() &&
9799 NewFD->
getName() ==
"__init" &&
D.isFunctionDefinition()) {
9800 if (
auto *Def =
Parent->getDefinition())
9801 Def->setInitMethod(
true);
9806 isMemberSpecialization =
false;
9807 isFunctionTemplateSpecialization =
false;
9808 if (
D.isInvalidType())
9816 ?
D.getName().TemplateId
9821 D.getCXXScopeSpec(), TemplateId, TemplateParamLists, isFriend,
9822 isMemberSpecialization,
Invalid);
9823 if (TemplateParams) {
9828 if (TemplateParams->
size() > 0) {
9836 }
else if (TemplateId) {
9837 Diag(
D.getIdentifierLoc(), diag::err_function_template_partial_spec)
9853 Name, TemplateParams,
9859 if (TemplateParamLists.size() > 1) {
9866 isFunctionTemplateSpecialization =
true;
9868 if (TemplateParamLists.size() > 0)
9887 Diag(
D.getIdentifierLoc(), diag::err_template_spec_decl_friend)
9888 << Name << RemoveRange
9894 HasExplicitTemplateArgs =
true;
9901 if (!TemplateParamLists.empty() && isMemberSpecialization &&
9907 if (TemplateParamLists.size() > 0)
9912 if (isFriend && TemplateId)
9913 isFunctionTemplateSpecialization =
true;
9919 if (isFunctionTemplateSpecialization && TemplateId) {
9920 HasExplicitTemplateArgs =
true;
9951 if (!isVirtualOkay) {
9952 Diag(
D.getDeclSpec().getVirtualSpecLoc(),
9953 diag::err_virtual_non_function);
9956 Diag(
D.getDeclSpec().getVirtualSpecLoc(),
9957 diag::err_virtual_out_of_class)
9962 Diag(
D.getDeclSpec().getVirtualSpecLoc(),
9963 diag::err_virtual_member_function_template)
9972 Diag(
D.getDeclSpec().getVirtualSpecLoc(), diag::err_auto_fn_virtual);
9981 Diag(
D.getDeclSpec().getInlineSpecLoc(),
9982 diag::err_inline_declaration_block_scope) << Name
9992 !isa<CXXDeductionGuideDecl>(NewFD)) {
9995 Diag(
D.getDeclSpec().getExplicitSpecLoc(),
9996 diag::err_explicit_out_of_class)
9998 }
else if (!isa<CXXConstructorDecl>(NewFD) &&
9999 !isa<CXXConversionDecl>(NewFD)) {
10002 Diag(
D.getDeclSpec().getExplicitSpecLoc(),
10003 diag::err_explicit_non_ctor_or_conv_function)
10017 if (isa<CXXDestructorDecl>(NewFD) &&
10020 Diag(
D.getDeclSpec().getConstexprSpecLoc(), diag::err_constexpr_dtor)
10021 <<
static_cast<int>(ConstexprKind);
10034 Diag(
D.getDeclSpec().getConstexprSpecLoc(),
10035 diag::err_invalid_consteval_decl_kind)
10042 if (
D.getDeclSpec().isModulePrivateSpecified()) {
10043 if (isFunctionTemplateSpecialization) {
10045 =
D.getDeclSpec().getModulePrivateSpecLoc();
10046 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10067 switch (
D.getFunctionDefinitionKind()) {
10081 if (isa<CXXMethodDecl>(NewFD) && DC ==
CurContext &&
10082 D.isFunctionDefinition() && !isInline) {
10092 if (!isFriend && SC !=
SC_None) {
10100 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10101 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
10102 diag::ext_explicit_specialization_storage_class)
10104 D.getDeclSpec().getStorageClassSpecLoc());
10108 assert(isa<CXXMethodDecl>(NewFD) &&
10109 "Out-of-line member function should be a CXXMethodDecl");
10121 Diag(
D.getDeclSpec().getStorageClassSpecLoc(),
10123 cast<CXXRecordDecl>(DC)->getDescribedClassTemplate()) ||
10126 ? diag::ext_static_out_of_line
10127 : diag::err_static_out_of_line)
10129 D.getDeclSpec().getStorageClassSpecLoc());
10137 if ((Name.getCXXOverloadedOperator() == OO_Delete ||
10138 Name.getCXXOverloadedOperator() == OO_Array_Delete) &&
10151 if (isInline && !
D.isFunctionDefinition() &&
getLangOpts().CPlusPlus20 &&
10153 PendingInlineFuncDecls.insert(NewFD);
10159 D.getCXXScopeSpec().isNotEmpty() ||
10160 isMemberSpecialization ||
10161 isFunctionTemplateSpecialization);
10171 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10187 if (
D.isFunctionDeclarator(FTIIdx)) {
10196 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10200 Params.push_back(Param);
10215 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10220 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10221 TD = cast<EnumDecl>(ECD->getDeclContext());
10225 DeclContext *TagDC = TD->getLexicalDeclContext();
10229 TD->setDeclContext(NewFD);
10237 if (TagDC != PrototypeTagContext)
10238 TD->setLexicalDeclContext(TagDC);
10252 for (
const auto &AI : FT->param_types()) {
10256 Params.push_back(Param);
10260 "Should not need args for typedef of non-prototype fn");
10264 NewFD->setParams(Params);
10266 if (
D.getDeclSpec().isNoreturnSpecified())
10268 C11NoReturnAttr::Create(
Context,
D.getDeclSpec().getNoreturnSpecLoc()));
10280 !NewFD->
hasAttr<SectionAttr>())
10281 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10286 if (
CodeSegStack.CurrentValue &&
D.isFunctionDefinition() &&
10287 !NewFD->
hasAttr<SectionAttr>()) {
10288 NewFD->
addAttr(SectionAttr::CreateImplicit(
10290 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10301 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10302 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10307 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10309 D.isFunctionDefinition())) {
10316 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10317 if (NewTVA && !NewTVA->isDefaultVersion() &&
10320 AddToScope =
false;
10332 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10347 isMemberSpecialization,
10348 D.isFunctionDefinition()));
10351 D.setRedeclaration(
true);
10354 "previous declaration set still overloaded");
10360 if (isa<FunctionNoProtoType>(FT) && !
D.isFunctionDefinition()) {
10366 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10385 if (
D.getDeclSpec().isInlineSpecified() &&
10388 Diag(
D.getDeclSpec().getInlineSpecLoc(),
10389 diag::ext_operator_new_delete_declared_inline)
10416 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10428 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10431 !
D.isFunctionDefinition()) {
10436 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10439 !(isa<CXXMethodDecl>(NewFD) ||
D.isFunctionDefinition())) {
10440 Diag(TRC->getBeginLoc(),
10441 diag::err_constrained_non_templated_function);
10458 if (isFunctionTemplateSpecialization) {
10459 bool isDependentSpecialization =
false;
10464 isDependentSpecialization =
10466 (HasExplicitTemplateArgs &&
10470 assert((!isDependentSpecialization ||
10471 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10472 "dependent friend function specialization without template "
10478 isDependentSpecialization =
10483 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10484 if (isDependentSpecialization) {
10491 NewFD, ExplicitTemplateArgs,
Previous))
10512 isMemberSpecialization,
10513 D.isFunctionDefinition()));
10516 D.setRedeclaration(
true);
10519 !
D.isRedeclaration() ||
10521 "previous declaration set still overloaded");
10548 D.getDeclSpec().isFriendSpecified()
10549 ? (
D.isFunctionDefinition()
10552 : (
D.getCXXScopeSpec().isSet() &&
10561 }
else if (!
D.isRedeclaration()) {
10562 struct ActOnFDArgs ExtraArgs = { S,
D, TemplateParamLists,
10569 if (
D.getCXXScopeSpec().isSet()) {
10584 (
D.getCXXScopeSpec().getScopeRep()->isDependent() ||
10608 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10609 AddToScope = ExtraArgs.AddToScope;
10616 }
else if (isFriend && cast<CXXRecordDecl>(
CurContext)->isLocalClass()) {
10618 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10619 AddToScope = ExtraArgs.AddToScope;
10623 }
else if (!
D.isFunctionDefinition() &&
10624 isa<CXXMethodDecl>(NewFD) && NewFD->
isOutOfLine() &&
10625 !isFriend && !isFunctionTemplateSpecialization &&
10626 !isMemberSpecialization) {
10635 <<
D.getCXXScopeSpec().getRange();
10641 if (!NewFD->
isInvalidDecl() && S->getDepth() == 0 && Name.isIdentifier())
10644 if (NewFD->
hasAttr<HLSLShaderAttr>())
10650 if (!
D.isRedeclaration()) {
10652 if (
unsigned BuiltinID = II->getBuiltinID()) {
10654 if (!InStdNamespace &&
10660 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10669 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10674 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10685 if (NewFD->
hasAttr<OverloadableAttr>() &&
10688 diag::err_attribute_overloadable_no_prototype)
10690 NewFD->
dropAttr<OverloadableAttr>();
10704 if (
D.isFunctionDefinition()) {
10720 if (
D.isRedeclaration() && !
Previous.empty()) {
10723 isMemberSpecialization ||
10724 isFunctionTemplateSpecialization,
10725 D.isFunctionDefinition());
10730 if (II && II->
isStr(
CUDA().getConfigureFuncName()) &&
10743 (NewFD->
hasAttr<CUDADeviceAttr>() ||
10744 NewFD->
hasAttr<CUDAGlobalAttr>()) &&
10746 !
D.isFunctionDefinition())) {
10758 Diag(
D.getIdentifierLoc(), diag::err_static_kernel);
10759 D.setInvalidType();
10765 Diag(
D.getIdentifierLoc(), diag::err_expected_kernel_void_return_type)
10768 D.setInvalidType();
10777 Diag(
D.getIdentifierLoc(), diag::err_method_kernel);
10778 D.setInvalidType();
10781 Diag(
D.getIdentifierLoc(), diag::err_template_kernel);
10782 D.setInvalidType();
10797 if (!
D.isFunctionDefinition()) {
10799 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
10819 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
10821 QualType ElemTy = PipeTy->getElementType();
10823 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
10824 D.setInvalidType();
10831 Diag(Param->getTypeSpecStartLoc(),
10832 diag::err_wasm_table_as_function_parameter);
10833 D.setInvalidType();
10840 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
10841 if (NewFD->
hasAttr<ConstructorAttr>()) {
10842 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
10844 NewFD->
dropAttr<AvailabilityAttr>();
10846 if (NewFD->
hasAttr<DestructorAttr>()) {
10847 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
10849 NewFD->
dropAttr<AvailabilityAttr>();
10860 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
10861 switch (
D.getFunctionDefinitionKind()) {
10864 Diag(NBA->getLocation(),
10865 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
10866 << NBA->getSpelling();
10869 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
10870 << NBA->getSpelling();
10898 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
10902 if (
const auto *SAttr =
Parent->getAttr<CodeSegAttr>()) {
10913 while ((
Parent = dyn_cast<CXXRecordDecl>(
Parent->getParent()))) {
10914 if (
const auto *SAttr =
Parent->getAttr<CodeSegAttr>()) {
10924 bool IsDefinition) {
10927 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
10929 return SectionAttr::CreateImplicit(
10931 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
10979 auto *VD = dyn_cast<ValueDecl>(
D);
10980 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
10981 return !VD || !PrevVD ||
10983 PrevVD->getType());
10991 const auto *TA = FD->
getAttr<TargetAttr>();
10992 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
10995 "MultiVersion candidate requires a target or target_version attribute");
11007 for (
const auto &Feat : ParseInfo.
Features) {
11008 auto BareFeat = StringRef{Feat}.substr(1);
11009 if (Feat[0] ==
'-') {
11011 << Feature << (
"no-" + BareFeat).str();
11018 << Feature << BareFeat;
11026 TVA->getFeatures(Feats);
11027 for (
const auto &Feat : Feats) {
11030 << Feature << Feat;
11047 case attr::ArmLocallyStreaming:
11052 case attr::NonNull:
11053 case attr::NoThrow:
11062 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11063 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11064 <<
static_cast<unsigned>(MVKind) << A;
11066 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11071 switch (A->getKind()) {
11072 case attr::CPUDispatch:
11073 case attr::CPUSpecific:
11076 return Diagnose(S, A);
11080 return Diagnose(S, A);
11082 case attr::TargetVersion:
11085 return Diagnose(S, A);
11087 case attr::TargetClones:
11090 return Diagnose(S, A);
11094 return Diagnose(S, A);
11107 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11108 enum DoesntSupport {
11115 DefaultedFuncs = 6,
11116 ConstexprFuncs = 7,
11117 ConstevalFuncs = 8,
11129 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11132 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11140 if (!TemplatesSupported &&
11142 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11145 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11146 if (NewCXXFD->isVirtual())
11147 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11150 if (isa<CXXConstructorDecl>(NewCXXFD))
11151 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11154 if (isa<CXXDestructorDecl>(NewCXXFD))
11155 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11160 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11164 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11168 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11169 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11172 const auto *NewType = cast<FunctionType>(NewQType);
11173 QualType NewReturnType = NewType->getReturnType();
11176 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11182 const auto *OldType = cast<FunctionType>(OldQType);
11189 bool ArmStreamingCCMismatched =
false;
11190 if (OldFPT && NewFPT) {
11197 ArmStreamingCCMismatched =
true;
11200 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11203 QualType OldReturnType = OldType->getReturnType();
11205 if (OldReturnType != NewReturnType)
11206 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11209 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11212 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11215 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11238 bool IsCPUSpecificCPUDispatchMVKind =
11242 if (CausesMV && OldFD &&
11250 if (OldFD && CausesMV && OldFD->
isUsed(
false))
11251 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
11254 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11256 S.
PDiag(diag::note_multiversioning_caused_here)),
11258 S.
PDiag(diag::err_multiversion_doesnt_support)
11259 <<
static_cast<unsigned>(MVKind)),
11261 S.
PDiag(diag::err_multiversion_diff)),
11263 !IsCPUSpecificCPUDispatchMVKind,
11276 "Function lacks multiversion attribute");
11277 const auto *TA = FD->
getAttr<TargetAttr>();
11278 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11281 if (TA && !TA->isDefaultVersion())
11285 if (TVA && TVA->isDefaultVersion())
11321 To->
addAttr(TargetVersionAttr::CreateImplicit(
11327 bool &Redeclaration,
11337 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11338 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11339 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11343 if (NewTA && !NewTA->isDefaultVersion() &&
11344 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11349 if (NewTVA && NewTVA->isDefaultVersion())
11366 if (NewTA && NewTA->isDefaultVersion() && !OldTA) {
11367 Redeclaration =
true;
11375 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11383 OldTA->getFeaturesStr());
11387 NewTA->getFeaturesStr());
11390 if (OldParsed == NewParsed) {
11398 for (
const auto *FD : OldFD->
redecls()) {
11399 const auto *CurTA = FD->
getAttr<TargetAttr>();
11400 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11404 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11405 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11407 << (NewTA ? 0 : 2);
11408 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11416 Redeclaration =
false;
11455 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11456 const TargetClonesAttr *NewClones,
bool &Redeclaration,
NamedDecl *&OldDecl,
11471 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11472 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11479 NewTA->getFeaturesStr());
11484 NewTVA->getFeatures(NewFeats);
11485 llvm::sort(NewFeats);
11488 bool UseMemberUsingDeclRules =
11491 bool MayNeedOverloadableChecks =
11500 if (MayNeedOverloadableChecks &&
11501 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11504 switch (NewMVKind) {
11507 "Only target_clones can be omitted in subsequent declarations");
11510 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11511 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11513 Redeclaration =
true;
11520 CurTA->getFeaturesStr());
11522 if (CurParsed == NewParsed) {
11531 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11532 if (CurTVA->getName() == NewTVA->getName()) {
11534 Redeclaration =
true;
11539 CurTVA->getFeatures(CurFeats);
11540 llvm::sort(CurFeats);
11542 if (CurFeats == NewFeats) {
11548 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11550 if (NewFeats.empty())
11553 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11555 CurClones->getFeatures(CurFeats, I);
11556 llvm::sort(CurFeats);
11558 if (CurFeats == NewFeats) {
11569 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11570 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11571 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11572 !std::equal(CurClones->featuresStrs_begin(),
11573 CurClones->featuresStrs_end(),
11574 NewClones->featuresStrs_begin())) {
11580 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11582 CurTVA->getFeatures(CurFeats);
11583 llvm::sort(CurFeats);
11586 if (CurFeats.empty())
11589 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11591 NewClones->getFeatures(NewFeats, I);
11592 llvm::sort(NewFeats);
11594 if (CurFeats == NewFeats) {
11603 Redeclaration =
true;
11610 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
11611 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
11616 CurFD->
hasAttr<CPUDispatchAttr>()) {
11617 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
11619 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
11620 NewCPUDisp->cpus_begin(),
11622 return Cur->getName() == New->getName();
11625 Redeclaration =
true;
11637 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
11639 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
11640 NewCPUSpec->cpus_begin(),
11642 return Cur->getName() == New->getName();
11645 Redeclaration =
true;
11653 if (CurII == NewII) {
11688 Redeclaration =
true;
11694 Redeclaration =
false;
11707 bool &Redeclaration,
NamedDecl *&OldDecl,
11709 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11710 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11711 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
11712 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
11713 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
11723 NewTVA->isDefaultVersion())) {
11724 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
11734 if (NewTA &&
T.isAArch64())
11738 if (NewTA &&
T.isRISCV())
11761 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
11772 S, OldFD, NewFD, Redeclaration, OldDecl,
Previous);
11774 if (OldFD->
isUsed(
false)) {
11776 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
11792 NewCPUSpec, NewClones, Redeclaration,
11797 bool IsPure = NewFD->
hasAttr<PureAttr>();
11798 bool IsConst = NewFD->
hasAttr<ConstAttr>();
11801 if (!IsPure && !IsConst)
11808 if (IsPure && IsConst) {
11818 NewFD->
dropAttrs<PureAttr, ConstAttr>();
11824 bool IsMemberSpecialization,
11827 "Variably modified return types are not handled here");
11832 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
11835 bool Redeclaration =
false;
11837 bool MayNeedOverloadableChecks =
false;
11848 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
11849 Redeclaration =
true;
11850 OldDecl = Candidate;
11853 MayNeedOverloadableChecks =
true;
11857 Redeclaration =
true;
11861 Redeclaration =
true;
11865 Redeclaration =
false;
11872 if (!Redeclaration &&
11877 Redeclaration =
true;
11878 OldDecl =
Previous.getFoundDecl();
11879 MergeTypeWithPrevious =
false;
11882 if (OldDecl->
hasAttr<OverloadableAttr>() ||
11883 NewFD->
hasAttr<OverloadableAttr>()) {
11884 if (
IsOverload(NewFD, cast<FunctionDecl>(OldDecl),
false)) {
11885 MayNeedOverloadableChecks =
true;
11886 Redeclaration =
false;
11894 return Redeclaration;
11944 !MD->
isStatic() && !isa<CXXConstructorDecl>(MD) &&
11948 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
11949 if (!OldMD || !OldMD->
isStatic()) {
11971 if (Redeclaration) {
11977 return Redeclaration;
11984 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
11985 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
11988 assert(NewTemplateDecl &&
"Template/non-template mismatch");
11997 NewFD->
setAccess(OldTemplateDecl->getAccess());
11998 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12003 if (IsMemberSpecialization &&
12006 assert(OldTemplateDecl->isMemberSpecialization());
12009 if (OldFD->isDeleted()) {
12011 assert(OldFD->getCanonicalDecl() == OldFD);
12013 OldFD->setDeletedAsWritten(
false);
12019 auto *OldFD = cast<FunctionDecl>(OldDecl);
12027 !NewFD->
getAttr<OverloadableAttr>()) {
12031 return ND->hasAttr<OverloadableAttr>();
12033 "Non-redecls shouldn't happen without overloadable present");
12036 const auto *FD = dyn_cast<FunctionDecl>(ND);
12037 return FD && !FD->
hasAttr<OverloadableAttr>();
12040 if (OtherUnmarkedIter !=
Previous.end()) {
12042 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12043 Diag((*OtherUnmarkedIter)->getLocation(),
12044 diag::note_attribute_overloadable_prev_overload)
12061 dyn_cast<CXXDestructorDecl>(NewFD)) {
12069 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12078 return Redeclaration;
12081 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12082 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12088 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12093 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(NewFD)) {
12094 if (!Method->isFunctionTemplateSpecialization() &&
12095 !Method->getDescribedFunctionTemplate() &&
12096 Method->isCanonicalDecl()) {
12103 diag::err_constrained_virtual_method);
12105 if (Method->isStatic())
12116 return Redeclaration;
12123 return Redeclaration;
12143 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12156 auto HasNoexcept = [&](
QualType T) ->
bool {
12167 if (FPT->isNothrow())
12173 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12175 AnyNoexcept |= HasNoexcept(
T);
12178 diag::warn_cxx17_compat_exception_spec_in_signature)
12182 if (!Redeclaration &&
LangOpts.CUDA)
12191 bool UsesSM = NewFD->
hasAttr<ArmLocallyStreamingAttr>();
12192 bool UsesZA =
Attr &&
Attr->isNewZA();
12193 bool UsesZT0 =
Attr &&
Attr->isNewZT0();
12195 if (NewFD->
hasAttr<ArmLocallyStreamingAttr>()) {
12198 diag::warn_sme_locally_streaming_has_vl_args_returns)
12201 return P->getOriginalType()->isSizelessVectorType();
12204 diag::warn_sme_locally_streaming_has_vl_args_returns)
12217 if (UsesSM || UsesZA) {
12218 llvm::StringMap<bool> FeatureMap;
12220 if (!FeatureMap.contains(
"sme")) {
12223 diag::err_sme_definition_using_sm_in_non_sme_target);
12226 diag::err_sme_definition_using_za_in_non_sme_target);
12230 llvm::StringMap<bool> FeatureMap;
12232 if (!FeatureMap.contains(
"sme2")) {
12234 diag::err_sme_definition_using_zt0_in_non_sme2_target);
12239 return Redeclaration;
12248 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification)
12260 ? diag::err_static_main : diag::warn_static_main)
12268 Diag(NoreturnLoc, diag::ext_noreturn_main);
12269 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12281 << FD->
hasAttr<OpenCLKernelAttr>();
12292 assert(
T->
isFunctionType() &&
"function decl is not of function type");
12314 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12336 if (isa<FunctionNoProtoType>(FT))
return;
12342 bool HasExtraParameters = (nparams > 3);
12354 HasExtraParameters =
false;
12356 if (HasExtraParameters) {
12369 for (
unsigned i = 0; i < nparams; ++i) {
12372 bool mismatch =
true;
12389 mismatch = !qs.
empty();
12418 if (
T.isWindowsGNUEnvironment())
12423 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12431 assert(
T->
isFunctionType() &&
"function decl is not of function type");
12440 if (FD->
getName() !=
"DllMain")
12474 if (
Init->isValueDependent()) {
12475 assert(
Init->containsErrors() &&
12476 "Dependent code should only occur in error-recovery path.");
12479 const Expr *Culprit;
12480 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12489 class SelfReferenceChecker
12495 bool isReferenceType;
12503 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12504 S(S), OrigDecl(OrigDecl) {
12507 isReferenceType =
false;
12508 isInitList =
false;
12509 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12510 isPODType = VD->getType().isPODType(S.
Context);
12512 isReferenceType = VD->getType()->isReferenceType();
12519 void CheckExpr(
Expr *
E) {
12528 InitFieldIndex.push_back(0);
12529 for (
auto *Child : InitList->
children()) {
12530 CheckExpr(cast<Expr>(Child));
12531 ++InitFieldIndex.back();
12533 InitFieldIndex.pop_back();
12538 bool CheckInitListMemberExpr(
MemberExpr *
E,
bool CheckReference) {
12541 bool ReferenceField =
false;
12545 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12548 Fields.push_back(FD);
12550 ReferenceField =
true;
12551 Base = ME->getBase()->IgnoreParenImpCasts();
12556 if (!DRE || DRE->
getDecl() != OrigDecl)
12560 if (CheckReference && !ReferenceField)
12565 for (
const FieldDecl *I : llvm::reverse(Fields))
12566 UsedFieldIndex.push_back(I->getFieldIndex());
12571 for (
auto UsedIter = UsedFieldIndex.begin(),
12572 UsedEnd = UsedFieldIndex.end(),
12573 OrigIter = InitFieldIndex.begin(),
12574 OrigEnd = InitFieldIndex.end();
12575 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12576 if (*UsedIter < *OrigIter)
12578 if (*UsedIter > *OrigIter)
12583 HandleDeclRefExpr(DRE);
12590 void HandleValue(
Expr *
E) {
12593 HandleDeclRefExpr(DRE);
12598 Visit(CO->getCond());
12599 HandleValue(CO->getTrueExpr());
12600 HandleValue(CO->getFalseExpr());
12605 dyn_cast<BinaryConditionalOperator>(
E)) {
12606 Visit(BCO->getCond());
12607 HandleValue(BCO->getFalseExpr());
12612 if (
Expr *SE = OVE->getSourceExpr())
12618 if (BO->getOpcode() == BO_Comma) {
12619 Visit(BO->getLHS());
12620 HandleValue(BO->getRHS());
12625 if (isa<MemberExpr>(
E)) {
12627 if (CheckInitListMemberExpr(cast<MemberExpr>(
E),
12635 if (!isa<FieldDecl>(ME->getMemberDecl()))
12637 Base = ME->getBase()->IgnoreParenImpCasts();
12640 HandleDeclRefExpr(DRE);
12650 if (isReferenceType)
12651 HandleDeclRefExpr(
E);
12655 if (
E->getCastKind() == CK_LValueToRValue) {
12656 HandleValue(
E->getSubExpr());
12660 Inherited::VisitImplicitCastExpr(
E);
12665 if (CheckInitListMemberExpr(
E,
true ))
12674 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(
E->getMemberDecl());
12675 bool Warn = (MD && !MD->
isStatic());
12678 if (!isa<FieldDecl>(ME->getMemberDecl()))
12680 Base = ME->getBase()->IgnoreParenImpCasts();
12685 HandleDeclRefExpr(DRE);
12697 if (isa<UnresolvedLookupExpr>(Callee))
12698 return Inherited::VisitCXXOperatorCallExpr(
E);
12701 for (
auto Arg:
E->arguments())
12702 HandleValue(Arg->IgnoreParenImpCasts());
12710 HandleValue(
E->getSubExpr());
12714 if (
E->isIncrementDecrementOp()) {
12715 HandleValue(
E->getSubExpr());
12719 Inherited::VisitUnaryOperator(
E);
12725 if (
E->getConstructor()->isCopyConstructor()) {
12726 Expr *ArgExpr =
E->getArg(0);
12727 if (
InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
12728 if (ILE->getNumInits() == 1)
12729 ArgExpr = ILE->getInit(0);
12731 if (ICE->getCastKind() == CK_NoOp)
12732 ArgExpr = ICE->getSubExpr();
12733 HandleValue(ArgExpr);
12736 Inherited::VisitCXXConstructExpr(
E);
12741 if (
E->isCallToStdMove()) {
12742 HandleValue(
E->getArg(0));
12746 Inherited::VisitCallExpr(
E);
12750 if (
E->isCompoundAssignmentOp()) {
12751 HandleValue(
E->getLHS());
12752 Visit(
E->getRHS());
12756 Inherited::VisitBinaryOperator(
E);
12763 Visit(
E->getCond());
12764 Visit(
E->getFalseExpr());
12769 if (OrigDecl != ReferenceDecl)
return;
12771 if (isReferenceType) {
12772 diag = diag::warn_uninit_self_reference_in_reference_init;
12773 }
else if (cast<VarDecl>(OrigDecl)->isStaticLocal()) {
12774 diag = diag::warn_static_self_reference_in_init;
12775 }
else if (isa<TranslationUnitDecl>(OrigDecl->
getDeclContext()) ||
12778 diag = diag::warn_uninit_self_reference_in_init;
12792 static void CheckSelfReference(
Sema &S,
Decl* OrigDecl,
Expr *
E,
12796 if (isa<ParmVarDecl>(OrigDecl))
12805 if (ICE->getCastKind() == CK_LValueToRValue)
12806 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
12807 if (DRE->
getDecl() == OrigDecl)
12810 SelfReferenceChecker(S, OrigDecl).CheckExpr(
E);
12817 struct VarDeclOrName {
12823 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
12833 bool IsInitCapture = !VDecl;
12835 "init captures are expected to be deduced prior to initialization");
12837 VarDeclOrName VN{VDecl, Name};
12840 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
12844 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
12853 assert(VDecl &&
"no init for init capture deduction?");
12857 if (!isa<DeducedTemplateSpecializationType>(Deduced) ||
12868 DeduceInits =
Init;
12870 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
12872 DeduceInits = PL->exprs();
12874 if (isa<DeducedTemplateSpecializationType>(Deduced)) {
12875 assert(VDecl &&
"non-auto type for init capture deduction?");
12886 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
12887 DeduceInits = IL->inits();
12891 if (DeduceInits.empty()) {
12894 Diag(
Init->getBeginLoc(), IsInitCapture
12895 ? diag::err_init_capture_no_expression
12896 : diag::err_auto_var_init_no_expression)
12901 if (DeduceInits.size() > 1) {
12902 Diag(DeduceInits[1]->getBeginLoc(),
12903 IsInitCapture ? diag::err_init_capture_multiple_expressions
12904 : diag::err_auto_var_init_multiple_expressions)
12909 Expr *DeduceInit = DeduceInits[0];
12910 if (
DirectInit && isa<InitListExpr>(DeduceInit)) {
12911 Diag(
Init->getBeginLoc(), IsInitCapture
12912 ? diag::err_init_capture_paren_braces
12913 : diag::err_auto_var_init_paren_braces)
12919 bool DefaultedAnyToId =
false;
12923 if (
Result.isInvalid()) {
12927 DefaultedAnyToId =
true;
12933 if (VDecl && isa<DecompositionDecl>(VDecl) &&
12937 Type.getQualifiers());
12945 if (!IsInitCapture)
12947 else if (isa<InitListExpr>(
Init))
12949 diag::err_init_capture_deduction_failure_from_init_list)
12978 assert(!
Init || !
Init->containsErrors());
12991 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13012 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13013 Init = EWC->getSubExpr();
13015 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13016 Init = CE->getSubExpr();
13021 "shouldn't be called if type doesn't have a non-trivial C struct");
13022 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13023 for (
auto *I : ILE->inits()) {
13024 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13025 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13033 if (isa<ImplicitValueInitExpr>(
Init)) {
13049bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13055 return FD->
hasAttr<UnavailableAttr>();
13058struct DiagNonTrivalCUnionDefaultInitializeVisitor
13065 DiagNonTrivalCUnionDefaultInitializeVisitor(
13068 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13071 const FieldDecl *FD,
bool InNonTrivialUnion) {
13074 InNonTrivialUnion);
13075 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13079 bool InNonTrivialUnion) {
13080 if (InNonTrivialUnion)
13082 << 1 << 0 << QT << FD->
getName();
13086 if (InNonTrivialUnion)
13088 << 1 << 0 << QT << FD->
getName();
13094 if (OrigLoc.isValid()) {
13095 bool IsUnion =
false;
13096 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13097 IsUnion = OrigRD->isUnion();
13098 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13099 << 0 << OrigTy << IsUnion << UseContext;
13103 InNonTrivialUnion =
true;
13106 if (InNonTrivialUnion)
13111 if (!shouldIgnoreForRecordTriviality(FD))
13112 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13125struct DiagNonTrivalCUnionDestructedTypeVisitor
13130 DiagNonTrivalCUnionDestructedTypeVisitor(
13133 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13136 const FieldDecl *FD,
bool InNonTrivialUnion) {
13139 InNonTrivialUnion);
13140 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13144 bool InNonTrivialUnion) {
13145 if (InNonTrivialUnion)
13147 << 1 << 1 << QT << FD->
getName();
13151 if (InNonTrivialUnion)
13153 << 1 << 1 << QT << FD->
getName();
13159 if (OrigLoc.isValid()) {
13160 bool IsUnion =
false;
13161 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13162 IsUnion = OrigRD->isUnion();
13163 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13164 << 1 << OrigTy << IsUnion << UseContext;
13168 InNonTrivialUnion =
true;
13171 if (InNonTrivialUnion)
13176 if (!shouldIgnoreForRecordTriviality(FD))
13177 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13182 bool InNonTrivialUnion) {}
13192struct DiagNonTrivalCUnionCopyVisitor
13199 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13202 const FieldDecl *FD,
bool InNonTrivialUnion) {
13205 InNonTrivialUnion);
13206 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13210 bool InNonTrivialUnion) {
13211 if (InNonTrivialUnion)
13213 << 1 << 2 << QT << FD->
getName();
13217 if (InNonTrivialUnion)
13219 << 1 << 2 << QT << FD->
getName();
13225 if (OrigLoc.isValid()) {
13226 bool IsUnion =
false;
13227 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13228 IsUnion = OrigRD->isUnion();
13229 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13230 << 2 << OrigTy << IsUnion << UseContext;
13234 InNonTrivialUnion =
true;
13237 if (InNonTrivialUnion)
13242 if (!shouldIgnoreForRecordTriviality(FD))
13243 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13247 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13250 bool InNonTrivialUnion) {}
13264 unsigned NonTrivialKind) {
13268 "shouldn't be called if type doesn't have a non-trivial C union");
13272 DiagNonTrivalCUnionDefaultInitializeVisitor(QT,
Loc, UseContext, *
this)
13273 .
visit(QT,
nullptr,
false);
13276 DiagNonTrivalCUnionDestructedTypeVisitor(QT,
Loc, UseContext, *
this)
13277 .visit(QT,
nullptr,
false);
13279 DiagNonTrivalCUnionCopyVisitor(QT,
Loc, UseContext, *
this)
13280 .visit(QT,
nullptr,
false);
13291 if (
auto *Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13292 if (!Method->isInvalidDecl()) {
13294 Diag(Method->getLocation(), diag::err_member_function_initialization)
13295 << Method->getDeclName() <<
Init->getSourceRange();
13296 Method->setInvalidDecl();
13301 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13303 assert(!isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13313 SubExprs.push_back(Res.
get());
13322 if (
Init && !
Init->getType().isNull() &&
13323 Init->getType()->isWebAssemblyTableType()) {
13324 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13355 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13376 BaseDeclType = Array->getElementType();
13378 diag::err_typecheck_decl_incomplete_type)) {
13385 diag::err_abstract_type_in_decl,
13395 !VDecl->
isTemplated() && !isa<VarTemplateSpecializationDecl>(VDecl) &&
13405 if (Def != VDecl &&
13425 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13428 diag::note_previous_initializer)
13451 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
13452 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
13466 if (
Result.isInvalid()) {
13475 bool IsParenListInit =
false;
13487 for (
size_t Idx = 0; Idx < Args.size(); ++Idx) {
13489 Args[Idx], VDecl,
true,
13490 [
this, Entity, Kind](
Expr *
E) {
13496 }
else if (Res.
get() != Args[Idx]) {
13497 Args[Idx] = Res.
get();
13507 if (
Result.isInvalid()) {
13521 if (isa<DecompositionDecl>(VDecl))
13527 IsParenListInit = !InitSeq.
steps().empty() &&
13531 if (
Init && !
Init->getType().isNull() &&
13563 if (VDecl->
hasAttr<BlocksAttr>())
13577 Init->getBeginLoc()))
13578 FSI->markSafeWeakUse(
Init);
13595 if (
Result.isInvalid()) {
13628 isa<InitListExpr>(
Init)) {
13632 if (
auto *
E = dyn_cast<ExprWithCleanups>(
Init))
13633 if (
auto *BE = dyn_cast<BlockExpr>(
E->getSubExpr()->
IgnoreParens()))
13635 BE->getBlockDecl()->setCanAvoidCopyToHeap();
13670 <<
Init->getSourceRange();
13681 else if (
Init->isValueDependent())
13685 else if (
Init->getType()->isScopedEnumeralType() &&
13691 Diag(
Loc, diag::ext_in_class_initializer_non_constant)
13692 <<
Init->getSourceRange();
13696 Diag(
Loc, diag::err_in_class_initializer_non_constant)
13697 <<
Init->getSourceRange();
13707 diag::ext_in_class_initializer_float_type_cxx11)
13708 << DclT <<
Init->getSourceRange();
13710 diag::note_in_class_initializer_float_type_cxx11)
13713 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
13714 << DclT <<
Init->getSourceRange();
13717 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
13718 <<
Init->getSourceRange();
13725 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
13726 << DclT <<
Init->getSourceRange()
13732 << DclT <<
Init->getSourceRange();
13766 if (!InitType.
isNull() &&
13785 if (CXXDirectInit) {
13786 assert(
DirectInit &&
"Call-style initializer must be direct init.");
13797 DeclsToCheckForDeferredDiags.insert(VDecl);
13806 VarDecl *VD = dyn_cast<VarDecl>(
D);
13810 if (
auto *DD = dyn_cast<DecompositionDecl>(
D))
13811 for (
auto *BD : DD->bindings())
13812 BD->setInvalidDecl();
13826 diag::err_typecheck_decl_incomplete_type)) {
13833 diag::err_abstract_type_in_decl,
13848 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
13852 if (isa<DecompositionDecl>(RealDecl)) {
13853 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
13854 Var->setInvalidDecl();
13868 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
13869 !Var->isThisDeclarationADemotedDefinition()) {
13870 if (Var->isStaticDataMember()) {
13875 Diag(Var->getLocation(),
13876 diag::err_constexpr_static_mem_var_requires_init)
13878 Var->setInvalidDecl();
13882 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
13883 Var->setInvalidDecl();
13890 if (!Var->isInvalidDecl() &&
13892 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
13893 bool HasConstExprDefaultConstructor =
false;
13894 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
13895 for (
auto *Ctor : RD->ctors()) {
13896 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
13897 Ctor->getMethodQualifiers().getAddressSpace() ==
13899 HasConstExprDefaultConstructor =
true;
13903 if (!HasConstExprDefaultConstructor) {
13904 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
13905 Var->setInvalidDecl();
13910 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
13911 if (Var->getStorageClass() ==
SC_Extern) {
13912 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
13914 Var->setInvalidDecl();
13918 diag::err_typecheck_decl_incomplete_type)) {
13919 Var->setInvalidDecl();
13922 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
13923 if (!RD->hasTrivialDefaultConstructor()) {
13924 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
13925 Var->setInvalidDecl();
13935 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
13942 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
13958 !Var->hasLinkage() && !Var->isInvalidDecl() &&
13960 diag::err_typecheck_decl_incomplete_type))
13961 Var->setInvalidDecl();
13966 diag::err_abstract_type_in_decl,
13968 Var->setInvalidDecl();
13971 Diag(Var->getLocation(), diag::warn_private_extern);
13972 Diag(Var->getLocation(), diag::note_private_extern);
13976 !Var->isInvalidDecl())
13987 if (!Var->isInvalidDecl()) {
13991 Var->getLocation(), ArrayT->getElementType(),
13992 diag::err_array_incomplete_or_sizeless_type))
13993 Var->setInvalidDecl();
13994 }
else if (Var->getStorageClass() ==
SC_Static) {
14004 if (Var->isFirstDecl())
14006 diag::ext_typecheck_decl_incomplete_type);
14011 if (!Var->isInvalidDecl())
14019 if (Var->isConstexpr())
14020 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14023 Diag(Var->getLocation(),
14024 diag::err_typecheck_incomplete_array_needs_initializer);
14025 Var->setInvalidDecl();
14032 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14033 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14042 if (Var->isInvalidDecl())
14045 if (!Var->hasAttr<AliasAttr>()) {
14048 diag::err_typecheck_decl_incomplete_type)) {
14049 Var->setInvalidDecl();
14058 diag::err_abstract_type_in_decl,
14060 Var->setInvalidDecl();
14081 if (!CXXRecord->isPOD())
14115 }
else if (
Init.isInvalid()) {
14133 VarDecl *VD = dyn_cast<VarDecl>(
D);
14192 const char *PrevSpec;
14198 D.SetIdentifier(Ident, IdentLoc);
14199 D.takeAttributes(Attrs);
14204 cast<VarDecl>(Var)->setCXXForRangeDecl(
true);
14212 if (var->isInvalidDecl())
return;
14219 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14221 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14223 var->setInvalidDecl();
14231 var->hasLocalStorage()) {
14232 switch (var->getType().getObjCLifetime()) {
14245 if (var->hasLocalStorage() &&
14254 if (var->isThisDeclarationADefinition() &&
14255 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14256 var->isExternallyVisible() && var->hasLinkage() &&
14257 !var->isInline() && !var->getDescribedVarTemplate() &&
14259 !isa<VarTemplatePartialSpecializationDecl>(var) &&
14261 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14262 var->getLocation())) {
14264 VarDecl *prev = var->getPreviousDecl();
14269 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14270 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14276 std::optional<bool> CacheHasConstInit;
14277 const Expr *CacheCulprit =
nullptr;
14278 auto checkConstInit = [&]()
mutable {
14279 if (!CacheHasConstInit)
14280 CacheHasConstInit = var->getInit()->isConstantInitializer(
14281 Context, var->getType()->isReferenceType(), &CacheCulprit);
14282 return *CacheHasConstInit;
14286 if (var->getType().isDestructedType()) {
14290 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14292 Diag(var->getLocation(), diag::note_use_thread_local);
14294 if (!checkConstInit()) {
14302 Diag(var->getLocation(), diag::note_use_thread_local);
14308 if (!var->getType()->isStructureType() && var->hasInit() &&
14309 isa<InitListExpr>(var->getInit())) {
14310 const auto *ILE = cast<InitListExpr>(var->getInit());
14311 unsigned NumInits = ILE->getNumInits();
14313 for (
unsigned I = 0; I < NumInits; ++I) {
14314 const auto *
Init = ILE->getInit(I);
14317 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14321 unsigned NumConcat = SL->getNumConcatenated();
14325 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14326 bool OnlyOneMissingComma =
true;
14327 for (
unsigned J = I + 1; J < NumInits; ++J) {
14328 const auto *
Init = ILE->getInit(J);
14331 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14332 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14333 OnlyOneMissingComma =
false;
14338 if (OnlyOneMissingComma) {
14340 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14344 Diag(SL->getStrTokenLoc(1),
14345 diag::warn_concatenated_literal_array_init)
14347 Diag(SL->getBeginLoc(),
14348 diag::note_concatenated_string_literal_silence);
14359 if (var->hasAttr<BlocksAttr>())
14363 bool GlobalStorage = var->hasGlobalStorage();
14364 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14366 bool HasConstInit =
true;
14369 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14374 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14375 (GlobalStorage || var->isConstexpr() ||
14376 var->mightBeUsableInConstantExpressions(
Context))) {
14388 HasConstInit = checkConstInit();
14392 if (HasConstInit) {
14393 (void)var->checkForConstantInitialization(Notes);
14395 }
else if (CacheCulprit) {
14396 Notes.emplace_back(CacheCulprit->
getExprLoc(),
14397 PDiag(diag::note_invalid_subexpr_in_const_expr));
14402 HasConstInit = var->checkForConstantInitialization(Notes);
14405 if (HasConstInit) {
14407 }
else if (var->isConstexpr()) {
14411 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
14412 diag::note_invalid_subexpr_in_const_expr) {
14413 DiagLoc = Notes[0].first;
14416 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
14417 << var <<
Init->getSourceRange();
14418 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
14419 Diag(Notes[I].first, Notes[I].second);
14420 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
14421 auto *
Attr = var->getAttr<ConstInitAttr>();
14422 Diag(var->getLocation(), diag::err_require_constant_init_failed)
14423 <<
Init->getSourceRange();
14426 for (
auto &it : Notes)
14427 Diag(it.first, it.second);
14428 }
else if (IsGlobal &&
14430 var->getLocation())) {
14439 if (!checkConstInit())
14440 Diag(var->getLocation(), diag::warn_global_constructor)
14441 <<
Init->getSourceRange();
14447 if (GlobalStorage && var->isThisDeclarationADefinition() &&
14453 std::optional<QualType::NonConstantStorageReason> Reason;
14454 if (HasConstInit &&
14455 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
14461 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
14465 }
else if (Stack->CurrentValue) {
14468 var->getType().isConstQualified()) {
14470 NonConstNonReferenceType) &&
14471 "This case should've already been handled elsewhere");
14472 Diag(var->getLocation(), diag::warn_section_msvc_compat)
14478 auto SectionName = Stack->CurrentValue->getString();
14479 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
14480 Stack->CurrentPragmaLocation,
14481 SectionAttr::Declspec_allocate));
14483 var->dropAttr<SectionAttr>();
14504 if (!
type->isDependentType())
14514 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
14525 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
14526 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
14535 auto *NewAttr = cast<InheritableAttr>(A->clone(
getASTContext()));
14536 NewAttr->setInherited(
true);
14538 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
14539 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
14540 NewAttr->setInherited(
true);
14545 if (!FD->
hasAttr<DLLExportAttr>())
14548 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
14549 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
14550 NewAttr->setInherited(
true);
14579 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
14587 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
14591 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
14595 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
14599 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
14604 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
14605 for (
auto *BD : DD->bindings()) {
14630 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
14637 bool IsClassTemplateMember =
14638 isa<ClassTemplatePartialSpecializationDecl>(
Context) ||
14639 Context->getDescribedClassTemplate();
14642 IsClassTemplateMember
14643 ? diag::warn_attribute_dllimport_static_field_definition
14644 : diag::err_attribute_dllimport_static_field_definition);
14645 Diag(IA->getLocation(), diag::note_attribute);
14646 if (!IsClassTemplateMember)
14674 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
14689 if (VD->
isFileVarDecl() && !isa<VarTemplatePartialSpecializationDecl>(VD))
14694 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
14698 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
14700 if (!MagicValueExpr) {
14703 std::optional<llvm::APSInt> MagicValueInt;
14705 Diag(I->getRange().getBegin(),
14706 diag::err_type_tag_for_datatype_not_ice)
14710 if (MagicValueInt->getActiveBits() > 64) {
14711 Diag(I->getRange().getBegin(),
14712 diag::err_type_tag_for_datatype_too_large)
14716 uint64_t MagicValue = MagicValueInt->getZExtValue();
14719 I->getMatchingCType(),
14720 I->getLayoutCompatible(),
14721 I->getMustBeNull());
14726 auto *VD = dyn_cast<VarDecl>(DD);
14727 return VD && !VD->getType()->hasAutoForTrailingReturnType();
14739 bool DiagnosedMultipleDecomps =
false;
14741 bool DiagnosedNonDeducedAuto =
false;
14743 for (
Decl *
D : Group) {
14748 if (
auto *VD = dyn_cast<VarDecl>(
D);
14749 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
14750 VD->hasGlobalStorage())
14754 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
14755 if (!FirstDeclaratorInGroup)
14756 FirstDeclaratorInGroup = DD;
14757 if (!FirstDecompDeclaratorInGroup)
14758 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(
D);
14761 FirstNonDeducedAutoInGroup = DD;
14763 if (FirstDeclaratorInGroup != DD) {
14766 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
14768 diag::err_decomp_decl_not_alone)
14770 << DD->getSourceRange();
14771 DiagnosedMultipleDecomps =
true;
14777 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
14779 diag::err_auto_non_deduced_not_alone)
14780 << FirstNonDeducedAutoInGroup->
getType()
14783 << DD->getSourceRange();
14784 DiagnosedNonDeducedAuto =
true;
14789 Decls.push_back(
D);
14795 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
14809 if (Group.size() > 1) {
14811 VarDecl *DeducedDecl =
nullptr;
14812 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
14813 VarDecl *
D = dyn_cast<VarDecl>(Group[i]);
14816 DeducedType *DT =
D->getType()->getContainedDeducedType();
14823 auto *AT = dyn_cast<AutoType>(DT);
14825 diag::err_auto_different_deductions)
14826 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
14828 <<
D->getDeclName();
14851 if (Group.empty() || !Group[0])
14855 Group[0]->getLocation()) &&
14857 Group[0]->getLocation()))
14860 if (Group.size() >= 2) {
14868 Decl *MaybeTagDecl = Group[0];
14869 if (MaybeTagDecl && isa<TagDecl>(MaybeTagDecl)) {
14870 Group = Group.slice(1);
14887 if (
D.getCXXScopeSpec().isSet()) {
14888 Diag(
D.getIdentifierLoc(), diag::err_qualified_param_declarator)
14889 <<
D.getCXXScopeSpec().getRange();
14905 Diag(
D.getIdentifierLoc(), diag::err_bad_parameter_name)
14912 Diag(
D.getIdentifierLoc(), diag::err_bad_parameter_name_template_id);
14919 if (!ExplicitThisLoc.
isValid())
14922 "explicit parameter in non-cplusplus mode");
14924 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
14925 <<
P->getSourceRange();
14929 if (
P->isParameterPack()) {
14930 S.
Diag(
P->getBeginLoc(), diag::err_explicit_object_parameter_pack)
14931 <<
P->getSourceRange();
14934 P->setExplicitObjectParameterLoc(ExplicitThisLoc);
14936 LSI->ExplicitObjectParameter =
P;
14954 : diag::warn_deprecated_register)
14962 diag::err_invalid_storage_class_in_func_decl);
14963 D.getMutableDeclSpec().ClearStorageClassSpecs();
14974 << 0 <<
static_cast<int>(
D.getDeclSpec().getConstexprSpecifier());
14987 RedeclarationKind::ForVisibleRedeclaration);
14995 PrevDecl =
nullptr;
14997 if (PrevDecl && S->isDeclScope(PrevDecl)) {
14998 Diag(
D.getIdentifierLoc(), diag::err_param_redefinition) << II;
15002 D.SetIdentifier(
nullptr,
D.getIdentifierLoc());
15003 D.setInvalidType(
true);
15013 D.getIdentifierLoc(), II, parmDeclType, TInfo, SC);
15015 if (
D.isInvalidType())
15020 assert(S->isFunctionPrototypeScope());
15021 assert(S->getFunctionPrototypeDepth() >= 1);
15023 S->getNextFunctionPrototypeIndex());
15032 if (
D.getDeclSpec().isModulePrivateSpecified())
15034 << 1 << New <<
SourceRange(
D.getDeclSpec().getModulePrivateSpecLoc())
15037 if (New->
hasAttr<BlocksAttr>()) {
15069 !
Parameter->getIdentifier()->isPlaceholder()) {
15070 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15078 if (
LangOpts.NumLargeByValueCopy == 0)
15085 if (Size >
LangOpts.NumLargeByValueCopy)
15096 if (Size >
LangOpts.NumLargeByValueCopy)
15117 if (!
T.isConstQualified()) {
15121 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15123 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15135 TSInfo, SC,
nullptr);
15142 LSI->LocalPacks.push_back(New);
15155 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15174 Diag(NameLoc, diag::err_arg_with_address_space);
15202 for (
int i = FTI.
NumParams; i != 0; ) {
15207 llvm::raw_svector_ostream(Code)
15218 const char* PrevSpec;
15239 assert(
D.isFunctionDeclarator() &&
"Not a function declarator!");
15250 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15252 ParentScope,
D, TemplateParameterLists, Bases);
15258 if (!Bases.empty())
15275 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15278 PossiblePrototype = Prev;
15296 if (isa<CXXMethodDecl>(FD))
15302 if (II->isStr(
"main") || II->isStr(
"efi_main"))
15321 if (FD->
hasAttr<OpenCLKernelAttr>())
15375 Definition->getNumTemplateParameterLists())) {
15378 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
15391 Diag(
Definition->getLocation(), diag::note_previous_definition);
15400 LSI->
Lambda = LambdaClass;
15424 for (
const auto &
C : LambdaClass->
captures()) {
15425 if (
C.capturesVariable()) {
15429 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
15431 true,
C.getLocation(),
15432 C.isPackExpansion()
15434 I->getType(),
false);
15436 }
else if (
C.capturesThis()) {
15462 FD = FunTmpl->getTemplatedDecl();
15464 FD = cast<FunctionDecl>(
D);
15489 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
15494 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
15499 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
15501 !
Attr->isDefaultVersion()) {
15510 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
15512 Ctor->isDefaultConstructor() &&
15555 "There should be an active template instantiation on the stack "
15556 "when instantiating a generic lambda!");
15582 diag::err_func_def_incomplete_result) ||
15584 diag::err_abstract_type_in_decl,
15600 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
15603 assert(!isa<ParmVarDecl>(NonParmDecl) &&
15604 "parameters should not be in newly created FD yet");
15607 if (NonParmDecl->getDeclName())
15612 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
15613 for (
auto *EI : ED->enumerators())
15621 Param->setOwningFunction(FD);
15624 if (Param->getIdentifier() && FnBodyScope) {
15653 assert(!FD->
hasAttr<DLLExportAttr>());
15654 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
15677 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
15678 FD = TD->getTemplatedDecl();
15679 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
15691 for (
unsigned I = 0,
E =
Scope->Returns.size(); I !=
E; ++I) {
15692 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
15693 if (!NRVOCandidate->isNRVOVariable())
15701 if (
D.getDeclSpec().hasConstexprSpecifier())
15706 if (
D.getDeclSpec().hasAutoTypeSpec()) {
15709 if (
D.getNumTypeObjects()) {
15710 const auto &Outer =
D.getTypeObject(
D.getNumTypeObjects() - 1);
15712 Outer.Fun.hasTrailingReturnType()) {
15730 if (FD->isConstexpr())
15735 if (FD->getReturnType()->getContainedDeducedType())
15745 FD->setHasSkippedBody();
15767 bool IsLambda =
false;
15771 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
15773 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
15774 if (EscapeInfo.count(BD))
15775 return EscapeInfo[BD];
15787 return EscapeInfo[BD] = R;
15792 for (
const std::pair<SourceLocation, const BlockDecl *> &
P :
15794 if (IsOrNestedInEscapingBlock(
P.second))
15795 S.
Diag(
P.first, diag::warn_implicitly_retains_self)
15800 return isa<CXXMethodDecl>(FD) && FD->
param_empty() &&
15810 methodHasName(FD,
"get_return_object_on_allocation_failure");
15820 if (!FD->
hasAttr<CoroWrapperAttr>())
15825 bool IsInstantiation) {
15875 Expr *Dummy =
nullptr;
15886 if (LSI->HasImplicitReturnType) {
15893 LSI->ReturnType.isNull() ?
Context.
VoidTy : LSI->ReturnType;
15898 Proto->getExtProtoInfo()));
15926 dyn_cast<CXXDestructorDecl>(FD))
15946 if (PossiblePrototype) {
15950 TypeLoc TL = TI->getTypeLoc();
15953 diag::note_declaration_not_a_prototype)
15956 FTL.getRParenLoc(),
"void")
15963 std::pair<FileID, unsigned> LocInfo =
SM.getDecomposedLoc(
Loc);
15964 if (LocInfo.first.isInvalid())
15968 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
15972 if (LocInfo.second > Buffer.size())
15975 const char *LexStart = Buffer.data() + LocInfo.second;
15976 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
15978 return StartTok.consume_front(
"const") &&
15980 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
15983 auto findBeginLoc = [&]() {
15999 diag::note_static_for_internal_linkage)
16010 if (!PossiblePrototype)
16056 if (PossiblePrototype)
16058 diag::warn_non_prototype_changes_behavior)
16065 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16066 if (!CmpndBody->body_empty())
16067 Diag(CmpndBody->body_front()->getBeginLoc(),
16068 diag::warn_dispatch_body_ignored);
16070 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16095 "Function parsing confused");
16096 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16108 << MD->getSelector().getAsString();
16113 bool isDesignated =
16114 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16115 assert(isDesignated && InitMethod);
16116 (void)isDesignated;
16119 auto IFace = MD->getClassInterface();
16122 auto SuperD = IFace->getSuperClass();
16132 diag::warn_objc_designated_init_missing_super_call);
16134 diag::note_objc_designated_init_marked_here);
16142 diag::warn_objc_secondary_init_missing_init_call);
16158 "This should only be set for ObjC methods, which should have been "
16159 "handled in the block above.");
16166 if (FD && isa<CXXConstructorDecl>(FD) && isa<CXXTryStmt>(Body))
16174 if (!
Destructor->getParent()->isDependentType())
16192 ActivePolicy = &WP;
16195 if (!IsInstantiation && FD &&
16201 if (FD && FD->
hasAttr<NakedAttr>()) {
16205 bool RegisterVariables =
false;
16206 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
16207 for (
const auto *
Decl : DS->decls()) {
16208 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
16209 RegisterVariables =
16210 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16211 if (!RegisterVariables)
16216 if (RegisterVariables)
16218 if (!isa<AsmStmt>(S) && !isa<NullStmt>(S)) {
16219 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16220 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16229 "Leftover temporaries in function");
16231 "Unaccounted cleanups in function");
16233 "Leftover expressions for odr-use checking");
16239 if (!IsInstantiation)
16256 DeclsToCheckForDeferredDiags.insert(FD);
16271 D = TD->getTemplatedDecl();
16276 if (Method->isStatic())
16284 "Implicit function declarations aren't allowed in this language mode");
16291 Scope *BlockScope = S;
16299 Scope *ContextScope = BlockScope;
16303 ContextScope = ContextScope->
getParent();
16319 if (!isa<FunctionDecl>(ExternCPrev) ||
16321 cast<FunctionDecl>(ExternCPrev)->getType(),
16323 Diag(
Loc, diag::ext_use_out_of_scope_declaration)
16326 return ExternCPrev;
16332 if (II.
getName().starts_with(
"__builtin_"))
16333 diag_id = diag::warn_builtin_unknown;
16336 diag_id = diag::ext_implicit_function_decl_c99;
16338 diag_id = diag::warn_implicit_function_decl;
16346 if (S && !ExternCPrev &&
16369 return ExternCPrev;
16379 assert(!Error &&
"Error setting up implicit decl!");
16401 D.SetIdentifier(&II,
Loc);
16421 std::optional<unsigned> AlignmentParam;
16422 bool IsNothrow =
false;
16434 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
16452 if (!FD->
hasAttr<AllocSizeAttr>()) {
16453 FD->
addAttr(AllocSizeAttr::CreateImplicit(
16464 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
16465 FD->
addAttr(AllocAlignAttr::CreateImplicit(
16489 unsigned FormatIdx;
16492 if (!FD->
hasAttr<FormatAttr>()) {
16493 const char *fmt =
"printf";
16495 if (FormatIdx < NumParams &&
16501 HasVAListArg ? 0 : FormatIdx+2,
16507 if (!FD->
hasAttr<FormatAttr>())
16511 HasVAListArg ? 0 : FormatIdx+2,
16517 if (!FD->
hasAttr<CallbackAttr>() &&
16519 FD->
addAttr(CallbackAttr::CreateImplicit(
16525 bool NoExceptions =
16527 bool ConstWithoutErrnoAndExceptions =
16529 bool ConstWithoutExceptions =
16531 if (!FD->
hasAttr<ConstAttr>() &&
16532 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
16533 (!ConstWithoutErrnoAndExceptions ||
16535 (!ConstWithoutExceptions || NoExceptions))
16542 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
16544 switch (BuiltinID) {
16545 case Builtin::BI__builtin_fma:
16546 case Builtin::BI__builtin_fmaf:
16547 case Builtin::BI__builtin_fmal:
16548 case Builtin::BIfma:
16549 case Builtin::BIfmaf:
16550 case Builtin::BIfmal:
16559 !FD->
hasAttr<ReturnsTwiceAttr>())
16569 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
16581 switch (BuiltinID) {
16582 case Builtin::BImemalign:
16583 case Builtin::BIaligned_alloc:
16584 if (!FD->
hasAttr<AllocAlignAttr>())
16593 switch (BuiltinID) {
16594 case Builtin::BIcalloc:
16595 FD->
addAttr(AllocSizeAttr::CreateImplicit(
16598 case Builtin::BImemalign:
16599 case Builtin::BIaligned_alloc:
16600 case Builtin::BIrealloc:
16604 case Builtin::BImalloc:
16613 switch (BuiltinID) {
16614 case Builtin::BIaddressof:
16615 case Builtin::BI__addressof:
16616 case Builtin::BI__builtin_addressof:
16617 case Builtin::BIas_const:
16618 case Builtin::BIforward:
16619 case Builtin::BIforward_like:
16620 case Builtin::BImove:
16621 case Builtin::BImove_if_noexcept:
16623 !
P->hasAttr<LifetimeBoundAttr>())
16640 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
16656 if (Name->isStr(
"asprintf") || Name->isStr(
"vasprintf")) {
16659 if (!FD->
hasAttr<FormatAttr>())
16662 Name->isStr(
"vasprintf") ? 0 : 3,
16666 if (Name->isStr(
"__CFStringMakeConstantString")) {
16669 if (!FD->
hasAttr<FormatArgAttr>())
16677 assert(
D.getIdentifier() &&
"Wrong callback for declspec without declarator");
16678 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
16681 assert(
D.isInvalidType() &&
"no declarator info for valid type");
16688 D.getIdentifierLoc(),
D.getIdentifier(), TInfo);
16691 if (
D.isInvalidType()) {
16696 if (
D.getDeclSpec().isModulePrivateSpecified()) {
16700 <<
SourceRange(
D.getDeclSpec().getModulePrivateSpecLoc())
16702 D.getDeclSpec().getModulePrivateSpecLoc());
16713 switch (
D.getDeclSpec().getTypeSpecType()) {
16719 TagDecl *tagFromDeclSpec = cast<TagDecl>(
D.getDeclSpec().getRepAsDecl());
16741 if (BT->isInteger())
16744 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
16749 QualType EnumUnderlyingTy,
bool IsFixed,
16751 if (IsScoped != Prev->
isScoped()) {
16752 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
16758 if (IsFixed && Prev->
isFixed()) {
16764 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
16770 }
else if (IsFixed != Prev->
isFixed()) {
16771 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
16793 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
16809 if (isa<TypedefDecl>(PrevDecl))
16811 else if (isa<TypeAliasDecl>(PrevDecl))
16813 else if (isa<ClassTemplateDecl>(PrevDecl))
16815 else if (isa<TypeAliasTemplateDecl>(PrevDecl))
16817 else if (isa<TemplateTemplateParmDecl>(PrevDecl))
16829 llvm_unreachable(
"invalid TTK");
16850 if (OldTag != NewTag &&
16868 if (IsIgnoredLoc(NewTagLoc))
16871 auto IsIgnored = [&](
const TagDecl *Tag) {
16872 return IsIgnoredLoc(Tag->getLocation());
16886 if (OldTag != NewTag) {
16889 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
16897 if (isDefinition) {
16905 bool previousMismatch =
false;
16907 if (I->getTagKind() != NewTag) {
16912 if (!previousMismatch) {
16913 previousMismatch =
true;
16914 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
16918 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
16931 if (PrevDef && IsIgnored(PrevDef))
16935 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
16942 Diag(NewTagLoc, diag::note_struct_class_suggestion)
16972 if (!Namespace || Namespace->isAnonymousNamespace())
16975 Namespaces.push_back(II);
16978 if (Lookup == Namespace)
16985 llvm::raw_svector_ostream OS(Insertion);
16988 std::reverse(Namespaces.begin(), Namespaces.end());
16989 for (
auto *II : Namespaces)
16990 OS << II->getName() <<
"::";
17003 if (OldDC->
Equals(NewDC))
17022 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17023 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17028 "Nameless record must be a definition!");
17033 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17036 bool isMemberSpecialization =
false;
17042 if (TemplateParameterLists.size() > 0 ||
17046 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17063 !isMemberSpecialization)
17064 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17067 if (TemplateParams) {
17069 Diag(KWLoc, diag::err_enum_template);
17073 if (TemplateParams->
size() > 0) {
17082 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17083 AS, ModulePrivateLoc,
17085 TemplateParameterLists.data(), SkipBody);
17091 isMemberSpecialization =
true;
17095 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17114 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17115 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17116 Diag(KWLoc, diag::note_enum_friend)
17117 << (ScopedEnum + ScopedEnumUsesClassTag);
17123 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17124 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17127 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17131 }
else if (UnderlyingType.
get()) {
17136 EnumUnderlying = TI;
17158 bool isStdBadAlloc =
false;
17159 bool isStdAlignValT =
false;
17163 Redecl = RedeclarationKind::NotForRedeclaration;
17168 auto createTagFromNewDecl = [&]() ->
TagDecl * {
17178 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17182 if (EnumUnderlying) {
17183 EnumDecl *ED = cast<EnumDecl>(New);
17198 if (
RecordDecl *RD = dyn_cast<RecordDecl>(New)) {
17225 goto CreateNewDecl;
17233 IsDependent =
true;
17262 if (
Previous.wasNotFoundInCurrentInstantiation() &&
17264 IsDependent =
true;
17269 Diag(NameLoc, diag::err_not_tag_in_scope)
17270 << llvm::to_underlying(Kind) << Name << DC << SS.
getRange();
17273 goto CreateNewDecl;
17321 bool FriendSawTagOutsideEnclosingNamespace =
false;
17328 FriendSawTagOutsideEnclosingNamespace =
true;
17337 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
17339 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
17353 while (isa<RecordDecl, EnumDecl, ObjCContainerDecl>(SearchDC))
17359 while (isa<ObjCContainerDecl>(SearchDC))
17365 while (isa<ObjCContainerDecl>(SearchDC))
17370 Previous.getFoundDecl()->isTemplateParameter()) {
17379 if (Name->isStr(
"bad_alloc")) {
17381 isStdBadAlloc =
true;
17388 }
else if (Name->isStr(
"align_val_t")) {
17389 isStdAlignValT =
true;
17401 IsTemplateParamOrArg)) {
17402 if (
Invalid)
goto CreateNewDecl;
17486 TagDecl *Tag = TT->getDecl();
17487 if (Tag->getDeclName() == Name &&
17488 Tag->getDeclContext()->getRedeclContext()
17489 ->Equals(TD->getDeclContext()->getRedeclContext())) {
17502 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
17503 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
17506 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
17508 *
this, OldTag->getDeclContext(), SearchDC))) {
17509 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
17510 Diag(Shadow->getTargetDecl()->getLocation(),
17511 diag::note_using_decl_target);
17512 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
17516 goto CreateNewDecl;
17520 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
17526 SS.
isNotEmpty() || isMemberSpecialization)) {
17532 bool SafeToContinue =
17535 if (SafeToContinue)
17536 Diag(KWLoc, diag::err_use_with_wrong_tag)
17539 PrevTagDecl->getKindName());
17541 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
17542 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
17544 if (SafeToContinue)
17545 Kind = PrevTagDecl->getTagKind();
17556 const EnumDecl *PrevEnum = cast<EnumDecl>(PrevTagDecl);
17558 return PrevTagDecl;
17562 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
17563 else if (
const Type *
T = EnumUnderlying.dyn_cast<
const Type*>())
17570 ScopedEnum, EnumUnderlyingTy,
17571 IsFixed, PrevEnum))
17580 S->isDeclScope(PrevDecl)) {
17581 Diag(NameLoc, diag::ext_member_redeclared);
17582 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
17589 if (!Attrs.
empty()) {
17593 (PrevTagDecl->getFriendObjectKind() ==
17606 return PrevTagDecl;
17611 return PrevTagDecl;
17617 if (
NamedDecl *Def = PrevTagDecl->getDefinition()) {
17621 bool IsExplicitSpecializationAfterInstantiation =
false;
17622 if (isMemberSpecialization) {
17624 IsExplicitSpecializationAfterInstantiation =
17625 RD->getTemplateSpecializationKind() !=
17627 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
17628 IsExplicitSpecializationAfterInstantiation =
17629 ED->getTemplateSpecializationKind() !=
17649 SkipBody->
New = createTagFromNewDecl();
17659 }
else if (!IsExplicitSpecializationAfterInstantiation) {
17663 Diag(NameLoc, diag::warn_redefinition_in_param_list) << Name;
17665 Diag(NameLoc, diag::err_redefinition) << Name;
17667 NameLoc.
isValid() ? NameLoc : KWLoc);
17679 if (TD->isBeingDefined()) {
17680 Diag(NameLoc, diag::err_nested_redefinition) << Name;
17681 Diag(PrevTagDecl->getLocation(),
17682 diag::note_previous_definition);
17697 SearchDC = PrevTagDecl->getDeclContext();
17725 Diag(NameLoc, diag::err_tag_reference_non_tag)
17726 << PrevDecl << NTK << llvm::to_underlying(Kind);
17732 SS.
isNotEmpty() || isMemberSpecialization)) {
17738 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
17744 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
17746 if (isa<TypeAliasDecl>(PrevDecl)) Kind = 1;
17747 Diag(NameLoc, diag::err_tag_definition_of_typedef)
17748 << Name << Kind << TND->getUnderlyingType();
17756 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
17772 PrevDecl = cast<TagDecl>(
Previous.getFoundDecl());
17788 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
17789 ScopedEnumUsesClassTag, IsFixed);
17797 if (IsFixed && cast<EnumDecl>(New)->isFixed()) {
17801 else if (PrevDecl && (Def = cast<EnumDecl>(PrevDecl)->
getDefinition())) {
17802 Diag(
Loc, diag::ext_forward_ref_enum_def)
17806 unsigned DiagID = diag::ext_forward_ref_enum;
17808 DiagID = diag::ext_ms_forward_ref_enum;
17810 DiagID = diag::err_forward_ref_enum;
17815 if (EnumUnderlying) {
17816 EnumDecl *ED = cast<EnumDecl>(New);
17825 assert(ED->
isComplete() &&
"enum with type should be complete");
17835 cast_or_null<CXXRecordDecl>(PrevDecl));
17841 cast_or_null<RecordDecl>(PrevDecl));
17853 (IsTypeSpecifier || IsTemplateParamOrArg) &&
17875 isMemberSpecialization))
17879 if (TemplateParameterLists.size() > 0) {
17887 if (
RecordDecl *RD = dyn_cast<RecordDecl>(New)) {
17903 if (ModulePrivateLoc.
isValid()) {
17904 if (isMemberSpecialization)
17929 Diag(
Loc, diag::err_type_defined_in_param_type)
17933 }
else if (!PrevDecl) {
17994 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(New)) {
18011 if (
auto RD = dyn_cast<RecordDecl>(New))
18014 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18023 TagDecl *Tag = cast<TagDecl>(TagD);
18046 bool IsFinalSpelledSealed,
18054 if (!
Record->getIdentifier())
18062 IsFinalSpelledSealed
18063 ? FinalAttr::Keyword_sealed
18064 : FinalAttr::Keyword_final));
18083 "Broken injected-class-name");
18089 TagDecl *Tag = cast<TagDecl>(TagD);
18090 Tag->setBraceRange(BraceRange);
18093 if (Tag->isBeingDefined()) {
18094 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18095 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18099 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18101 if (RD->
hasAttr<SYCLSpecialClassAttr>()) {
18103 assert(Def &&
"The record is expected to have a completed definition");
18104 unsigned NumInitMethods = 0;
18105 for (
auto *Method : Def->methods()) {
18106 if (!Method->getIdentifier())
18108 if (Method->getName() ==
"__init")
18111 if (NumInitMethods > 1 || !Def->hasInitMethod())
18112 Diag(RD->
getLocation(), diag::err_sycl_special_type_num_init_method);
18129 Tag->getDeclContext()->isFileContext())
18130 Tag->setTopLevelDeclInObjCContainer();
18133 if (!Tag->isInvalidDecl())
18144 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18148 if (llvm::any_of(RD->
fields(),
18149 [](
const FieldDecl *FD) { return FD->isBitField(); }))
18150 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
18156 TagDecl *Tag = cast<TagDecl>(TagD);
18157 Tag->setInvalidDecl();
18160 if (Tag->isBeingDefined()) {
18161 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18175 QualType FieldTy,
bool IsMsStruct,
18186 diag::err_field_incomplete_or_sizeless))
18189 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
18191 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
18202 llvm::APSInt
Value;
18206 BitWidth = ICE.
get();
18209 if (
Value == 0 && FieldName)
18210 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
18213 if (
Value.isSigned() &&
Value.isNegative()) {
18215 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
18217 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
18224 return Diag(FieldLoc, diag::err_bitfield_too_wide)
18231 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
18235 bool CStdConstraintViolation =
18237 bool MSBitfieldViolation =
18238 Value.ugt(TypeStorageSize) &&
18240 if (CStdConstraintViolation || MSBitfieldViolation) {
18241 unsigned DiagWidth =
18242 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
18243 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
18245 << !CStdConstraintViolation << DiagWidth;
18251 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
18252 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
18274 if (
D.isDecompositionDeclarator()) {
18283 if (II)
Loc =
D.getIdentifierLoc();
18292 D.setInvalidType();
18300 if (
D.getDeclSpec().isInlineSpecified())
18301 Diag(
D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
18303 if (
DeclSpec::TSCS TSCS =
D.getDeclSpec().getThreadStorageClassSpec())
18304 Diag(
D.getDeclSpec().getThreadStorageClassSpecLoc(),
18305 diag::err_invalid_thread)
18311 RedeclarationKind::ForVisibleRedeclaration);
18313 switch (
Previous.getResultKind()) {
18320 PrevDecl =
Previous.getRepresentativeDecl();
18334 PrevDecl =
nullptr;
18338 PrevDecl =
nullptr;
18345 TSSL, AS, PrevDecl, &
D);
18348 Record->setInvalidDecl();
18350 if (
D.getDeclSpec().isModulePrivateSpecified())
18367 bool Mutable,
Expr *BitWidth,
18373 bool InvalidDecl =
false;
18374 if (
D) InvalidDecl =
D->isInvalidType();
18379 InvalidDecl =
true;
18385 bool isIncomplete =
18389 diag::err_field_incomplete_or_sizeless);
18390 if (isIncomplete) {
18392 Record->setInvalidDecl();
18393 InvalidDecl =
true;
18398 Record->setInvalidDecl();
18399 InvalidDecl =
true;
18407 Diag(
Loc, diag::err_field_with_address_space);
18408 Record->setInvalidDecl();
18409 InvalidDecl =
true;
18417 Diag(
Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
18418 Record->setInvalidDecl();
18419 InvalidDecl =
true;
18424 "__cl_clang_bitfields",
LangOpts)) {
18425 Diag(
Loc, diag::err_opencl_bitfields);
18426 InvalidDecl =
true;
18432 T.hasQualifiers()) {
18433 InvalidDecl =
true;
18434 Diag(
Loc, diag::err_anon_bitfield_qualifiers);
18441 TInfo,
T,
Loc, diag::err_typecheck_field_variable_size))
18442 InvalidDecl =
true;
18447 diag::err_abstract_type_in_decl,
18449 InvalidDecl =
true;
18452 BitWidth =
nullptr;
18458 InvalidDecl =
true;
18459 BitWidth =
nullptr;
18464 if (!InvalidDecl && Mutable) {
18465 unsigned DiagID = 0;
18467 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
18468 : diag::err_mutable_reference;
18469 else if (
T.isConstQualified())
18470 DiagID = diag::err_mutable_const;
18474 if (
D &&
D->getDeclSpec().getStorageClassSpecLoc().isValid())
18475 ErrLoc =
D->getDeclSpec().getStorageClassSpecLoc();
18476 Diag(ErrLoc, DiagID);
18477 if (DiagID != diag::ext_mutable_reference) {
18479 InvalidDecl =
true;
18491 BitWidth, Mutable, InitStyle);
18495 if (PrevDecl && !isa<TagDecl>(PrevDecl) &&
18497 Diag(
Loc, diag::err_duplicate_member) << II;
18503 if (
Record->isUnion()) {
18521 const bool HaveMSExt =
18526 HaveMSExt ? diag::ext_union_member_of_reference_type
18527 : diag::err_union_member_of_reference_type)
18547 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
18550 if (
T.isObjCGCWeak())
18551 Diag(
Loc, diag::warn_attribute_weak_on_field);
18602 if (!FD->
hasAttr<UnavailableAttr>())
18604 UnavailableAttr::IR_ARCFieldWithOwnership,
Loc));
18612 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
18613 : diag::err_illegal_union_or_anon_struct_member)
18615 << llvm::to_underlying(member);
18630 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
18638 if (!CD->IsClassExtension())
18650 DeclLoc, DeclLoc,
nullptr,
18656 AllIvarDecls.push_back(Ivar);
18668 if (!
Record->hasUserDeclaredDestructor()) {
18676 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
18677 if (DD->isInvalidDecl())
18681 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
18695 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
18699 Msg = diag::err_ambiguous_destructor;
18704 Msg = diag::err_no_viable_destructor;
18715 Record->setInvalidDecl();
18722 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
18766 const Expr *Constraints = Method->getTrailingRequiresClause();
18768 SatisfactionStatus.push_back(
true);
18772 SatisfactionStatus.push_back(
false);
18774 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
18778 for (
size_t i = 0; i < Methods.size(); i++) {
18779 if (!SatisfactionStatus[i])
18784 OrigMethod = cast<CXXMethodDecl>(MF);
18787 bool AnotherMethodIsMoreConstrained =
false;
18788 for (
size_t j = 0; j < Methods.size(); j++) {
18789 if (i == j || !SatisfactionStatus[j])
18793 OtherMethod = cast<CXXMethodDecl>(MF);
18800 if (!OtherConstraints)
18802 if (!Constraints) {
18803 AnotherMethodIsMoreConstrained =
true;
18808 AnotherMethodIsMoreConstrained)) {
18811 AnotherMethodIsMoreConstrained =
true;
18813 if (AnotherMethodIsMoreConstrained)
18818 if (!AnotherMethodIsMoreConstrained) {
18820 Record->addedEligibleSpecialMemberFunction(Method,
18821 1 << llvm::to_underlying(CSM));
18835 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
18837 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
18839 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
18843 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
18844 if (CD->isInvalidDecl())
18846 if (CD->isDefaultConstructor())
18847 DefaultConstructors.push_back(MD);
18848 else if (CD->isCopyConstructor())
18849 CopyConstructors.push_back(MD);
18850 else if (CD->isMoveConstructor())
18851 MoveConstructors.push_back(MD);
18853 CopyAssignmentOperators.push_back(MD);
18855 MoveAssignmentOperators.push_back(MD);
18875 assert(EnclosingDecl &&
"missing record or interface decl");
18880 if (!Fields.empty() && isa<ObjCContainerDecl>(EnclosingDecl)) {
18884 case Decl::ObjCCategory:
18887 case Decl::ObjCImplementation:
18889 ResetObjCLayout(cast<ObjCImplementationDecl>(DC)->getClassInterface());
18895 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
18899 unsigned NumNamedMembers = 0;
18901 for (
const auto *I :
Record->decls()) {
18902 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
18903 if (IFD->getDeclName())
18920 RecFields.push_back(FD);
18940 bool IsLastField = (i + 1 == Fields.end());
18949 (
Record || isa<ObjCContainerDecl>(EnclosingDecl))) {
18955 unsigned DiagID = 0;
18956 if (!
Record->isUnion() && !IsLastField) {
18959 << llvm::to_underlying(
Record->getTagKind());
18960 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
18964 }
else if (
Record->isUnion())
18966 ? diag::ext_flexible_array_union_ms
18967 : diag::ext_flexible_array_union_gnu;
18968 else if (NumNamedMembers < 1)
18970 ? diag::ext_flexible_array_empty_aggregate_ms
18971 : diag::ext_flexible_array_empty_aggregate_gnu;
18981 if (CXXRecord && CXXRecord->getNumVBases() != 0)
18995 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19002 Record->setHasFlexibleArrayMember(
true);
19011 diag::err_incomplete_type)
19014 diag::err_field_incomplete_or_sizeless))) {
19020 if (
Record && FDTTy->getDecl()->hasFlexibleArrayMember()) {
19023 Record->setHasFlexibleArrayMember(
true);
19024 if (!
Record->isUnion()) {
19039 if (isa<ObjCContainerDecl>(EnclosingDecl) &&
19041 diag::err_abstract_type_in_decl,
19046 if (
Record && FDTTy->getDecl()->hasObjectMember())
19047 Record->setHasObjectMember(
true);
19048 if (
Record && FDTTy->getDecl()->hasVolatileMember())
19049 Record->setHasVolatileMember(
true);
19068 FD->
addAttr(UnavailableAttr::CreateImplicit(
19069 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19073 !
Record->hasObjectMember()) {
19076 Record->setHasObjectMember(
true);
19081 Record->setHasObjectMember(
true);
19084 Record->setHasObjectMember(
true);
19089 !shouldIgnoreForRecordTriviality(FD)) {
19092 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
19095 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
19099 Record->setNonTrivialToPrimitiveCopy(
true);
19101 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
19104 Record->setNonTrivialToPrimitiveDestroy(
true);
19105 Record->setParamDestroyedInCallee(
true);
19107 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
19111 if (RT->getDecl()->getArgPassingRestrictions() ==
19113 Record->setArgPassingRestrictions(
19116 Record->setArgPassingRestrictions(
19121 Record->setHasVolatileMember(
true);
19129 bool Completed =
false;
19133 Parent->isTemplateParamScope())
19134 Record->setInvalidDecl();
19138 if (!CXXRecord->isInvalidDecl()) {
19141 I = CXXRecord->conversion_begin(),
19142 E = CXXRecord->conversion_end(); I !=
E; ++I)
19143 I.setAccess((*I)->getAccess());
19149 if (!CXXRecord->isDependentType()) {
19150 if (!CXXRecord->isInvalidDecl()) {
19154 if (CXXRecord->getNumVBases()) {
19156 CXXRecord->getFinalOverriders(FinalOverriders);
19158 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
19159 MEnd = FinalOverriders.end();
19162 SOEnd = M->second.end();
19163 SO != SOEnd; ++SO) {
19164 assert(SO->second.size() > 0 &&
19165 "Virtual function without overriding functions?");
19166 if (SO->second.size() == 1)
19173 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
19175 Diag(M->first->getLocation(),
19176 diag::note_overridden_virtual_function);
19178 OM = SO->second.begin(),
19179 OMEnd = SO->second.end();
19181 Diag(OM->Method->getLocation(), diag::note_final_overrider)
19182 << (
const NamedDecl *)M->first << OM->Method->getParent();
19184 Record->setInvalidDecl();
19187 CXXRecord->completeDefinition(&FinalOverriders);
19197 Record->completeDefinition();
19203 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *
D) {
19204 const FieldDecl *FD = dyn_cast<FieldDecl>(
D);
19217 if (
const auto *TD = dyn_cast<TagDecl>(
D))
19218 return !TD->isCompleteDefinition();
19222 if (isa<PointerType>(FieldType)) {
19232 (
Record->hasAttr<RandomizeLayoutAttr>() ||
19233 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
19234 llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl))) &&
19236 !
Record->isRandomized()) {
19240 Record->reorderDecls(NewDeclOrdering);
19245 auto *Dtor = CXXRecord->getDestructor();
19246 if (Dtor && Dtor->isImplicit() &&
19248 CXXRecord->setImplicitDestructorIsDeleted();
19253 if (
Record->hasAttrs()) {
19256 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
19258 IA->getRange(), IA->getBestCase(),
19259 IA->getInheritanceModel());
19265 bool CheckForZeroSize;
19267 CheckForZeroSize =
true;
19272 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
19274 CXXRecord->isCLike();
19276 if (CheckForZeroSize) {
19277 bool ZeroSize =
true;
19278 bool IsEmpty =
true;
19279 unsigned NonBitFields = 0;
19282 (NonBitFields == 0 || ZeroSize) && I !=
E; ++I) {
19284 if (I->isUnnamedBitField()) {
19285 if (!I->isZeroLengthBitField(
Context))
19289 QualType FieldType = I->getType();
19301 diag::warn_zero_size_struct_union_in_extern_c :
19302 diag::warn_zero_size_struct_union_compat)
19303 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
19308 if (NonBitFields == 0 && !
getLangOpts().CPlusPlus) {
19309 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union :
19310 diag::ext_no_named_members_in_struct_union)
19318 ID->setEndOfDefinitionLoc(RBrac);
19320 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
19322 ID->addDecl(ClsFields[i]);
19326 if (ID->getSuperClass())
19329 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
19330 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
19331 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
19337 IMPDecl->setIvarLBraceLoc(LBrac);
19338 IMPDecl->setIvarRBraceLoc(RBrac);
19340 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
19348 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
19352 Diag(ClsFields[i]->getLocation(),
19353 diag::err_duplicate_ivar_declaration);
19354 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
19360 Diag(ClsFields[i]->getLocation(),
19361 diag::err_duplicate_ivar_declaration);
19362 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
19368 CDecl->addDecl(ClsFields[i]);
19370 CDecl->setIvarLBraceLoc(LBrac);
19371 CDecl->setIvarRBraceLoc(RBrac);
19380 llvm::APSInt &
Value,
19383 "Integral type required!");
19386 if (
Value.isUnsigned() ||
Value.isNonNegative()) {
19389 return Value.getActiveBits() <= BitWidth;
19391 return Value.getSignificantBits() <= BitWidth;
19401 const unsigned NumTypes = 4;
19402 QualType SignedIntegralTypes[NumTypes] = {
19405 QualType UnsignedIntegralTypes[NumTypes] = {
19412 : UnsignedIntegralTypes;
19413 for (
unsigned I = 0; I != NumTypes; ++I)
19426 llvm::APSInt EnumVal(IntWidth);
19446 EltTy =
Enum->getIntegerType();
19453 Val = Converted.
get();
19460 if (
Enum->isComplete()) {
19461 EltTy =
Enum->getIntegerType();
19470 .isWindowsMSVCEnvironment()) {
19471 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
19473 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
19497 Diag(IdLoc, diag::ext_enum_value_not_int)
19499 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
19511 if (
Enum->isDependentType())
19513 else if (!LastEnumConst) {
19522 if (
Enum->isFixed()) {
19523 EltTy =
Enum->getIntegerType();
19532 EltTy = LastEnumConst->
getType();
19535 if (EnumVal < LastEnumConst->getInitVal()) {
19547 if (
T.isNull() ||
Enum->isFixed()) {
19551 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
19553 if (
Enum->isFixed())
19555 Diag(IdLoc, diag::err_enumerator_wrapped)
19559 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
19579 Diag(IdLoc, diag::warn_enum_value_overflow);
19584 Diag(IdLoc, diag::ext_enum_value_not_int)
19612 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
19616 EnumDecl *PrevED = cast<EnumDecl>(PrevECD->getDeclContext());
19631 EnumDecl *TheEnumDecl = cast<EnumDecl>(theEnumDecl);
19633 cast_or_null<EnumConstantDecl>(lastEnumConst);
19642 RedeclarationKind::ForVisibleRedeclaration);
19650 PrevDecl =
nullptr;
19668 if (!TheEnumDecl->
isScoped() && isa<ValueDecl>(PrevDecl)) {
19676 "Received TagDecl when not in C++!");
19678 if (isa<EnumConstantDecl>(PrevDecl))
19679 Diag(IdLoc, diag::err_redefinition_of_enumerator) <<
Id;
19681 Diag(IdLoc, diag::err_redefinition) <<
Id;
19714 if (!BO->isAdditiveOp())
19722 InitExpr = BO->getLHS();
19726 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
19746 if (!
Enum->getIdentifier())
19750 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
19759 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
19762 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
19766 llvm::APSInt Val =
D->getInitVal();
19767 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
19770 DuplicatesVector DupVector;
19771 ValueToVectorMap EnumMap;
19775 for (
auto *Element : Elements) {
19789 EnumMap.insert({EnumConstantToKey(ECD), ECD});
19792 if (EnumMap.size() == 0)
19796 for (
auto *Element : Elements) {
19802 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
19803 if (
Iter == EnumMap.end())
19806 DeclOrVector& Entry =
Iter->second;
19813 auto Vec = std::make_unique<ECDVector>();
19815 Vec->push_back(ECD);
19822 DupVector.emplace_back(std::move(Vec));
19826 ECDVector *Vec = Entry.get<ECDVector*>();
19828 if (*Vec->begin() == ECD)
19831 Vec->push_back(ECD);
19835 for (
const auto &Vec : DupVector) {
19836 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
19839 auto *FirstECD = Vec->front();
19840 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
19841 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
19842 << FirstECD->getSourceRange();
19846 for (
auto *ECD : llvm::drop_begin(*Vec))
19847 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
19848 << ECD <<
toString(ECD->getInitVal(), 10)
19849 << ECD->getSourceRange();
19854 bool AllowMask)
const {
19855 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
19858 auto R =
FlagBitsCache.insert(std::make_pair(ED, llvm::APInt()));
19859 llvm::APInt &FlagBits = R.first->second;
19863 const auto &EVal =
E->getInitVal();
19865 if (EVal.isPowerOf2())
19866 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
19878 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
19879 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
19891 if (
Enum->isDependentType()) {
19892 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
19894 cast_or_null<EnumConstantDecl>(Elements[i]);
19895 if (!ECD)
continue;
19913 unsigned NumNegativeBits = 0;
19914 unsigned NumPositiveBits = 0;
19916 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
19918 cast_or_null<EnumConstantDecl>(Elements[i]);
19919 if (!ECD)
continue;
19921 const llvm::APSInt &InitVal = ECD->
getInitVal();
19924 if (InitVal.isUnsigned() || InitVal.isNonNegative()) {
19927 unsigned ActiveBits = InitVal.getActiveBits();
19928 NumPositiveBits = std::max({NumPositiveBits, ActiveBits, 1u});
19931 std::max(NumNegativeBits, (
unsigned)InitVal.getSignificantBits());
19939 if (!NumPositiveBits && !NumNegativeBits)
19940 NumPositiveBits = 1;
19944 unsigned BestWidth;
19957 bool Packed =
Enum->hasAttr<PackedAttr>();
19965 if (
Enum->isComplete()) {
19966 BestType =
Enum->getIntegerType();
19970 BestPromotionType = BestType;
19974 else if (NumNegativeBits) {
19978 if (Packed && NumNegativeBits <= CharWidth && NumPositiveBits < CharWidth) {
19980 BestWidth = CharWidth;
19981 }
else if (Packed && NumNegativeBits <= ShortWidth &&
19982 NumPositiveBits < ShortWidth) {
19984 BestWidth = ShortWidth;
19985 }
else if (NumNegativeBits <= IntWidth && NumPositiveBits < IntWidth) {
19987 BestWidth = IntWidth;
19991 if (NumNegativeBits <= BestWidth && NumPositiveBits < BestWidth) {
19996 if (NumNegativeBits > BestWidth || NumPositiveBits >= BestWidth)
19997 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20001 BestPromotionType = (BestWidth <= IntWidth ?
Context.
IntTy : BestType);
20006 if (Packed && NumPositiveBits <= CharWidth) {
20009 BestWidth = CharWidth;
20010 }
else if (Packed && NumPositiveBits <= ShortWidth) {
20013 BestWidth = ShortWidth;
20014 }
else if (NumPositiveBits <= IntWidth) {
20016 BestWidth = IntWidth;
20018 = (NumPositiveBits == BestWidth || !
getLangOpts().CPlusPlus)
20020 }
else if (NumPositiveBits <=
20024 = (NumPositiveBits == BestWidth || !
getLangOpts().CPlusPlus)
20028 if (NumPositiveBits > BestWidth) {
20033 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20037 = (NumPositiveBits == BestWidth || !
getLangOpts().CPlusPlus)
20044 for (
auto *
D : Elements) {
20045 auto *ECD = cast_or_null<EnumConstantDecl>(
D);
20046 if (!ECD)
continue;
20055 llvm::APSInt InitVal = ECD->getInitVal();
20063 !
Enum->isFixed() &&
20066 NewWidth = IntWidth;
20068 }
else if (ECD->getType() == BestType) {
20078 NewWidth = BestWidth;
20083 InitVal = InitVal.extOrTrunc(NewWidth);
20084 InitVal.setIsSigned(NewSign);
20085 ECD->setInitVal(
Context, InitVal);
20088 if (ECD->getInitExpr() &&
20091 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20099 ECD->setType(NewTy);
20102 Enum->completeDefinition(BestType, BestPromotionType,
20103 NumPositiveBits, NumNegativeBits);
20107 if (
Enum->isClosedFlag()) {
20108 for (
Decl *
D : Elements) {
20110 if (!ECD)
continue;
20113 if (InitVal != 0 && !InitVal.isPowerOf2() &&
20121 if (
Enum->hasAttrs())
20131 AsmString, StartLoc,
20147 D->setStmt(Statement);
20162 AsmLabelAttr *
Attr = AsmLabelAttr::CreateImplicit(
20169 if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) {
20173 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
20174 << (isa<FunctionDecl>(PrevDecl) ? 0 : 1) << PrevDecl;
20186 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
20201 if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) {
20202 if (!PrevDecl->
hasAttr<AliasAttr>())
20203 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
20212 assert(FD &&
"Expected non-null FunctionDecl");
20224 auto IsEmittedForExternalSymbol = [
this, FD]() {
20236 if (
LangOpts.OpenMPIsTargetDevice) {
20239 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20246 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
20250 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
20251 if (IsEmittedForExternalSymbol())
20257 }
else if (
LangOpts.OpenMP > 45) {
20261 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20264 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
20283 if (IsEmittedForExternalSymbol())
20308 Diag(NewLoc, diag::warn_conflicting_func_effects)
20309 << Conflict.Kept.description() << Conflict.Rejected.description();
20310 Diag(OldLoc, diag::note_previous_declaration);
20324 Diag(NewAttrLoc, diag::err_attributes_are_not_compatible)
20326 << (
"'" + PrevEC.description() +
"'") <<
false;
20337 if (PrevEC.Cond.getCondition() !=
nullptr)
20343 if (PrevEC.Effect.oppositeKind() == NewKind)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
static constexpr Builtin::Info BuiltinInfo[]
Defines enum values for all the target-independent builtin functions.
enum clang::sema::@1656::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
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.
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 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 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 bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, Sema::AvailabilityMergeKind AMK)
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.
void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
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 void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx, FixItHint &Hint)
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P, SourceLocation ExplicitThisLoc)
static NestedNameSpecifier * synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC)
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 bool isRepresentableIntegerValue(ASTContext &Context, llvm::APSInt &Value, QualType T)
Determine whether the given integral value is representable within the given type T.
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 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 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 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 bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
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 isUsingDeclNotAtClassScope(NamedDecl *D)
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 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 ParsedType buildNamedType(Sema &S, const CXXScopeSpec *SS, QualType T, SourceLocation NameLoc, bool WantNontrivialTypeSourceInfo=true)
Build a ParsedType for a simple-type-specifier with a nested-name-specifier.
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 SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const VarDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
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 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 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 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 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.
const NestedNameSpecifier * Specifier
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
virtual void HandleTagDeclDefinition(TagDecl *D)
HandleTagDeclDefinition - This callback is invoked each time a TagDecl (e.g.
virtual void HandleInlineFunctionDefinition(FunctionDecl *D)
This callback is invoked each time an inline (method or friend) function definition in a class is com...
virtual bool shouldSkipFunctionBody(Decl *D)
This callback is called for each function if the Parser was initialized with SkipFunctionBodies set t...
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 ...
QualType getUsingType(const UsingShadowDecl *Found, QualType Underlying) const
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getParenType(QualType NamedType) const
unsigned getIntWidth(QualType T) const
const FunctionType * adjustFunctionType(const FunctionType *Fn, FunctionType::ExtInfo EInfo)
Change the ExtInfo on a function type.
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType) const
ExternCContextDecl * getExternCContextDecl() const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
DeclarationNameTable DeclarationNames
QualType getObjCClassType() const
Represents the Objective-C Class type.
QualType getRecordType(const RecordDecl *Decl) const
QualType getFunctionNoProtoType(QualType ResultTy, const FunctionType::ExtInfo &Info) const
Return a K&R style C function type like 'int()'.
void setObjCIdRedefinitionType(QualType RedefType)
Set the user-written type that redefines id.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
void setsigjmp_bufDecl(TypeDecl *sigjmp_bufDecl)
Set the type for the C sigjmp_buf type.
bool DeclMustBeEmitted(const Decl *D)
Determines if the decl can be CodeGen'ed or deserialized from PCH lazily, only when used; this is onl...
void setObjCSelRedefinitionType(QualType RedefType)
Set the user-written type that redefines 'SEL'.
void setFILEDecl(TypeDecl *FILEDecl)
Set the type for the C FILE type.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
bool hasSameFunctionTypeIgnoringExceptionSpec(QualType T, QualType U) const
Determine whether two function types are the same, ignoring exception specifications in cases where t...
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Builtin::Context & BuiltinInfo
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
const LangOptions & getLangOpts() const
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
void attachCommentsToJustParsedDecls(ArrayRef< Decl * > Decls, const Preprocessor *PP)
Searches existing comments for doc comments that should be attached to Decls.
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
QualType getObjCSelType() const
Retrieve the type that corresponds to the predefined Objective-C 'SEL' type.
QualType getDeducedTemplateSpecializationType(TemplateName Template, QualType DeducedType, bool IsDependent) const
C++17 deduced class template specialization type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
void setucontext_tDecl(TypeDecl *ucontext_tDecl)
Set the type for the C ucontext_t type.
CanQualType UnsignedLongTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
bool hasAnyFunctionEffects() const
MangleNumberingContext & getManglingNumberContext(const DeclContext *DC)
Retrieve the context for computing mangling numbers in the given DeclContext.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
void setNonKeyFunction(const CXXMethodDecl *method)
Observe that the given method cannot be a key function.
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
const clang::PrintingPolicy & getPrintingPolicy() const
QualType mergeTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool BlockReturnType=false, bool IsConditionalOperator=false)
QualType getObjCIdType() const
Represents the Objective-CC id type.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
CanQualType UnsignedLongLongTy
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
CanQualType UnsignedShortTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const
void setcudaConfigureCallDecl(FunctionDecl *FD)
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
const VariableArrayType * getAsVariableArrayType(QualType T) const
void setObjCClassRedefinitionType(QualType RedefType)
Set the user-written type that redefines 'SEL'.
bool hasDirectOwnershipQualifier(QualType Ty) const
Return true if the type has been explicitly qualified with ObjC ownership.
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
void ResetObjCLayout(const ObjCContainerDecl *CD)
DeclarationNameInfo getNameForTemplate(TemplateName Name, SourceLocation NameLoc) const
const TargetInfo & getTargetInfo() const
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
QualType getLifetimeQualifiedType(QualType type, Qualifiers::ObjCLifetime lifetime)
Return a type with the given lifetime qualifier.
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin, UnresolvedSetIterator End) const
Retrieve the template name that corresponds to a non-empty lookup.
bool typesAreCompatible(QualType T1, QualType T2, bool CompareUnqualified=false)
Compatibility predicates used to check assignment expressions.
void setjmp_bufDecl(TypeDecl *jmp_bufDecl)
Set the type for the C jmp_buf type.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
QualType mergeObjCGCQualifiers(QualType, QualType)
mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 'RHS' attributes and ret...
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
LangAS getLangASForBuiltinAddressSpace(unsigned AS) const
bool hasSameFunctionTypeIgnoringPtrSizes(QualType T, QualType U)
Determine whether two function types are the same, ignoring pointer sizes in the return type and para...
TemplateName getAssumedTemplateName(DeclarationName Name) const
Retrieve a template name representing an unqualified-id that has been assumed to name a template for ...
@ 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>
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
The result of parsing/analyzing an expression, statement etc.
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
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.
An attributed type is a type to which a type attribute has been applied.
QualType getModifiedType() const
bool isCallingConv() const
static Kind getNullabilityAttrKind(NullabilityKind kind)
Retrieve the attribute kind corresponding to the given nullability kind.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
AutoTypeKeyword getKeyword() const
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
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...
bool performsCallback(unsigned ID, llvm::SmallVectorImpl< int > &Encoding) const
Determine whether this builtin has callback behavior (see llvm::AbstractCallSites for details).
bool isAuxBuiltinID(unsigned ID) const
Return true if builtin ID belongs to AuxTarget.
const char * getHeaderName(unsigned ID) const
If this is a library function that comes from a specific header, retrieve that header name.
llvm::StringRef getName(unsigned ID) const
Return the identifier name for the specified builtin, e.g.
bool isReturnsTwice(unsigned ID) const
Return true if we know this builtin can return twice.
bool isImmediate(unsigned ID) const
Returns true if this is an immediate (consteval) function.
bool isConstWithoutErrnoAndExceptions(unsigned ID) const
Return true if this function has no side effects and doesn't read memory, except for possibly errno o...
bool allowTypeMismatch(unsigned ID) const
Determines whether a declaration of this builtin should be recognized even if the type doesn't match ...
bool isTSBuiltin(unsigned ID) const
Return true if this function is a target-specific builtin.
bool isHeaderDependentFunction(unsigned ID) const
Returns true if this builtin requires appropriate header in other compilers.
bool isScanfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg)
Determine whether this builtin is like scanf in its formatting rules and, if so, set the index to the...
bool isInStdNamespace(unsigned ID) const
Determines whether this builtin is a C++ standard library function that lives in (possibly-versioned)...
bool isPredefinedLibFunction(unsigned ID) const
Determines whether this builtin is a predefined libc/libm function, such as "malloc",...
bool isPrintfLike(unsigned ID, unsigned &FormatIdx, bool &HasVAListArg)
Determine whether this builtin is like printf in its formatting rules and, if so, set the index to th...
bool isConstWithoutExceptions(unsigned ID) const
bool isPredefinedRuntimeFunction(unsigned ID) const
Determines whether this builtin is a predefined compiler-rt/libgcc function, such as "__clear_cache",...
bool isPure(unsigned ID) const
Return true if this function has no side effects.
bool isNoThrow(unsigned ID) const
Return true if we know this builtin never throws an exception.
bool isConst(unsigned ID) const
Return true if this function has no side effects and doesn't read memory.
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
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
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(), Expr *TrailingRequiresClause=nullptr)
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, Expr *TrailingRequiresClause=nullptr)
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)
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, Expr *TrailingRequiresClause=nullptr)
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)
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.
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, Expr *TrailingRequiresClause=nullptr)
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.
A call to an overloaded operator written using operator syntax.
Represents a C++ struct/union/class.
bool hasNonTrivialCopyAssignment() const
Determine whether this class has a non-trivial copy assignment operator (C++ [class....
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
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.
bool hasNonTrivialDestructor() const
Determine whether this class has a non-trivial destructor (C++ [class.dtor]p3)
CXXRecordDecl * getDefinition() const
unsigned getNumBases() const
Retrieves the number of base classes of this class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
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 hasDefinition() const
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
LambdaCaptureDefault getLambdaCaptureDefault() const
void setDescribedClassTemplate(ClassTemplateDecl *Template)
bool hasNonTrivialCopyConstructor() const
Determine whether this class has a non-trivial copy constructor (C++ [class.copy]p6,...
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.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
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).
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
static CharSourceRange getCharRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
bool exprNeedsCleanups() const
ConditionalOperator - The ?: ternary operator.
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.
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)
The results of name lookup within a DeclContext.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
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.
bool isObjCContainer() const
bool isExternCXXContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
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 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 LLVM_READONLY
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.
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
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 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
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,...
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.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFromExplicitGlobalModule() const
Whether this declaration comes from explicit global module.
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 setLocalOwningModule(Module *M)
void setImplicit(bool I=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
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 SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
The name of a declaration.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
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
unsigned getNumTemplateParameterLists() const
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Information about one declarator, including the parsed type information and the identifier.
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.
const ParsedAttributes & getAttributes() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
const ParsedAttributesView & getDeclarationAttributes() 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
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it has not been deduced.
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.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
Expr * getCondition() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
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.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
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, e.g.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
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...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Represents difference between two FPOptions values.
void setDisallowOptimizations()
void applyChanges(FPOptionsOverride FPO)
bool isFPConstrained() const
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
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.
bool isZeroLengthBitField(const ASTContext &Ctx) const
Is this a zero-length bit-field? Such bit-fields aren't really bit-fields at all and instead act as a...
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)
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, StringLiteral *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.
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 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 isVariadic() const
Whether this function is variadic.
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 isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
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.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
bool isImmediateEscalating() const
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isReplaceableGlobalAllocationFunction(std::optional< unsigned > *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
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, Expr *TrailingRequiresClause=nullptr)
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.
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
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.
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.
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
Kind kind() const
The kind of the effect.
Kind
Identifies the particular effect.
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
ArrayRef< QualType > param_types() 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)
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
bool getCmseNSCallAttr() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
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.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
void InsertDeclAfter(iterator Pos, NamedDecl *D)
Insert the given declaration after the given iterator position.
iterator end()
Returns the end iterator.
void AddDecl(NamedDecl *D)
AddDecl - Link the decl to its shadowed decl chain.
bool isDeclInScope(Decl *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',...
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
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, llvm::MutableArrayRef< NamedDecl * > CH)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Describes an C or C++ initializer list.
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...
Describes the sequence of initializations required to initialize a given object or reference with a s...
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
@ 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...
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
clang::ObjCRuntime ObjCRuntime
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 implicitFunctionsAllowed() const
Returns true if implicit function declarations are allowed in the current language mode.
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
void push_back(const T &LocalValue)
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...
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
void InstantiatedLocal(const Decl *D, Decl *Inst)
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.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ 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.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
@ Found
Name lookup found a single declaration that met the criteria.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
Sema & getSema() const
Get the Sema object that this lookup result is searching with.
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
LookupResultKind getResultKind() const
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
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.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
SourceLocation DefinitionLoc
The location of the module definition.
Module * Parent
The parent of this module.
bool isPrivateModule() const
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
bool isModuleImplementation() const
Is this a module implementation.
bool isModulePartition() const
Is this a module partition.
bool isImplicitGlobalModule() const
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
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.
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
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 getTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
NestedNameSpecifierLoc getPrefix() const
Return the prefix of this nested-name-specifier.
SourceRange getLocalSourceRange() const
Retrieve the source range covering just the last part of this nested-name-specifier,...
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
bool containsErrors() const
Whether this nested name specifier contains an error.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)
Builds a specifier combining a prefix and an identifier.
static NestedNameSpecifier * GlobalSpecifier(const ASTContext &Context)
Returns the nested name specifier representing the global scope.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
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
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)
An expression that sends a message to the given Objective-C object or class.
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
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
Wrapper for void* pointer.
static OpaquePtr make(PtrTy P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
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.
SmallVectorImpl< UniqueVirtualMethod >::iterator overriding_iterator
MapType::iterator iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
unsigned getNumExprs() const
Return the number of expressions in this paren list.
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)
QualType getOriginalType() const
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
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
TypeLoc getPointeeLoc() const
Wrapper for source info for pointers.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
bool isIncrementalProcessingEnabled() const
Returns true if incremental processing is enabled.
bool isCodeCompletionEnabled() const
Determine if we are performing code completion.
HeaderSearch & getHeaderSearchInfo() const
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Computes the source location just past the end of the token at this source location.
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...
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.
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.
@ 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.
bool hasObjectMember() const
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() 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.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
redecl_iterator redecls_end() const
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
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.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
bool isCompoundStmtScope() const
Determine whether this scope is a compound statement scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
@ 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.
A generic diagnostic builder for errors which may or may not be deferred.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial 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)
HLSLNumThreadsAttr * mergeNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z)
void ActOnTopLevelFunction(FunctionDecl *FD)
HLSLShaderAttr * mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType)
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 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)
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.
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.
@ NTCUC_DefaultInitializedObject
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.
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.
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)
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()
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Preprocessor & getPreprocessor() const
void deduceOpenCLAddressSpace(ValueDecl *decl)
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)
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
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.
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)
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...
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
bool diagnoseConflictingFunctionEffect(const FunctionEffectsRef &FX, const FunctionEffectWithCondition &EC, SourceLocation NewAttrLoc)
Warn and return true if adding an effect to a set would create a conflict.
void * SkippedDefinitionContext
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
PragmaStack< bool > StrictGuardStackCheckStack
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void CheckCoroutineWrapper(FunctionDecl *FD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
void PopExpressionEvaluationContext()
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.
bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn)
We've just determined that Old and New both appear to be definitions of the same variable.
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)
@ 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()
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)
SourceLocation CurInitSegLoc
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)
const LangOptions & LangOpts
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
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)
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.
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, const CXXScopeSpec &SS, QualType T, TagDecl *OwnedTagDecl=nullptr)
Retrieve a version of the type 'T' that is elaborated by Keyword, qualified by the nested-name-specif...
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 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...
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...
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.
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val)
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)
bool ActOnDuplicateDefinition(Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
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.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
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)
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.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ NTK_TemplateTemplateArgument
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 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
PragmaClangSection PragmaClangDataSection
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body)
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=std::nullopt, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
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.
bool IsAtLeastAsConstrained(NamedDecl *D1, MutableArrayRef< const Expr * > AC1, NamedDecl *D2, MutableArrayRef< const Expr * > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
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 DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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)
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)
@ CCEK_Enumerator
Enumerator value with fixed underlying type.
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
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.
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)
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...
@ Ovl_NonFunction
This is not an overload because the lookup results contain a non-function.
@ Ovl_Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
@ Ovl_Match
This is not an overload because the signature exactly matches an existing declaration.
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....
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ AMK_None
Don't merge availability attributes at all.
@ AMK_Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ AMK_ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ AMK_OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ AMK_Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
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,...
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.
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.
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
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...
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().
sema::LambdaScopeInfo * getEnclosingLambda() const
Get the innermost lambda enclosing the current location, if any.
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...
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
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.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
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)
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...
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 CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
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.
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings=std::nullopt)
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
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.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
SourceLocation getIncludeLoc(FileID FID) const
Returns the include location if FID is a #include'd file otherwise it returns an invalid location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
std::pair< FileID, unsigned > getDecomposedLoc(SourceLocation Loc) const
Decompose the specified location into a raw FileID + Offset pair.
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
StringRef getFilename(SourceLocation SpellingLoc) const
Return the filename of the file containing a SourceLocation.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
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)
bool isBeingDefined() const
Return true if this decl is currently being defined.
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 startDefinition()
Starts the definition of this tag declaration.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
bool canKeyFunctionBeInline() const
Can an out-of-line inline function serve as a key function?
Exposes information about the current target.
virtual bool validateCpuIs(StringRef Name) const
unsigned getShortWidth() const
Return the size of 'signed short' and 'unsigned short' for this target, in bits.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
unsigned getIntWidth() const
getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for this target,...
virtual bool allowDebugInfoForExternalRef() const
Whether target allows debuginfo types for decl only variables/functions.
unsigned getLongLongWidth() const
getLongLongWidth/Align - Return the size of 'signed long long' and 'unsigned long long' for this targ...
bool isTLSSupported() const
Whether the target supports thread-local storage.
unsigned getMaxTLSAlign() const
Return the maximum alignment (in bits) of a TLS variable.
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.
unsigned getCharWidth() const
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
unsigned getLongWidth() const
getLongWidth/Align - Return the size of 'signed long' and 'unsigned long' for this target,...
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.
virtual bool isValidGCCRegisterName(StringRef Name) const
Returns whether the passed in string is a valid register name according to GCC.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
llvm::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() 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
Represents a type template specialization; the template must be a class template, a type alias templa...
static bool anyInstantiationDependentTemplateArguments(ArrayRef< TemplateArgumentLoc > Args)
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(tok::TokenKind K1, tok::TokenKind K2) 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.
void setTypeForDecl(const Type *TD)
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
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 getTemplateKeywordLoc() const
Get the SourceLocation of the template keyword (if any).
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.
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
The base class of the type hierarchy.
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
bool isStructureType() const
bool isDecltypeType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isDependentSizedArrayType() const
bool isBlockPointerType() 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.
const RecordType * getAsUnionType() const
NOTE: getAs*ArrayType are methods on ASTContext.
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.
bool isDependentAddressSpaceType() const
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
bool isVoidPointerType() const
bool isFunctionPointerType() const
bool isPointerType() const
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isScalarType() const
bool isVariableArrayType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
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.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isBitIntType() const
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.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isHLSLSpecificType() const
const RecordType * getAsStructureType() const
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 isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isPointerOrReferenceType() const
Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const
Return the implicit lifetime for this type, which must not be dependent.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
const T * getAsAdjusted() const
Member-template getAsAdjusted<specific type>.
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isMemberFunctionPointerType() const
bool isRVVSizelessBuiltinType() const
Returns true for RVV scalable vector types.
bool isFloatingType() const
bool isAnyPointerType() const
TypeClass getTypeClass() 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
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isFunctionNoProtoType() const
bool isReserveIDT() const
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
bool isSizelessVectorType() const
Returns true for all scalable vector types.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
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
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
QualType getUnderlyingType() const
void setTypeSourceInfo(TypeSourceInfo *newType)
TagDecl * getAnonDeclWithTypedefName(bool AnyRedecl=false) const
Retrieves the tag declaration for which this is the typedef name for linkage purposes,...
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.
NestedNameSpecifier * getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setCorrectionDecl(NamedDecl *CDecl)
Clears the list of NamedDecls before adding the new one.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a C++ unqualified-id that has been parsed.
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
The iterator over UnresolvedSets.
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.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
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 isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
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 ...
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...
void demoteThisDefinitionToDeclaration()
This is a definition which should be demoted to a declaration.
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
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()
Policy getDefaultPolicy()
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.
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 [...].
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.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
const internal::VariadicAllOfMatcher< Attr > attr
Matches attributes.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< RecordType > recordType
Matches record types (e.g.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
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)
TypeSpecifierType
Specifies the kind of type.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
@ 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
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
ConstexprSpecKind
Define the kind of constexpr specifier.
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_NoInit
No in-class initializer.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
@ 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.
bool DeclAttrsMatchCUDAMode(const LangOptions &LangOpts, Decl *D)
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
ThreadStorageClassSpecifier
Thread storage-class-specifier.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
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)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
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',...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
bool isDiscardableGVALinkage(GVALinkage L)
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
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.
int hasAttribute(AttributeCommonInfo::Syntax Syntax, const IdentifierInfo *Scope, const IdentifierInfo *Attr, const TargetInfo &Target, const LangOptions &LangOpts)
Return the version number associated with the attribute if we recognize and implement the attribute s...
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
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.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ 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.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
@ None
The alignment was not explicit in code.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
MutableArrayRef< Expr * > MultiExprArg
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.
enum clang::DeclaratorChunk::@222 Kind
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
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
RetTy visit(QualType FT, Ts &&... Args)
EvalResult is a struct with detailed info about an evaluated expression.
A FunctionEffect plus a potential boolean expression determining whether the effect is declared (e....
std::string description() const
Return a textual description of the effect, and its condition, if any.
Extra information about a function prototype.
unsigned AArch64SMEAttributes
FunctionEffectsRef FunctionEffects
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
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 PragmaLocation
Information about a template-id annotation token.
unsigned NumArgs
NumArgs - The number of template arguments.
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.