62#include "llvm/ADT/ArrayRef.h"
63#include "llvm/ADT/STLForwardCompat.h"
64#include "llvm/ADT/ScopeExit.h"
65#include "llvm/ADT/SmallPtrSet.h"
66#include "llvm/ADT/SmallString.h"
67#include "llvm/ADT/StringExtras.h"
68#include "llvm/ADT/StringRef.h"
69#include "llvm/Support/SaveAndRestore.h"
70#include "llvm/TargetParser/Triple.h"
74#include <unordered_map>
81 Decl *Group[2] = { OwnedType, Ptr };
92 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
93 bool AllowTemplates =
false,
94 bool AllowNonTemplates =
true)
95 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
96 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
97 WantExpressionKeywords =
false;
98 WantCXXNamedCasts =
false;
99 WantRemainingKeywords =
false;
102 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
104 if (!AllowInvalidDecl && ND->isInvalidDecl())
108 return AllowTemplates;
114 if (AllowNonTemplates)
119 if (AllowTemplates) {
120 auto *RD = dyn_cast<CXXRecordDecl>(ND);
121 if (!RD || !RD->isInjectedClassName())
124 return RD->getDescribedClassTemplate() ||
131 return !WantClassName && candidate.
isKeyword();
134 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
135 return std::make_unique<TypeNameValidatorCCC>(*
this);
139 bool AllowInvalidDecl;
142 bool AllowNonTemplates;
149 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
150 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
152 FoundRD->isInjectedClassName() &&
156 ? diag::ext_out_of_line_qualified_id_type_names_constructor
157 : diag::err_out_of_line_qualified_id_type_names_constructor)
167enum class UnqualifiedTypeNameLookupResult {
178static UnqualifiedTypeNameLookupResult
183 return UnqualifiedTypeNameLookupResult::NotFound;
185 UnqualifiedTypeNameLookupResult FoundTypeDecl =
186 UnqualifiedTypeNameLookupResult::NotFound;
190 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
191 Base.getType().getCanonicalType())) {
194 if (!TST->isDependentType())
196 auto *TD = TST->getTemplateName().getAsTemplateDecl();
199 if (
auto *BasePrimaryTemplate =
200 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
202 BaseRD = BasePrimaryTemplate;
203 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
205 CTD->findPartialSpecialization(
Base.getType()))
214 return UnqualifiedTypeNameLookupResult::FoundNonType;
215 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
217 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
219 case UnqualifiedTypeNameLookupResult::FoundNonType:
220 return UnqualifiedTypeNameLookupResult::FoundNonType;
221 case UnqualifiedTypeNameLookupResult::FoundType:
222 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
224 case UnqualifiedTypeNameLookupResult::NotFound:
231 return FoundTypeDecl;
239 UnqualifiedTypeNameLookupResult FoundTypeDecl =
240 UnqualifiedTypeNameLookupResult::NotFound;
242 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
246 RD = dyn_cast<CXXRecordDecl>(DC);
250 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
256 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
276 bool HasTrailingDot,
ParsedType ObjectTypePtr,
277 bool IsCtorOrDtorName,
278 bool WantNontrivialTypeSourceInfo,
279 bool IsClassTemplateDeductionContext,
282 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
284 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
310 if (IsImplicitTypename) {
315 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
324 if (WantNontrivialTypeSourceInfo)
360 if (ObjectTypePtr &&
Result.empty()) {
384 switch (
Result.getResultKind()) {
387 TypeNameValidatorCCC CCC(
true, isClassName,
388 AllowDeducedTemplate);
394 bool MemberOfUnknownSpecialization;
403 if (Correction && (NNS || NewII != &II) &&
409 Template, MemberOfUnknownSpecialization))) {
411 isClassName, HasTrailingDot, ObjectTypePtr,
413 WantNontrivialTypeSourceInfo,
414 IsClassTemplateDeductionContext);
417 PDiag(diag::err_unknown_type_or_class_name_suggest)
418 <<
Result.getLookupName() << isClassName);
421 *CorrectedII = NewII;
426 Result.suppressDiagnostics();
442 Result.suppressDiagnostics();
452 Result.suppressDiagnostics();
458 Res != ResEnd; ++Res) {
467 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
479 Result.suppressDiagnostics();
490 IIDecl =
Result.getFoundDecl();
491 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
495 assert(IIDecl &&
"Didn't find decl");
498 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
504 if (FoundUsingShadow) {
508 if (!WantNontrivialTypeSourceInfo)
514 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
518 if (!WantNontrivialTypeSourceInfo)
524 TL.setNameLoc(NameLoc);
525 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
529 if (!WantNontrivialTypeSourceInfo)
535 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
539 if (!WantNontrivialTypeSourceInfo)
547 if (!WantNontrivialTypeSourceInfo)
558 if (!HasTrailingDot) {
561 if (!WantNontrivialTypeSourceInfo)
566 TL.setNameEndLoc(NameLoc);
569 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
573 }
else if (AllowDeducedTemplate) {
575 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
584 TL.setNameLoc(NameLoc);
592 Result.suppressDiagnostics();
601 auto *ND = dyn_cast<NamespaceDecl>(DC);
602 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
604 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
609 llvm_unreachable(
"something isn't in TU scope?");
620 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
621 if (MD->getParent()->hasAnyDependentBases())
629 bool IsTemplateTypeArg) {
630 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
633 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
642 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
651 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
682 switch (TD->getTagKind()) {
723 bool IsTemplateName) {
728 SuggestedType =
nullptr;
732 TypeNameValidatorCCC CCC(
false,
false,
739 bool CanRecover = !IsTemplateName;
740 if (Corrected.isKeyword()) {
743 PDiag(IsTemplateName ? diag::err_no_template_suggest
744 : diag::err_unknown_typename_suggest)
746 II = Corrected.getCorrectionAsIdentifierInfo();
749 if (!SS || !SS->
isSet()) {
751 PDiag(IsTemplateName ? diag::err_no_template_suggest
752 : diag::err_unknown_typename_suggest)
755 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
756 bool DroppedSpecifier =
757 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
760 ? diag::err_no_member_template_suggest
761 : diag::err_unknown_nested_typename_suggest)
762 << II << DC << DroppedSpecifier << SS->
getRange(),
765 llvm_unreachable(
"could not have corrected a typo here");
772 if (Corrected.getCorrectionSpecifier())
777 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
778 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
791 bool MemberOfUnknownSpecialization;
793 Name,
nullptr,
true, TemplateResult,
804 Diag(IILoc, IsTemplateName ? diag::err_no_template
805 : diag::err_unknown_typename)
808 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
809 : diag::err_typename_nested_not_found)
815 unsigned DiagID = diag::err_typename_missing;
817 DiagID = diag::ext_typename_missing;
828 "Invalid scope specifier has already been diagnosed");
836 NextToken.
is(tok::less);
856 StringRef FixItTagName;
857 switch (Tag->getTagKind()) {
859 FixItTagName =
"class ";
863 FixItTagName =
"enum ";
867 FixItTagName =
"struct ";
871 FixItTagName =
"__interface ";
875 FixItTagName =
"union ";
879 StringRef TagName = FixItTagName.drop_back();
880 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
881 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
886 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
901 const Token &NextToken,
906 assert(NextToken.
isNot(tok::coloncolon) &&
907 "parse nested name specifiers before calling ClassifyName");
948 bool SecondTry =
false;
949 bool IsFilteredTemplateName =
false;
952 switch (
Result.getResultKind()) {
956 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
1002 if (!SecondTry && CCC) {
1007 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1008 unsigned QualifiedDiag = diag::err_no_member_suggest;
1011 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1014 UnqualifiedDiag = diag::err_no_template_suggest;
1015 QualifiedDiag = diag::err_no_member_template_suggest;
1016 }
else if (UnderlyingFirstDecl &&
1020 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1021 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1027 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1028 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1029 Name->
getName() == CorrectedStr;
1032 << DroppedSpecifier << SS.
getRange());
1036 Name = Corrected.getCorrectionAsIdentifierInfo();
1039 if (Corrected.isKeyword())
1045 Result.setLookupName(Corrected.getCorrection());
1067 Result.suppressDiagnostics();
1109 if (!
Result.isAmbiguous()) {
1110 IsFilteredTemplateName =
true;
1120 (IsFilteredTemplateName ||
1136 if (!IsFilteredTemplateName)
1139 bool IsFunctionTemplate;
1143 IsFunctionTemplate =
true;
1146 }
else if (!
Result.empty()) {
1154 dyn_cast<UsingShadowDecl>(*
Result.begin());
1155 assert(!FoundUsingShadow ||
1164 IsFunctionTemplate =
true;
1168 if (IsFunctionTemplate) {
1172 Result.suppressDiagnostics();
1184 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1196 TTL.setNameLoc(NameLoc);
1223 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1224 Class = Alias->getClassInterface();
1230 if (NextToken.
is(tok::period)) {
1233 Result.suppressDiagnostics();
1243 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1249 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1262 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1263 if ((NextToken.
is(tok::identifier) ||
1265 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1277 if (
Result.isSingleResult() && !ADL &&
1282 Result.suppressDiagnostics();
1302 bool IsAddressOfOperand) {
1305 NameInfo, IsAddressOfOperand,
1312 const Token &NextToken) {
1314 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1330 if ((*ULE->decls_begin())->isCXXClassMember()) {
1332 SS.
Adopt(ULE->getQualifierLoc());
1337 Result.setNamingClass(ULE->getNamingClass());
1338 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1339 Result.addDecl(*I, I.getAccess());
1372 "The next DeclContext should be lexically contained in the current one.");
1378 assert(
CurContext &&
"DeclContext imbalance!");
1381 assert(
CurContext &&
"Popped translation unit!");
1391 assert(
CurContext &&
"skipping definition of undefined tag");
1419 assert(!S->
getEntity() &&
"scope already has entity");
1452 "expected to be initializing a template parameter scope");
1480 cast<Decl>(DC)->getDescribedTemplateParams()) {
1481 unsigned DCDepth = TPL->getDepth() + 1;
1482 if (DCDepth > ScopeDepth)
1484 if (ScopeDepth == DCDepth)
1503 "The next DeclContext should be lexically contained in the current one.");
1507 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1510 if (Param->getIdentifier()) {
1520 assert(
CurContext &&
"DeclContext imbalance!");
1522 assert(
CurContext &&
"Popped translation unit!");
1536 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1551 return ND->
hasAttr<OverloadableAttr>();
1554 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1589 for (; I != IEnd; ++I) {
1622 bool AllowInlineNamespace)
const {
1623 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1630 if (ScopeDC->getPrimaryContext() == TargetDC)
1642 bool ConsiderLinkage,
1643 bool AllowInlineNamespace) {
1661 if (
auto *VD = dyn_cast<VarDecl>(D))
1663 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1665 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1679 if (
New->getFriendObjectKind() &&
1720 if (NewIsModuleInterface || OldIsModuleInterface) {
1724 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1726 << NewIsModuleInterface
1728 << OldIsModuleInterface
1731 New->setInvalidDecl();
1744 if (!
New->getLexicalDeclContext()
1745 ->getNonTransparentContext()
1746 ->isFileContext() ||
1752 bool IsNewExported =
New->isInExportDeclContext();
1756 if (!IsNewExported && !IsOldExported)
1768 New->getOwningModule()->isImplicitGlobalModule())
1771 assert(IsNewExported);
1779 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1797 "New and Old are not the same definition, we should diagnostic it "
1798 "immediately instead of checking it.");
1801 "We shouldn't see unreachable definitions here.");
1849 return OldM == NewM;
1886 return CD->isCopyConstructor();
1893 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1894 if (!RD->hasNameForLinkage())
1923 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1929 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1932 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1937 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1941 if (FD->doesThisDeclarationHaveABody() &&
1942 Context.DeclMustBeEmitted(FD))
1944 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1951 if (
Context.DeclMustBeEmitted(VD))
1954 if (VD->isStaticDataMember() &&
1957 if (VD->isStaticDataMember() &&
1959 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1962 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1971 return mightHaveNonExternalLinkage(D);
1978 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1984 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1999 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2003 bool IsAllIgnored =
true;
2004 for (
const auto *BD : DD->bindings()) {
2005 if (BD->isReferenced())
2007 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2008 BD->hasAttr<UnusedAttr>());
2021 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2031 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2034 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2035 if (!WithinFunction)
2046 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2049 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2050 Init = Cleanups->getSubExpr();
2052 const auto *Ty = VD->getType().getTypePtr();
2057 if (TT->getDecl()->hasAttr<UnusedAttr>())
2063 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2064 MTE && MTE->getExtendingDecl()) {
2065 Ty = VD->getType().getNonReferenceType().getTypePtr();
2066 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2071 if (Ty->isIncompleteType() || Ty->isDependentType())
2076 Ty = Ty->getBaseElementTypeUnsafe();
2078 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2079 if (Tag->hasAttr<UnusedAttr>())
2082 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2083 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2087 const auto *Construct =
2088 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2089 if (Construct && !Construct->isElidable()) {
2091 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2092 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2098 if (
Init->isTypeDependent()) {
2100 if (!Ctor->isTrivial())
2141 for (
auto *TmpD : D->
decls()) {
2142 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2144 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2158 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2170 DiagID = diag::warn_unused_exception_param;
2172 DiagID = diag::warn_unused_label;
2174 DiagID = diag::warn_unused_variable;
2193 if (Ty->isReferenceType() || Ty->isDependentType())
2196 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2197 if (Tag->hasAttr<UnusedAttr>())
2201 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2202 RD && !RD->hasAttr<WarnUnusedAttr>())
2209 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2215 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2222 assert(iter->getSecond() >= 0 &&
2223 "Found a negative number of references to a VarDecl");
2224 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2234 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2235 if (!UnusedCXXCondDecl)
2239 unsigned DiagID =
isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2240 : diag::warn_unused_but_set_variable;
2250 bool Diagnose =
false;
2254 Diagnose = L->
getStmt() ==
nullptr;
2265 "Scope shouldn't contain decls!");
2272 std::optional<SourceLocation> PreviousDeclLoc;
2277 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2282 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2285 for (
auto *TmpD : S->
decls()) {
2286 assert(TmpD &&
"This decl didn't get pushed??");
2294 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2296 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2305 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2316 auto ShadowI = ShadowingDecls.find(D);
2317 if (ShadowI != ShadowingDecls.end()) {
2318 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2319 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2320 PDiag(diag::warn_ctor_parm_shadows_field)
2321 << D << FD << FD->getParent());
2323 ShadowingDecls.erase(ShadowI);
2327 llvm::sort(DeclDiags,
2328 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2333 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2335 for (
const LocAndDiag &D : DeclDiags) {
2337 if (D.PreviousDeclLoc)
2338 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2362 return "ucontext.h";
2364 llvm_unreachable(
"unhandled error kind");
2375 Parent->
addDecl(CLinkageDecl);
2376 Parent = CLinkageDecl;
2380 if (
Context.BuiltinInfo.isImmediate(ID)) {
2382 "consteval builtins should only be available in C++20 mode");
2391 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2397 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2400 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2402 Params.push_back(parm);
2404 New->setParams(Params);
2412 Scope *S,
bool ForRedeclaration,
2419 if (!ForRedeclaration)
2425 Context.BuiltinInfo.allowTypeMismatch(ID))
2431 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2432 <<
Context.BuiltinInfo.getName(ID);
2438 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2440 <<
Context.BuiltinInfo.getName(ID);
2444 if (!ForRedeclaration &&
2445 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2446 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2447 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2448 : diag::ext_implicit_lib_function_decl)
2449 <<
Context.BuiltinInfo.getName(ID) << R;
2450 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2451 Diag(Loc, diag::note_include_header_or_declare)
2452 << Header <<
Context.BuiltinInfo.getName(ID);
2488 while (Filter.hasNext()) {
2497 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2499 Decl->getUnderlyingType()))
2504 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2505 Decl->getAnonDeclWithTypedefName())
2517 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2518 OldType = OldTypedef->getUnderlyingType();
2520 OldType =
Context.getTypeDeclType(Old);
2526 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2530 New->setInvalidDecl();
2534 if (OldType != NewType &&
2537 !
Context.hasSameType(OldType, NewType)) {
2539 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2540 << Kind << NewType << OldType;
2543 New->setInvalidDecl();
2553 if (
New->isInvalidDecl())
return;
2559 switch (TypeID->getLength()) {
2563 if (!TypeID->isStr(
"id"))
2566 if (!
T->isPointerType())
2568 if (!
T->isVoidPointerType()) {
2573 Context.setObjCIdRedefinitionType(
T);
2575 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2580 if (!TypeID->isStr(
"Class"))
2582 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2584 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2588 if (!TypeID->isStr(
"SEL"))
2590 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2592 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2602 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2603 <<
New->getDeclName();
2609 return New->setInvalidDecl();
2614 return New->setInvalidDecl();
2616 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2617 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2618 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2621 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2625 if (OldTD->isModed())
2626 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2627 OldTD->getUnderlyingType());
2629 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2685 Diag(
New->getLocation(), diag::err_redefinition)
2686 <<
New->getDeclName();
2688 return New->setInvalidDecl();
2703 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2706 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2707 <<
New->getDeclName();
2714 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2716 for (
auto *ECD : ED->enumerators()) {
2727 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2728 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2729 for (
const auto *i : D->
attrs())
2730 if (i->getKind() == A->
getKind()) {
2746 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2747 return VD->isThisDeclarationADefinition();
2748 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2749 return TD->isCompleteDefinition() || TD->isBeingDefined();
2760 AlignedAttr *OldAlignasAttr =
nullptr;
2761 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2762 unsigned OldAlign = 0;
2770 if (I->isAlignmentDependent())
2776 unsigned Align = I->getAlignment(S.
Context);
2777 if (Align > OldAlign) {
2779 OldStrictestAlignAttr = I;
2784 AlignedAttr *NewAlignasAttr =
nullptr;
2785 unsigned NewAlign = 0;
2786 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2787 if (I->isAlignmentDependent())
2793 unsigned Align = I->getAlignment(S.
Context);
2794 if (Align > NewAlign)
2798 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2806 if (OldAlign == 0 || NewAlign == 0) {
2819 if (OldAlign != NewAlign) {
2820 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2823 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2836 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2838 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2842 bool AnyAdded =
false;
2845 if (OldAlign > NewAlign) {
2846 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2847 Clone->setInherited(
true);
2848 New->addAttr(Clone);
2853 if (OldAlignasAttr && !NewAlignasAttr &&
2854 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2855 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2856 Clone->setInherited(
true);
2857 New->addAttr(Clone);
2864#define WANT_DECL_MERGE_LOGIC
2865#include "clang/Sema/AttrParsedAttrImpl.inc"
2866#undef WANT_DECL_MERGE_LOGIC
2873 if (!DiagnoseMutualExclusions(S, D,
Attr))
2884 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2886 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2887 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2888 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2889 AA->getPriority(), AA->getEnvironment());
2890 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2892 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2894 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2896 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2898 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2900 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2901 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2903 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2905 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2906 else if (
const auto *MFA = dyn_cast<ModularFormatAttr>(
Attr))
2908 D, *MFA, MFA->getModularImplFn(), MFA->getImplName(),
2910 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2912 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2914 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2916 IA->getInheritanceModel());
2917 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2926 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2928 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2930 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2932 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2943 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2944 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2945 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2947 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2949 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2951 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2953 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2955 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2958 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2961 WS->getSpelledArgsCount());
2962 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2964 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2969 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2986 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
2987 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
2991 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2997 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2999 if (FD->isDefined(Def,
true))
3006 for (
const auto *Attribute : D->
attrs())
3007 if (Attribute->getKind() == Kind)
3015 if (!
New->hasAttrs())
3019 if (!Def || Def ==
New)
3023 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3024 Attr *NewAttribute = NewAttributes[I];
3033 NewAttributes.erase(NewAttributes.begin() + I);
3041 ? diag::err_alias_after_tentative
3042 : diag::err_redefinition;
3044 if (
Diag == diag::err_redefinition)
3054 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3090 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3091 if (AA->isAlignas()) {
3102 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3104 NewAttributes.erase(NewAttributes.begin() + I);
3114 diag::err_loader_uninitialized_redeclaration);
3116 NewAttributes.erase(NewAttributes.begin() + I);
3139 diag::err_sycl_entry_point_after_definition)
3152 diag::warn_attribute_precede_definition);
3154 NewAttributes.erase(NewAttributes.begin() + I);
3160 const ConstInitAttr *CIAttr,
3161 bool AttrBeforeInit) {
3168 std::string SuitableSpelling;
3170 SuitableSpelling = std::string(
3172 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3174 InsertLoc, {tok::l_square, tok::l_square,
3175 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3176 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3177 tok::r_square, tok::r_square}));
3178 if (SuitableSpelling.empty())
3180 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3181 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3182 tok::r_paren, tok::r_paren}));
3183 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3184 SuitableSpelling =
"constinit";
3185 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3186 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3187 if (SuitableSpelling.empty())
3188 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3189 SuitableSpelling +=
" ";
3191 if (AttrBeforeInit) {
3194 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3197 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3201 S.
Diag(CIAttr->getLocation(),
3202 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3203 : diag::warn_require_const_init_added_too_late)
3206 << CIAttr->isConstinit()
3214 UsedAttr *NewAttr = OldAttr->clone(
Context);
3215 NewAttr->setInherited(
true);
3216 New->addAttr(NewAttr);
3219 RetainAttr *NewAttr = OldAttr->clone(
Context);
3220 NewAttr->setInherited(
true);
3221 New->addAttr(NewAttr);
3230 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3231 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3232 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3240 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3243 if (InitDecl == NewVD) {
3247 if (OldConstInit && OldConstInit->isConstinit())
3250 }
else if (NewConstInit) {
3254 if (InitDecl && InitDecl != NewVD) {
3257 NewVD->dropAttr<ConstInitAttr>();
3265 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3266 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3267 if (!OldA->isEquivalent(NewA)) {
3269 Diag(
New->getLocation(), diag::err_different_asm_label);
3270 Diag(OldA->getLocation(), diag::note_previous_declaration);
3272 }
else if (Old->
isUsed()) {
3275 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3281 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3282 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3283 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3284 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3285 Diag(NewAbiTagAttr->getLocation(),
3286 diag::err_new_abi_tag_on_redeclaration)
3288 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3292 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3298 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3299 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3301 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3308 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3309 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3311 Diag(
New->getLocation(), diag::warn_mismatched_section)
3319 bool foundAny =
New->hasAttrs();
3349 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3362 if (!foundAny)
New->dropAttrs();
3367 checkAttrIsTypeDependent(D, A);
3378 newAttr->setInherited(
true);
3400 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3415 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3416 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3417 S.
Diag(CDA->getLocation(),
3418 diag::err_carries_dependency_missing_on_first_decl) << 1;
3426 diag::note_carries_dependency_missing_first_decl) << 1;
3445 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3446 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3454 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3486 if (*Oldnullability != *Newnullability) {
3487 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3504 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3505 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3506 if (OldParamDT && NewParamDT &&
3507 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3508 QualType OldParamOT = OldParamDT->getOriginalType();
3509 QualType NewParamOT = NewParamDT->getOriginalType();
3512 << NewParam << NewParamOT;
3523struct GNUCompatibleParamWarning {
3524 ParmVarDecl *OldParm;
3525 ParmVarDecl *NewParm;
3526 QualType PromotedType;
3533template <
typename T>
3534static std::pair<diag::kind, SourceLocation>
3538 if (Old->isThisDeclarationADefinition())
3539 PrevDiag = diag::note_previous_definition;
3540 else if (Old->isImplicit()) {
3541 PrevDiag = diag::note_previous_implicit_declaration;
3542 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3543 if (FD->getBuiltinID())
3544 PrevDiag = diag::note_previous_builtin_declaration;
3547 OldLocation =
New->getLocation();
3549 PrevDiag = diag::note_previous_declaration;
3550 return std::make_pair(PrevDiag, OldLocation);
3558 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3559 !LangOpts.CPlusPlus &&
3565 const AttributedType *AT =
T->getAs<AttributedType>();
3566 while (AT && !AT->isCallingConv())
3567 AT = AT->getModifiedType()->getAs<AttributedType>();
3571template <
typename T>
3585template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3592template<
typename ExpectedDecl>
3614 !Old->getDeclContext()->getRedeclContext()->Equals(
3615 New->getDeclContext()->getRedeclContext()) &&
3620 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3633 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3634 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3637 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3638 AttrA->isDynamic() == AttrB->isDynamic();
3664 if (NamedDC->Equals(SemaDC))
3667 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3669 "unexpected context for redeclaration");
3680 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3681 FixSemaDC(FD->getDescribedFunctionTemplate());
3682 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3683 FixSemaDC(VD->getDescribedVarTemplate());
3687 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3695 Diag(
New->getLocation(), diag::err_using_decl_friend);
3696 Diag(Shadow->getTargetDecl()->getLocation(),
3697 diag::note_using_decl_target);
3698 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3706 New->getDescribedFunctionTemplate()) {
3718 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3719 <<
New->getDeclName();
3743 std::tie(PrevDiag, OldLocation) =
3753 !
New->getTemplateSpecializationInfo() &&
3756 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3757 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3759 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3760 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3765 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3766 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3767 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3770 New->dropAttr<InternalLinkageAttr>();
3773 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3774 if (!Old->
hasAttr<ErrorAttr>()) {
3775 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3777 New->dropAttr<ErrorAttr>();
3785 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3786 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3787 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3796 const Decl *DiagOld = Old;
3798 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3799 const auto *A = D->getAttr<OverloadableAttr>();
3800 return A && !A->isImplicit();
3809 diag::note_attribute_overloadable_prev_overload)
3813 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3815 New->dropAttr<OverloadableAttr>();
3822 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3824 Diag(OldLocation, diag::note_previous_declaration);
3847 bool RequiresAdjustment =
false;
3849 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3855 if (!NewCCExplicit) {
3859 RequiresAdjustment =
true;
3867 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3871 RequiresAdjustment =
true;
3875 Diag(
New->getLocation(), diag::err_cconv_change)
3878 << (!FirstCCExplicit ?
"" :
3882 Diag(
First->getLocation(), diag::note_previous_declaration);
3890 RequiresAdjustment =
true;
3902 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3903 FPT2->getParamTypes(), EPI2);
3905 New->setType(NewQType);
3914 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3917 Diag(OldLocation, diag::note_previous_declaration);
3922 RequiresAdjustment =
true;
3928 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3929 <<
"'ns_returns_retained'";
3930 Diag(OldLocation, diag::note_previous_declaration);
3935 RequiresAdjustment =
true;
3941 AnyX86NoCallerSavedRegistersAttr *
Attr =
3942 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3943 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3944 Diag(OldLocation, diag::note_previous_declaration);
3949 RequiresAdjustment =
true;
3952 if (RequiresAdjustment) {
3956 NewQType =
Context.getCanonicalType(
New->getType());
3961 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3969 if (
New->hasAttr<GNUInlineAttr>() &&
3978 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
3979 <<
New->getDeclName();
3980 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3984 QualType OldQTypeForComparison = OldQType;
3985 if (
Context.hasAnyFunctionEffects()) {
3987 const auto NewFX =
New->getFunctionEffects();
3988 if (OldFX != NewFX) {
3990 for (
const auto &Diff : Diffs) {
3991 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
3993 diag::warn_mismatched_func_effect_redeclaration)
3994 << Diff.effectName();
4005 if (!MergeErrs.empty())
4012 NewFPT->getParamTypes(), EPI);
4014 New->setType(ModQT);
4015 NewQType =
New->getType();
4020 EPI = OldFPT->getExtProtoInfo();
4022 OldQTypeForComparison =
Context.getFunctionType(
4023 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4025 if (OldFX.empty()) {
4036 NewQType =
Context.getCanonicalType(
New->getType());
4044 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4045 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4047 OldDeclaredReturnType)) {
4052 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4054 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4055 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4056 <<
New <<
New->getReturnTypeSourceRange();
4058 !Old->
hasAttr<OverloadableAttr>() &&
4059 !
New->hasAttr<OverloadableAttr>())
4060 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4062 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4063 <<
New->getReturnTypeSourceRange();
4064 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4074 if (OldReturnType != NewReturnType) {
4078 if (OldAT && OldAT->isDeduced()) {
4079 QualType DT = OldAT->getDeducedType();
4090 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4092 if (OldMethod && NewMethod) {
4099 bool IsClassScopeExplicitSpecialization =
4105 !IsClassScopeExplicitSpecialization) {
4110 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4111 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4122 NewDiag = diag::err_constructor_redeclared;
4124 NewDiag = diag::err_destructor_redeclared;
4126 NewDiag = diag::err_conv_function_redeclared;
4128 NewDiag = diag::err_member_redeclared;
4130 Diag(
New->getLocation(), NewDiag);
4132 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4133 <<
New <<
New->getType();
4135 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4148 diag::err_definition_of_implicitly_declared_member)
4154 diag::err_definition_of_explicitly_defaulted_member)
4177 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4178 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4179 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4188 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4189 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4190 Diag(CDA->getLocation(),
4191 diag::err_carries_dependency_missing_on_first_decl) << 0;
4193 diag::note_carries_dependency_missing_first_decl) << 0;
4201 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4202 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4203 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4218 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4232 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4233 Diag(OldLocation, PrevDiag);
4235 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4236 Diag(OldLocation, PrevDiag);
4243 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4251 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4261 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4289 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4293 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4311 if (
New->hasWrittenPrototype()) {
4323 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4324 if (WithoutProto ==
New)
4325 IsWithoutProtoADef = NewDeclIsDefn;
4327 IsWithProtoADef = NewDeclIsDefn;
4329 diag::warn_non_prototype_changes_behavior)
4330 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4331 << (WithoutProto == Old) << IsWithProtoADef;
4341 !IsWithoutProtoADef)
4347 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4352 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4355 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4356 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4357 OldProto->getParamTypes(),
4358 OldProto->getExtProtoInfo());
4359 New->setType(NewQType);
4360 New->setHasInheritedPrototype();
4364 for (
const auto &ParamType : OldProto->param_types()) {
4367 ParamType,
nullptr,
SC_None,
nullptr);
4368 Param->setScopeInfo(0, Params.size());
4369 Param->setImplicit();
4370 Params.push_back(Param);
4373 New->setParams(Params);
4382 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4409 NewProto->getReturnType());
4410 bool LooseCompatible = !MergedReturn.isNull();
4412 LooseCompatible && Idx != End; ++Idx) {
4416 NewProto->getParamType(Idx))) {
4417 ArgTypes.push_back(NewParm->
getType());
4421 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4422 NewProto->getParamType(Idx) };
4423 Warnings.push_back(Warn);
4424 ArgTypes.push_back(NewParm->
getType());
4426 LooseCompatible =
false;
4429 if (LooseCompatible) {
4430 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4431 Diag(Warnings[Warn].NewParm->getLocation(),
4432 diag::ext_param_promoted_not_compatible_with_prototype)
4433 << Warnings[Warn].PromotedType
4434 << Warnings[Warn].OldParm->getType();
4435 if (Warnings[Warn].OldParm->getLocation().isValid())
4436 Diag(Warnings[Warn].OldParm->getLocation(),
4437 diag::note_previous_declaration);
4440 if (MergeTypeWithOld)
4441 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4458 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4459 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4460 Diag(OldLocation, diag::note_previous_builtin_declaration)
4465 PrevDiag = diag::note_previous_builtin_declaration;
4468 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4469 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4474 Scope *S,
bool MergeTypeWithOld) {
4480 New->setIsPureVirtual();
4489 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4503 if (!Merged.isNull() && MergeTypeWithOld)
4504 New->setType(Merged);
4528 ni != ne && oi != oe; ++ni, ++oi)
4537 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4538 ? diag::err_redefinition_different_type
4539 : diag::err_redeclaration_different_type)
4544 std::tie(PrevDiag, OldLocation)
4546 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4547 New->setInvalidDecl();
4551 bool MergeTypeWithOld) {
4557 if (
New->getType()->isUndeducedType()) {
4579 QualType PrevVDTy = PrevVD->getType();
4583 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4591 MergedT =
New->getType();
4602 else if (
New->getType()->isObjCObjectPointerType() &&
4604 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4619 if ((
New->getType()->isDependentType() ||
4624 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4633 if (MergeTypeWithOld)
4634 New->setType(MergedT);
4668 if (
New->isInvalidDecl())
4681 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4685 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4687 return New->setInvalidDecl();
4689 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4692 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4694 return New->setInvalidDecl();
4698 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4699 <<
New->getDeclName();
4701 New->getLocation());
4702 return New->setInvalidDecl();
4714 return New->setInvalidDecl();
4721 Diag(
New->getLocation(), diag::err_duplicate_member)
4722 <<
New->getIdentifier();
4724 New->setInvalidDecl();
4730 if (
New->hasAttr<WeakImportAttr>())
4733 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4736 New->dropAttr<WeakImportAttr>();
4741 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4742 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4743 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4746 New->dropAttr<InternalLinkageAttr>();
4751 if (MostRecent != Old) {
4754 if (
New->isInvalidDecl())
4759 if (
New->isInvalidDecl())
4764 std::tie(PrevDiag, OldLocation) =
4769 !
New->isStaticDataMember() &&
4772 Diag(
New->getLocation(), diag::ext_static_non_static)
4773 <<
New->getDeclName();
4774 Diag(OldLocation, PrevDiag);
4776 Diag(
New->getLocation(), diag::err_static_non_static)
4777 <<
New->getDeclName();
4778 Diag(OldLocation, PrevDiag);
4779 return New->setInvalidDecl();
4793 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4794 !
New->isStaticDataMember() &&
4796 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4797 Diag(OldLocation, PrevDiag);
4798 return New->setInvalidDecl();
4802 if (
New->hasExternalStorage() &&
4804 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4805 Diag(OldLocation, PrevDiag);
4806 return New->setInvalidDecl();
4809 !
New->hasExternalStorage()) {
4810 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4811 Diag(OldLocation, PrevDiag);
4812 return New->setInvalidDecl();
4822 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4825 !
New->getLexicalDeclContext()->isRecord())) {
4826 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4827 Diag(OldLocation, PrevDiag);
4828 return New->setInvalidDecl();
4836 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4837 Diag(Def->getLocation(), diag::note_previous_definition);
4851 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4852 Diag(OldLocation, PrevDiag);
4853 }
else if (!
New->getTLSKind()) {
4854 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4855 Diag(OldLocation, PrevDiag);
4861 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4863 Diag(OldLocation, PrevDiag);
4873 diag::warn_deprecated_redundant_constexpr_static_def);
4886 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4893 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4894 Diag(OldLocation, PrevDiag);
4895 New->setInvalidDecl();
4904 New->setPreviousDecl(Old);
4914 New->setImplicitlyInline();
4919 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4921 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4922 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4923 auto &HSI =
PP.getHeaderSearchInfo();
4924 StringRef HdrFilename =
4927 auto noteFromModuleOrInclude = [&](
Module *Mod,
4933 if (IncLoc.isValid()) {
4935 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4941 Diag(IncLoc, diag::note_redefinition_include_same_file)
4942 << HdrFilename.str();
4952 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4960 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4976 New->getDescribedVarTemplate() ||
New->getNumTemplateParameterLists() ||
4977 New->getDeclContext()->isDependentContext() ||
4978 New->hasAttr<SelectAnyAttr>())) {
4981 New->demoteThisDefinitionToDeclaration();
4989 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
4991 New->setInvalidDecl();
5017 if (!
Context.getLangOpts().CPlusPlus)
5023 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5026 Context.getManglingNumberContext(Tag->getParent());
5035 Decl *ManglingContextDecl;
5036 std::tie(MCtx, ManglingContextDecl) =
5046struct NonCLikeKind {
5058 explicit operator bool() {
return Kind !=
None; }
5066 return {NonCLikeKind::Invalid, {}};
5073 return {NonCLikeKind::BaseClass,
5085 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5086 if (FD->hasInClassInitializer()) {
5087 auto *
Init = FD->getInClassInitializer();
5088 return {NonCLikeKind::DefaultMemberInit,
5104 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5112 if (MemberRD->isLambda())
5113 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5117 if (MemberRD->isThisDeclarationADefinition()) {
5123 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5140 Context.getCanonicalTagType(TagFromDeclSpec))) {
5142 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5153 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5157 if (NonCLike || ChangesLinkage) {
5158 if (NonCLike.Kind == NonCLikeKind::Invalid)
5161 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5162 if (ChangesLinkage) {
5164 if (NonCLike.Kind == NonCLikeKind::None)
5165 DiagID = diag::err_typedef_changes_linkage;
5167 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5173 TextToInsert +=
' ';
5176 Diag(FixitLoc, DiagID)
5179 if (NonCLike.Kind != NonCLikeKind::None) {
5180 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5181 << NonCLike.Kind - 1 << NonCLike.Range;
5184 << NewTD << isa<TypeAliasDecl>(NewTD);
5209 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5210 if (ED->isScopedUsingClassTag())
5217 llvm_unreachable(
"unexpected type specifier");
5225 bool IsExplicitInstantiation,
5228 Decl *TagD =
nullptr;
5246 Tag = CTD->getTemplatedDecl();
5251 Tag->setFreeStanding();
5252 if (Tag->isInvalidDecl())
5261 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5298 "Friend ellipsis but not friend-specified?");
5301 bool DeclaresAnything =
true;
5305 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5308 Record->getDeclContext()->isRecord()) {
5322 DeclaresAnything =
false;
5341 if ((Tag && Tag->getDeclName()) ||
5351 DeclaresAnything =
false;
5363 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5364 !
Enum->isInvalidDecl())
5365 DeclaresAnything =
false;
5373 DeclaresAnything =
false;
5377 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5379 << Tag->getTagKind()
5392 if (!DeclaresAnything) {
5395 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5396 ? diag::err_no_declarators
5397 : diag::ext_no_declarators)
5410 unsigned DiagID = diag::warn_standalone_specifier;
5412 DiagID = diag::ext_standalone_specifier;
5453 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5454 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5456 DiagnosticId = diag::warn_attribute_ignored;
5457 else if (AL.isRegularKeywordAttribute())
5458 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5460 DiagnosticId = diag::warn_declspec_attribute_ignored;
5461 Diag(AL.getLoc(), DiagnosticId)
5465 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5466 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5490 assert(PrevDecl &&
"Expected a non-null Decl");
5503 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5505 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5511 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5521 if (
Record->isAnonymousStructOrUnion())
5526 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5560 for (
auto *D : AnonRecord->
decls()) {
5583 unsigned OldChainingSize = Chaining.size();
5585 Chaining.append(IF->chain_begin(), IF->chain_end());
5587 Chaining.push_back(VD);
5589 assert(Chaining.size() >= 2);
5592 for (
unsigned i = 0; i < Chaining.size(); i++)
5593 NamedChain[i] = Chaining[i];
5597 VD->
getType(), {NamedChain, Chaining.size()});
5611 Chaining.resize(OldChainingSize);
5625 "Parser allowed 'typedef' as storage class VarDecl.");
5626 switch (StorageClassSpec) {
5640 llvm_unreachable(
"unknown storage class specifier");
5644 assert(
Record->hasInClassInitializer());
5646 for (
const auto *I :
Record->decls()) {
5647 const auto *FD = dyn_cast<FieldDecl>(I);
5648 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5649 FD = IFD->getAnonField();
5650 if (FD && FD->hasInClassInitializer())
5651 return FD->getLocation();
5654 llvm_unreachable(
"couldn't find in-class initializer");
5662 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5682 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5684 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5686 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5692 const char *PrevSpec =
nullptr;
5704 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5709 PrevSpec, DiagID, Policy);
5717 diag::err_anonymous_union_with_storage_spec)
5723 PrevSpec, DiagID,
Context.getPrintingPolicy());
5731 <<
Record->isUnion() <<
"const"
5735 diag::ext_anonymous_struct_union_qualified)
5736 <<
Record->isUnion() <<
"volatile"
5740 diag::ext_anonymous_struct_union_qualified)
5741 <<
Record->isUnion() <<
"restrict"
5745 diag::ext_anonymous_struct_union_qualified)
5746 <<
Record->isUnion() <<
"_Atomic"
5750 diag::ext_anonymous_struct_union_qualified)
5751 <<
Record->isUnion() <<
"__unaligned"
5761 for (
auto *Mem :
Record->decls()) {
5763 if (Mem->isInvalidDecl())
5766 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5770 assert(FD->getAccess() !=
AS_none);
5772 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5784 }
else if (Mem->isImplicit()) {
5791 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5792 if (!MemRecord->isAnonymousStructOrUnion() &&
5793 MemRecord->getDeclName()) {
5796 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5800 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5808 Diag(MemRecord->getLocation(),
5809 diag::ext_anonymous_record_with_anonymous_type)
5819 unsigned DK = diag::err_anonymous_record_bad_member;
5821 DK = diag::err_anonymous_record_with_type;
5823 DK = diag::err_anonymous_record_with_function;
5825 DK = diag::err_anonymous_record_with_static;
5829 DK == diag::err_anonymous_record_with_type)
5830 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5833 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5849 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5870 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5874 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5890 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5896 Record->getLocation(),
nullptr,
5912 Record->setAnonymousStructOrUnion(
true);
5923 Chain.push_back(Anon);
5929 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5932 Decl *ManglingContextDecl;
5933 std::tie(MCtx, ManglingContextDecl) =
5952 assert(
Record &&
"expected a record!");
5957 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5965 nullptr, RecTy, TInfo,
5977 Chain.push_back(Anon);
5981 diag::err_field_incomplete_or_sizeless) ||
5986 ParentDecl->setInvalidDecl();
6023 diag::err_deduction_guide_name_not_class_template)
6043 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6053 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6054 Context.getCanonicalType(Ty)));
6065 Context.getCanonicalType(Ty)));
6086 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6098 Context.getCanonicalType(Ty)));
6106 return Context.getNameForTemplate(TName, TNameLoc);
6111 llvm_unreachable(
"Unknown name kind");
6139 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6144 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6152 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6153 (DeclTyName && DeclTyName == DefTyName))
6154 Params.push_back(Idx);
6181#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6182#include "clang/Basic/TransformTypeTraits.def"
6187 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6197 if (!TSI)
return true;
6210 if (Result.isInvalid())
return true;
6255 << D << static_cast<int>(Status);
6266 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6267 llvm::omp::TraitProperty::
6268 implementation_extension_bind_to_declaration))
6293 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6304 bool IsMemberSpecialization) {
6305 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6306 "without nested-name-specifier");
6322 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6323 : diag::err_member_extra_qualification)
6327 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6335 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6337 Diag(Loc, diag::err_member_qualification)
6340 Diag(Loc, diag::err_invalid_declarator_global_scope)
6343 Diag(Loc, diag::err_invalid_declarator_in_function)
6346 Diag(Loc, diag::err_invalid_declarator_in_block)
6350 Diag(Loc, diag::err_export_non_namespace_scope_name)
6357 Diag(Loc, diag::err_invalid_declarator_scope)
6365 Diag(Loc, diag::err_member_qualification)
6392 Diag(Loc, diag::ext_template_after_declarative_nns)
6397 TL = std::exchange(NextTL,
TypeLoc())) {
6399 switch (TL.getTypeLocClass()) {
6400 case TypeLoc::TemplateSpecialization: {
6402 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6403 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6404 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6405 << TST.getLocalSourceRange();
6408 case TypeLoc::Decltype:
6409 case TypeLoc::PackIndexing: {
6410 const Type *
T = TL.getTypePtr();
6417 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6418 <<
T->isDecltypeType() << TL.getSourceRange();
6421 case TypeLoc::DependentName:
6428 if (TemplateKeywordLoc.
isValid())
6429 Diag(Loc, diag::ext_template_after_declarative_nns)
6470 diag::err_template_qualified_declarator_no_match)
6477 if (!IsDependentContext &&
6484 diag::err_member_def_undefined_record)
6505 if (EnteringContext && IsDependentContext &&
6506 TemplateParamLists.size() != 0) {
6525 bool IsLinkageLookup =
false;
6526 bool CreateBuiltins =
false;
6540 IsLinkageLookup =
true;
6542 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6543 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6545 CreateBuiltins =
true;
6547 if (IsLinkageLookup) {
6589 bool AllowForCompatibility =
false;
6592 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6593 TemplateParamParent->isDeclScope(TPD);
6596 AllowForCompatibility);
6626 bool AddToScope =
true;
6628 if (TemplateParamLists.size()) {
6650 if (
New->getDeclName() && AddToScope)
6653 if (
OpenMP().isInOpenMPDeclareTargetContext())
6664 bool &SizeIsNegative,
6665 llvm::APSInt &Oversized) {
6670 SizeIsNegative =
false;
6673 if (
T->isDependentType())
6679 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6684 if (FixedType.
isNull())
return FixedType;
6685 FixedType = Context.getPointerType(FixedType);
6686 return Qs.
apply(Context, FixedType);
6688 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6689 QualType Inner = PTy->getInnerType();
6693 if (FixedType.
isNull())
return FixedType;
6694 FixedType = Context.getParenType(FixedType);
6695 return Qs.
apply(Context, FixedType);
6705 SizeIsNegative, Oversized);
6715 llvm::APSInt Res = Result.Val.getInt();
6718 if (Res.isSigned() && Res.isNegative()) {
6719 SizeIsNegative =
true;
6724 unsigned ActiveSizeBits =
6728 : Res.getActiveBits();
6734 QualType FoldedArrayType = Context.getConstantArrayType(
6736 return Qs.
apply(Context, FoldedArrayType);
6761 TypeLoc DstElemTL = DstATL.getElementLoc();
6780 bool &SizeIsNegative,
6781 llvm::APSInt &Oversized) {
6784 SizeIsNegative, Oversized);
6787 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6795 unsigned FailedFoldDiagID) {
6796 bool SizeIsNegative;
6797 llvm::APSInt Oversized;
6799 TInfo,
Context, SizeIsNegative, Oversized);
6801 Diag(Loc, diag::ext_vla_folded_to_constant);
6808 Diag(Loc, diag::err_typecheck_negative_array_size);
6809 else if (Oversized.getBoolValue())
6811 Oversized, 10, Oversized.isSigned(),
false,
6813 else if (FailedFoldDiagID)
6814 Diag(Loc, FailedFoldDiagID);
6826 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6831 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6840 diag::err_virtual_non_function);
6844 diag::err_explicit_non_function);
6848 diag::err_noreturn_non_function);
6869 ? diag::warn_ms_inline_non_function
6870 : diag::err_inline_non_function)
6874 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6879 diag::err_deduction_guide_invalid_specifier)
6888 if (!NewTD)
return nullptr;
6909 if (
T->isVariablyModifiedType()) {
6913 bool SizeIsNegative;
6914 llvm::APSInt Oversized;
6925 else if (
T->isVariableArrayType())
6927 else if (Oversized.getBoolValue())
6964 switch (II->getNotableIdentifierID()) {
6965 case tok::NotableIdentifierKind::FILE:
6968 case tok::NotableIdentifierKind::jmp_buf:
6969 Context.setjmp_bufDecl(NewTD);
6971 case tok::NotableIdentifierKind::sigjmp_buf:
6972 Context.setsigjmp_bufDecl(NewTD);
6974 case tok::NotableIdentifierKind::ucontext_t:
6975 Context.setucontext_tDecl(NewTD);
6977 case tok::NotableIdentifierKind::float_t:
6978 case tok::NotableIdentifierKind::double_t:
6979 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7016 if (Context.getLangOpts().CPlusPlus) {
7040 if (!OuterContext->
Equals(PrevOuterContext))
7049 if (!SS.
isSet())
return;
7054 if (
Decl->getType().hasAddressSpace())
7056 if (
Decl->getType()->isDependentType())
7068 Var->hasGlobalStorage())
7072 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
7073 auto OrigTy = DT->getOriginalType();
7074 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
7077 OrigTy =
Context.getAddrSpaceQualType(OrigTy, ImplAS);
7105 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7114 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7115 if (VD->hasInit()) {
7116 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7117 assert(VD->isThisDeclarationADefinition() &&
7118 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7120 VD->dropAttr<AliasAttr>();
7129 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7132 diag::err_attribute_selectany_non_extern_data);
7139 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7142 diag::warn_attribute_hybrid_patchable_non_extern);
7148 auto *VD = dyn_cast<VarDecl>(&ND);
7149 bool IsAnonymousNS =
false;
7152 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7153 while (NS && !IsAnonymousNS) {
7155 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7162 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7164 (!AnonNSInMicrosoftMode &&
7175 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7176 FD = FD->getMostRecentDecl();
7181 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7187 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7188 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7189 int NoImplicitObjectError = -1;
7191 NoImplicitObjectError = 0;
7192 else if (MD->isStatic())
7193 NoImplicitObjectError = 1;
7194 else if (MD->isExplicitObjectMemberFunction())
7195 NoImplicitObjectError = 2;
7196 if (NoImplicitObjectError != -1) {
7197 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7198 << NoImplicitObjectError << A->getRange();
7200 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7202 }
else if (MD->getReturnType()->isVoidType()) {
7206 err_lifetimebound_implicit_object_parameter_void_return_type);
7211 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7216 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7218 S.
Diag(A->getLocation(),
7219 diag::err_lifetimebound_parameter_void_return_type);
7227 if (ND.
hasAttr<ModularFormatAttr>() && !ND.
hasAttr<FormatAttr>())
7228 S.
Diag(ND.
getLocation(), diag::err_modular_format_attribute_no_format);
7248 bool IsSpecialization,
7249 bool IsDefinition) {
7253 bool IsTemplate =
false;
7254 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7255 OldDecl = OldTD->getTemplatedDecl();
7257 if (!IsSpecialization)
7258 IsDefinition =
false;
7260 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7261 NewDecl = NewTD->getTemplatedDecl();
7265 if (!OldDecl || !NewDecl)
7268 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7269 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7270 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7271 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7275 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7276 (NewExportAttr && !NewExportAttr->isInherited());
7282 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7284 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7286 bool JustWarn =
false;
7288 auto *VD = dyn_cast<VarDecl>(OldDecl);
7289 if (VD && !VD->getDescribedVarTemplate())
7291 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7303 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7304 : diag::err_attribute_dll_redeclaration;
7307 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7320 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7322 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7325 IsStaticDataMember = VD->isStaticDataMember();
7326 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7328 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7329 IsInline = FD->isInlined();
7330 IsQualifiedFriend = FD->getQualifier() &&
7334 if (OldImportAttr && !HasNewAttr &&
7335 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7337 if (IsMicrosoftABI && IsDefinition) {
7338 if (IsSpecialization) {
7341 diag::err_attribute_dllimport_function_specialization_definition);
7342 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7343 NewDecl->
dropAttr<DLLImportAttr>();
7346 diag::warn_redeclaration_without_import_attribute)
7349 NewDecl->
dropAttr<DLLImportAttr>();
7350 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7351 S.
Context, NewImportAttr->getRange()));
7353 }
else if (IsMicrosoftABI && IsSpecialization) {
7354 assert(!IsDefinition);
7358 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7359 << NewDecl << OldImportAttr;
7361 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7362 OldDecl->
dropAttr<DLLImportAttr>();
7363 NewDecl->
dropAttr<DLLImportAttr>();
7365 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7368 OldDecl->
dropAttr<DLLImportAttr>();
7369 NewDecl->
dropAttr<DLLImportAttr>();
7371 diag::warn_dllimport_dropped_from_inline_function)
7372 << NewDecl << OldImportAttr;
7379 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7381 !NewImportAttr && !NewExportAttr) {
7382 if (
const DLLExportAttr *ParentExportAttr =
7383 MD->getParent()->getAttr<DLLExportAttr>()) {
7384 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7385 NewAttr->setInherited(
true);
7437 return D->isExternC();
7454 llvm_unreachable(
"Unexpected context");
7464 llvm_unreachable(
"Unexpected context");
7509 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7510 return FD->isExternC();
7511 if (
const auto *VD = dyn_cast<VarDecl>(D))
7512 return VD->isExternC();
7514 llvm_unreachable(
"Unknown type of decl!");
7527 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7541 diag::err_invalid_type_for_program_scope_var)
7570 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7603 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7613template <
typename AttrTy>
7616 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7617 AttrTy *Clone = Attribute->clone(S.
Context);
7618 Clone->setInherited(
true);
7646 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7648 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7655 "NewD is not a function or variable");
7664 if (IdentName ==
nullptr)
7668 auto &Label = PendingName->second;
7674 Diag(Label.NameLoc, diag::warn_pragma_not_applied) <<
"export" << NewD;
7684 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7698 QualType R = TInfo->
getType();
7703 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7707 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7709 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7719 const auto &TI =
Context.getTargetInfo();
7720 bool HasSizeMismatch;
7722 if (!TI.isValidGCCRegisterName(Label))
7723 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7724 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7726 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7727 else if (HasSizeMismatch)
7728 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7733 diag::err_asm_unsupported_register_type)
7748 bool IsPlaceholderVariable =
false;
7754 if (!Decomp.bindings().empty()) {
7755 II = Decomp.bindings()[0].Name;
7769 IsPlaceholderVariable =
true;
7777 if (IsPlaceholderVariable)
7791 bool IsLocalExternDecl = SC ==
SC_Extern &&
7810 : diag::warn_deprecated_register)
7833 const AutoType *AT = TL.getTypePtr();
7837 bool IsMemberSpecialization =
false;
7838 bool IsVariableTemplateSpecialization =
false;
7840 bool IsVariableTemplate =
false;
7869 false, IsMemberSpecialization,
Invalid);
7871 if (TemplateParams) {
7878 if (!TemplateParams->
size() &&
7883 diag::err_template_variable_noparams)
7887 TemplateParams =
nullptr;
7895 IsVariableTemplateSpecialization =
true;
7899 IsVariableTemplate =
true;
7907 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7912 "should have a 'template<>' for this decl");
7915 bool IsExplicitSpecialization =
7926 (IsExplicitSpecialization || IsMemberSpecialization)) {
7928 diag::ext_explicit_specialization_storage_class)
7934 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7940 if (Ctxt->isFunctionOrMethod()) {
7941 FunctionOrMethod = Ctxt;
7944 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7946 AnonStruct = ParentDecl;
7950 if (FunctionOrMethod) {
7954 diag::err_static_data_member_not_allowed_in_local_class)
7955 << Name << RD->getDeclName() << RD->getTagKind();
7956 }
else if (AnonStruct) {
7961 diag::err_static_data_member_not_allowed_in_anon_struct)
7964 }
else if (RD->isUnion()) {
7968 diag_compat::static_data_member_in_union)
7986 diag::err_static_out_of_line)
7999 diag::err_storage_class_for_static_member)
8004 llvm_unreachable(
"C storage class in c++!");
8008 if (IsVariableTemplateSpecialization) {
8010 TemplateParamLists.size() > 0
8011 ? TemplateParamLists[0]->getTemplateLoc()
8014 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
8029 if (IsVariableTemplate) {
8032 TemplateParams, NewVD);
8053 unsigned VDTemplateParamLists =
8054 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8055 if (TemplateParamLists.size() > VDTemplateParamLists)
8057 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8064 }
else if (
CurContext->isFunctionOrMethod()) {
8067 diag::err_inline_declaration_block_scope) << Name
8072 : diag::compat_pre_cxx17_inline_variable);
8083 if (IsLocalExternDecl) {
8086 B->setLocalExternDecl();
8091 bool EmitTLSUnsupportedError =
false;
8104 diag::err_thread_non_global)
8106 else if (!
Context.getTargetInfo().isTLSSupported()) {
8111 EmitTLSUnsupportedError =
true;
8118 diag::err_thread_unsupported);
8129 diag::err_constexpr_wrong_decl_kind)
8130 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8140 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8147 diag::err_constinit_local_variable);
8151 ConstInitAttr::Keyword_constinit));
8169 diag::warn_static_local_in_extern_inline);
8175 if (IsVariableTemplateSpecialization)
8180 else if (IsMemberSpecialization)
8195 B->setModulePrivate();
8205 diag::err_opencl_unknown_type_specifier)
8215 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8216 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8232 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8262 if (EmitTLSUnsupportedError &&
8265 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8267 diag::err_thread_unsupported);
8269 if (EmitTLSUnsupportedError &&
8276 (NewVD->
hasAttr<CUDASharedAttr>() ||
8277 NewVD->
hasAttr<CUDAConstantAttr>())) {
8285 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8286 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8291 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8298 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8310 IsMemberSpecialization ||
8311 IsVariableTemplateSpecialization);
8325 if (IsMemberSpecialization && !IsVariableTemplate &&
8326 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8343 !IsVariableTemplateSpecialization) {
8351 if (!IsPlaceholderVariable)
8382 if (PrevVarTemplate &&
8403 Decl *ManglingContextDecl;
8404 std::tie(MCtx, ManglingContextDecl) =
8540 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8541 if (
const auto *MD =
8545 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8551 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8554 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8559 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8560 if (shadowedVar->isExternC()) {
8563 for (
auto *I : shadowedVar->redecls())
8564 if (I->isFileVarDecl()) {
8572 unsigned WarningDiag = diag::warn_decl_shadow;
8575 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8581 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8587 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8593 ->ShadowingDecls.push_back({D, VD});
8604 ->ShadowingDecls.push_back({D, ShadowedDecl});
8610 bool HasLocalStorage =
false;
8611 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8612 HasLocalStorage = VD->hasLocalStorage();
8613 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8617 if (HasLocalStorage) {
8622 ParentDC && !ParentDC->
Equals(OldDC);
8665 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8672 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8678 Diag(Shadow.VD->getLocation(),
8679 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8680 : diag::warn_decl_shadow)
8681 << Shadow.VD->getDeclName()
8684 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8685 << Shadow.VD->getDeclName() << 0;
8688 Diag(Shadow.VD->getLocation(),
8690 : diag::warn_decl_shadow_uncaptured_local)
8691 << Shadow.VD->getDeclName()
8717 auto *DRE = dyn_cast<DeclRefExpr>(E);
8721 auto I = ShadowingDecls.find(D);
8722 if (I == ShadowingDecls.end())
8724 const NamedDecl *ShadowedDecl = I->second;
8726 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8731 ShadowingDecls.erase(I);
8739 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8798 assert(Prev &&
"should have found a previous declaration to diagnose");
8800 Prev = FD->getFirstDecl();
8804 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8826 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8838 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8858 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8868 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8876 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8892 if (
T->isUndeducedType())
8898 if (
T->isObjCObjectType()) {
8901 T =
Context.getObjCObjectPointerType(
T);
8932 if (NewVD->
hasAttr<BlocksAttr>()) {
8937 if (
T->isBlockPointerType()) {
8940 if (!
T.isConstQualified()) {
8941 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8947 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8956 if (!
T->isSamplerT() && !
T->isDependentType() &&
8963 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8964 <<
Scope <<
"global or constant";
8966 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8967 <<
Scope <<
"constant";
8981 bool AllowFunctionScopeLocalVariables =
8984 "__cl_clang_function_scope_local_variables",
getLangOpts());
8985 if (AllowFunctionScopeLocalVariables) {
8992 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
9004 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
9029 && !NewVD->
hasAttr<BlocksAttr>()) {
9040 if (
T->isWebAssemblyTableType()) {
9051 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
9052 if (!ATy || ATy->getZExtSize() != 0) {
9054 diag::err_typecheck_wasm_table_must_have_zero_length);
9064 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9067 ArrayT && ArrayT->isZeroSize()) {
9073 bool isVM =
T->isVariablyModifiedType();
9074 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9080 bool SizeIsNegative;
9081 llvm::APSInt Oversized;
9086 FixedT = FixedTInfo->
getType();
9087 else if (FixedTInfo) {
9093 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9126 if (
T->isVoidType()) {
9144 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9150 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9163 !
T->isDependentType() &&
9165 diag::err_constexpr_var_non_literal)) {
9171 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9181 llvm::StringMap<bool> CallerFeatureMap;
9182 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9184 CallerFeatureMap)) {
9192 llvm::StringMap<bool> CallerFeatureMap;
9193 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9226 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9231 Name =
Context.DeclarationNames.getCXXDestructorName(
9232 Context.getCanonicalTagType(BaseRecord));
9237 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9244 if (Overridden.insert(BaseMD).second) {
9261 return !Overridden.empty();
9267 struct ActOnFDArgs {
9281 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9282 CXXRecordDecl *Parent)
9283 : Context(Context), OriginalFD(TypoFD),
9286 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9290 SmallVector<unsigned, 1> MismatchedParams;
9292 CDeclEnd = candidate.
end();
9293 CDecl != CDeclEnd; ++CDecl) {
9294 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9298 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9299 CXXRecordDecl *Parent = MD->getParent();
9302 }
else if (!ExpectedParent) {
9311 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9312 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9316 ASTContext &Context;
9317 FunctionDecl *OriginalFD;
9318 CXXRecordDecl *ExpectedParent;
9338 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9346 IsLocalFriend ? diag::err_no_matching_local_friend :
9348 diag::err_member_decl_does_not_match;
9360 "Cannot have an ambiguity in previous-declaration lookup");
9362 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9364 if (!Prev.
empty()) {
9373 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9374 NearMatches.push_back(std::make_pair(FD, ParamNum));
9382 IsLocalFriend ?
nullptr : NewDC))) {
9389 CDeclEnd = Correction.
end();
9390 CDecl != CDeclEnd; ++CDecl) {
9410 ExtraArgs.S, ExtraArgs.D,
9413 ExtraArgs.AddToScope);
9424 if ((*I)->getCanonicalDecl() == Canonical)
9431 SemaRef.
PDiag(IsLocalFriend
9432 ? diag::err_no_matching_local_friend_suggest
9433 : diag::err_member_decl_does_not_match_suggest)
9434 << Name << NewDC << IsDefinition);
9447 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9450 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9456 bool NewFDisConst = NewMD && NewMD->
isConst();
9459 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9460 NearMatch != NearMatchEnd; ++NearMatch) {
9463 bool FDisConst = MD && MD->
isConst();
9464 bool IsMember = MD || !IsLocalFriend;
9467 if (
unsigned Idx = NearMatch->second) {
9471 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9472 : diag::note_local_decl_close_param_match)
9475 }
else if (FDisConst != NewFDisConst) {
9477 diag::note_member_def_close_const_match)
9482 else if (FTI.hasMethodTypeQualifiers() &&
9483 FTI.getConstQualifierLoc().isValid())
9487 IsMember ? diag::note_member_def_close_match
9488 : diag::note_local_decl_close_match);
9496 default: llvm_unreachable(
"Unknown storage class!");
9501 diag::err_typecheck_sclass_func);
9518 diag::err_static_block_func);
9534 bool &IsVirtualOkay) {
9548 diag::err_c23_constexpr_not_variable);
9551 diag::err_constexpr_wrong_decl_kind)
9552 <<
static_cast<int>(ConstexprKind);
9576 "Strict prototypes are required");
9597 "Constructors can only be declared in a member context");
9603 isInline,
false, ConstexprKind,
9614 false, ConstexprKind,
9615 TrailingRequiresClause);
9618 if (
Record->isBeingDefined())
9627 IsVirtualOkay =
true;
9639 true, ConstexprKind, TrailingRequiresClause);
9645 diag::err_conv_function_not_member);
9653 IsVirtualOkay =
true;
9658 TrailingRequiresClause);
9685 IsVirtualOkay = !Ret->isStatic();
9699 true , ConstexprKind, TrailingRequiresClause);
9716 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9724 if (Names.end() !=
Match)
9729 }
while (DesugaredTy != Ty);
9768 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9770 bool IsStandardLayoutType =
true;
9776 if (!CXXRec->hasDefinition())
9777 CXXRec = CXXRec->getTemplateInstantiationPattern();
9778 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9779 IsStandardLayoutType =
false;
9782 !IsStandardLayoutType)
9830 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9844 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9857 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9866 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9883 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9891 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9892 PT = Typedef->desugar();
9914 HistoryStack.push_back(
nullptr);
9919 VisitStack.push_back(PD);
9920 assert(VisitStack.back() &&
"First decl null?");
9923 const Decl *
Next = VisitStack.pop_back_val();
9925 assert(!HistoryStack.empty());
9927 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9928 ValidTypes.insert(Hist->getType().getTypePtr());
9937 HistoryStack.push_back(Field);
9939 QualType FieldTy = Field->getType();
9943 "Unexpected type.");
9952 VisitStack.push_back(
nullptr);
9954 for (
const auto *FD : RD->
fields()) {
9965 VisitStack.push_back(FD);
9976 S.
Diag(Param->getLocation(),
9977 diag::err_record_with_pointers_kernel_param)
9981 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9984 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
9985 << PD->getDeclName();
9990 I = HistoryStack.begin() + 1,
9991 E = HistoryStack.end();
10004 }
while (!VisitStack.empty());
10021 (LangOpts.CPlusPlus &&
10031 unsigned BuiltinID) {
10032 switch (BuiltinID) {
10033 case Builtin::BI__GetExceptionInfo:
10037 case Builtin::BIaddressof:
10038 case Builtin::BI__addressof:
10039 case Builtin::BIforward:
10040 case Builtin::BIforward_like:
10041 case Builtin::BImove:
10042 case Builtin::BImove_if_noexcept:
10043 case Builtin::BIas_const: {
10048 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10060 bool &AddToScope) {
10068 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10070 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10071 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10072 TemplateParamLists.back() = Invented;
10074 TemplateParamLists.push_back(Invented);
10084 diag::err_invalid_thread)
10092 bool isFriend =
false;
10094 bool isMemberSpecialization =
false;
10095 bool isFunctionTemplateSpecialization =
false;
10097 bool HasExplicitTemplateArgs =
false;
10100 bool isVirtualOkay =
false;
10107 if (!NewFD)
return nullptr;
10117 if (IsLocalExternDecl)
10127 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10155 if (isVirtual && Parent->isUnion()) {
10159 if ((Parent->isClass() || Parent->isStruct()) &&
10160 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10163 if (
auto *Def = Parent->getDefinition())
10164 Def->setInitMethod(
true);
10169 isMemberSpecialization =
false;
10170 isFunctionTemplateSpecialization =
false;
10185 isMemberSpecialization,
Invalid);
10186 if (TemplateParams) {
10191 if (TemplateParams->
size() > 0) {
10199 }
else if (TemplateId) {
10216 Name, TemplateParams,
10222 if (TemplateParamLists.size() > 1) {
10229 isFunctionTemplateSpecialization =
true;
10231 if (TemplateParamLists.size() > 0)
10251 << Name << RemoveRange
10257 HasExplicitTemplateArgs =
true;
10264 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10270 if (TemplateParamLists.size() > 0)
10275 if (isFriend && TemplateId)
10276 isFunctionTemplateSpecialization =
true;
10282 if (isFunctionTemplateSpecialization && TemplateId) {
10283 HasExplicitTemplateArgs =
true;
10314 if (!isVirtualOkay) {
10316 diag::err_virtual_non_function);
10320 diag::err_virtual_out_of_class)
10326 diag::err_virtual_member_function_template)
10345 diag::err_inline_declaration_block_scope) << Name
10359 diag::err_explicit_out_of_class)
10366 diag::err_explicit_non_ctor_or_conv_function)
10384 <<
static_cast<int>(ConstexprKind);
10395 diag::err_invalid_consteval_decl_kind)
10403 if (isFunctionTemplateSpecialization) {
10406 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10452 if (!isFriend && SC !=
SC_None) {
10460 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10462 diag::ext_explicit_specialization_storage_class)
10469 "Out-of-line member function should be a CXXMethodDecl");
10486 ? diag::ext_static_out_of_line
10487 : diag::err_static_out_of_line)
10512 PendingInlineFuncDecls.insert(NewFD);
10519 isMemberSpecialization ||
10520 isFunctionTemplateSpecialization);
10529 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10554 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10556 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10557 Param->setDeclContext(NewFD);
10558 Params.push_back(Param);
10560 if (Param->isInvalidDecl())
10573 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10578 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10583 DeclContext *TagDC = TD->getLexicalDeclContext();
10587 TD->setDeclContext(NewFD);
10595 if (TagDC != PrototypeTagContext)
10596 TD->setLexicalDeclContext(TagDC);
10610 for (
const auto &AI : FT->param_types()) {
10613 Param->setScopeInfo(0, Params.size());
10614 Params.push_back(Param);
10618 "Should not need args for typedef of non-prototype fn");
10622 NewFD->setParams(Params);
10647 !NewFD->
hasAttr<SectionAttr>())
10648 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10654 !NewFD->
hasAttr<SectionAttr>()) {
10655 NewFD->
addAttr(SectionAttr::CreateImplicit(
10657 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10668 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10669 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10674 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10683 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10684 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10685 !NewTVA->isDefaultVersion() &&
10686 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10688 AddToScope =
false;
10700 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10715 isMemberSpecialization,
10722 "previous declaration set still overloaded");
10734 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10757 diag::ext_operator_new_delete_declared_inline)
10784 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10796 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10804 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10808 Diag(TRC->getBeginLoc(),
10809 diag::err_constrained_non_templated_function);
10826 if (isFunctionTemplateSpecialization) {
10827 bool isDependentSpecialization =
false;
10832 isDependentSpecialization =
10834 (HasExplicitTemplateArgs &&
10835 TemplateSpecializationType::
10836 anyInstantiationDependentTemplateArguments(
10838 assert((!isDependentSpecialization ||
10839 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10840 "dependent friend function specialization without template "
10846 isDependentSpecialization =
10851 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10852 if (isDependentSpecialization) {
10859 NewFD, ExplicitTemplateArgs,
Previous))
10880 isMemberSpecialization,
10889 "previous declaration set still overloaded");
10930 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10976 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10977 AddToScope = ExtraArgs.AddToScope;
10986 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10987 AddToScope = ExtraArgs.AddToScope;
10993 !isFriend && !isFunctionTemplateSpecialization &&
10994 !isMemberSpecialization) {
11012 if (NewFD->
hasAttr<HLSLShaderAttr>())
11020 if (
unsigned BuiltinID = II->getBuiltinID()) {
11021 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
11022 if (!InStdNamespace &&
11027 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
11028 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11035 Context.hasSameFunctionTypeIgnoringExceptionSpec(
11037 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11042 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11054 if (NewFD->
hasAttr<OverloadableAttr>() &&
11057 diag::err_attribute_overloadable_no_prototype)
11059 NewFD->
dropAttr<OverloadableAttr>();
11092 isMemberSpecialization ||
11093 isFunctionTemplateSpecialization,
11104 Context.setcudaConfigureCallDecl(NewFD);
11106 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11112 Context.setcudaGetParameterBufferDecl(NewFD);
11114 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11120 Context.setcudaLaunchDeviceDecl(NewFD);
11171 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11191 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11193 QualType ElemTy = PipeTy->getElementType();
11195 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11201 if (
Context.getTargetInfo().getTriple().isWasm()) {
11203 Diag(Param->getTypeSpecStartLoc(),
11204 diag::err_wasm_table_as_function_parameter);
11212 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11213 if (NewFD->
hasAttr<ConstructorAttr>()) {
11214 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11216 NewFD->
dropAttr<AvailabilityAttr>();
11218 if (NewFD->
hasAttr<DestructorAttr>()) {
11219 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11221 NewFD->
dropAttr<AvailabilityAttr>();
11232 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11236 Diag(NBA->getLocation(),
11237 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11238 << NBA->getSpelling();
11241 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11242 << NBA->getSpelling();
11251 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11275 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11279 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11290 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11291 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11301 bool IsDefinition) {
11304 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11306 return SectionAttr::CreateImplicit(
11308 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11356 auto *VD = dyn_cast<ValueDecl>(D);
11357 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11358 return !VD || !PrevVD ||
11360 PrevVD->getType());
11368 const auto *TA = FD->
getAttr<TargetAttr>();
11369 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11371 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11384 for (
const auto &Feat : ParseInfo.
Features) {
11385 auto BareFeat = StringRef{Feat}.substr(1);
11386 if (Feat[0] ==
'-') {
11388 <<
Feature << (
"no-" + BareFeat).str();
11408 for (
auto &Feat : ParseInfo.
Features)
11409 Feats.push_back(StringRef{Feat}.substr(1));
11412 TVA->getFeatures(Feats);
11414 for (
const auto &Feat : Feats) {
11434 case attr::ArmLocallyStreaming:
11439 case attr::NonNull:
11440 case attr::NoThrow:
11449 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11450 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11451 <<
static_cast<unsigned>(MVKind) << A;
11453 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11458 switch (A->getKind()) {
11459 case attr::CPUDispatch:
11460 case attr::CPUSpecific:
11463 return Diagnose(S, A);
11467 return Diagnose(S, A);
11469 case attr::TargetVersion:
11472 return Diagnose(S, A);
11474 case attr::TargetClones:
11477 return Diagnose(S, A);
11481 return Diagnose(S, A);
11494 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11495 enum DoesntSupport {
11502 DefaultedFuncs = 6,
11503 ConstexprFuncs = 7,
11504 ConstevalFuncs = 8,
11516 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11519 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11527 if (!TemplatesSupported &&
11529 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11532 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11533 if (NewCXXFD->isVirtual())
11534 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11538 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11542 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11547 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11551 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11555 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11556 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11560 QualType NewReturnType = NewType->getReturnType();
11563 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11576 bool ArmStreamingCCMismatched =
false;
11577 if (OldFPT && NewFPT) {
11584 ArmStreamingCCMismatched =
true;
11587 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11590 QualType OldReturnType = OldType->getReturnType();
11592 if (OldReturnType != NewReturnType)
11593 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11596 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11599 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11602 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11625 bool IsCPUSpecificCPUDispatchMVKind =
11629 if (CausesMV && OldFD &&
11637 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11644 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11646 S.
PDiag(diag::note_multiversioning_caused_here)),
11648 S.
PDiag(diag::err_multiversion_doesnt_support)
11649 <<
static_cast<unsigned>(MVKind)),
11651 S.
PDiag(diag::err_multiversion_diff)),
11653 !IsCPUSpecificCPUDispatchMVKind,
11666 "Function lacks multiversion attribute");
11667 const auto *TA = FD->
getAttr<TargetAttr>();
11668 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11671 if (TA && !TA->isDefaultVersion())
11708 To->
addAttr(TargetVersionAttr::CreateImplicit(
11719 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11720 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11721 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11722 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11724 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11733 if (NewTA && !NewTA->isDefaultVersion() &&
11734 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11751 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11752 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11761 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11769 OldTA->getFeaturesStr());
11773 NewTA->getFeaturesStr());
11776 if (OldParsed == NewParsed) {
11784 for (
const auto *FD : OldFD->
redecls()) {
11785 const auto *CurTA = FD->
getAttr<TargetAttr>();
11786 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11790 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11791 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11793 << (NewTA ? 0 : 2);
11794 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11841 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11857 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11858 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11865 NewTA->getFeaturesStr());
11870 NewTVA->getFeatures(NewFeats);
11871 llvm::sort(NewFeats);
11874 bool UseMemberUsingDeclRules =
11877 bool MayNeedOverloadableChecks =
11886 if (MayNeedOverloadableChecks &&
11887 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11890 switch (NewMVKind) {
11893 "Only target_clones can be omitted in subsequent declarations");
11896 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11897 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11906 CurTA->getFeaturesStr());
11908 if (CurParsed == NewParsed) {
11917 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11918 if (CurTVA->getName() == NewTVA->getName()) {
11925 CurTVA->getFeatures(CurFeats);
11926 llvm::sort(CurFeats);
11928 if (CurFeats == NewFeats) {
11934 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11936 if (NewFeats.empty())
11939 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11941 CurClones->getFeatures(CurFeats, I);
11942 llvm::sort(CurFeats);
11944 if (CurFeats == NewFeats) {
11955 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11956 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11957 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11958 !std::equal(CurClones->featuresStrs_begin(),
11959 CurClones->featuresStrs_end(),
11960 NewClones->featuresStrs_begin())) {
11966 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11968 CurTVA->getFeatures(CurFeats);
11969 llvm::sort(CurFeats);
11972 if (CurFeats.empty())
11975 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11977 NewClones->getFeatures(NewFeats, I);
11978 llvm::sort(NewFeats);
11980 if (CurFeats == NewFeats) {
11996 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
11997 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
12002 CurFD->
hasAttr<CPUDispatchAttr>()) {
12003 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
12005 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
12006 NewCPUDisp->cpus_begin(),
12008 return Cur->getName() == New->getName();
12023 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
12025 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
12026 NewCPUSpec->cpus_begin(),
12028 return Cur->getName() == New->getName();
12039 if (CurII == NewII) {
12109 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12110 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12111 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12112 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12113 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12123 NewTVA->isDefaultVersion())) {
12124 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12132 if (NewTA && TI.
getTriple().isAArch64())
12159 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12172 if (OldFD->
isUsed(
false)) {
12174 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12196 bool IsPure = NewFD->
hasAttr<PureAttr>();
12197 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12200 if (!IsPure && !IsConst)
12207 if (IsPure && IsConst) {
12217 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12223 bool IsMemberSpecialization,
12226 "Variably modified return types are not handled here");
12231 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12236 bool MayNeedOverloadableChecks =
false;
12248 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12250 OldDecl = Candidate;
12253 MayNeedOverloadableChecks =
true;
12278 OldDecl =
Previous.getFoundDecl();
12279 MergeTypeWithPrevious =
false;
12282 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12283 NewFD->
hasAttr<OverloadableAttr>()) {
12285 MayNeedOverloadableChecks =
true;
12297 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12348 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12349 if (!OldMD || !OldMD->
isStatic()) {
12384 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12385 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12388 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12397 NewFD->
setAccess(OldTemplateDecl->getAccess());
12398 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12403 if (IsMemberSpecialization &&
12406 assert(OldTemplateDecl->isMemberSpecialization());
12409 if (OldFD->isDeleted()) {
12411 assert(OldFD->getCanonicalDecl() == OldFD);
12413 OldFD->setDeletedAsWritten(
false);
12427 !NewFD->
getAttr<OverloadableAttr>()) {
12431 return ND->hasAttr<OverloadableAttr>();
12433 "Non-redecls shouldn't happen without overloadable present");
12436 const auto *FD = dyn_cast<FunctionDecl>(ND);
12437 return FD && !FD->
hasAttr<OverloadableAttr>();
12440 if (OtherUnmarkedIter !=
Previous.end()) {
12442 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12443 Diag((*OtherUnmarkedIter)->getLocation(),
12444 diag::note_attribute_overloadable_prev_overload)
12454 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12457 if (NewFD->
hasAttr<SYCLExternalAttr>())
12467 dyn_cast<CXXDestructorDecl>(NewFD)) {
12475 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12480 Context.DeclarationNames.getCXXDestructorName(ClassType);
12487 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12488 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12494 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12500 if (!
Method->isFunctionTemplateSpecialization() &&
12501 !
Method->getDescribedFunctionTemplate() &&
12502 Method->isCanonicalDecl()) {
12509 diag::err_constrained_virtual_method);
12549 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12562 auto HasNoexcept = [&](
QualType T) ->
bool {
12567 T = RT->getPointeeType();
12568 else if (
T->isAnyPointerType())
12569 T =
T->getPointeeType();
12571 T = MPT->getPointeeType();
12573 if (FPT->isNothrow())
12579 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12581 AnyNoexcept |= HasNoexcept(
T);
12584 diag::warn_cxx17_compat_exception_spec_in_signature)
12589 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12591 if (!Parm->getType()->isDependentType() &&
12592 Parm->hasAttr<CUDAGridConstantAttr>() &&
12593 !(IsKernel && Parm->getType().isConstQualified()))
12594 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12595 diag::err_cuda_grid_constant_not_allowed);
12601 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12611 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12622 ? diag::err_static_main : diag::warn_static_main)
12630 Diag(NoreturnLoc, diag::ext_noreturn_main);
12631 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12643 << FD->
hasAttr<DeviceKernelAttr>();
12648 if (FD->
hasAttr<SYCLExternalAttr>()) {
12650 << FD->
getAttr<SYCLExternalAttr>();
12661 assert(
T->isFunctionType() &&
"function decl is not of function type");
12683 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12708 Diag(start, diag::warn_main_in_named_module)
12720 bool HasExtraParameters = (nparams > 3);
12731 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12732 HasExtraParameters =
false;
12734 if (HasExtraParameters) {
12747 for (
unsigned i = 0; i < nparams; ++i) {
12750 bool mismatch =
true;
12767 mismatch = !qs.
empty();
12796 if (
T.isOSCygMing())
12801 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12809 assert(
T->isFunctionType() &&
"function decl is not of function type");
12818 if (FD->
getName() !=
"DllMain")
12825 FT =
Context.adjustFunctionType(
12830 FT =
Context.adjustFunctionType(FT,
12852 if (
Init->isValueDependent()) {
12853 assert(
Init->containsErrors() &&
12854 "Dependent code should only occur in error-recovery path.");
12857 const Expr *Culprit;
12858 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12867 class SelfReferenceChecker
12873 bool isReferenceType;
12874 bool isInCXXOperatorCall;
12882 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12883 S(S), OrigDecl(OrigDecl) {
12886 isReferenceType =
false;
12887 isInCXXOperatorCall =
false;
12888 isInitList =
false;
12889 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12890 isPODType = VD->getType().isPODType(S.
Context);
12892 isReferenceType = VD->getType()->isReferenceType();
12899 void CheckExpr(Expr *E) {
12900 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12908 InitFieldIndex.push_back(0);
12909 for (
auto *Child : InitList->
children()) {
12911 ++InitFieldIndex.back();
12913 InitFieldIndex.pop_back();
12918 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12919 llvm::SmallVector<FieldDecl*, 4> Fields;
12921 bool ReferenceField =
false;
12924 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12925 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12928 Fields.push_back(FD);
12930 ReferenceField =
true;
12931 Base = ME->getBase()->IgnoreParenImpCasts();
12935 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12936 if (!DRE || DRE->
getDecl() != OrigDecl)
12940 if (CheckReference && !ReferenceField)
12944 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12945 for (
const FieldDecl *I : llvm::reverse(Fields))
12946 UsedFieldIndex.push_back(I->getFieldIndex());
12951 for (
auto UsedIter = UsedFieldIndex.begin(),
12952 UsedEnd = UsedFieldIndex.end(),
12953 OrigIter = InitFieldIndex.begin(),
12954 OrigEnd = InitFieldIndex.end();
12955 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12956 if (*UsedIter < *OrigIter)
12958 if (*UsedIter > *OrigIter)
12963 HandleDeclRefExpr(DRE);
12970 void HandleValue(Expr *E) {
12972 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12973 HandleDeclRefExpr(DRE);
12977 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12978 Visit(CO->getCond());
12979 HandleValue(CO->getTrueExpr());
12980 HandleValue(CO->getFalseExpr());
12984 if (BinaryConditionalOperator *BCO =
12985 dyn_cast<BinaryConditionalOperator>(E)) {
12986 Visit(BCO->getCond());
12987 HandleValue(BCO->getFalseExpr());
12991 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
12992 if (Expr *SE = OVE->getSourceExpr())
12997 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
12998 if (BO->getOpcode() == BO_Comma) {
12999 Visit(BO->getLHS());
13000 HandleValue(BO->getRHS());
13013 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13017 Base = ME->getBase()->IgnoreParenImpCasts();
13019 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
13020 HandleDeclRefExpr(DRE);
13029 void VisitDeclRefExpr(DeclRefExpr *E) {
13030 if (isReferenceType)
13031 HandleDeclRefExpr(E);
13034 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
13040 Inherited::VisitImplicitCastExpr(E);
13043 void VisitMemberExpr(MemberExpr *E) {
13045 if (CheckInitListMemberExpr(E,
true ))
13054 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13055 bool Warn = (MD && !MD->
isStatic());
13057 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13060 Base = ME->getBase()->IgnoreParenImpCasts();
13063 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13065 HandleDeclRefExpr(DRE);
13074 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13075 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13079 return Inherited::VisitCXXOperatorCallExpr(E);
13083 HandleValue(Arg->IgnoreParenImpCasts());
13087 if (!isInCXXOperatorCall) {
13088 Inherited::VisitLambdaExpr(E);
13093 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13094 HandleDeclRefExpr(DRE);
13099 void VisitUnaryOperator(UnaryOperator *E) {
13113 Inherited::VisitUnaryOperator(E);
13116 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13118 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13120 Expr *ArgExpr = E->
getArg(0);
13121 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13122 if (ILE->getNumInits() == 1)
13123 ArgExpr = ILE->getInit(0);
13124 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13125 if (ICE->getCastKind() == CK_NoOp)
13126 ArgExpr = ICE->getSubExpr();
13127 HandleValue(ArgExpr);
13130 Inherited::VisitCXXConstructExpr(E);
13133 void VisitCallExpr(CallExpr *E) {
13136 HandleValue(E->
getArg(0));
13140 Inherited::VisitCallExpr(E);
13143 void VisitBinaryOperator(BinaryOperator *E) {
13145 HandleValue(E->
getLHS());
13150 Inherited::VisitBinaryOperator(E);
13156 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13161 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13163 if (OrigDecl != ReferenceDecl)
return;
13165 if (isReferenceType) {
13166 diag = diag::warn_uninit_self_reference_in_reference_init;
13168 diag = diag::warn_static_self_reference_in_init;
13172 diag = diag::warn_uninit_self_reference_in_init;
13186 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13196 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13197 VD && VD->isConstexpr() && VD->isFileVarDecl())
13205 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13206 if (ICE->getCastKind() == CK_LValueToRValue)
13207 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13208 if (DRE->
getDecl() == OrigDecl)
13211 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13218 struct VarDeclOrName {
13220 DeclarationName Name;
13222 friend const Sema::SemaDiagnosticBuilder &
13223 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13224 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13234 bool IsInitCapture = !VDecl;
13236 "init captures are expected to be deduced prior to initialization");
13238 VarDeclOrName VN{VDecl, Name};
13241 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13245 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13246 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13247 << (int)Deduced->getContainedAutoType()->getKeyword()
13254 assert(VDecl &&
"no init for init capture deduction?");
13269 DeduceInits =
Init;
13271 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13273 DeduceInits = PL->exprs();
13276 assert(VDecl &&
"non-auto type for init capture deduction?");
13287 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13288 DeduceInits = IL->inits();
13292 if (DeduceInits.empty()) {
13295 Diag(
Init->getBeginLoc(), IsInitCapture
13296 ? diag::err_init_capture_no_expression
13297 : diag::err_auto_var_init_no_expression)
13298 << VN <<
Type << Range;
13302 if (DeduceInits.size() > 1) {
13303 Diag(DeduceInits[1]->getBeginLoc(),
13304 IsInitCapture ? diag::err_init_capture_multiple_expressions
13305 : diag::err_auto_var_init_multiple_expressions)
13306 << VN <<
Type << Range;
13310 Expr *DeduceInit = DeduceInits[0];
13312 Diag(
Init->getBeginLoc(), IsInitCapture
13313 ? diag::err_init_capture_paren_braces
13314 : diag::err_auto_var_init_paren_braces)
13320 bool DefaultedAnyToId =
false;
13322 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13324 if (
Result.isInvalid()) {
13328 DefaultedAnyToId =
true;
13338 Type.getQualifiers());
13346 if (!IsInitCapture)
13349 Diag(Range.getBegin(),
13350 diag::err_init_capture_deduction_failure_from_init_list)
13356 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13371 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13374 return DeducedType;
13379 assert(!
Init || !
Init->containsErrors());
13383 if (DeducedType.
isNull()) {
13392 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13416 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13417 Init = EWC->getSubExpr();
13419 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13420 Init = CE->getSubExpr();
13425 "shouldn't be called if type doesn't have a non-trivial C struct");
13426 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13427 for (
auto *I : ILE->inits()) {
13428 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13429 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13455bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13461 return FD->
hasAttr<UnavailableAttr>();
13464struct DiagNonTrivalCUnionDefaultInitializeVisitor
13471 DiagNonTrivalCUnionDefaultInitializeVisitor(
13474 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13477 const FieldDecl *FD,
bool InNonTrivialUnion) {
13480 InNonTrivialUnion);
13481 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13484 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13485 bool InNonTrivialUnion) {
13486 if (InNonTrivialUnion)
13488 << 1 << 0 << QT << FD->
getName();
13491 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13492 if (InNonTrivialUnion)
13494 << 1 << 0 << QT << FD->
getName();
13497 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13499 if (RD->isUnion()) {
13500 if (OrigLoc.isValid()) {
13501 bool IsUnion =
false;
13502 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13503 IsUnion = OrigRD->isUnion();
13504 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13505 << 0 << OrigTy << IsUnion << UseContext;
13507 OrigLoc = SourceLocation();
13509 InNonTrivialUnion =
true;
13512 if (InNonTrivialUnion)
13513 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13516 for (
const FieldDecl *FD : RD->fields())
13517 if (!shouldIgnoreForRecordTriviality(FD))
13518 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13521 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13526 SourceLocation OrigLoc;
13531struct DiagNonTrivalCUnionDestructedTypeVisitor
13534 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13536 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13537 SourceLocation OrigLoc,
13540 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13543 const FieldDecl *FD,
bool InNonTrivialUnion) {
13546 InNonTrivialUnion);
13547 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13550 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13551 bool InNonTrivialUnion) {
13552 if (InNonTrivialUnion)
13554 << 1 << 1 << QT << FD->
getName();
13557 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13558 if (InNonTrivialUnion)
13560 << 1 << 1 << QT << FD->
getName();
13563 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13565 if (RD->isUnion()) {
13566 if (OrigLoc.isValid()) {
13567 bool IsUnion =
false;
13568 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13569 IsUnion = OrigRD->isUnion();
13570 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13571 << 1 << OrigTy << IsUnion << UseContext;
13573 OrigLoc = SourceLocation();
13575 InNonTrivialUnion =
true;
13578 if (InNonTrivialUnion)
13579 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13582 for (
const FieldDecl *FD : RD->fields())
13583 if (!shouldIgnoreForRecordTriviality(FD))
13584 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13587 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13588 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13589 bool InNonTrivialUnion) {}
13594 SourceLocation OrigLoc;
13599struct DiagNonTrivalCUnionCopyVisitor
13601 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13603 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13605 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13608 const FieldDecl *FD,
bool InNonTrivialUnion) {
13611 InNonTrivialUnion);
13612 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13615 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13616 bool InNonTrivialUnion) {
13617 if (InNonTrivialUnion)
13619 << 1 << 2 << QT << FD->
getName();
13622 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13623 if (InNonTrivialUnion)
13625 << 1 << 2 << QT << FD->
getName();
13628 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13630 if (RD->isUnion()) {
13631 if (OrigLoc.isValid()) {
13632 bool IsUnion =
false;
13633 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13634 IsUnion = OrigRD->isUnion();
13635 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13636 << 2 << OrigTy << IsUnion << UseContext;
13638 OrigLoc = SourceLocation();
13640 InNonTrivialUnion =
true;
13643 if (InNonTrivialUnion)
13644 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13647 for (
const FieldDecl *FD : RD->fields())
13648 if (!shouldIgnoreForRecordTriviality(FD))
13649 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13652 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13653 if (InNonTrivialUnion)
13655 << 1 << 2 << QT << FD->
getName();
13659 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13660 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13661 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13662 bool InNonTrivialUnion) {}
13667 SourceLocation OrigLoc;
13676 unsigned NonTrivialKind) {
13680 "shouldn't be called if type doesn't have a non-trivial C union");
13684 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13685 .visit(QT,
nullptr,
false);
13688 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13689 .visit(QT,
nullptr,
false);
13691 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13692 .visit(QT,
nullptr,
false);
13716 bool TargetIsInline = Dcl->
isInline();
13717 bool TargetWasTemplated =
13734 TargetWasTemplated =
13744 if (!TargetIsInline || TargetWasTemplated)
13754 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13755 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13761 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13762 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13784 T =
T.getNonReferenceType();
13785 if (
T->isFunctionType())
13787 if (!
T.isConstant(Ctx))
13789 if (
T->isPointerType())
13807 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13808 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13820 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13821 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13827 llvm::scope_exit ResetDeclForInitializer([
this]() {
13838 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13839 if (!
Method->isInvalidDecl()) {
13841 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13842 <<
Method->getDeclName() <<
Init->getSourceRange();
13843 Method->setInvalidDecl();
13848 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13850 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13859 if (
Expr *E = Recovery.
get())
13865 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13866 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13873 if (
Init->containsErrors()) {
13882 "decl should be invalidated when deduce fails");
13895 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13915 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13916 BaseDeclType = Array->getElementType();
13918 diag::err_typecheck_decl_incomplete_type)) {
13925 diag::err_abstract_type_in_decl,
13943 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
13952 if (Def != VDecl &&
13972 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13975 diag::note_previous_initializer)
14000 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
14001 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
14007 if (!
HLSL().handleInitialization(VDecl,
Init))
14019 if (!
Result.isUsable()) {
14027 bool InitializedFromParenListExpr =
false;
14028 bool IsParenListInit =
false;
14035 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
14037 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
14038 InitializedFromParenListExpr =
true;
14039 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
14040 Args = CXXDirectInit->getInitExprs();
14041 InitializedFromParenListExpr =
true;
14048 if (!
Result.isUsable()) {
14068 IsParenListInit = !InitSeq.
steps().empty() &&
14072 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14074 Context.getAsIncompleteArrayType(VDeclType) &&
14075 Context.getAsIncompleteArrayType(
Init->getType())) {
14104 if (VDecl->
hasAttr<BlocksAttr>())
14117 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14118 Init->getBeginLoc()))
14119 FSI->markSafeWeakUse(
Init);
14136 if (!
Result.isUsable()) {
14176 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14177 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14179 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14214 <<
Init->getSourceRange();
14230 diag::ext_in_class_initializer_float_type_cxx11)
14231 << DclT <<
Init->getSourceRange();
14233 diag::note_in_class_initializer_float_type_cxx11)
14236 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14237 << DclT <<
Init->getSourceRange();
14240 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14241 <<
Init->getSourceRange();
14248 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14249 << DclT <<
Init->getSourceRange()
14255 << DclT <<
Init->getSourceRange();
14268 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14276 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14289 if (!InitType.
isNull() &&
14307 if (InitializedFromParenListExpr) {
14308 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14331 VarDecl *VD = dyn_cast<VarDecl>(D);
14335 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14336 for (
auto *BD : DD->bindings())
14337 BD->setInvalidDecl();
14350 Context.getBaseElementType(Ty),
14351 diag::err_typecheck_decl_incomplete_type)) {
14358 diag::err_abstract_type_in_decl,
14373 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14378 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14379 Var->setInvalidDecl();
14395 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14396 !Var->isThisDeclarationADemotedDefinition()) {
14397 if (Var->isStaticDataMember()) {
14401 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14402 Diag(Var->getLocation(),
14403 diag::err_constexpr_static_mem_var_requires_init)
14405 Var->setInvalidDecl();
14409 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14410 Var->setInvalidDecl();
14417 if (!Var->isInvalidDecl() &&
14419 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14420 bool HasConstExprDefaultConstructor =
false;
14421 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14422 for (
auto *Ctor : RD->ctors()) {
14423 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14424 Ctor->getMethodQualifiers().getAddressSpace() ==
14426 HasConstExprDefaultConstructor =
true;
14430 if (!HasConstExprDefaultConstructor) {
14431 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14432 Var->setInvalidDecl();
14438 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14439 Diag(Var->getLocation(), diag::err_specialization_const);
14440 Var->setInvalidDecl();
14444 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14445 if (Var->getStorageClass() ==
SC_Extern) {
14446 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14448 Var->setInvalidDecl();
14452 diag::err_typecheck_decl_incomplete_type)) {
14453 Var->setInvalidDecl();
14456 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14457 if (!RD->hasTrivialDefaultConstructor()) {
14458 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14459 Var->setInvalidDecl();
14469 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14476 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14492 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14494 diag::err_typecheck_decl_incomplete_type))
14495 Var->setInvalidDecl();
14500 diag::err_abstract_type_in_decl,
14502 Var->setInvalidDecl();
14505 Diag(Var->getLocation(), diag::warn_private_extern);
14506 Diag(Var->getLocation(), diag::note_private_extern);
14509 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14510 !Var->isInvalidDecl())
14521 if (!Var->isInvalidDecl()) {
14525 Var->getLocation(), ArrayT->getElementType(),
14526 diag::err_array_incomplete_or_sizeless_type))
14527 Var->setInvalidDecl();
14529 if (Var->getStorageClass() ==
SC_Static) {
14539 if (Var->isFirstDecl())
14541 diag::ext_typecheck_decl_incomplete_type,
14547 if (!Var->isInvalidDecl())
14558 if (Var->isConstexpr())
14559 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14562 Diag(Var->getLocation(),
14563 diag::err_typecheck_incomplete_array_needs_initializer);
14564 Var->setInvalidDecl();
14571 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14572 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14581 if (Var->isInvalidDecl())
14584 if (!Var->hasAttr<AliasAttr>()) {
14587 diag::err_typecheck_decl_incomplete_type)) {
14588 Var->setInvalidDecl();
14597 diag::err_abstract_type_in_decl,
14599 Var->setInvalidDecl();
14606 unsigned DiagID = diag::warn_default_init_const_unsafe;
14607 if (Var->getStorageDuration() ==
SD_Static ||
14608 Var->getStorageDuration() ==
SD_Thread)
14609 DiagID = diag::warn_default_init_const;
14611 bool EmitCppCompat = !
Diags.isIgnored(
14612 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14613 Var->getLocation());
14615 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14629 if (
const auto *CXXRecord =
14630 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14634 if (!CXXRecord->isPOD())
14679 }
else if (
Init.isInvalid()) {
14697 VarDecl *VD = dyn_cast<VarDecl>(D);
14756 const char *PrevSpec;
14781 Context.getAttributedType(
Attr, MethodType, MethodType);
14792 if (var->isInvalidDecl())
return;
14799 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14801 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14803 var->setInvalidDecl();
14811 var->hasLocalStorage()) {
14812 switch (var->getType().getObjCLifetime()) {
14825 if (var->hasLocalStorage() &&
14834 if (var->isThisDeclarationADefinition() &&
14835 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14836 var->isExternallyVisible() && var->hasLinkage() &&
14837 !var->isInline() && !var->getDescribedVarTemplate() &&
14841 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14842 var->getLocation())) {
14844 VarDecl *prev = var->getPreviousDecl();
14849 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14850 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14856 std::optional<bool> CacheHasConstInit;
14857 const Expr *CacheCulprit =
nullptr;
14858 auto checkConstInit = [&]()
mutable {
14859 const Expr *
Init = var->getInit();
14860 if (
Init->isInstantiationDependent())
14863 if (!CacheHasConstInit)
14864 CacheHasConstInit = var->getInit()->isConstantInitializer(
14865 Context, var->getType()->isReferenceType(), &CacheCulprit);
14866 return *CacheHasConstInit;
14870 if (var->getType().isDestructedType()) {
14874 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14876 Diag(var->getLocation(), diag::note_use_thread_local);
14878 if (!checkConstInit()) {
14886 Diag(var->getLocation(), diag::note_use_thread_local);
14892 if (!var->getType()->isStructureType() && var->hasInit() &&
14895 unsigned NumInits = ILE->getNumInits();
14897 for (
unsigned I = 0; I < NumInits; ++I) {
14898 const auto *
Init = ILE->getInit(I);
14901 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14905 unsigned NumConcat = SL->getNumConcatenated();
14909 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14910 bool OnlyOneMissingComma =
true;
14911 for (
unsigned J = I + 1; J < NumInits; ++J) {
14912 const auto *
Init = ILE->getInit(J);
14915 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14916 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14917 OnlyOneMissingComma =
false;
14922 if (OnlyOneMissingComma) {
14924 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14926 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
14928 Diag(SL->getStrTokenLoc(1),
14929 diag::warn_concatenated_literal_array_init)
14931 Diag(SL->getBeginLoc(),
14932 diag::note_concatenated_string_literal_silence);
14943 if (var->hasAttr<BlocksAttr>())
14947 bool GlobalStorage = var->hasGlobalStorage();
14948 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14950 bool HasConstInit =
true;
14953 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14958 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14959 (GlobalStorage || var->isConstexpr() ||
14960 var->mightBeUsableInConstantExpressions(
Context))) {
14972 HasConstInit = checkConstInit();
14976 if (HasConstInit) {
14977 if (var->isStaticDataMember() && !var->isInline() &&
14978 var->getLexicalDeclContext()->isRecord() &&
14979 type->isIntegralOrEnumerationType()) {
14984 diag::ext_in_class_initializer_non_constant)
14985 <<
Init->getSourceRange();
14988 (void)var->checkForConstantInitialization(Notes);
14990 }
else if (CacheCulprit) {
14991 Notes.emplace_back(CacheCulprit->
getExprLoc(),
14992 PDiag(diag::note_invalid_subexpr_in_const_expr));
14997 HasConstInit = var->checkForConstantInitialization(Notes);
15000 if (HasConstInit) {
15002 }
else if (var->isConstexpr()) {
15006 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
15007 diag::note_invalid_subexpr_in_const_expr) {
15008 DiagLoc = Notes[0].first;
15011 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
15012 << var <<
Init->getSourceRange();
15013 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
15014 Diag(Notes[I].first, Notes[I].second);
15015 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
15016 auto *
Attr = var->getAttr<ConstInitAttr>();
15017 Diag(var->getLocation(), diag::err_require_constant_init_failed)
15018 <<
Init->getSourceRange();
15021 for (
auto &it : Notes)
15022 Diag(it.first, it.second);
15023 }
else if (var->isStaticDataMember() && !var->isInline() &&
15024 var->getLexicalDeclContext()->isRecord()) {
15025 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
15026 <<
Init->getSourceRange();
15027 for (
auto &it : Notes)
15028 Diag(it.first, it.second);
15029 var->setInvalidDecl();
15030 }
else if (IsGlobal &&
15032 var->getLocation())) {
15041 if (!checkConstInit())
15042 Diag(var->getLocation(), diag::warn_global_constructor)
15043 <<
Init->getSourceRange();
15049 if (GlobalStorage && var->isThisDeclarationADefinition() &&
15054 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
15055 std::optional<QualType::NonConstantStorageReason> Reason;
15056 if (HasConstInit &&
15057 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
15063 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
15070 var->getType().isConstQualified()) {
15072 NonConstNonReferenceType) &&
15073 "This case should've already been handled elsewhere");
15074 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15075 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15081 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15083 SectionAttr::Declspec_allocate));
15085 var->dropAttr<SectionAttr>();
15100 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15101 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15108 if (!
type->isDependentType())
15114 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15115 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15118 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15129 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15130 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15140 NewAttr->setInherited(
true);
15142 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15143 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15144 NewAttr->setInherited(
true);
15149 if (!FD->
hasAttr<DLLExportAttr>())
15152 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15153 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15154 NewAttr->setInherited(
true);
15165 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15170 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15183 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15195 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15199 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15203 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15207 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15212 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15213 for (
auto *BD : DD->bindings()) {
15218 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15241 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15248 bool IsClassTemplateMember =
15250 Context->getDescribedClassTemplate();
15253 IsClassTemplateMember
15254 ? diag::warn_attribute_dllimport_static_field_definition
15255 : diag::err_attribute_dllimport_static_field_definition);
15256 Diag(IA->getLocation(), diag::note_attribute);
15257 if (!IsClassTemplateMember)
15285 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15305 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15309 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15311 if (!MagicValueExpr) {
15314 std::optional<llvm::APSInt> MagicValueInt;
15316 Diag(I->getRange().getBegin(),
15317 diag::err_type_tag_for_datatype_not_ice)
15321 if (MagicValueInt->getActiveBits() > 64) {
15322 Diag(I->getRange().getBegin(),
15323 diag::err_type_tag_for_datatype_too_large)
15327 uint64_t MagicValue = MagicValueInt->getZExtValue();
15330 I->getMatchingCType(),
15331 I->getLayoutCompatible(),
15332 I->getMustBeNull());
15337 auto *VD = dyn_cast<VarDecl>(DD);
15338 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15350 bool DiagnosedMultipleDecomps =
false;
15352 bool DiagnosedNonDeducedAuto =
false;
15354 for (
Decl *D : Group) {
15359 if (
auto *VD = dyn_cast<VarDecl>(D);
15360 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15361 VD->hasGlobalStorage())
15365 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15366 if (!FirstDeclaratorInGroup)
15367 FirstDeclaratorInGroup = DD;
15368 if (!FirstDecompDeclaratorInGroup)
15369 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15372 FirstNonDeducedAutoInGroup = DD;
15374 if (FirstDeclaratorInGroup != DD) {
15377 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15379 diag::err_decomp_decl_not_alone)
15381 << DD->getSourceRange();
15382 DiagnosedMultipleDecomps =
true;
15388 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15390 diag::err_auto_non_deduced_not_alone)
15391 << FirstNonDeducedAutoInGroup->
getType()
15394 << DD->getSourceRange();
15395 DiagnosedNonDeducedAuto =
true;
15400 Decls.push_back(D);
15406 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15408 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15420 if (Group.size() > 1) {
15422 VarDecl *DeducedDecl =
nullptr;
15423 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15424 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15428 if (!DT || DT->getDeducedType().isNull())
15431 Deduced = DT->getDeducedType();
15433 }
else if (!
Context.hasSameType(DT->getDeducedType(), Deduced)) {
15434 auto *AT = dyn_cast<AutoType>(DT);
15436 diag::err_auto_different_deductions)
15437 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
15438 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15462 if (Group.empty() || !Group[0])
15465 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15466 Group[0]->getLocation()) &&
15467 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15468 Group[0]->getLocation()))
15471 if (Group.size() >= 2) {
15479 Decl *MaybeTagDecl = Group[0];
15481 Group = Group.slice(1);
15534 const auto *VD = dyn_cast<ValueDecl>(D);
15548 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15550 Diag(TD->getLocation(), diag::note_declared_at);
15556 if (!ExplicitThisLoc.
isValid())
15559 "explicit parameter in non-cplusplus mode");
15561 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15573 LSI->ExplicitObjectParameter = P;
15596 ? diag::ext_register_storage_class
15597 : diag::warn_deprecated_register)
15603 diag::err_invalid_storage_class_in_func_decl)
15612 diag::err_invalid_storage_class_in_func_decl);
15624 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15645 PrevDecl =
nullptr;
15662 diag::err_hlsl_incomplete_resource_array_in_function_param);
15674 New->setInvalidDecl();
15693 Diag(
New->getLocation(), diag::err_module_private_local)
15697 if (
New->hasAttr<BlocksAttr>()) {
15698 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15714 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
15716 Param->setImplicit();
15729 !
Parameter->getIdentifier()->isPlaceholder()) {
15730 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15738 if (
LangOpts.NumLargeByValueCopy == 0)
15744 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15745 if (Size >
LangOpts.NumLargeByValueCopy)
15753 if (
T->isDependentType() || !
T.isPODType(
Context))
15755 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
15756 if (Size >
LangOpts.NumLargeByValueCopy)
15769 T->isObjCLifetimeType()) {
15776 if (
T->isArrayType()) {
15777 if (!
T.isConstQualified()) {
15781 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15783 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15788 lifetime =
T->getObjCARCImplicitLifetime();
15790 T =
Context.getLifetimeQualifiedType(
T, lifetime);
15794 Context.getAdjustedParameterType(
T),
15795 TSInfo, SC,
nullptr);
15800 if (
New->isParameterPack())
15802 CSI->LocalPacks.push_back(
New);
15804 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15805 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15812 if (
T->isObjCObjectType()) {
15816 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15818 T =
Context.getObjCObjectPointerType(
T);
15823 if (
T.getPointerAuth()) {
15824 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
15825 New->setInvalidDecl();
15839 !(
T->isFunctionPointerType() &&
15841 Diag(NameLoc, diag::err_arg_with_address_space);
15842 New->setInvalidDecl();
15846 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15847 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15848 New->setInvalidDecl();
15869 for (
int i = FTI.
NumParams; i != 0; ) {
15874 llvm::raw_svector_ostream(Code)
15885 const char* PrevSpec;
15888 DiagID,
Context.getPrintingPolicy());
15917 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15919 ParentScope, D, TemplateParameterLists, Bases);
15925 if (!Bases.empty())
15933 Consumer.HandleInlineFunctionDefinition(D);
15942 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15945 PossiblePrototype = Prev;
15969 if (II->isStr(
"main") || II->isStr(
"efi_main"))
15988 if (FD->
hasAttr<DeviceKernelAttr>())
16037 bool DefinitionVisible =
false;
16041 Definition->getNumTemplateParameterLists())) {
16044 if (!DefinitionVisible) {
16045 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
16059 Diag(
Definition->getLocation(), diag::note_previous_definition);
16068 LSI->
Lambda = LambdaClass;
16107 for (
const auto &
C : LambdaClass->
captures()) {
16108 if (
C.capturesVariable()) {
16112 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16114 true,
C.getLocation(),
16115 C.isPackExpansion()
16117 I->getType(),
false);
16119 }
else if (
C.capturesThis()) {
16145 FD = FunTmpl->getTemplatedDecl();
16156 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16161 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16166 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16167 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16168 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16169 !
Attr->isDefaultVersion()) {
16178 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16180 Ctor->isDefaultConstructor() &&
16181 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16223 "There should be an active template instantiation on the stack "
16224 "when instantiating a generic lambda!");
16234 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16235 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16250 diag::err_func_def_incomplete_result) ||
16252 diag::err_abstract_type_in_decl,
16268 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16272 "parameters should not be in newly created FD yet");
16275 if (NonParmDecl->getDeclName())
16280 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16281 for (
auto *EI : ED->enumerators())
16289 Param->setOwningFunction(FD);
16292 if (Param->getIdentifier() && FnBodyScope) {
16329 assert(!FD->
hasAttr<DLLExportAttr>());
16330 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16355 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16356 FD = TD->getTemplatedDecl();
16357 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16369 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16370 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16371 if (!NRVOCandidate->isNRVOVariable()) {
16372 Diag(Returns[I]->getRetValue()->getExprLoc(),
16373 diag::warn_not_eliding_copy_on_return);
16393 Outer.Fun.hasTrailingReturnType()) {
16411 if (FD->isConstexpr())
16416 if (FD->getReturnType()->getContainedDeducedType())
16419 return Consumer.shouldSkipFunctionBody(D);
16426 FD->setHasSkippedBody();
16439 S.PopExpressionEvaluationContext();
16444 bool IsLambda =
false;
16448 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16450 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16451 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16465 return It->second = R;
16470 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16472 if (IsOrNestedInEscapingBlock(P.second))
16473 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16488 methodHasName(FD,
"get_return_object_on_allocation_failure");
16498 if (!FD->
hasAttr<CoroWrapperAttr>())
16503 bool RetainFunctionScopeInfo) {
16530 SYCLKernelEntryPointAttr *SKEPAttr =
16531 FD->
getAttr<SYCLKernelEntryPointAttr>();
16533 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16534 << SKEPAttr << diag::InvalidSKEPReason::DefaultedFn;
16535 SKEPAttr->setInvalidAttr();
16537 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16538 << SKEPAttr << diag::InvalidSKEPReason::DeletedFn;
16539 SKEPAttr->setInvalidAttr();
16541 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16542 << SKEPAttr << diag::InvalidSKEPReason::Coroutine;
16543 SKEPAttr->setInvalidAttr();
16545 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16546 << SKEPAttr << diag::InvalidSKEPReason::FunctionTryBlock;
16547 SKEPAttr->setInvalidAttr();
16550 if (Body && !FD->
isTemplated() && !SKEPAttr->isInvalidAttr()) {
16560 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16562 Diag(SEAttr->getLocation(),
16563 diag::err_sycl_external_invalid_deleted_function)
16593 Expr *Dummy =
nullptr;
16604 if (LSI->HasImplicitReturnType) {
16611 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16615 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16616 Proto->getExtProtoInfo()));
16649 dyn_cast<CXXDestructorDecl>(FD))
16669 if (PossiblePrototype) {
16673 TypeLoc TL = TI->getTypeLoc();
16676 diag::note_declaration_not_a_prototype)
16679 FTL.getRParenLoc(),
"void")
16687 if (LocInfo.first.isInvalid())
16691 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16695 if (LocInfo.second > Buffer.size())
16698 const char *LexStart = Buffer.data() + LocInfo.second;
16699 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16701 return StartTok.consume_front(
"const") &&
16703 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16706 auto findBeginLoc = [&]() {
16722 diag::note_static_for_internal_linkage)
16733 if (!PossiblePrototype)
16779 if (PossiblePrototype)
16781 diag::warn_non_prototype_changes_behavior)
16788 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16789 if (!CmpndBody->body_empty())
16790 Diag(CmpndBody->body_front()->getBeginLoc(),
16791 diag::warn_dispatch_body_ignored);
16793 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16801 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16802 Context.setNonKeyFunction(MD);
16818 "Function parsing confused");
16819 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16831 << MD->getSelector().getAsString();
16836 bool isDesignated =
16837 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16838 assert(isDesignated && InitMethod);
16839 (void)isDesignated;
16842 auto IFace = MD->getClassInterface();
16845 auto SuperD = IFace->getSuperClass();
16855 diag::warn_objc_designated_init_missing_super_call);
16857 diag::note_objc_designated_init_marked_here);
16865 diag::warn_objc_secondary_init_missing_init_call);
16881 "This should only be set for ObjC methods, which should have been "
16882 "handled in the block above.");
16897 if (!
Destructor->getParent()->isDependentType())
16915 ActivePolicy = &WP;
16918 if (!IsInstantiation && FD &&
16924 if (FD && FD->
hasAttr<NakedAttr>()) {
16928 bool RegisterVariables =
false;
16929 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
16930 for (
const auto *
Decl : DS->decls()) {
16931 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
16932 RegisterVariables =
16933 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16934 if (!RegisterVariables)
16939 if (RegisterVariables)
16942 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16943 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16952 "Leftover temporaries in function");
16953 assert(!
Cleanup.exprNeedsCleanups() &&
16954 "Unaccounted cleanups in function");
16956 "Leftover expressions for odr-use checking");
16965 if (!IsInstantiation)
16968 if (!RetainFunctionScopeInfo)
16997 D = TD->getTemplatedDecl();
17009 assert(
LangOpts.implicitFunctionsAllowed() &&
17010 "Implicit function declarations aren't allowed in this language mode");
17017 Scope *BlockScope = S;
17025 Scope *ContextScope = BlockScope;
17029 ContextScope = ContextScope->
getParent();
17049 Diag(Loc, diag::ext_use_out_of_scope_declaration)
17052 return ExternCPrev;
17058 if (II.
getName().starts_with(
"__builtin_"))
17059 diag_id = diag::warn_builtin_unknown;
17062 diag_id = diag::ext_implicit_function_decl_c99;
17064 diag_id = diag::warn_implicit_function_decl;
17072 if (S && !ExternCPrev &&
17079 Diag(Loc, diag_id) << &II;
17095 return ExternCPrev;
17103 Context.getPrintingPolicy());
17105 assert(!
Error &&
"Error setting up implicit decl!");
17148 bool IsNothrow =
false;
17160 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17178 if (!FD->
hasAttr<AllocSizeAttr>()) {
17179 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17190 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17191 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17215 unsigned FormatIdx;
17217 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17218 if (!FD->
hasAttr<FormatAttr>()) {
17219 const char *fmt =
"printf";
17221 if (FormatIdx < NumParams &&
17227 HasVAListArg ? 0 : FormatIdx+2,
17231 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17233 if (!FD->
hasAttr<FormatAttr>())
17235 &
Context.Idents.get(
"scanf"),
17237 HasVAListArg ? 0 : FormatIdx+2,
17243 if (!FD->
hasAttr<CallbackAttr>() &&
17244 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17245 FD->
addAttr(CallbackAttr::CreateImplicit(
17251 bool NoExceptions =
17253 bool ConstWithoutErrnoAndExceptions =
17254 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17255 bool ConstWithoutExceptions =
17256 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17257 if (!FD->
hasAttr<ConstAttr>() &&
17258 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17259 (!ConstWithoutErrnoAndExceptions ||
17261 (!ConstWithoutExceptions || NoExceptions))
17267 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17268 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17270 switch (BuiltinID) {
17271 case Builtin::BI__builtin_fma:
17272 case Builtin::BI__builtin_fmaf:
17273 case Builtin::BI__builtin_fmal:
17274 case Builtin::BIfma:
17275 case Builtin::BIfmaf:
17276 case Builtin::BIfmal:
17286 if (
Context.BuiltinInfo.isNonNull(BuiltinID, Indxs, OptMode) &&
17287 !FD->
hasAttr<NonNullAttr>()) {
17289 for (
int I : Indxs) {
17292 T =
Context.getAttributedType(attr::TypeNonNull,
T,
T);
17297 for (
int I : Indxs)
17298 ParamIndxs.push_back(
ParamIdx(I + 1, FD));
17299 FD->
addAttr(NonNullAttr::CreateImplicit(
Context, ParamIndxs.data(),
17300 ParamIndxs.size()));
17303 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17304 !FD->
hasAttr<ReturnsTwiceAttr>())
17307 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17309 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17311 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17314 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17319 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17326 switch (BuiltinID) {
17327 case Builtin::BImemalign:
17328 case Builtin::BIaligned_alloc:
17329 if (!FD->
hasAttr<AllocAlignAttr>())
17338 switch (BuiltinID) {
17339 case Builtin::BIcalloc:
17340 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17343 case Builtin::BImemalign:
17344 case Builtin::BIaligned_alloc:
17345 case Builtin::BIrealloc:
17349 case Builtin::BImalloc:
17369 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17385 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17388 if (!FD->
hasAttr<FormatAttr>())
17390 &
Context.Idents.get(
"printf"), 2,
17391 Name->
isStr(
"vasprintf") ? 0 : 3,
17395 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17398 if (!FD->
hasAttr<FormatArgAttr>())
17406 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17407 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17410 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17411 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17464 if (
T->isDependentType())
17474 if (
T->isAtomicType())
17475 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17478 std::optional<unsigned> QualSelect;
17480 QualSelect = diag::CVQualList::Both;
17482 QualSelect = diag::CVQualList::Const;
17484 QualSelect = diag::CVQualList::Volatile;
17487 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17489 T =
T.getAtomicUnqualifiedType();
17494 if (BT->isInteger())
17497 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17498 <<
T <<
T->isBitIntType();
17502 QualType EnumUnderlyingTy,
bool IsFixed,
17504 if (IsScoped != Prev->
isScoped()) {
17505 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17511 if (IsFixed && Prev->
isFixed()) {
17514 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17517 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17523 }
else if (IsFixed != Prev->
isFixed()) {
17524 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17546 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17582 llvm_unreachable(
"invalid TTK");
17621 if (IsIgnoredLoc(NewTagLoc))
17624 auto IsIgnored = [&](
const TagDecl *Tag) {
17625 return IsIgnoredLoc(Tag->getLocation());
17642 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17650 if (isDefinition) {
17658 bool previousMismatch =
false;
17660 if (I->getTagKind() !=
NewTag) {
17665 if (!previousMismatch) {
17666 previousMismatch =
true;
17667 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17671 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17684 if (PrevDef && IsIgnored(PrevDef))
17688 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17695 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17725 if (!Namespace || Namespace->isAnonymousNamespace())
17728 Namespaces.push_back(II);
17731 if (Lookup == Namespace)
17738 llvm::raw_svector_ostream OS(Insertion);
17741 std::reverse(Namespaces.begin(), Namespaces.end());
17742 for (
auto *II : Namespaces)
17743 OS << II->getName() <<
"::";
17756 if (OldDC->
Equals(NewDC))
17775 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17776 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17781 "Nameless record must be a definition!");
17786 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17789 bool isMemberSpecialization =
false;
17790 bool IsInjectedClassName =
false;
17796 if (TemplateParameterLists.size() > 0 ||
17800 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17817 !isMemberSpecialization)
17818 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17821 if (TemplateParams) {
17823 Diag(KWLoc, diag::err_enum_template);
17827 if (TemplateParams->
size() > 0) {
17836 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17837 AS, ModulePrivateLoc,
17839 TemplateParameterLists.data(), SkipBody);
17845 isMemberSpecialization =
true;
17849 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17868 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17869 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17870 Diag(KWLoc, diag::note_enum_friend)
17871 << (ScopedEnum + ScopedEnumUsesClassTag);
17877 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17878 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17881 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17884 EnumUnderlying =
Context.IntTy.getTypePtr();
17885 }
else if (UnderlyingType.
get()) {
17893 EnumUnderlying = TI;
17897 EnumUnderlying =
Context.IntTy.getTypePtr();
17901 EnumUnderlying =
Context.IntTy.getTypePtr();
17911 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
17912 TI && TI->
getType()->isAtomicType())
17915 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
17921 EnumUnderlying =
Context.IntTy.getTypePtr();
17927 bool isStdBadAlloc =
false;
17928 bool isStdAlignValT =
false;
17937 auto createTagFromNewDecl = [&]() ->
TagDecl * {
17947 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17951 if (EnumUnderlying) {
17953 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
17959 ?
Context.getPromotedIntegerType(EnumTy)
17980 RD->addAttr(PackedAttr::CreateImplicit(
Context));
17996 goto CreateNewDecl;
18004 IsDependent =
true;
18033 if (
Previous.wasNotFoundInCurrentInstantiation() &&
18035 IsDependent =
true;
18040 Diag(NameLoc, diag::err_not_tag_in_scope)
18041 << Kind << Name << DC << SS.
getRange();
18044 goto CreateNewDecl;
18092 bool FriendSawTagOutsideEnclosingNamespace =
false;
18099 FriendSawTagOutsideEnclosingNamespace =
true;
18108 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18110 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18141 Previous.getFoundDecl()->isTemplateParameter()) {
18150 if (Name->
isStr(
"bad_alloc")) {
18152 isStdBadAlloc =
true;
18159 }
else if (Name->
isStr(
"align_val_t")) {
18160 isStdAlignValT =
true;
18172 IsTemplateParamOrArg)) {
18173 if (
Invalid)
goto CreateNewDecl;
18256 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18257 if (Tag->getDeclName() == Name &&
18258 Tag->getDeclContext()->getRedeclContext()
18259 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18266 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18268 RD->isInjectedClassName()) {
18275 IsInjectedClassName =
true;
18282 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18283 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18286 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18288 *
this, OldTag->getDeclContext(), SearchDC))) {
18289 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18290 Diag(Shadow->getTargetDecl()->getLocation(),
18291 diag::note_using_decl_target);
18292 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18296 goto CreateNewDecl;
18300 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18306 SS.
isNotEmpty() || isMemberSpecialization)) {
18312 bool SafeToContinue =
18315 if (SafeToContinue)
18316 Diag(KWLoc, diag::err_use_with_wrong_tag)
18319 PrevTagDecl->getKindName());
18321 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18322 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18324 if (SafeToContinue)
18325 Kind = PrevTagDecl->getTagKind();
18338 return PrevTagDecl;
18342 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18343 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18344 else if (
const Type *
T =
18345 dyn_cast_if_present<const Type *>(EnumUnderlying))
18352 ScopedEnum, EnumUnderlyingTy,
18353 IsFixed, PrevEnum))
18363 Diag(NameLoc, diag::ext_member_redeclared);
18364 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18371 if (!Attrs.
empty()) {
18375 (PrevTagDecl->getFriendObjectKind() ==
18388 return PrevTagDecl;
18393 return PrevTagDecl;
18402 if (Def->isBeingDefined()) {
18403 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18404 Diag(PrevTagDecl->getLocation(),
18405 diag::note_previous_definition);
18413 bool IsExplicitSpecializationAfterInstantiation =
false;
18414 if (isMemberSpecialization) {
18416 IsExplicitSpecializationAfterInstantiation =
18417 RD->getTemplateSpecializationKind() !=
18419 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18420 IsExplicitSpecializationAfterInstantiation =
18421 ED->getTemplateSpecializationKind() !=
18430 bool HiddenDefVisible =
false;
18444 SkipBody->
New = createTagFromNewDecl();
18453 if (!HiddenDefVisible && Hidden)
18458 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18463 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18466 Diag(NameLoc, diag::err_redefinition) << Name;
18468 NameLoc.
isValid() ? NameLoc : KWLoc);
18487 SearchDC = PrevTagDecl->getDeclContext();
18515 Diag(NameLoc, diag::err_tag_reference_non_tag)
18516 << PrevDecl << NTK << Kind;
18522 SS.
isNotEmpty() || isMemberSpecialization)) {
18528 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18534 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18537 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18538 << Name << Kind << TND->getUnderlyingType();
18546 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18578 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18579 ScopedEnumUsesClassTag, IsFixed);
18583 KWLoc, ScopedEnumKWLoc.
isValid() ? ScopedEnumKWLoc : KWLoc));
18591 if (IsFixed && ED->
isFixed()) {
18594 }
else if (PrevDecl &&
18596 Diag(Loc, diag::ext_forward_ref_enum_def)
18600 unsigned DiagID = diag::ext_forward_ref_enum;
18602 DiagID = diag::ext_ms_forward_ref_enum;
18604 DiagID = diag::err_forward_ref_enum;
18609 if (EnumUnderlying) {
18611 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18617 ?
Context.getPromotedIntegerType(EnumTy)
18619 assert(ED->
isComplete() &&
"enum with type should be complete");
18629 cast_or_null<CXXRecordDecl>(PrevDecl));
18635 cast_or_null<RecordDecl>(PrevDecl));
18641 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18647 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18649 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18656 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18669 isMemberSpecialization))
18673 if (TemplateParameterLists.size() > 0) {
18674 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18693 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18699 if (ModulePrivateLoc.
isValid()) {
18700 if (isMemberSpecialization)
18701 Diag(
New->getLocation(), diag::err_module_private_specialization)
18708 New->setModulePrivate();
18728 Diag(Loc, diag::err_type_defined_in_param_type)
18734 }
else if (!PrevDecl) {
18738 Diag(Loc, diag::warn_decl_in_param_list)
18744 New->setInvalidDecl();
18766 New->startDefinition();
18768 New->setCompleteDefinition();
18769 New->demoteThisDefinitionToDeclaration();
18797 if (!
New->isInvalidDecl() &&
18798 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18805 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18818 if (isMemberSpecialization && !
New->isInvalidDecl())
18825 if (
New->isBeingDefined())
18826 if (
auto RD = dyn_cast<RecordDecl>(
New))
18827 RD->completeDefinition();
18829 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18863 bool IsFinalSpelledSealed,
18871 if (!
Record->getIdentifier())
18879 IsFinalSpelledSealed
18880 ? FinalAttr::Keyword_sealed
18881 : FinalAttr::Keyword_final));
18899 "Broken injected-class-name");
18906 Tag->setBraceRange(BraceRange);
18909 if (Tag->isBeingDefined()) {
18910 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18911 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18912 RD->completeDefinition();
18915 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18917 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
18918 auto *Def = RD->getDefinition();
18919 assert(Def &&
"The record is expected to have a completed definition");
18920 unsigned NumInitMethods = 0;
18921 for (
auto *
Method : Def->methods()) {
18922 if (!
Method->getIdentifier())
18924 if (
Method->getName() ==
"__init")
18927 if (NumInitMethods > 1 || !Def->hasInitMethod())
18928 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
18946 Tag->setTopLevelDeclInObjCContainer();
18949 if (!Tag->isInvalidDecl())
18950 Consumer.HandleTagDeclDefinition(Tag);
18954 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
18960 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18964 if (llvm::any_of(RD->
fields(),
18965 [](
const FieldDecl *FD) { return FD->isBitField(); }))
18966 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
18973 Tag->setInvalidDecl();
18976 if (Tag->isBeingDefined()) {
18977 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18978 RD->completeDefinition();
18991 QualType FieldTy,
bool IsMsStruct,
19002 diag::err_field_incomplete_or_sizeless))
19005 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
19007 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
19017 llvm::APSInt
Value;
19022 BitWidth = ICE.
get();
19025 if (
Value == 0 && FieldName)
19026 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
19029 if (
Value.isSigned() &&
Value.isNegative()) {
19031 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
19033 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
19040 return Diag(FieldLoc, diag::err_bitfield_too_wide)
19045 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
19046 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
19047 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
19051 bool CStdConstraintViolation =
19053 bool MSBitfieldViolation =
Value.ugt(TypeStorageSize) && IsMsStruct;
19054 if (CStdConstraintViolation || MSBitfieldViolation) {
19055 unsigned DiagWidth =
19056 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
19057 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
19059 << !CStdConstraintViolation << DiagWidth;
19065 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
19066 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19109 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19120 diag::err_invalid_thread)
19128 switch (
Previous.getResultKind()) {
19135 PrevDecl =
Previous.getRepresentativeDecl();
19149 PrevDecl =
nullptr;
19153 PrevDecl =
nullptr;
19160 TSSL, AS, PrevDecl, &D);
19163 Record->setInvalidDecl();
19182 bool Mutable,
Expr *BitWidth,
19188 bool InvalidDecl =
false;
19193 if (
T.isNull() ||
T->containsErrors()) {
19194 InvalidDecl =
true;
19200 bool isIncomplete =
19204 diag::err_field_incomplete_or_sizeless);
19205 if (isIncomplete) {
19207 Record->setInvalidDecl();
19208 InvalidDecl =
true;
19213 Record->setInvalidDecl();
19214 InvalidDecl =
true;
19220 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19221 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19222 Diag(Loc, diag::err_field_with_address_space);
19223 Record->setInvalidDecl();
19224 InvalidDecl =
true;
19230 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19231 T->isBlockPointerType()) {
19232 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19233 Record->setInvalidDecl();
19234 InvalidDecl =
true;
19239 "__cl_clang_bitfields",
LangOpts)) {
19240 Diag(Loc, diag::err_opencl_bitfields);
19241 InvalidDecl =
true;
19247 T.hasQualifiers()) {
19248 InvalidDecl =
true;
19249 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19254 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19256 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19257 InvalidDecl =
true;
19262 diag::err_abstract_type_in_decl,
19264 InvalidDecl =
true;
19267 BitWidth =
nullptr;
19273 InvalidDecl =
true;
19274 BitWidth =
nullptr;
19279 if (!InvalidDecl && Mutable) {
19280 unsigned DiagID = 0;
19281 if (
T->isReferenceType())
19282 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19283 : diag::err_mutable_reference;
19284 else if (
T.isConstQualified())
19285 DiagID = diag::err_mutable_const;
19291 Diag(ErrLoc, DiagID);
19292 if (DiagID != diag::ext_mutable_reference) {
19294 InvalidDecl =
true;
19306 BitWidth, Mutable, InitStyle);
19315 Diag(Loc, diag::err_duplicate_member) << II;
19321 if (
Record->isUnion()) {
19323 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19338 const bool HaveMSExt =
19343 HaveMSExt ? diag::ext_union_member_of_reference_type
19344 : diag::err_union_member_of_reference_type)
19364 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19367 if (
T.isObjCGCWeak())
19368 Diag(Loc, diag::warn_attribute_weak_on_field);
19371 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19388 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19399 if (RDecl->hasNonTrivialCopyConstructor())
19401 else if (!RDecl->hasTrivialDefaultConstructor())
19403 else if (RDecl->hasNonTrivialCopyAssignment())
19405 else if (RDecl->hasNonTrivialDestructor())
19410 RDecl->hasObjectMember()) {
19418 if (!FD->
hasAttr<UnavailableAttr>())
19419 FD->
addAttr(UnavailableAttr::CreateImplicit(
19420 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19427 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19428 : diag::err_illegal_union_or_anon_struct_member)
19440 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19443 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19451 if (!CD->IsClassExtension())
19468 AllIvarDecls.push_back(Ivar);
19480 if (!
Record->hasUserDeclaredDestructor()) {
19488 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19489 if (DD->isInvalidDecl())
19493 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19507 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19511 Msg = diag::err_ambiguous_destructor;
19516 Msg = diag::err_no_viable_destructor;
19527 Record->setInvalidDecl();
19534 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19578 if (!Method->getTrailingRequiresClause())
19579 SatisfactionStatus.push_back(
true);
19583 SatisfactionStatus.push_back(
false);
19585 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19589 for (
size_t i = 0; i < Methods.size(); i++) {
19590 if (!SatisfactionStatus[i])
19598 bool AnotherMethodIsMoreConstrained =
false;
19599 for (
size_t j = 0; j < Methods.size(); j++) {
19600 if (i == j || !SatisfactionStatus[j])
19614 AnotherMethodIsMoreConstrained =
true;
19618 AnotherMethodIsMoreConstrained)) {
19621 AnotherMethodIsMoreConstrained =
true;
19623 if (AnotherMethodIsMoreConstrained)
19628 if (!AnotherMethodIsMoreConstrained) {
19629 Method->setIneligibleOrNotSelected(
false);
19630 Record->addedEligibleSpecialMemberFunction(Method,
19631 1 << llvm::to_underlying(CSM));
19645 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19647 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19649 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19653 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19654 if (CD->isInvalidDecl())
19656 if (CD->isDefaultConstructor())
19657 DefaultConstructors.push_back(MD);
19658 else if (CD->isCopyConstructor())
19659 CopyConstructors.push_back(MD);
19660 else if (CD->isMoveConstructor())
19661 MoveConstructors.push_back(MD);
19663 CopyAssignmentOperators.push_back(MD);
19665 MoveAssignmentOperators.push_back(MD);
19683 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19684 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19697 if (
const auto *TD = dyn_cast<TagDecl>(D))
19698 return !TD->isCompleteDefinition();
19713 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19720 assert(EnclosingDecl &&
"missing record or interface decl");
19729 case Decl::ObjCCategory:
19732 case Decl::ObjCImplementation:
19740 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19744 unsigned NumNamedMembers = 0;
19746 for (
const auto *I :
Record->decls()) {
19747 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19748 if (IFD->getDeclName())
19755 const FieldDecl *PreviousField =
nullptr;
19765 RecFields.push_back(FD);
19785 bool IsLastField = (i + 1 == Fields.end());
19800 unsigned DiagID = 0;
19801 if (!
Record->isUnion() && !IsLastField) {
19804 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19808 }
else if (
Record->isUnion())
19810 ? diag::ext_flexible_array_union_ms
19811 : diag::ext_flexible_array_union_gnu;
19812 else if (NumNamedMembers < 1)
19814 ? diag::ext_flexible_array_empty_aggregate_ms
19815 : diag::ext_flexible_array_empty_aggregate_gnu;
19825 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19839 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19846 Record->setHasFlexibleArrayMember(
true);
19855 diag::err_incomplete_type)
19858 diag::err_field_incomplete_or_sizeless))) {
19864 if (
Record && RD->hasFlexibleArrayMember()) {
19867 Record->setHasFlexibleArrayMember(
true);
19868 if (!
Record->isUnion()) {
19885 diag::err_abstract_type_in_decl,
19890 if (
Record && RD->hasObjectMember())
19891 Record->setHasObjectMember(
true);
19892 if (
Record && RD->hasVolatileMember())
19893 Record->setHasVolatileMember(
true);
19912 FD->
addAttr(UnavailableAttr::CreateImplicit(
19913 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19917 !
Record->hasObjectMember()) {
19920 Record->setHasObjectMember(
true);
19923 if (
const auto *RD = BaseType->getAsRecordDecl();
19924 RD && RD->hasObjectMember())
19925 Record->setHasObjectMember(
true);
19926 else if (BaseType->isObjCObjectPointerType() ||
19927 BaseType.isObjCGCStrong())
19928 Record->setHasObjectMember(
true);
19933 !shouldIgnoreForRecordTriviality(FD)) {
19936 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
19939 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
19943 Record->setNonTrivialToPrimitiveCopy(
true);
19945 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
19947 if (FD->
hasAttr<ExplicitInitAttr>())
19948 Record->setHasUninitializedExplicitInitFields(
true);
19950 Record->setNonTrivialToPrimitiveDestroy(
true);
19951 Record->setParamDestroyedInCallee(
true);
19953 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
19957 if (RD->getArgPassingRestrictions() ==
19959 Record->setArgPassingRestrictions(
19962 Record->setArgPassingRestrictions(
19966 Record->setArgPassingRestrictions(
19968 Record->setNonTrivialToPrimitiveCopy(
true);
19973 Record->setHasVolatileMember(
true);
19974 bool ReportMSBitfieldStoragePacking =
19975 Record && PreviousField &&
19976 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
19978 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
19982 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
19983 IsNonDependentBitField(PreviousField)) {
19987 if (FDStorageSize != PreviousFieldStorageSize) {
19989 diag::warn_ms_bitfield_mismatched_storage_packing)
19993 diag::note_ms_bitfield_mismatched_storage_size_previous)
19994 << PreviousField << PreviousField->
getType();
20004 bool Completed =
false;
20009 Record->setInvalidDecl();
20013 if (!CXXRecord->isInvalidDecl()) {
20016 I = CXXRecord->conversion_begin(),
20017 E = CXXRecord->conversion_end(); I != E; ++I)
20018 I.setAccess((*I)->getAccess());
20024 if (!CXXRecord->isDependentType()) {
20025 if (!CXXRecord->isInvalidDecl()) {
20029 if (CXXRecord->getNumVBases()) {
20031 CXXRecord->getFinalOverriders(FinalOverriders);
20033 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
20034 MEnd = FinalOverriders.end();
20037 SOEnd = M->second.end();
20038 SO != SOEnd; ++SO) {
20039 assert(SO->second.size() > 0 &&
20040 "Virtual function without overriding functions?");
20041 if (SO->second.size() == 1)
20048 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
20050 Diag(M->first->getLocation(),
20051 diag::note_overridden_virtual_function);
20053 OM = SO->second.begin(),
20054 OMEnd = SO->second.end();
20056 Diag(OM->Method->getLocation(), diag::note_final_overrider)
20057 << (
const NamedDecl *)M->first << OM->Method->getParent();
20059 Record->setInvalidDecl();
20062 CXXRecord->completeDefinition(&FinalOverriders);
20072 Record->completeDefinition();
20081 (
Record->hasAttr<RandomizeLayoutAttr>() ||
20082 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
20083 EntirelyFunctionPointers(
Record)))) {
20087 Record->reorderDecls(NewDeclOrdering);
20092 auto *Dtor = CXXRecord->getDestructor();
20093 if (Dtor && Dtor->isImplicit() &&
20095 CXXRecord->setImplicitDestructorIsDeleted();
20100 if (
Record->hasAttrs()) {
20103 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20105 IA->getRange(), IA->getBestCase(),
20106 IA->getInheritanceModel());
20112 bool CheckForZeroSize;
20114 CheckForZeroSize =
true;
20119 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20121 CXXRecord->isCLike();
20123 if (CheckForZeroSize) {
20124 bool ZeroSize =
true;
20125 bool IsEmpty =
true;
20126 unsigned NonBitFields = 0;
20128 E =
Record->field_end();
20129 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20131 if (I->isUnnamedBitField()) {
20132 if (!I->isZeroLengthBitField())
20136 QualType FieldType = I->getType();
20138 !
Context.getTypeSizeInChars(FieldType).isZero())
20148 diag::warn_zero_size_struct_union_in_extern_c :
20149 diag::warn_zero_size_struct_union_compat)
20150 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20157 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20158 : diag::ext_no_named_members_in_struct_union)
20166 ID->setEndOfDefinitionLoc(RBrac);
20168 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20170 ID->addDecl(ClsFields[i]);
20174 if (ID->getSuperClass())
20177 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20178 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20179 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20185 IMPDecl->setIvarLBraceLoc(LBrac);
20186 IMPDecl->setIvarRBraceLoc(RBrac);
20188 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20196 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20200 Diag(ClsFields[i]->getLocation(),
20201 diag::err_duplicate_ivar_declaration);
20202 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20208 Diag(ClsFields[i]->getLocation(),
20209 diag::err_duplicate_ivar_declaration);
20210 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20216 CDecl->addDecl(ClsFields[i]);
20218 CDecl->setIvarLBraceLoc(LBrac);
20219 CDecl->setIvarRBraceLoc(RBrac);
20231 assert((
T->isIntegralType(Context) ||
20232 T->isEnumeralType()) &&
"Integral type required!");
20233 const unsigned NumTypes = 4;
20234 QualType SignedIntegralTypes[NumTypes] = {
20235 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20237 QualType UnsignedIntegralTypes[NumTypes] = {
20238 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20239 Context.UnsignedLongLongTy
20242 unsigned BitWidth = Context.getTypeSize(
T);
20243 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20244 : UnsignedIntegralTypes;
20245 for (
unsigned I = 0; I != NumTypes; ++I)
20246 if (Context.getTypeSize(Types[I]) > BitWidth)
20257 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20258 llvm::APSInt EnumVal(IntWidth);
20278 EltTy =
Enum->getIntegerType();
20284 Val = Converted.
get();
20291 if (
Enum->isComplete()) {
20292 EltTy =
Enum->getIntegerType();
20298 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20301 .isWindowsMSVCEnvironment()) {
20302 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20304 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20327 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20329 ? diag::warn_c17_compat_enum_value_not_int
20330 : diag::ext_c23_enum_value_not_int)
20332 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20344 if (
Enum->isDependentType())
20346 else if (!LastEnumConst) {
20355 if (
Enum->isFixed()) {
20356 EltTy =
Enum->getIntegerType();
20365 EltTy = LastEnumConst->
getType();
20368 if (EnumVal < LastEnumConst->getInitVal()) {
20380 if (
T.isNull() ||
Enum->isFixed()) {
20384 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20386 if (
Enum->isFixed())
20388 Diag(IdLoc, diag::err_enumerator_wrapped)
20392 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20403 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20415 ? diag::warn_c17_compat_enum_value_not_int
20416 : diag::ext_c23_enum_value_not_int)
20417 << 1 <<
toString(EnumVal, 10) << 1;
20419 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20422 : diag::ext_c23_enum_value_not_int)
20423 << 1 <<
toString(EnumVal, 10) << 1;
20431 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20450 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20458 Skip.Previous = Hidden;
20472 cast_or_null<EnumConstantDecl>(lastEnumConst);
20489 PrevDecl =
nullptr;
20516 "Received TagDecl when not in C++!");
20519 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20521 Diag(IdLoc, diag::err_redefinition) << Id;
20554 if (!BO->isAdditiveOp())
20562 InitExpr = BO->getLHS();
20566 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20586 if (!
Enum->getIdentifier())
20590 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20599 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20602 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20606 llvm::APSInt Val = D->getInitVal();
20607 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20610 DuplicatesVector DupVector;
20611 ValueToVectorMap EnumMap;
20615 for (
auto *Element : Elements) {
20629 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20632 if (EnumMap.size() == 0)
20636 for (
auto *Element : Elements) {
20642 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20643 if (Iter == EnumMap.end())
20646 DeclOrVector& Entry = Iter->second;
20653 auto Vec = std::make_unique<ECDVector>();
20655 Vec->push_back(ECD);
20662 DupVector.emplace_back(std::move(Vec));
20668 if (*Vec->begin() == ECD)
20671 Vec->push_back(ECD);
20675 for (
const auto &Vec : DupVector) {
20676 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20679 auto *FirstECD = Vec->front();
20680 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20681 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20682 << FirstECD->getSourceRange();
20686 for (
auto *ECD : llvm::drop_begin(*Vec))
20687 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20688 << ECD <<
toString(ECD->getInitVal(), 10)
20689 << ECD->getSourceRange();
20694 bool AllowMask)
const {
20695 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20699 llvm::APInt &FlagBits = R.first->second;
20703 const auto &EVal = E->getInitVal();
20705 if (EVal.isPowerOf2())
20706 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20718 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20719 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20726 bool HasBitwiseOp =
false;
20731 for (
const auto *ECD :
Enum->enumerators()) {
20732 const Expr *InitExpr = ECD->getInitExpr();
20738 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20742 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20743 HasBitwiseOp =
true;
20744 }
else if (Op == BO_LT || Op == BO_GT) {
20747 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20749 if (IntLiteral->getValue() == 1)
20750 SuspiciousCompares.push_back(BinOp);
20758 if (HasBitwiseOp) {
20759 for (
const auto *BinOp : SuspiciousCompares) {
20760 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20765 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20766 << BinOp->getOpcodeStr() << SuggestedOp;
20768 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20784 if (
Enum->isDependentType()) {
20785 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20787 cast_or_null<EnumConstantDecl>(Elements[i]);
20788 if (!ECD)
continue;
20799 unsigned NumNegativeBits = 0;
20800 unsigned NumPositiveBits = 0;
20801 bool MembersRepresentableByInt =
20802 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20806 unsigned BestWidth;
20827 if (
Enum->isComplete()) {
20828 BestType =
Enum->getIntegerType();
20829 if (
Context.isPromotableIntegerType(BestType))
20830 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20832 BestPromotionType = BestType;
20834 BestWidth =
Context.getIntWidth(BestType);
20836 bool EnumTooLarge =
Context.computeBestEnumTypes(
20837 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20838 BestWidth =
Context.getIntWidth(BestType);
20840 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20845 for (
auto *D : Elements) {
20846 auto *ECD = cast_or_null<EnumConstantDecl>(D);
20847 if (!ECD)
continue;
20856 llvm::APSInt InitVal = ECD->getInitVal();
20864 MembersRepresentableByInt) {
20872 NewWidth =
Context.getTargetInfo().getIntWidth();
20874 }
else if (ECD->getType() == BestType) {
20882 ECD->setType(EnumType);
20886 NewWidth = BestWidth;
20891 InitVal = InitVal.extOrTrunc(NewWidth);
20892 InitVal.setIsSigned(NewSign);
20893 ECD->setInitVal(
Context, InitVal);
20896 if (ECD->getInitExpr() &&
20897 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20899 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20908 ECD->setType(EnumType);
20910 ECD->setType(NewTy);
20913 Enum->completeDefinition(BestType, BestPromotionType,
20914 NumPositiveBits, NumNegativeBits);
20919 if (
Enum->isClosedFlag()) {
20920 for (
Decl *D : Elements) {
20922 if (!ECD)
continue;
20925 if (InitVal != 0 && !InitVal.isPowerOf2() &&
20933 if (
Enum->hasAttrs())
20972 AsmLabelAttr *
Attr =
20973 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
20983 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
20996 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
21012 if (!PrevDecl->
hasAttr<AliasAttr>())
21013 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
21022 assert(FD &&
"Expected non-null FunctionDecl");
21034 auto IsEmittedForExternalSymbol = [
this, FD]() {
21046 if (
LangOpts.OpenMPIsTargetDevice) {
21049 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21056 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
21060 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
21061 if (IsEmittedForExternalSymbol())
21067 }
else if (
LangOpts.OpenMP > 45) {
21071 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
21074 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
21093 if (IsEmittedForExternalSymbol())
21098 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
21100 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
21103 Spec->getTemplateSpecializationKind();
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
static bool isDeclExternC(const T &D)
Defines the classes clang::DelayedDiagnostic and clang::AccessedEntity.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines helper utilities for supporting the HLSL runtime environment.
static const Decl * getCanonicalDecl(const Decl *D)
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Architecture Architecture
llvm::MachO::Record Record
static bool isExternC(const NamedDecl *ND)
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
RedeclarationKind
Specifies whether (or how) name lookup is being performed for a redeclaration (vs.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to ARM.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static void diagnoseImplicitlyRetainedSelf(Sema &S)
static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D)
static UnqualifiedTypeNameLookupResult lookupUnqualifiedTypeNameInBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc, const CXXRecordDecl *RD)
Tries to perform unqualified lookup of the type decls in bases for dependent class.
static bool ShouldWarnAboutMissingPrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool isMainVar(DeclarationName Name, VarDecl *VD)
static bool PreviousDeclsHaveMultiVersionAttribute(const FunctionDecl *FD)
static ParsedType recoverFromTypeInKnownDependentBase(Sema &S, const IdentifierInfo &II, SourceLocation NameLoc)
static void mergeParamDeclTypes(ParmVarDecl *NewParam, const ParmVarDecl *OldParam, Sema &S)
static void checkHybridPatchableAttr(Sema &S, NamedDecl &ND)
static void adjustDeclContextForDeclaratorDecl(DeclaratorDecl *NewD, DeclaratorDecl *OldD)
If necessary, adjust the semantic declaration context for a qualified declaration to name the correct...
static bool isResultTypeOrTemplate(LookupResult &R, const Token &NextToken)
Determine whether the given result set contains either a type name or.
static void FixInvalidVariablyModifiedTypeLoc(TypeLoc SrcTL, TypeLoc DstTL)
static bool AllowOverloadingOfFunction(const LookupResult &Previous, ASTContext &Context, const FunctionDecl *New)
Determine whether overloading is allowed for a new function declaration considering prior declaration...
static TypeSourceInfo * TryToFixInvalidVariablyModifiedTypeSourceInfo(TypeSourceInfo *TInfo, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static StringRef getHeaderName(Builtin::Context &BuiltinInfo, unsigned ID, ASTContext::GetBuiltinTypeError Error)
static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D)
static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS, ExpectedDecl *New)
Check whether a redeclaration of an entity introduced by a using-declaration is valid,...
static ShadowedDeclKind computeShadowedDeclKind(const NamedDecl *ShadowedDecl, const DeclContext *OldDC)
Determine what kind of declaration we're shadowing.
static void checkIsValidOpenCLKernelParameter(Sema &S, Declarator &D, ParmVarDecl *Param, llvm::SmallPtrSetImpl< const Type * > &ValidTypes)
static void mergeParamDeclAttributes(ParmVarDecl *newDecl, const ParmVarDecl *oldDecl, Sema &S)
mergeParamDeclAttributes - Copy attributes from the old parameter to the new one.
static bool CheckC23ConstexprVarType(Sema &SemaRef, SourceLocation VarLoc, QualType T)
static bool CheckMultiVersionFunction(Sema &S, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a mulitversion function declaration.
static bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old)
Merge alignment attributes from Old to New, taking into account the special semantics of C11's _Align...
static bool mergeTypeWithPrevious(Sema &S, VarDecl *NewVD, VarDecl *OldVD, LookupResult &Previous)
static void CheckConstPureAttributesUsage(Sema &S, FunctionDecl *NewFD)
static bool FindPossiblePrototype(const FunctionDecl *FD, const FunctionDecl *&PossiblePrototype)
static bool MultiVersionTypesCompatible(FunctionDecl *Old, FunctionDecl *New)
static NestedNameSpecifier synthesizeCurrentNestedNameSpecifier(ASTContext &Context, DeclContext *DC)
static void GenerateFixForUnusedDecl(const NamedDecl *D, ASTContext &Ctx, FixItHint &Hint)
static void CheckExplicitObjectParameter(Sema &S, ParmVarDecl *P, SourceLocation ExplicitThisLoc)
static void checkLifetimeBoundAttr(Sema &S, NamedDecl &ND)
static void patchDefaultTargetVersion(FunctionDecl *From, FunctionDecl *To)
static bool isFunctionDefinitionDiscarded(Sema &S, FunctionDecl *FD)
Given that we are within the definition of the given function, will that definition behave like C99's...
static void CheckForDuplicateEnumValues(Sema &S, ArrayRef< Decl * > Elements, EnumDecl *Enum, QualType EnumType)
static unsigned GetDiagnosticTypeSpecifierID(const DeclSpec &DS)
static void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old)
checkNewAttributesAfterDef - If we already have a definition, check that there are no new attributes ...
static bool isClassCompatTagKind(TagTypeKind Tag)
Determine if tag kind is a class-key compatible with class for redeclaration (class,...
static bool hasIdenticalPassObjectSizeAttrs(const FunctionDecl *A, const FunctionDecl *B)
static void checkAttributesAfterMerging(Sema &S, NamedDecl &ND)
static bool hasSimilarParameters(ASTContext &Context, FunctionDecl *Declaration, FunctionDecl *Definition, SmallVectorImpl< unsigned > &Params)
hasSimilarParameters - Determine whether the C++ functions Declaration and Definition have "nearly" m...
static NonCLikeKind getNonCLikeKindForAnonymousStruct(const CXXRecordDecl *RD)
Determine whether a class is C-like, according to the rules of C++ [dcl.typedef] for anonymous classe...
static unsigned propagateAttribute(ParmVarDecl *To, const ParmVarDecl *From, Sema &S)
static FunctionDecl * CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, DeclContext *DC, QualType &R, TypeSourceInfo *TInfo, StorageClass SC, bool &IsVirtualOkay)
static Scope * getTagInjectionScope(Scope *S, const LangOptions &LangOpts)
Find the Scope in which a tag is implicitly declared if we see an elaborated type specifier in the sp...
static bool methodHasName(const FunctionDecl *FD, StringRef Name)
static std::pair< diag::kind, SourceLocation > getNoteDiagForInvalidRedeclaration(const T *Old, const T *New)
static bool checkForConflictWithNonVisibleExternC(Sema &S, const T *ND, LookupResult &Previous)
Apply special rules for handling extern "C" declarations.
static bool DeclHasAttr(const Decl *D, const Attr *A)
DeclhasAttr - returns true if decl Declaration already has the target attribute.
static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty)
static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit)
static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags, const LookupResult &R)
static FixItHint createFriendTagNNSFixIt(Sema &SemaRef, NamedDecl *ND, Scope *S, SourceLocation NameLoc)
Add a minimal nested name specifier fixit hint to allow lookup of a tag name from an outer enclosing ...
static bool CheckAnonMemberRedeclaration(Sema &SemaRef, Scope *S, DeclContext *Owner, DeclarationName Name, SourceLocation NameLoc, bool IsUnion, StorageClass SC)
We are trying to inject an anonymous member into the given scope; check if there's an existing declar...
static bool checkGlobalOrExternCConflict(Sema &S, const T *ND, bool IsGlobal, LookupResult &Previous)
Check for conflict between this global or extern "C" declaration and previous global or extern "C" de...
static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts, const NamedDecl *D)
static bool isStdBuiltin(ASTContext &Ctx, FunctionDecl *FD, unsigned BuiltinID)
Determine whether a declaration matches a known function in namespace std.
static bool InjectAnonymousStructOrUnionMembers(Sema &SemaRef, Scope *S, DeclContext *Owner, RecordDecl *AnonRecord, AccessSpecifier AS, StorageClass SC, SmallVectorImpl< NamedDecl * > &Chaining)
InjectAnonymousStructOrUnionMembers - Inject the members of the anonymous struct or union AnonRecord ...
@ InvalidAddrSpacePtrKernelParam
static bool isFromSystemHeader(SourceManager &SM, const Decl *D)
Returns true if the declaration is declared in a system header or from a system macro.
static SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const ValueDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context, CXXMethodDecl *M1, CXXMethodDecl *M2, CXXSpecialMemberKind CSM)
[class.mem.special]p5 Two special member functions are of the same kind if:
static const CXXRecordDecl * findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC)
Find the parent class with dependent bases of the innermost enclosing method context.
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record)
[class.dtor]p4: At the end of the definition of a class, overload resolution is performed among the p...
static bool shouldConsiderLinkage(const VarDecl *VD)
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record)
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD, const FunctionDecl *NewFD, bool CausesMV, MultiVersionKind MVKind)
static DeclContext * getTagInjectionContext(DeclContext *DC)
Find the DeclContext in which a tag is implicitly declared if we see an elaborated type specifier in ...
static bool EquivalentArrayTypes(QualType Old, QualType New, const ASTContext &Ctx)
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New)
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for redeclaration diagnostic message.
static void checkInheritableAttr(Sema &S, NamedDecl &ND)
static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver)
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl *Old)
static NamedDecl * DiagnoseInvalidRedeclaration(Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD, ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S)
Generate diagnostics for an invalid function redeclaration.
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, DeclarationName Name)
RebuildDeclaratorInCurrentInstantiation - Checks whether the given declarator needs to be rebuilt in ...
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record, ArrayRef< CXXMethodDecl * > Methods, CXXSpecialMemberKind CSM)
[class.mem.special]p6: An eligible special member function is a special member function for which:
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc)
static bool hasParsedAttr(Scope *S, const Declarator &PD, ParsedAttr::Kind Kind)
ShadowedDeclKind
Enum describing the select options in diag::warn_decl_shadow.
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S)
static void CheckForComparisonInEnumInitializer(SemaBase &Sema, const EnumDecl *Enum)
static void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
static bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
static void checkWeakAttr(Sema &S, NamedDecl &ND)
static void checkModularFormatAttr(Sema &S, NamedDecl &ND)
static void checkSelectAnyAttr(Sema &S, NamedDecl &ND)
static bool isImplicitInstantiation(NamedDecl *D)
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT)
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent, SourceLocation DefaultInitLoc)
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S)
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD)
Returns true if there hasn't been any invalid type diagnosed.
static void RemoveUsingDecls(LookupResult &R)
Removes using shadow declarations not at class scope from the lookup results.
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S, CXXRecordDecl *Record)
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind, MultiVersionKind MVKind)
static bool looksMutable(QualType T, const ASTContext &Ctx)
static bool isUsingDeclNotAtClassScope(NamedDecl *D)
static void propagateAttributes(ParmVarDecl *To, const ParmVarDecl *From, F &&propagator)
static const NamedDecl * getDefinition(const Decl *D)
static QualType TryToFixInvalidVariablyModifiedType(QualType T, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static bool hasDeducedAuto(DeclaratorDecl *DD)
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT)
static QualType getCoreType(QualType Ty)
static bool isMainFileLoc(const Sema &S, SourceLocation Loc)
static bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, AvailabilityMergeKind AMK)
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD)
Check the target or target_version attribute of the function for MultiVersion validity.
static bool isOutOfScopePreviousDeclaration(NamedDecl *, DeclContext *, ASTContext &)
Determines whether the given declaration is an out-of-scope previous declaration.
static StorageClass StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS)
StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to a VarDecl::StorageClass.
static bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a new function declaration being added to an existing multiversioned declaratio...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void checkAliasAttr(Sema &S, NamedDecl &ND)
static void filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl, LookupResult &Previous)
Typedef declarations don't have linkage, but they still denote the same entity if their types are the...
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum)
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T)
static void checkWeakRefAttr(Sema &S, NamedDecl &ND)
static bool isIncompleteDeclExternC(Sema &S, const T *D)
Determine whether a variable is extern "C" prior to attaching an initializer.
static bool isAttributeTargetADefinition(Decl *D)
static Attr * getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD)
Return a CodeSegAttr from a containing class.
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D)
Check for this common pattern:
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC, DeclContext *NewDC)
Determine whether a tag originally declared in context OldDC can be redeclared with an unqualified na...
static bool isRecordType(QualType T)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
static CharSourceRange getRange(const CharSourceRange &EditRange, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeMacroExpansion)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
@ GE_Missing_type
Missing a type.
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
TypeLoc getElementLoc() const
SourceLocation getRBracketLoc() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
@ AS_Declspec
__declspec(...)
SourceRange getRange() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
AttributeFactory & getFactory() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
void setAttr(const Attr *A)
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
A builtin binary operation expression such as "x + y" or "x <= y".
StringRef getOpcodeStr() const
static bool isCompoundAssignmentOp(Opcode Opc)
A binding in a decomposition declaration.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool doesNotEscape() const
This class is used for builtin types like 'int'.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
const char * getHeaderName(unsigned ID) const
If this is a library function that comes from a specific header, retrieve that header name.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, const AssociatedConstraint &TrailingRequiresClause={}, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
A mapping from each virtual member function to its set of final overriders.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
void addOverriddenMethod(const CXXMethodDecl *MD)
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
base_class_iterator bases_end()
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
base_class_iterator bases_begin()
capture_const_range captures() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool hasDefinition() const
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
UnresolvedSetIterator conversion_iterator
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
char * location_data() const
Retrieve the data associated with the source-location information.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool isCallToStdMove() const
CastKind getCastKind() const
static CharSourceRange getCharRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
llvm::APInt getSize() const
Return the constant array size as an APInt.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclListNode::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
SourceLocation getBeginLoc() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
static const TST TST_typeof_unqualType
bool hasAutoTypeSpec() const
static const TST TST_typename
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
void ClearStorageClassSpecs()
bool isNoreturnSpecified() const
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
static const TST TST_interface
static const TST TST_typeofExpr
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
void SetRangeStart(SourceLocation Loc)
SourceLocation getNoreturnSpecLoc() const
bool isExternInLinkageSpec() const
static const TST TST_union
SCS
storage-class-specifier
SourceLocation getExplicitSpecLoc() const
SourceLocation getModulePrivateSpecLoc() const
bool isMissingDeclaratorOk()
Checks if this DeclSpec can stand alone, without a Declarator.
ParsedType getRepAsType() const
void UpdateTypeRep(ParsedType Rep)
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
void ClearTypeQualifiers()
Clear out all of the type qualifiers.
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
static const TST TST_enum
static const TST TST_decltype
static bool isDeclRep(TST T)
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
static const TST TST_typeof_unqualExpr
static const TST TST_class
static const TST TST_void
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
static const TST TST_atomic
SourceLocation getThreadStorageClassSpecLoc() const
Decl * getRepAsDecl() const
static const TST TST_unspecified
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void UpdateExprRep(Expr *Rep)
static const TSCS TSCS_thread_local
static const TST TST_error
ExplicitSpecifier getExplicitSpecifier() const
bool isTypeSpecOwned() const
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_typeofType
static const TST TST_auto
ConstexprSpecKind getConstexprSpecifier() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setAttrs(const AttrVec &Attrs)
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
bool isInNamedModule() const
Whether this declaration comes from a named module.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void setTopLevelDeclInObjCContainer(bool V=true)
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
@ FOK_Declared
A friend of a previously-declared entity.
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
bool isReferenced() const
Whether any declaration of this entity was referenced.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
bool isAnyOperatorDelete() const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Expr * getAsmLabel() const
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
void setRedeclaration(bool Val)
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
void takeAttributesAppending(ParsedAttributes &attrs)
takeAttributesAppending - Takes attributes from the given ParsedAttributes set and add them to this d...
void setInvalidType(bool Val=true)
TemplateParameterList * getInventedTemplateParameterList() const
The template parameter list generated from the explicit template parameters along with any invented t...
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
const ParsedAttributesView & getDeclarationAttributes() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool hasInitializer() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
const Expr * getInitExpr() const
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
bool isComplete() const
Returns true if this can be considered a complete type.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
void setEnumKeyRange(SourceRange Range)
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withRegParm(unsigned RegParm) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
bool getCmseNSCallAttr() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
iterator - Iterate over the decls of a specified declaration name.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
step_iterator step_begin() const
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
Describes an entity that is being initialized.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
bool isResolvedMSAsmLabel() const
LabelStmt * getStmt() const
bool isMSAsmLabel() const
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
std::string getOpenCLVersionString() const
Return the OpenCL C or C++ for OpenCL language name and version as a string.
bool IsHeaderFile
Indicates whether the front-end is explicitly told that the input is a header file (i....
bool isCompatibleWithMSVC() const
unsigned getOpenCLCompatibleVersion() const
Return the OpenCL version that kernel language is compatible with.
static SourceLocation findLocationAfterToken(SourceLocation loc, tok::TokenKind TKind, const SourceManager &SM, const LangOptions &LangOpts, bool SkipTrailingWhitespaceAndNewLine)
Checks that the given token is the first token that occurs after the given location (this excludes co...
Visibility getVisibility() const
Linkage getLinkage() const
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
A class for iterating through a result set and possibly filtering out results.
void erase()
Erase the last element returned from this iterator.
Represents the results of name lookup.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
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.
UnresolvedSetImpl::iterator iterator
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.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
virtual unsigned getStaticLocalNumber(const VarDecl *VD)=0
Static locals are numbered by source order.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Describes a module or submodule.
SourceLocation DefinitionLoc
The location of the module definition.
Module * Parent
The parent of this module.
bool isPrivateModule() const
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
bool isModuleImplementation() const
Is this a module implementation.
bool isModulePartition() const
Is this a module partition.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isLinkageValid() const
True if the computed linkage is valid.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
bool isPlaceholderVar(const LangOptions &LangOpts) const
Visibility getVisibility() const
Determines the visibility of this entity.
bool hasLinkageBeenComputed() const
True if something has required us to compute the linkage of this declaration.
bool hasExternalFormalLinkage() const
True if this decl has external linkage.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool declarationReplaces(const NamedDecl *OldD, bool IsKnownNewer=true) const
Determine whether this declaration, if known to be well-formed within its context,...
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
bool hasLinkage() const
Determine whether this declaration has linkage.
bool isExternallyVisible() const
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represent a C++ namespace.
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
TypeLoc getAsTypeLoc() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
static constexpr NestedNameSpecifier getGlobal()
bool containsErrors() const
Whether this nested name specifier contains an error.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Type
A type, stored as a Type*.
ObjCCategoryDecl - Represents a category declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
ObjCContainerDecl - Represents a container for method declarations.
ObjCIvarDecl * getIvarDecl(IdentifierInfo *Id) const
getIvarDecl - This method looks up an ivar in this ContextDecl.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Represents an ObjC class declaration.
known_extensions_range known_extensions() const
Wrapper for source info for ObjC interfaces.
void setNameLoc(SourceLocation Loc)
ObjCIvarDecl - Represents an ObjC instance variable.
static ObjCIvarDecl * Create(ASTContext &C, ObjCContainerDecl *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, AccessControl ac, Expr *BW=nullptr, bool synthesized=false)
ObjCMethodDecl - Represents an instance or class method declaration.
param_const_iterator param_end() const
param_const_iterator param_begin() const
const ParmVarDecl *const * param_const_iterator
ParmVarDecl *const * param_iterator
ProtocolLAngleLoc, ProtocolRAngleLoc, and the source locations for protocol qualifiers are stored aft...
static OpaquePtr make(DeclGroupRef P)
bool isAvailableOption(llvm::StringRef Ext, const LangOptions &LO) const
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
@ CSK_Normal
Normal lookup.
SmallVectorImpl< OverloadCandidate >::iterator iterator
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
MapType::iterator iterator
SmallVectorImpl< UniqueVirtualMethod >::iterator overriding_iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
void setRParenLoc(SourceLocation Loc)
TypeLoc getInnerLoc() const
void setLParenLoc(SourceLocation Loc)
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
ObjCDeclQualifier getObjCDeclQualifier() const
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setExplicitObjectParameterLoc(SourceLocation Loc)
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
ParsedAttr - Represents a syntactic attribute.
static const ParsedAttributesView & none()
bool hasAttribute(ParsedAttr::Kind K) const
ParsedAttributes - A collection of parsed attributes.
AttributePool & getPool() const
unsigned getDiagID() const
Pointer-authentication qualifiers.
bool isAddressDiscriminated() const
TypeLoc getPointeeLoc() const
Wrapper for source info for pointers.
void setStarLoc(SourceLocation Loc)
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
StringRef getLastMacroWithSpelling(SourceLocation Loc, ArrayRef< TokenValue > Tokens) const
Return the name of the macro defined before Loc that has spelling Tokens.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool hasNonTrivialToPrimitiveCopyCUnion() const
Check if this is or contains a C union that is non-trivial to copy, which is a union that has a membe...
PointerAuthQualifier getPointerAuth() const
PrimitiveDefaultInitializeKind
bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const
const IdentifierInfo * getBaseTypeIdentifier() const
Retrieves a pointer to the name of the base type.
QualType withoutLocalFastQualifiers() const
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const
Check if this is a non-trivial type that would cause a C struct transitively containing this type to ...
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
LangAS getAddressSpace() const
Return the address space of this type.
bool hasNonTrivialToPrimitiveDestructCUnion() const
Check if this is or contains a C union that is non-trivial to destruct, which is a union that has a m...
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
PrimitiveDefaultInitializeKind isNonTrivialToPrimitiveDefaultInitialize() const
Functions to query basic properties of non-trivial C struct types.
bool isObjCGCStrong() const
true when Type is objc's strong.
bool isConstQualified() const
Determine whether this type is const-qualified.
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
bool hasNonTrivialObjCLifetime() const
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
@ PCK_Trivial
The type does not fall into any of the following categories.
@ PCK_VolatileTrivial
The type would be trivial except that it is volatile-qualified.
bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const
Check if this is or contains a C union that is non-trivial to default-initialize, which is a union th...
A qualifier set is used to build a set of qualifiers.
const Type * strip(QualType type)
Collect any qualifiers on the given type and return an unqualified type.
QualType apply(const ASTContext &Context, QualType QT) const
Apply the collected qualifiers to the given type.
The collection of all-type qualifiers we support.
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
ObjCLifetime getObjCLifetime() const
Represents a struct/union/class.
field_range fields() const
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
specific_decl_iterator< FieldDecl > field_iterator
field_iterator field_begin() const
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
void setMemberSpecialization()
Note that this member template is a specialization.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
void setNRVOCandidate(const VarDecl *Var)
Set the variable that might be used for the named return value optimization.
Scope - A scope is a transient data structure that is used while parsing the program.
void setEntity(DeclContext *E)
bool isClassScope() const
isClassScope - Return true if this scope is a class/struct/union scope.
unsigned getDepth() const
Returns the depth of this scope. The translation-unit has scope depth 0.
unsigned getNextFunctionPrototypeIndex()
Return the number of parameters declared in this function prototype, increasing it by one for the nex...
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
unsigned getFlags() const
getFlags - Return the flags for this scope.
bool isTypeAliasScope() const
Determine whether this scope is a type alias scope.
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
void setLookupEntity(DeclContext *E)
unsigned getMSLastManglingNumber() const
DeclContext * getEntity() const
Get the entity corresponding to this scope.
unsigned getMSCurManglingNumber() const
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
unsigned getFunctionPrototypeDepth() const
Returns the number of function prototype scopes in this scope chain.
bool isCompoundStmtScope() const
Determine whether this scope is a compound statement scope.
bool containedInPrototypeScope() const
containedInPrototypeScope - Return true if this or a parent scope is a FunctionPrototypeScope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
bool isFunctionPrototypeScope() const
isFunctionPrototypeScope - Return true if this scope is a function prototype scope.
bool hasUnrecoverableErrorOccurred() const
Determine whether any unrecoverable errors have occurred within this scope.
Scope * getTemplateParamParent()
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
@ DeclScope
This is a scope that can contain a declaration.
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void CheckEntryPoint(FunctionDecl *FD)
HLSLVkConstantIdAttr * mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, int Id)
HLSLNumThreadsAttr * mergeNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z)
void deduceAddressSpace(VarDecl *Decl)
void ActOnTopLevelFunction(FunctionDecl *FD)
HLSLShaderAttr * mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType)
HLSLWaveSizeAttr * mergeWaveSizeAttr(Decl *D, const AttributeCommonInfo &AL, int Min, int Max, int Preferred, int SpelledArgsCount)
void ActOnVariableDeclarator(VarDecl *VD)
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID)
DiagnoseDuplicateIvars - Check for duplicate ivars in the entire class at the start of @implementatio...
void CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden)
Check whether the given new method is a valid override of the given overridden method,...
DeclResult LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S, IdentifierInfo *II)
The parser has read a name in, and Sema has detected that we're currently inside an ObjC method.
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
ExprResult BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV)
void AddCFAuditedAttribute(Decl *D)
AddCFAuditedAttribute - Check whether we're currently within '#pragma clang arc_cf_code_audited' and,...
void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl, ObjCIvarDecl **Fields, unsigned nIvars, SourceLocation Loc)
CheckImplementationIvars - This routine checks if the instance variables listed in the implelementati...
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void ActOnVariableDeclarator(VarDecl *VD)
Function called when a variable declarator is created, which lets us implement the 'routine' 'functio...
OpenACCRoutineDeclAttr * mergeRoutineDeclAttr(const OpenACCRoutineDeclAttr &Old)
void ActOnFunctionDeclarator(FunctionDecl *FD)
Called when a function decl is created, which lets us implement the 'routine' 'doesn't match next thi...
void ActOnVariableInit(VarDecl *VD, QualType InitType)
Called when a variable is initialized, so we can implement the 'routine 'doesn't match the next thing...
void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D)
Act on D, a function definition inside of an omp [begin/end] assumes.
void ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(Decl *D, SmallVectorImpl< FunctionDecl * > &Bases)
Register D as specialization of all base functions in Bases in the current omp begin/end declare vari...
void ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, SmallVectorImpl< FunctionDecl * > &Bases)
The declarator D defines a function in the scope S which is nested in an omp begin/end declare varian...
void ActOnOpenMPDeclareTargetInitializer(Decl *D)
Adds OMPDeclareTargetDeclAttr to referenced variables in declare target directive.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, const llvm::StringMap< bool > &FeatureMap)
void CheckSYCLExternalFunctionDecl(FunctionDecl *FD)
StmtResult BuildSYCLKernelCallStmt(FunctionDecl *FD, CompoundStmt *Body)
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
SwiftNameAttr * mergeNameAttr(Decl *D, const SwiftNameAttr &SNA, StringRef Name)
WebAssemblyImportNameAttr * mergeImportNameAttr(Decl *D, const WebAssemblyImportNameAttr &AL)
WebAssemblyImportModuleAttr * mergeImportModuleAttr(Decl *D, const WebAssemblyImportModuleAttr &AL)
Mode getAlignMode() const
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
static NameClassification DependentNonType()
static NameClassification VarTemplate(TemplateName Name)
static NameClassification Unknown()
static NameClassification OverloadSet(ExprResult E)
static NameClassification UndeclaredTemplate(TemplateName Name)
static NameClassification FunctionTemplate(TemplateName Name)
static NameClassification NonType(NamedDecl *D)
static NameClassification Concept(TemplateName Name)
static NameClassification UndeclaredNonType()
static NameClassification TypeTemplate(TemplateName Name)
static NameClassification Error()
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Scope * getCurScope() const
Retrieve the parser's current scope.
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn)
MergeFunctionDecl - We just parsed a function 'New' from declarator D which has the same name and sco...
void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind, uint64_t MagicValue, QualType Type, bool LayoutCompatible, bool MustBeNull)
Register a magic integral constant to be used as a type tag.
NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)
Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val, SkipBodyInfo *SkipBody=nullptr)
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
PragmaClangSection PragmaClangRodataSection
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
Preprocessor & getPreprocessor() const
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)
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.
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
ExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, bool isAddressOfOperand, const TemplateArgumentListInfo *TemplateArgs)
ActOnDependentIdExpression - Handle a dependent id-expression that was just parsed.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
void ActOnReenterFunctionContext(Scope *S, Decl *D)
Push the parameters of D, which must be a function, into scope.
sema::LambdaScopeInfo * RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator)
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
const AttributedType * getCallingConvAttributedType(QualType T) const
Get the outermost AttributedType node that sets a calling convention.
TypeSpecifierType isTagName(IdentifierInfo &II, Scope *S)
isTagName() - This method is called for error recovery purposes only to determine if the specified na...
bool CheckRedeclarationExported(NamedDecl *New, NamedDecl *Old)
[module.interface]p6: A redeclaration of an entity X is implicitly exported if X was introduced by an...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
VisibilityAttr * mergeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, VisibilityAttr::VisibilityType Vis)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
Decl * ActOnFileScopeAsmDecl(Expr *expr, SourceLocation AsmLoc, SourceLocation RParenLoc)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
void LazyProcessLifetimeCaptureByParams(FunctionDecl *FD)
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
llvm::DenseMap< IdentifierInfo *, PendingPragmaInfo > PendingExportedNames
DiagnosticsEngine & getDiagnostics() const
void ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement)
void * SkippedDefinitionContext
bool LookupBuiltin(LookupResult &R)
Lookup a builtin function, when name lookup would otherwise fail.
void DiagPlaceholderFieldDeclDefinitions(RecordDecl *Record)
Emit diagnostic warnings for placeholder members.
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
PragmaStack< bool > StrictGuardStackCheckStack
UnusedFileScopedDeclsType UnusedFileScopedDecls
The set of file scoped decls seen so far that have not been used and must warn if not used.
NamedDecl * LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S, bool ForRedeclaration, SourceLocation Loc)
LazilyCreateBuiltin - The specified Builtin-ID was first used at file scope.
ASTContext & getASTContext() const
void translateTemplateArguments(const ASTTemplateArgsPtr &In, TemplateArgumentListInfo &Out)
Translates template arguments as provided by the parser into template arguments used by semantic anal...
void CheckCoroutineWrapper(FunctionDecl *FD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void DiagnoseUnguardedAvailabilityViolations(Decl *FD)
Issue any -Wunguarded-availability warnings in FD.
PragmaStack< StringLiteral * > ConstSegStack
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
bool isMicrosoftMissingTypename(const CXXScopeSpec *SS, Scope *S)
isMicrosoftMissingTypename - In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal...
bool UseArgumentDependentLookup(const CXXScopeSpec &SS, const LookupResult &R, bool HasTrailingLParen)
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
void mergeVisibilityType(Decl *D, SourceLocation Loc, VisibilityAttr::VisibilityType Type)
bool checkVarDeclRedefinition(VarDecl *OldDefn, VarDecl *NewDefn)
We've just determined that Old and New both appear to be definitions of the same variable.
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
void ProcessPragmaWeak(Scope *S, Decl *D)
bool shouldIgnoreInHostDeviceCheck(FunctionDecl *Callee)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Decl * BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy)
BuildAnonymousStructOrUnion - Handle the declaration of an anonymous structure or union.
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)
Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...
void MarkTypoCorrectedFunctionDefinition(const NamedDecl *F)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
void CheckAttributesOnDeducedType(Decl *D)
CheckAttributesOnDeducedType - Calls Sema functions for attributes that requires the type to be deduc...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
void PushFunctionScope()
Enter a new function scope.
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
sema::LambdaScopeInfo * PushLambdaScope()
SkipBodyInfo shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II, SourceLocation IILoc)
Determine whether the body of an anonymous enumeration should be skipped.
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
@ UPPC_EnumeratorValue
The enumerator value.
@ UPPC_Initializer
An initializer.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_ExplicitSpecialization
Explicit specialization.
@ UPPC_DeclarationQualifier
A declaration qualifier.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_BitFieldWidth
The size of a bit-field.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool RebuildTemplateParamsInCurrentInstantiation(TemplateParameterList *Params)
Rebuild the template parameters now that we know we're in a current instantiation.
void DiagnoseInvalidJumps(Stmt *Body)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
SourceLocation CurInitSegLoc
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
ModularFormatAttr * mergeModularFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *ModularImplFn, StringRef ImplName, MutableArrayRef< StringRef > Aspects)
bool currentModuleIsHeaderUnit() const
Is the module scope we are in a C++ Header Unit?
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
bool tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID)
Attempt to fold a variable-sized type to a constant-sized type, returning true if we were successful.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
NamedDecl * findLocallyScopedExternCDecl(DeclarationName Name)
Look for a locally scoped extern "C" declaration by the given name.
bool CheckRedeclarationModuleOwnership(NamedDecl *New, NamedDecl *Old)
We've determined that New is a redeclaration of Old.
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
MinSizeAttr * mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D=nullptr)
Check if the type is allowed to be used for the current target.
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
bool ActOnDuplicateDefinition(Scope *S, Decl *Prev, SkipBodyInfo &SkipBody)
Perform ODR-like check for C/ObjC when merging tag types from modules.
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
bool isReachable(const NamedDecl *D)
Determine whether a declaration is reachable.
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
bool ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D) const
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
AlwaysInlineAttr * mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident)
FieldDecl * CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D=nullptr)
Build a new FieldDecl and check its well-formedness.
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
PragmaClangSection PragmaClangRelroSection
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT)
Deduce the return type for a function from a returned expression, per C++1y [dcl.spec....
void MaybeSuggestAddingStaticToDecl(const FunctionDecl *D)
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
bool checkUnsafeAssigns(SourceLocation Loc, QualType LHS, Expr *RHS)
checkUnsafeAssigns - Check whether +1 expr is being assigned to weak/__unsafe_unretained type.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
void AddImplicitMSFunctionNoBuiltinAttr(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based n...
PragmaStack< AlignPackInfo > AlignPackStack
bool canDelayFunctionBody(const Declarator &D)
Determine whether we can delay parsing the body of a function or function template until it is used,...
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
PragmaStack< StringLiteral * > BSSSegStack
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
DeclContext * getCurLexicalContext() const
bool CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous)
Perform semantic analysis for the given dependent function template specialization.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
bool hasExplicitCallingConv(QualType T)
NameClassification ClassifyName(Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc, const Token &NextToken, CorrectionCandidateCallback *CCC=nullptr)
Perform name lookup on the given name, classifying it based on the results of name lookup and the fol...
void ExitDeclaratorContext(Scope *S)
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
llvm::SmallSetVector< Decl *, 4 > DeclsToCheckForDeferredDiags
Function or variable declarations to be checked for whether the deferred diagnostics should be emitte...
void CheckMSVCRTEntryPoint(FunctionDecl *FD)
sema::FunctionScopeInfo * getCurFunction() const
void PushCompoundScope(bool IsStmtExpr)
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
FunctionDecl * CreateBuiltin(IdentifierInfo *II, QualType Type, unsigned ID, SourceLocation Loc)
Scope * getNonFieldDeclScope(Scope *S)
getNonFieldDeclScope - Retrieves the innermost scope, starting from S, where a non-field would be dec...
void ActOnPragmaWeakID(IdentifierInfo *WeakName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc)
ActOnPragmaWeakID - Called on well formed #pragma weak ident.
bool CheckNontrivialField(FieldDecl *FD)
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
ExprResult DefaultLvalueConversion(Expr *E)
MSInheritanceAttr * mergeMSInheritanceAttr(Decl *D, const AttributeCommonInfo &CI, bool BestCase, MSInheritanceModel Model)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
StringLiteral * CurInitSeg
Last section used with pragma init_seg.
FunctionEmissionStatus getEmissionStatus(const FunctionDecl *Decl, bool Final=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
bool AddOverriddenMethods(CXXRecordDecl *DC, CXXMethodDecl *MD)
AddOverriddenMethods - See if a method overrides any in the base classes, and if so,...
InternalLinkageAttr * mergeInternalLinkageAttr(Decl *D, const ParsedAttr &AL)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
void DiagnoseUniqueObjectDuplication(const VarDecl *Dcl)
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
TypeSourceInfo * RebuildTypeInCurrentInstantiation(TypeSourceInfo *T, SourceLocation Loc, DeclarationName Name)
Rebuilds a type within the context of the current instantiation.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
PragmaClangSection PragmaClangTextSection
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
PragmaClangSection PragmaClangDataSection
bool DiagRuntimeBehavior(SourceLocation Loc, const Stmt *Statement, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the current evaluation context.
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)
ExprResult ActOnNameClassifiedAsUndeclaredNonType(IdentifierInfo *Name, SourceLocation NameLoc)
Act on the result of classifying a name as an undeclared (ADL-only) non-type declaration.
void ActOnPragmaRedefineExtname(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaRedefineExtname - Called on well formed #pragma redefine_extname oldname newname.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
void AddMsStructLayoutForRecord(RecordDecl *RD)
AddMsStructLayoutForRecord - Adds ms_struct layout attribute to record.
MaybeODRUseExprSet MaybeODRUseExprs
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
TopLevelStmtDecl * ActOnStartTopLevelStmtDecl(Scope *S)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
void ProcessPragmaExport(DeclaratorDecl *newDecl)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
void ActOnLastBitfield(SourceLocation DeclStart, SmallVectorImpl< Decl * > &AllIvarDecls)
ActOnLastBitfield - This routine handles synthesized bitfields rules for class and class extensions.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
llvm::DenseMap< IdentifierInfo *, AsmLabelAttr * > ExtnameUndeclaredIdentifiers
ExtnameUndeclaredIdentifiers - Identifiers contained in #pragma redefine_extname before declared.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
@ FirstDecl
Parsing the first decl in a TU.
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
void ActOnDocumentableDecls(ArrayRef< Decl * > Group)
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
Decl * ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, RecordDecl *&AnonRecord)
ParsedFreeStandingDeclSpec - This method is invoked when a declspec with no declarator (e....
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFinishKNRParamDeclarations(Scope *S, Declarator &D, SourceLocation LocAfterDecls)
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
void ActOnTagFinishSkippedDefinition(SkippedDefinitionContext Context)
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void ModifyFnAttributesMSPragmaOptimize(FunctionDecl *FD)
Only called on function definitions; if there is a MSVC pragma optimize in scope, consider changing t...
bool shouldLinkDependentDeclWithPrevious(Decl *D, Decl *OldDecl)
Checks if the new declaration declared in dependent context must be put in the same redeclaration cha...
TentativeDefinitionsType TentativeDefinitions
All the tentative definitions encountered in the TU.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void warnOnCTypeHiddenInCPlusPlus(const NamedDecl *D)
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
UuidAttr * mergeUuidAttr(Decl *D, const AttributeCommonInfo &CI, StringRef UuidAsWritten, MSGuidDecl *GuidDecl)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
Decl * BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record)
BuildMicrosoftCAnonymousStruct - Handle the declaration of an Microsoft C anonymous structure.
static bool CanBeGetReturnTypeOnAllocFailure(const FunctionDecl *FD)
DiagnosticsEngine & Diags
OpenCLOptions & getOpenCLOptions()
static bool CanBeGetReturnObject(const FunctionDecl *FD)
NamespaceDecl * getStdNamespace() const
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
void addLifetimeBoundToImplicitThis(CXXMethodDecl *MD)
NamedDecl * ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous)
PragmaStack< StringLiteral * > DataSegStack
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
void diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc)
void CheckFunctionOrTemplateParamDeclarator(Scope *S, Declarator &D)
Common checks for a parameter-declaration that should apply to both function parameters and non-type ...
@ TPC_FriendFunctionTemplate
@ TPC_ClassTemplateMember
@ TPC_FriendFunctionTemplateDefinition
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
void ActOnFinishDelayedAttribute(Scope *S, Decl *D, ParsedAttributes &Attrs)
ActOnFinishDelayedAttribute - Invoked when we have finished parsing an attribute for which parsing is...
friend class InitializationSequence
bool GloballyUniqueObjectMightBeAccidentallyDuplicated(const VarDecl *Dcl)
Certain globally-unique variables might be accidentally duplicated if built into multiple shared libr...
void DiagnoseUnusedDecl(const NamedDecl *ND)
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, const WeakInfo &W)
DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak applied to it,...
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void ActOnUninitializedDecl(Decl *dcl)
void checkNonTrivialCUnionInInitializer(const Expr *Init, SourceLocation Loc)
Emit diagnostics if the initializer or any of its explicit or implicitly-generated subexpressions req...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
TypedefDecl * ParseTypedefDecl(Scope *S, Declarator &D, QualType T, TypeSourceInfo *TInfo)
Subroutines of ActOnDeclarator().
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
Decl * ActOnField(Scope *S, Decl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth)
ActOnField - Each field of a C struct/union is passed into this in order to create a FieldDecl object...
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
llvm::MapVector< IdentifierInfo *, llvm::SetVector< WeakInfo, llvm::SmallVector< WeakInfo, 1u >, llvm::SmallDenseSet< WeakInfo, 2u, WeakInfo::DenseMapInfoByAliasOnly > > > WeakUndeclaredIdentifiers
WeakUndeclaredIdentifiers - Identifiers contained in #pragma weak before declared.
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
PragmaClangSection PragmaClangBSSSection
Decl * ActOnDeclarator(Scope *S, Declarator &D)
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
void CheckAlignasUnderalignment(Decl *D)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
ExprResult ActOnNameClassifiedAsDependentNonType(const CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, bool IsAddressOfOperand)
Act on the result of classifying a name as an undeclared member of a dependent base class.
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
void ActOnPragmaWeakAlias(IdentifierInfo *WeakName, IdentifierInfo *AliasName, SourceLocation PragmaLoc, SourceLocation WeakNameLoc, SourceLocation AliasNameLoc)
ActOnPragmaWeakAlias - Called on well formed #pragma weak ident = ident.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
void CheckVariableDeclarationType(VarDecl *NewVD)
OpaquePtr< TemplateName > TemplateTy
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
SkippedDefinitionContext ActOnTagStartSkippedDefinition(Scope *S, Decl *TD)
Invoked when we enter a tag definition that we're skipping.
bool DeduceVariableDeclarationType(VarDecl *VDecl, bool DirectInit, Expr *Init)
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
llvm::SmallPtrSet< const NamedDecl *, 4 > TypoCorrectedFunctionDefinitions
The function definitions which were renamed as part of typo-correction to match their respective decl...
void AddSectionMSAllocText(FunctionDecl *FD)
Only called on function definitions; if there is a #pragma alloc_text that decides which code section...
void computeNRVO(Stmt *Body, sema::FunctionScopeInfo *Scope)
Given the set of return statements within a function body, compute the variables that are subject to ...
void checkNonTrivialCUnion(QualType QT, SourceLocation Loc, NonTrivialCUnionContext UseContext, unsigned NonTrivialKind)
Emit diagnostics if a non-trivial C union type or a struct that contains a non-trivial C union is use...
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Format, int FormatIdx, int FirstArg)
IdentifierResolver IdResolver
bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val, bool AllowMask) const
IsValueInFlagEnum - Determine if a value is allowed as part of a flag enum.
bool hasAnyUnrecoverableErrorsInThisFunction() const
Determine whether any errors occurred within this function/method/ block.
void DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName=false)
void DiagnoseSizeOfParametersAndReturnValue(ArrayRef< ParmVarDecl * > Parameters, QualType ReturnTy, NamedDecl *D)
Diagnose whether the size of parameters or return value of a function or obj-c method definition is p...
void checkTypeDeclType(DeclContext *LookupCtx, DiagCtorKind DCK, TypeDecl *TD, SourceLocation NameLoc)
Returns the TypeDeclType for the given type declaration, as ASTContext::getTypeDeclType would,...
void CheckDeductionGuideTemplate(FunctionTemplateDecl *TD)
llvm::SmallVector< std::pair< SourceLocation, const BlockDecl * >, 1 > ImplicitlyRetainedSelfLocs
List of SourceLocations where 'self' is implicitly retained inside a block.
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
bool checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel SemanticSpelling)
TemplateNameKindForDiagnostics
Describes the detailed kind of a template name. Used in diagnostics.
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, const IdentifierInfo *IIEnvironment)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
ExprResult ActOnNameClassifiedAsOverloadSet(Scope *S, Expr *OverloadSet)
Act on the result of classifying a name as an overload set.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
This class handles loading and caching of source files into memory.
bool isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
SourceLocation getStrTokenLoc(unsigned TokNum) const
Get one of the string literal token.
StringRef getString() const
Represents the declaration of a struct/union/class/enum.
static TagDecl * castFromDeclContext(const DeclContext *DC)
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
SourceLocation getInnerLocStart() const
Return SourceLocation representing start of source range ignoring outer template declarations.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
void setElaboratedKeywordLoc(SourceLocation Loc)
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Exposes information about the current target.
virtual bool validateCpuIs(StringRef Name) const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) const
virtual bool validateCpuSupports(StringRef Name) const
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
virtual bool isValidFeatureName(StringRef Feature) const
Determine whether this TargetInfo supports the given feature.
virtual ParsedTargetAttr parseTargetAttr(StringRef Str) const
bool supportsMultiVersioning() const
Identify whether this target supports multiversioning of functions, which requires support for cpu_su...
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getRAngleLoc() const
SourceLocation getTemplateLoc() const
Token - This structure provides full information about a lexed token.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
bool isOneOf(Ts... Ks) const
bool isNot(tok::TokenKind K) const
A declaration that models statements at global scope.
static TopLevelStmtDecl * Create(ASTContext &C, Stmt *Statement)
Represents a declaration of a type.
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
void initializeFullCopy(TypeLoc Other)
Initializes this by copying its information from another TypeLoc of the same type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
SourceLocation getEndLoc() const
Get the end source location.
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isStructureType() const
bool isDependentSizedArrayType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
const Type * getPointeeOrArrayElementType() const
If this is a pointer type, return the pointee type.
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isIncompleteArrayType() const
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isScalarType() const
bool isVariableArrayType() const
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.
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isOpenCLSpecificType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAggregateType() const
Determines whether the type is a C++ aggregate type or C aggregate or union type.
RecordDecl * castAsRecordDecl() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
bool containsErrors() const
Whether this type is an error type.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isFunctionProtoType() const
bool isObjCIdType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjCObjectType() const
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
const T * getAsAdjusted() const
Member-template getAsAdjusted<specific type>.
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isMemberFunctionPointerType() const
bool isFloatingType() const
bool isAnyPointerType() const
bool hasAutoForTrailingReturnType() const
Determine whether this type was written with a leading 'auto' corresponding to a trailing return type...
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isNullPtrType() const
bool isRecordType() const
bool isHLSLResourceRecordArray() const
std::optional< NullabilityKind > getNullability() const
Determine the nullability of the given type.
bool isFunctionNoProtoType() const
bool isReserveIDT() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
void setTypeSourceInfo(TypeSourceInfo *newType)
Wrapper for source info for typedefs.
TypedefNameDecl * getDecl() const
Simple class containing the result of Sema::CorrectTypo.
IdentifierInfo * getCorrectionAsIdentifierInfo() const
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SmallVectorImpl< NamedDecl * >::const_iterator const_decl_iterator
DeclarationName getCorrection() const
Gets the DeclarationName of the typo correction.
unsigned getEditDistance(bool Normalized=true) const
Gets the "edit distance" of the typo correction from the typo.
SmallVectorImpl< NamedDecl * >::iterator decl_iterator
void setCorrectionDecl(NamedDecl *CDecl)
Clears the list of NamedDecls before adding the new one.
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
Expr * getSubExpr() const
static bool isIncrementDecrementOp(Opcode Op)
Represents a C++ unqualified-id that has been parsed.
struct OFI OperatorFunctionId
When Kind == IK_OperatorFunctionId, the overloaded operator that we parsed.
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Specify that this unqualified-id was parsed as an identifier.
UnionParsedType ConstructorName
When Kind == IK_ConstructorName, the class-name of the type whose constructor is being referenced.
SourceLocation EndLocation
The location of the last token that describes this unqualified-id.
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Wrapper for source info for unresolved typename using decls.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Wrapper for source info for types used via transparent aliases.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setCXXForRangeDecl(bool FRD)
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
bool isCXXCondDecl() const
@ ListInit
Direct list-initialization (C++11)
@ ParenListInit
Parenthesized list-initialization (C++20)
@ CallInit
Call-style initialization (C++98)
void setStorageClass(StorageClass SC)
void setPreviousDeclInSameBlockScope(bool Same)
bool isStaticDataMember() const
Determines whether this is a static data member.
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
bool isFileVarDecl() const
Returns true for file scoped variable declaration.
void setTSCSpec(ThreadStorageClassSpecifier TSC)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
bool hasExternalStorage() const
Returns true if a variable has extern or private_extern storage.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
VarDecl * getInitializingDeclaration()
Get the initializing declaration of this variable, if any.
void setConstexpr(bool IC)
@ TLS_Static
TLS with a known-constant initializer.
@ TLS_Dynamic
TLS with a dynamic initializer.
VarDecl * getActingDefinition()
Get the tentative definition that acts as the real definition in a TU.
@ TentativeDefinition
This declaration is a tentative definition.
@ DeclarationOnly
This declaration is only a declaration.
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
bool isThisDeclarationADemotedDefinition() const
If this definition should pretend to be a declaration.
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
bool isLocalVarDeclOrParm() const
Similar to isLocalVarDecl but also includes parameters.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
VarTemplateDecl * getInstantiatedFromMemberTemplate() const
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
Represents a C array with a specified size that is not an integer-constant-expression.
Expr * getSizeExpr() const
Captures information about a #pragma weak directive.
void disableCheckFallThrough()
ValueDecl * getVariable() const
bool isVariableCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
void addVLATypeCapture(SourceLocation Loc, const VariableArrayType *VLAType, QualType CaptureType)
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
void addThisCapture(bool isNested, SourceLocation Loc, QualType CaptureType, bool ByCopy)
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
static DelayedDiagnostic makeForbiddenType(SourceLocation loc, unsigned diagnostic, QualType type, unsigned argument)
Retains information about a function, method, or block that is currently being parsed.
bool UsesFPIntrin
Whether this function uses constrained floating point intrinsics.
void addByrefBlockVar(VarDecl *VD)
bool NeedsScopeChecking() const
bool ObjCShouldCallSuper
A flag that is set when parsing a method that must call super's implementation, such as -dealloc,...
bool ObjCWarnForNoInitDelegation
This starts true for a secondary initializer method and will be set to false if there is an invocatio...
bool HasPotentialAvailabilityViolations
Whether we make reference to a declaration that could be unavailable.
bool ObjCWarnForNoDesignatedInitChain
This starts true for a method marked as designated initializer and will be set to false if there is a...
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
TemplateParameterList * GLTemplateParameterList
If this is a generic lambda, and the template parameter list has been created (from the TemplateParam...
ParmVarDecl * ExplicitObjectParameter
llvm::SmallVector< ShadowedOuterDecl, 4 > ShadowingDecls
CXXRecordDecl * Lambda
The class that describes the lambda.
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
bool Mutable
Whether this is a mutable lambda.
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
Public enums and private classes that are part of the SourceManager implementation.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
constexpr bool isInitializedByPipeline(LangAS AS)
bool implicitObjectParamIsLifetimeBound(const FunctionDecl *FD)
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool randomizeStructureLayout(const ASTContext &Context, RecordDecl *RD, llvm::SmallVectorImpl< Decl * > &FinalOrdering)
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ NonFunction
This is not an overload because the lookup results contain a non-function.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
bool isa(CodeGen::Address addr)
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
@ OR_Deleted
Succeeded, but refers to a deleted function.
@ OR_Success
Overload resolution succeeded.
@ OR_Ambiguous
Ambiguous candidates found.
@ OR_No_Viable_Function
No viable function found.
@ GVA_AvailableExternally
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
int hasAttribute(AttributeCommonInfo::Syntax Syntax, llvm::StringRef ScopeName, llvm::StringRef AttrName, const TargetInfo &Target, const LangOptions &LangOpts, bool CheckPlugins)
Return the version number associated with the attribute if we recognize and implement the attribute s...
ConstexprSpecKind
Define the kind of constexpr specifier.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ Found
Name lookup found a single declaration that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
InClassInitStyle
In-class initialization styles for non-static data members.
@ ICIS_NoInit
No in-class initializer.
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OverloadCandidateDisplayKind
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
@ OCD_AllCandidates
Requests that all candidates be shown.
std::pair< FileID, unsigned > FileIDAndOffset
@ LCK_ByRef
Capturing by reference.
@ LCK_StarThis
Capturing the *this object by copy.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
@ TemplateTemplateArgument
@ DefaultInitializedObject
AvailabilityMergeKind
Describes the kind of merge to perform for availability attributes (including "deprecated",...
@ None
Don't merge availability attributes at all.
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
@ OptionalProtocolImplementation
Merge availability attributes for an implementation of an optional protocol requirement.
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
@ ProtocolImplementation
Merge availability attributes for an implementation of a protocol requirement.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool DeclAttrsMatchCUDAMode(const LangOptions &LangOpts, Decl *D)
@ AmbiguousTagHiding
Name lookup results in an ambiguity because an entity with a tag name was hidden by an entity with an...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
StorageClass
Storage classes.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
const FunctionProtoType * T
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
bool isDiscardableGVALinkage(GVALinkage L)
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Complete
The translation unit is a complete translation unit.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
bool isExternalFormalLinkage(Linkage L)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Enumerator
Enumerator value with fixed underlying type.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ArrayRef< NamedDecl * > getDeclsInPrototype() const
Get the non-parameter decls defined within this function prototype.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
const IdentifierInfo * Ident
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
EvalResult is a struct with detailed info about an evaluated expression.
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const
SourceLocation SymbolLocations[3]
The source locations of the individual tokens that name the operator, e.g., the "new",...
OverloadedOperatorKind Operator
The kind of overloaded operator.