61#include "llvm/ADT/STLForwardCompat.h"
62#include "llvm/ADT/SmallPtrSet.h"
63#include "llvm/ADT/SmallString.h"
64#include "llvm/ADT/StringExtras.h"
65#include "llvm/Support/SaveAndRestore.h"
66#include "llvm/TargetParser/Triple.h"
70#include <unordered_map>
77 Decl *Group[2] = { OwnedType, Ptr };
88 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
89 bool AllowTemplates =
false,
90 bool AllowNonTemplates =
true)
91 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
92 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
93 WantExpressionKeywords =
false;
94 WantCXXNamedCasts =
false;
95 WantRemainingKeywords =
false;
100 if (!AllowInvalidDecl && ND->isInvalidDecl())
104 return AllowTemplates;
110 if (AllowNonTemplates)
115 if (AllowTemplates) {
116 auto *RD = dyn_cast<CXXRecordDecl>(ND);
117 if (!RD || !RD->isInjectedClassName())
120 return RD->getDescribedClassTemplate() ||
127 return !WantClassName && candidate.
isKeyword();
130 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
131 return std::make_unique<TypeNameValidatorCCC>(*
this);
135 bool AllowInvalidDecl;
138 bool AllowNonTemplates;
145 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
146 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
148 FoundRD->isInjectedClassName() &&
152 ? diag::ext_out_of_line_qualified_id_type_names_constructor
153 : diag::err_out_of_line_qualified_id_type_names_constructor)
163enum class UnqualifiedTypeNameLookupResult {
174static UnqualifiedTypeNameLookupResult
179 return UnqualifiedTypeNameLookupResult::NotFound;
181 UnqualifiedTypeNameLookupResult FoundTypeDecl =
182 UnqualifiedTypeNameLookupResult::NotFound;
186 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
187 Base.getType().getCanonicalType())) {
190 if (!TST->isDependentType())
192 auto *TD = TST->getTemplateName().getAsTemplateDecl();
195 if (
auto *BasePrimaryTemplate =
196 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
198 BaseRD = BasePrimaryTemplate;
199 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
201 CTD->findPartialSpecialization(
Base.getType()))
210 return UnqualifiedTypeNameLookupResult::FoundNonType;
211 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
213 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
215 case UnqualifiedTypeNameLookupResult::FoundNonType:
216 return UnqualifiedTypeNameLookupResult::FoundNonType;
217 case UnqualifiedTypeNameLookupResult::FoundType:
218 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
220 case UnqualifiedTypeNameLookupResult::NotFound:
227 return FoundTypeDecl;
235 UnqualifiedTypeNameLookupResult FoundTypeDecl =
236 UnqualifiedTypeNameLookupResult::NotFound;
238 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
242 RD = dyn_cast<CXXRecordDecl>(DC);
246 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
252 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
272 bool HasTrailingDot,
ParsedType ObjectTypePtr,
273 bool IsCtorOrDtorName,
274 bool WantNontrivialTypeSourceInfo,
275 bool IsClassTemplateDeductionContext,
278 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
280 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
306 if (IsImplicitTypename) {
311 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
320 if (WantNontrivialTypeSourceInfo)
356 if (ObjectTypePtr &&
Result.empty()) {
380 switch (
Result.getResultKind()) {
383 TypeNameValidatorCCC CCC(
true, isClassName,
384 AllowDeducedTemplate);
390 bool MemberOfUnknownSpecialization;
399 if (Correction && (NNS || NewII != &II) &&
405 Template, MemberOfUnknownSpecialization))) {
407 isClassName, HasTrailingDot, ObjectTypePtr,
409 WantNontrivialTypeSourceInfo,
410 IsClassTemplateDeductionContext);
413 PDiag(diag::err_unknown_type_or_class_name_suggest)
414 <<
Result.getLookupName() << isClassName);
417 *CorrectedII = NewII;
422 Result.suppressDiagnostics();
438 Result.suppressDiagnostics();
448 Result.suppressDiagnostics();
454 Res != ResEnd; ++Res) {
463 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
475 Result.suppressDiagnostics();
486 IIDecl =
Result.getFoundDecl();
487 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
491 assert(IIDecl &&
"Didn't find decl");
494 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
500 if (FoundUsingShadow) {
504 if (!WantNontrivialTypeSourceInfo)
510 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
514 if (!WantNontrivialTypeSourceInfo)
520 TL.setNameLoc(NameLoc);
521 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
525 if (!WantNontrivialTypeSourceInfo)
531 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
535 if (!WantNontrivialTypeSourceInfo)
543 if (!WantNontrivialTypeSourceInfo)
554 if (!HasTrailingDot) {
557 if (!WantNontrivialTypeSourceInfo)
562 TL.setNameEndLoc(NameLoc);
565 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
569 }
else if (AllowDeducedTemplate) {
571 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
580 TL.setNameLoc(NameLoc);
588 Result.suppressDiagnostics();
597 auto *ND = dyn_cast<NamespaceDecl>(DC);
598 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
600 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
605 llvm_unreachable(
"something isn't in TU scope?");
616 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
617 if (MD->getParent()->hasAnyDependentBases())
625 bool IsTemplateTypeArg) {
626 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
629 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
638 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
647 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
678 switch (TD->getTagKind()) {
719 bool IsTemplateName) {
724 SuggestedType =
nullptr;
728 TypeNameValidatorCCC CCC(
false,
false,
735 bool CanRecover = !IsTemplateName;
736 if (Corrected.isKeyword()) {
739 PDiag(IsTemplateName ? diag::err_no_template_suggest
740 : diag::err_unknown_typename_suggest)
742 II = Corrected.getCorrectionAsIdentifierInfo();
745 if (!SS || !SS->
isSet()) {
747 PDiag(IsTemplateName ? diag::err_no_template_suggest
748 : diag::err_unknown_typename_suggest)
751 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
752 bool DroppedSpecifier =
753 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
756 ? diag::err_no_member_template_suggest
757 : diag::err_unknown_nested_typename_suggest)
758 << II << DC << DroppedSpecifier << SS->
getRange(),
761 llvm_unreachable(
"could not have corrected a typo here");
768 if (Corrected.getCorrectionSpecifier())
773 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
774 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
787 bool MemberOfUnknownSpecialization;
789 Name,
nullptr,
true, TemplateResult,
800 Diag(IILoc, IsTemplateName ? diag::err_no_template
801 : diag::err_unknown_typename)
804 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
805 : diag::err_typename_nested_not_found)
811 unsigned DiagID = diag::err_typename_missing;
813 DiagID = diag::ext_typename_missing;
824 "Invalid scope specifier has already been diagnosed");
832 NextToken.
is(tok::less);
852 StringRef FixItTagName;
853 switch (Tag->getTagKind()) {
855 FixItTagName =
"class ";
859 FixItTagName =
"enum ";
863 FixItTagName =
"struct ";
867 FixItTagName =
"__interface ";
871 FixItTagName =
"union ";
875 StringRef TagName = FixItTagName.drop_back();
876 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
877 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
882 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
897 const Token &NextToken,
902 assert(NextToken.
isNot(tok::coloncolon) &&
903 "parse nested name specifiers before calling ClassifyName");
944 bool SecondTry =
false;
945 bool IsFilteredTemplateName =
false;
948 switch (
Result.getResultKind()) {
952 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
998 if (!SecondTry && CCC) {
1003 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1004 unsigned QualifiedDiag = diag::err_no_member_suggest;
1007 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1010 UnqualifiedDiag = diag::err_no_template_suggest;
1011 QualifiedDiag = diag::err_no_member_template_suggest;
1012 }
else if (UnderlyingFirstDecl &&
1016 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1017 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1023 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1024 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1025 Name->
getName() == CorrectedStr;
1028 << DroppedSpecifier << SS.
getRange());
1032 Name = Corrected.getCorrectionAsIdentifierInfo();
1035 if (Corrected.isKeyword())
1041 Result.setLookupName(Corrected.getCorrection());
1063 Result.suppressDiagnostics();
1105 if (!
Result.isAmbiguous()) {
1106 IsFilteredTemplateName =
true;
1116 (IsFilteredTemplateName ||
1132 if (!IsFilteredTemplateName)
1135 bool IsFunctionTemplate;
1139 IsFunctionTemplate =
true;
1142 }
else if (!
Result.empty()) {
1150 dyn_cast<UsingShadowDecl>(*
Result.begin());
1151 assert(!FoundUsingShadow ||
1160 IsFunctionTemplate =
true;
1164 if (IsFunctionTemplate) {
1168 Result.suppressDiagnostics();
1180 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1192 TTL.setNameLoc(NameLoc);
1219 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1220 Class = Alias->getClassInterface();
1226 if (NextToken.
is(tok::period)) {
1229 Result.suppressDiagnostics();
1239 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1245 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1258 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1259 if ((NextToken.
is(tok::identifier) ||
1261 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1273 if (
Result.isSingleResult() && !ADL &&
1278 Result.suppressDiagnostics();
1298 bool IsAddressOfOperand) {
1301 NameInfo, IsAddressOfOperand,
1308 const Token &NextToken) {
1310 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1326 if ((*ULE->decls_begin())->isCXXClassMember()) {
1328 SS.
Adopt(ULE->getQualifierLoc());
1333 Result.setNamingClass(ULE->getNamingClass());
1334 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1335 Result.addDecl(*I, I.getAccess());
1368 "The next DeclContext should be lexically contained in the current one.");
1374 assert(
CurContext &&
"DeclContext imbalance!");
1377 assert(
CurContext &&
"Popped translation unit!");
1387 assert(
CurContext &&
"skipping definition of undefined tag");
1415 assert(!S->
getEntity() &&
"scope already has entity");
1448 "expected to be initializing a template parameter scope");
1476 cast<Decl>(DC)->getDescribedTemplateParams()) {
1477 unsigned DCDepth = TPL->getDepth() + 1;
1478 if (DCDepth > ScopeDepth)
1480 if (ScopeDepth == DCDepth)
1499 "The next DeclContext should be lexically contained in the current one.");
1503 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1506 if (Param->getIdentifier()) {
1516 assert(
CurContext &&
"DeclContext imbalance!");
1518 assert(
CurContext &&
"Popped translation unit!");
1532 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1547 return ND->
hasAttr<OverloadableAttr>();
1550 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1585 for (; I != IEnd; ++I) {
1618 bool AllowInlineNamespace)
const {
1619 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1626 if (ScopeDC->getPrimaryContext() == TargetDC)
1638 bool ConsiderLinkage,
1639 bool AllowInlineNamespace) {
1657 if (
auto *VD = dyn_cast<VarDecl>(D))
1659 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1661 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1675 if (
New->getFriendObjectKind() &&
1716 if (NewIsModuleInterface || OldIsModuleInterface) {
1720 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1722 << NewIsModuleInterface
1724 << OldIsModuleInterface
1727 New->setInvalidDecl();
1740 if (!
New->getLexicalDeclContext()
1741 ->getNonTransparentContext()
1742 ->isFileContext() ||
1748 bool IsNewExported =
New->isInExportDeclContext();
1752 if (!IsNewExported && !IsOldExported)
1764 New->getOwningModule()->isImplicitGlobalModule())
1767 assert(IsNewExported);
1775 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1793 "New and Old are not the same definition, we should diagnostic it "
1794 "immediately instead of checking it.");
1797 "We shouldn't see unreachable definitions here.");
1845 return OldM == NewM;
1882 return CD->isCopyConstructor();
1889 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1890 if (!RD->hasNameForLinkage())
1919 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1925 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1928 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1933 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1937 if (FD->doesThisDeclarationHaveABody() &&
1938 Context.DeclMustBeEmitted(FD))
1940 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1947 if (
Context.DeclMustBeEmitted(VD))
1950 if (VD->isStaticDataMember() &&
1953 if (VD->isStaticDataMember() &&
1955 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1958 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1967 return mightHaveNonExternalLinkage(D);
1974 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1980 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1995 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
1999 bool IsAllIgnored =
true;
2000 for (
const auto *BD : DD->bindings()) {
2001 if (BD->isReferenced())
2003 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2004 BD->hasAttr<UnusedAttr>());
2017 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2027 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2030 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2031 if (!WithinFunction)
2042 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2045 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2046 Init = Cleanups->getSubExpr();
2048 const auto *Ty = VD->getType().getTypePtr();
2053 if (TT->getDecl()->hasAttr<UnusedAttr>())
2059 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2060 MTE && MTE->getExtendingDecl()) {
2061 Ty = VD->getType().getNonReferenceType().getTypePtr();
2062 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2067 if (Ty->isIncompleteType() || Ty->isDependentType())
2072 Ty = Ty->getBaseElementTypeUnsafe();
2074 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2075 if (Tag->hasAttr<UnusedAttr>())
2078 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2079 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2083 const auto *Construct =
2084 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2085 if (Construct && !Construct->isElidable()) {
2087 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2088 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2094 if (
Init->isTypeDependent()) {
2096 if (!Ctor->isTrivial())
2137 for (
auto *TmpD : D->
decls()) {
2138 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2140 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2154 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2166 DiagID = diag::warn_unused_exception_param;
2168 DiagID = diag::warn_unused_label;
2170 DiagID = diag::warn_unused_variable;
2189 if (Ty->isReferenceType() || Ty->isDependentType())
2192 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2193 if (Tag->hasAttr<UnusedAttr>())
2197 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2198 RD && !RD->hasAttr<WarnUnusedAttr>())
2205 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2211 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2218 assert(iter->getSecond() >= 0 &&
2219 "Found a negative number of references to a VarDecl");
2220 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2230 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2231 if (!UnusedCXXCondDecl)
2235 unsigned DiagID =
isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2236 : diag::warn_unused_but_set_variable;
2246 bool Diagnose =
false;
2250 Diagnose = L->
getStmt() ==
nullptr;
2261 "Scope shouldn't contain decls!");
2268 std::optional<SourceLocation> PreviousDeclLoc;
2273 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2278 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2281 for (
auto *TmpD : S->
decls()) {
2282 assert(TmpD &&
"This decl didn't get pushed??");
2290 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2292 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2301 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2312 auto ShadowI = ShadowingDecls.find(D);
2313 if (ShadowI != ShadowingDecls.end()) {
2314 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2315 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2316 PDiag(diag::warn_ctor_parm_shadows_field)
2317 << D << FD << FD->getParent());
2319 ShadowingDecls.erase(ShadowI);
2323 llvm::sort(DeclDiags,
2324 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2329 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2331 for (
const LocAndDiag &D : DeclDiags) {
2333 if (D.PreviousDeclLoc)
2334 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2358 return "ucontext.h";
2360 llvm_unreachable(
"unhandled error kind");
2371 Parent->
addDecl(CLinkageDecl);
2372 Parent = CLinkageDecl;
2376 if (
Context.BuiltinInfo.isImmediate(ID)) {
2378 "consteval builtins should only be available in C++20 mode");
2387 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2393 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2396 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2398 Params.push_back(parm);
2400 New->setParams(Params);
2408 Scope *S,
bool ForRedeclaration,
2415 if (!ForRedeclaration)
2421 Context.BuiltinInfo.allowTypeMismatch(ID))
2427 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2428 <<
Context.BuiltinInfo.getName(ID);
2434 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2436 <<
Context.BuiltinInfo.getName(ID);
2440 if (!ForRedeclaration &&
2441 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2442 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2443 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2444 : diag::ext_implicit_lib_function_decl)
2445 <<
Context.BuiltinInfo.getName(ID) << R;
2446 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2447 Diag(Loc, diag::note_include_header_or_declare)
2448 << Header <<
Context.BuiltinInfo.getName(ID);
2484 while (Filter.hasNext()) {
2493 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2495 Decl->getUnderlyingType()))
2500 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2501 Decl->getAnonDeclWithTypedefName())
2513 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2514 OldType = OldTypedef->getUnderlyingType();
2516 OldType =
Context.getTypeDeclType(Old);
2522 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2526 New->setInvalidDecl();
2530 if (OldType != NewType &&
2533 !
Context.hasSameType(OldType, NewType)) {
2535 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2536 << Kind << NewType << OldType;
2539 New->setInvalidDecl();
2549 if (
New->isInvalidDecl())
return;
2555 switch (TypeID->getLength()) {
2559 if (!TypeID->isStr(
"id"))
2562 if (!
T->isPointerType())
2564 if (!
T->isVoidPointerType()) {
2569 Context.setObjCIdRedefinitionType(
T);
2571 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2576 if (!TypeID->isStr(
"Class"))
2578 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2580 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2584 if (!TypeID->isStr(
"SEL"))
2586 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2588 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2598 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2599 <<
New->getDeclName();
2605 return New->setInvalidDecl();
2610 return New->setInvalidDecl();
2612 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2613 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2614 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2617 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2621 if (OldTD->isModed())
2622 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2623 OldTD->getUnderlyingType());
2625 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2681 Diag(
New->getLocation(), diag::err_redefinition)
2682 <<
New->getDeclName();
2684 return New->setInvalidDecl();
2699 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2702 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2703 <<
New->getDeclName();
2710 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2712 for (
auto *ECD : ED->enumerators()) {
2723 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2724 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2725 for (
const auto *i : D->
attrs())
2726 if (i->getKind() == A->
getKind()) {
2742 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2743 return VD->isThisDeclarationADefinition();
2744 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2745 return TD->isCompleteDefinition() || TD->isBeingDefined();
2756 AlignedAttr *OldAlignasAttr =
nullptr;
2757 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2758 unsigned OldAlign = 0;
2766 if (I->isAlignmentDependent())
2772 unsigned Align = I->getAlignment(S.
Context);
2773 if (Align > OldAlign) {
2775 OldStrictestAlignAttr = I;
2780 AlignedAttr *NewAlignasAttr =
nullptr;
2781 unsigned NewAlign = 0;
2782 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2783 if (I->isAlignmentDependent())
2789 unsigned Align = I->getAlignment(S.
Context);
2790 if (Align > NewAlign)
2794 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2802 if (OldAlign == 0 || NewAlign == 0) {
2815 if (OldAlign != NewAlign) {
2816 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2819 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2832 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2834 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2838 bool AnyAdded =
false;
2841 if (OldAlign > NewAlign) {
2842 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2843 Clone->setInherited(
true);
2844 New->addAttr(Clone);
2849 if (OldAlignasAttr && !NewAlignasAttr &&
2850 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2851 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2852 Clone->setInherited(
true);
2853 New->addAttr(Clone);
2860#define WANT_DECL_MERGE_LOGIC
2861#include "clang/Sema/AttrParsedAttrImpl.inc"
2862#undef WANT_DECL_MERGE_LOGIC
2869 if (!DiagnoseMutualExclusions(S, D,
Attr))
2880 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2882 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2883 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2884 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2885 AA->getPriority(), AA->getEnvironment());
2886 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2888 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2890 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2892 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2894 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2896 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2897 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2899 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2901 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2902 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2904 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2906 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2908 IA->getInheritanceModel());
2909 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2918 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2920 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2922 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2924 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2935 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2936 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2937 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2939 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2941 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2943 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2945 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2947 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2950 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2953 WS->getSpelledArgsCount());
2954 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2956 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2961 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2978 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
2979 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
2983 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2989 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2991 if (FD->isDefined(Def,
true))
2998 for (
const auto *Attribute : D->
attrs())
2999 if (Attribute->getKind() == Kind)
3007 if (!
New->hasAttrs())
3011 if (!Def || Def ==
New)
3015 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3016 Attr *NewAttribute = NewAttributes[I];
3025 NewAttributes.erase(NewAttributes.begin() + I);
3033 ? diag::err_alias_after_tentative
3034 : diag::err_redefinition;
3036 if (
Diag == diag::err_redefinition)
3046 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3082 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3083 if (AA->isAlignas()) {
3094 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3096 NewAttributes.erase(NewAttributes.begin() + I);
3106 diag::err_loader_uninitialized_redeclaration);
3108 NewAttributes.erase(NewAttributes.begin() + I);
3131 diag::err_sycl_entry_point_after_definition)
3144 diag::warn_attribute_precede_definition);
3146 NewAttributes.erase(NewAttributes.begin() + I);
3152 const ConstInitAttr *CIAttr,
3153 bool AttrBeforeInit) {
3160 std::string SuitableSpelling;
3162 SuitableSpelling = std::string(
3164 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3166 InsertLoc, {tok::l_square, tok::l_square,
3167 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3168 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3169 tok::r_square, tok::r_square}));
3170 if (SuitableSpelling.empty())
3172 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3173 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3174 tok::r_paren, tok::r_paren}));
3175 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3176 SuitableSpelling =
"constinit";
3177 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3178 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3179 if (SuitableSpelling.empty())
3180 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3181 SuitableSpelling +=
" ";
3183 if (AttrBeforeInit) {
3186 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3189 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3193 S.
Diag(CIAttr->getLocation(),
3194 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3195 : diag::warn_require_const_init_added_too_late)
3198 << CIAttr->isConstinit()
3206 UsedAttr *NewAttr = OldAttr->clone(
Context);
3207 NewAttr->setInherited(
true);
3208 New->addAttr(NewAttr);
3211 RetainAttr *NewAttr = OldAttr->clone(
Context);
3212 NewAttr->setInherited(
true);
3213 New->addAttr(NewAttr);
3222 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3223 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3224 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3232 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3235 if (InitDecl == NewVD) {
3239 if (OldConstInit && OldConstInit->isConstinit())
3242 }
else if (NewConstInit) {
3246 if (InitDecl && InitDecl != NewVD) {
3249 NewVD->dropAttr<ConstInitAttr>();
3257 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3258 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3259 if (!OldA->isEquivalent(NewA)) {
3261 Diag(
New->getLocation(), diag::err_different_asm_label);
3262 Diag(OldA->getLocation(), diag::note_previous_declaration);
3264 }
else if (Old->
isUsed()) {
3267 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3273 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3274 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3275 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3276 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3277 Diag(NewAbiTagAttr->getLocation(),
3278 diag::err_new_abi_tag_on_redeclaration)
3280 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3284 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3290 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3291 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3293 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3300 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3301 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3303 Diag(
New->getLocation(), diag::warn_mismatched_section)
3311 bool foundAny =
New->hasAttrs();
3341 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3354 if (!foundAny)
New->dropAttrs();
3365 newAttr->setInherited(
true);
3387 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3402 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3403 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3404 S.
Diag(CDA->getLocation(),
3405 diag::err_carries_dependency_missing_on_first_decl) << 1;
3413 diag::note_carries_dependency_missing_first_decl) << 1;
3432 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3433 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3441 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3473 if (*Oldnullability != *Newnullability) {
3474 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3491 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3492 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3493 if (OldParamDT && NewParamDT &&
3494 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3495 QualType OldParamOT = OldParamDT->getOriginalType();
3496 QualType NewParamOT = NewParamDT->getOriginalType();
3499 << NewParam << NewParamOT;
3510struct GNUCompatibleParamWarning {
3511 ParmVarDecl *OldParm;
3512 ParmVarDecl *NewParm;
3513 QualType PromotedType;
3520template <
typename T>
3521static std::pair<diag::kind, SourceLocation>
3525 if (Old->isThisDeclarationADefinition())
3526 PrevDiag = diag::note_previous_definition;
3527 else if (Old->isImplicit()) {
3528 PrevDiag = diag::note_previous_implicit_declaration;
3529 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3530 if (FD->getBuiltinID())
3531 PrevDiag = diag::note_previous_builtin_declaration;
3534 OldLocation =
New->getLocation();
3536 PrevDiag = diag::note_previous_declaration;
3537 return std::make_pair(PrevDiag, OldLocation);
3545 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3546 !LangOpts.CPlusPlus &&
3552 const AttributedType *AT =
T->getAs<AttributedType>();
3553 while (AT && !AT->isCallingConv())
3554 AT = AT->getModifiedType()->getAs<AttributedType>();
3558template <
typename T>
3572template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3579template<
typename ExpectedDecl>
3601 !Old->getDeclContext()->getRedeclContext()->Equals(
3602 New->getDeclContext()->getRedeclContext()) &&
3607 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3620 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3621 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3624 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3625 AttrA->isDynamic() == AttrB->isDynamic();
3651 if (NamedDC->Equals(SemaDC))
3654 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3656 "unexpected context for redeclaration");
3667 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3668 FixSemaDC(FD->getDescribedFunctionTemplate());
3669 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3670 FixSemaDC(VD->getDescribedVarTemplate());
3674 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3682 Diag(
New->getLocation(), diag::err_using_decl_friend);
3683 Diag(Shadow->getTargetDecl()->getLocation(),
3684 diag::note_using_decl_target);
3685 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3693 New->getDescribedFunctionTemplate()) {
3705 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3706 <<
New->getDeclName();
3730 std::tie(PrevDiag, OldLocation) =
3740 !
New->getTemplateSpecializationInfo() &&
3743 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3744 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3746 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3747 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3752 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3753 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3754 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3757 New->dropAttr<InternalLinkageAttr>();
3760 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3761 if (!Old->
hasAttr<ErrorAttr>()) {
3762 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3764 New->dropAttr<ErrorAttr>();
3772 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3773 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3774 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3783 const Decl *DiagOld = Old;
3785 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3786 const auto *A = D->getAttr<OverloadableAttr>();
3787 return A && !A->isImplicit();
3796 diag::note_attribute_overloadable_prev_overload)
3800 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3802 New->dropAttr<OverloadableAttr>();
3809 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3811 Diag(OldLocation, diag::note_previous_declaration);
3834 bool RequiresAdjustment =
false;
3836 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3842 if (!NewCCExplicit) {
3846 RequiresAdjustment =
true;
3854 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3858 RequiresAdjustment =
true;
3862 Diag(
New->getLocation(), diag::err_cconv_change)
3865 << (!FirstCCExplicit ?
"" :
3869 Diag(
First->getLocation(), diag::note_previous_declaration);
3877 RequiresAdjustment =
true;
3884 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3887 Diag(OldLocation, diag::note_previous_declaration);
3892 RequiresAdjustment =
true;
3898 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3899 <<
"'ns_returns_retained'";
3900 Diag(OldLocation, diag::note_previous_declaration);
3905 RequiresAdjustment =
true;
3911 AnyX86NoCallerSavedRegistersAttr *
Attr =
3912 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3913 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3914 Diag(OldLocation, diag::note_previous_declaration);
3919 RequiresAdjustment =
true;
3922 if (RequiresAdjustment) {
3926 NewQType =
Context.getCanonicalType(
New->getType());
3931 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3939 if (
New->hasAttr<GNUInlineAttr>() &&
3948 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
3949 <<
New->getDeclName();
3950 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3954 QualType OldQTypeForComparison = OldQType;
3955 if (
Context.hasAnyFunctionEffects()) {
3957 const auto NewFX =
New->getFunctionEffects();
3958 if (OldFX != NewFX) {
3960 for (
const auto &Diff : Diffs) {
3961 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
3963 diag::warn_mismatched_func_effect_redeclaration)
3964 << Diff.effectName();
3975 if (!MergeErrs.empty())
3982 NewFPT->getParamTypes(), EPI);
3984 New->setType(ModQT);
3985 NewQType =
New->getType();
3990 EPI = OldFPT->getExtProtoInfo();
3992 OldQTypeForComparison =
Context.getFunctionType(
3993 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
3995 if (OldFX.empty()) {
4006 NewQType =
Context.getCanonicalType(
New->getType());
4014 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4015 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4017 OldDeclaredReturnType)) {
4022 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4024 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4025 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4026 <<
New <<
New->getReturnTypeSourceRange();
4028 !Old->
hasAttr<OverloadableAttr>() &&
4029 !
New->hasAttr<OverloadableAttr>())
4030 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4032 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4033 <<
New->getReturnTypeSourceRange();
4034 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4044 if (OldReturnType != NewReturnType) {
4048 if (OldAT && OldAT->isDeduced()) {
4049 QualType DT = OldAT->getDeducedType();
4060 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4062 if (OldMethod && NewMethod) {
4069 bool IsClassScopeExplicitSpecialization =
4075 !IsClassScopeExplicitSpecialization) {
4080 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4081 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4092 NewDiag = diag::err_constructor_redeclared;
4094 NewDiag = diag::err_destructor_redeclared;
4096 NewDiag = diag::err_conv_function_redeclared;
4098 NewDiag = diag::err_member_redeclared;
4100 Diag(
New->getLocation(), NewDiag);
4102 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4103 <<
New <<
New->getType();
4105 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4118 diag::err_definition_of_implicitly_declared_member)
4124 diag::err_definition_of_explicitly_defaulted_member)
4147 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4148 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4149 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4158 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4159 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4160 Diag(CDA->getLocation(),
4161 diag::err_carries_dependency_missing_on_first_decl) << 0;
4163 diag::note_carries_dependency_missing_first_decl) << 0;
4171 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4172 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4173 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4188 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4202 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4203 Diag(OldLocation, PrevDiag);
4205 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4206 Diag(OldLocation, PrevDiag);
4213 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4221 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4231 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4259 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4263 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4281 if (
New->hasWrittenPrototype()) {
4293 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4294 if (WithoutProto ==
New)
4295 IsWithoutProtoADef = NewDeclIsDefn;
4297 IsWithProtoADef = NewDeclIsDefn;
4299 diag::warn_non_prototype_changes_behavior)
4300 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4301 << (WithoutProto == Old) << IsWithProtoADef;
4311 !IsWithoutProtoADef)
4317 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4322 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4325 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4326 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4327 OldProto->getParamTypes(),
4328 OldProto->getExtProtoInfo());
4329 New->setType(NewQType);
4330 New->setHasInheritedPrototype();
4334 for (
const auto &ParamType : OldProto->param_types()) {
4337 ParamType,
nullptr,
SC_None,
nullptr);
4338 Param->setScopeInfo(0, Params.size());
4339 Param->setImplicit();
4340 Params.push_back(Param);
4343 New->setParams(Params);
4352 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4379 NewProto->getReturnType());
4380 bool LooseCompatible = !MergedReturn.isNull();
4382 LooseCompatible && Idx != End; ++Idx) {
4386 NewProto->getParamType(Idx))) {
4387 ArgTypes.push_back(NewParm->
getType());
4391 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4392 NewProto->getParamType(Idx) };
4393 Warnings.push_back(Warn);
4394 ArgTypes.push_back(NewParm->
getType());
4396 LooseCompatible =
false;
4399 if (LooseCompatible) {
4400 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4401 Diag(Warnings[Warn].NewParm->getLocation(),
4402 diag::ext_param_promoted_not_compatible_with_prototype)
4403 << Warnings[Warn].PromotedType
4404 << Warnings[Warn].OldParm->getType();
4405 if (Warnings[Warn].OldParm->getLocation().isValid())
4406 Diag(Warnings[Warn].OldParm->getLocation(),
4407 diag::note_previous_declaration);
4410 if (MergeTypeWithOld)
4411 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4428 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4429 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4430 Diag(OldLocation, diag::note_previous_builtin_declaration)
4435 PrevDiag = diag::note_previous_builtin_declaration;
4438 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4439 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4444 Scope *S,
bool MergeTypeWithOld) {
4450 New->setIsPureVirtual();
4459 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4473 if (!Merged.isNull() && MergeTypeWithOld)
4474 New->setType(Merged);
4498 ni != ne && oi != oe; ++ni, ++oi)
4507 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4508 ? diag::err_redefinition_different_type
4509 : diag::err_redeclaration_different_type)
4514 std::tie(PrevDiag, OldLocation)
4516 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4517 New->setInvalidDecl();
4521 bool MergeTypeWithOld) {
4527 if (
New->getType()->isUndeducedType()) {
4549 QualType PrevVDTy = PrevVD->getType();
4553 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4561 MergedT =
New->getType();
4572 else if (
New->getType()->isObjCObjectPointerType() &&
4574 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4589 if ((
New->getType()->isDependentType() ||
4594 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4603 if (MergeTypeWithOld)
4604 New->setType(MergedT);
4638 if (
New->isInvalidDecl())
4651 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4655 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4657 return New->setInvalidDecl();
4659 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4662 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4664 return New->setInvalidDecl();
4668 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4669 <<
New->getDeclName();
4671 New->getLocation());
4672 return New->setInvalidDecl();
4684 return New->setInvalidDecl();
4691 Diag(
New->getLocation(), diag::err_duplicate_member)
4692 <<
New->getIdentifier();
4694 New->setInvalidDecl();
4700 if (
New->hasAttr<WeakImportAttr>())
4703 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4706 New->dropAttr<WeakImportAttr>();
4711 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4712 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4713 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4716 New->dropAttr<InternalLinkageAttr>();
4721 if (MostRecent != Old) {
4724 if (
New->isInvalidDecl())
4729 if (
New->isInvalidDecl())
4734 std::tie(PrevDiag, OldLocation) =
4739 !
New->isStaticDataMember() &&
4742 Diag(
New->getLocation(), diag::ext_static_non_static)
4743 <<
New->getDeclName();
4744 Diag(OldLocation, PrevDiag);
4746 Diag(
New->getLocation(), diag::err_static_non_static)
4747 <<
New->getDeclName();
4748 Diag(OldLocation, PrevDiag);
4749 return New->setInvalidDecl();
4763 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4764 !
New->isStaticDataMember() &&
4766 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4767 Diag(OldLocation, PrevDiag);
4768 return New->setInvalidDecl();
4772 if (
New->hasExternalStorage() &&
4774 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4775 Diag(OldLocation, PrevDiag);
4776 return New->setInvalidDecl();
4779 !
New->hasExternalStorage()) {
4780 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4781 Diag(OldLocation, PrevDiag);
4782 return New->setInvalidDecl();
4792 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4795 !
New->getLexicalDeclContext()->isRecord())) {
4796 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4797 Diag(OldLocation, PrevDiag);
4798 return New->setInvalidDecl();
4806 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4807 Diag(Def->getLocation(), diag::note_previous_definition);
4821 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4822 Diag(OldLocation, PrevDiag);
4823 }
else if (!
New->getTLSKind()) {
4824 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4825 Diag(OldLocation, PrevDiag);
4831 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4833 Diag(OldLocation, PrevDiag);
4843 diag::warn_deprecated_redundant_constexpr_static_def);
4856 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4863 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4864 Diag(OldLocation, PrevDiag);
4865 New->setInvalidDecl();
4874 New->setPreviousDecl(Old);
4884 New->setImplicitlyInline();
4889 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4891 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4892 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4893 auto &HSI =
PP.getHeaderSearchInfo();
4894 StringRef HdrFilename =
4897 auto noteFromModuleOrInclude = [&](
Module *Mod,
4903 if (IncLoc.isValid()) {
4905 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4911 Diag(IncLoc, diag::note_redefinition_include_same_file)
4912 << HdrFilename.str();
4922 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4930 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4946 New->getDescribedVarTemplate() ||
New->getNumTemplateParameterLists() ||
4947 New->getDeclContext()->isDependentContext() ||
4948 New->hasAttr<SelectAnyAttr>())) {
4951 New->demoteThisDefinitionToDeclaration();
4959 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
4961 New->setInvalidDecl();
4987 if (!
Context.getLangOpts().CPlusPlus)
4993 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
4996 Context.getManglingNumberContext(Tag->getParent());
5005 Decl *ManglingContextDecl;
5006 std::tie(MCtx, ManglingContextDecl) =
5016struct NonCLikeKind {
5028 explicit operator bool() {
return Kind !=
None; }
5036 return {NonCLikeKind::Invalid, {}};
5043 return {NonCLikeKind::BaseClass,
5055 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5056 if (FD->hasInClassInitializer()) {
5057 auto *
Init = FD->getInClassInitializer();
5058 return {NonCLikeKind::DefaultMemberInit,
5074 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5082 if (MemberRD->isLambda())
5083 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5087 if (MemberRD->isThisDeclarationADefinition()) {
5093 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5110 Context.getCanonicalTagType(TagFromDeclSpec))) {
5112 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5123 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5127 if (NonCLike || ChangesLinkage) {
5128 if (NonCLike.Kind == NonCLikeKind::Invalid)
5131 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5132 if (ChangesLinkage) {
5134 if (NonCLike.Kind == NonCLikeKind::None)
5135 DiagID = diag::err_typedef_changes_linkage;
5137 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5143 TextToInsert +=
' ';
5146 Diag(FixitLoc, DiagID)
5149 if (NonCLike.Kind != NonCLikeKind::None) {
5150 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5151 << NonCLike.Kind - 1 << NonCLike.Range;
5154 << NewTD << isa<TypeAliasDecl>(NewTD);
5179 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5180 if (ED->isScopedUsingClassTag())
5187 llvm_unreachable(
"unexpected type specifier");
5195 bool IsExplicitInstantiation,
5198 Decl *TagD =
nullptr;
5216 Tag = CTD->getTemplatedDecl();
5221 Tag->setFreeStanding();
5222 if (Tag->isInvalidDecl())
5231 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5268 "Friend ellipsis but not friend-specified?");
5271 bool DeclaresAnything =
true;
5275 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5278 Record->getDeclContext()->isRecord()) {
5292 DeclaresAnything =
false;
5311 if ((Tag && Tag->getDeclName()) ||
5321 DeclaresAnything =
false;
5333 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5334 !
Enum->isInvalidDecl())
5335 DeclaresAnything =
false;
5343 DeclaresAnything =
false;
5347 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5349 << Tag->getTagKind()
5362 if (!DeclaresAnything) {
5365 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5366 ? diag::err_no_declarators
5367 : diag::ext_no_declarators)
5380 unsigned DiagID = diag::warn_standalone_specifier;
5382 DiagID = diag::ext_standalone_specifier;
5423 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5424 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5426 DiagnosticId = diag::warn_attribute_ignored;
5427 else if (AL.isRegularKeywordAttribute())
5428 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5430 DiagnosticId = diag::warn_declspec_attribute_ignored;
5431 Diag(AL.getLoc(), DiagnosticId)
5435 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5436 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5460 assert(PrevDecl &&
"Expected a non-null Decl");
5473 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5475 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5481 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5491 if (
Record->isAnonymousStructOrUnion())
5496 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5530 for (
auto *D : AnonRecord->
decls()) {
5553 unsigned OldChainingSize = Chaining.size();
5555 Chaining.append(IF->chain_begin(), IF->chain_end());
5557 Chaining.push_back(VD);
5559 assert(Chaining.size() >= 2);
5562 for (
unsigned i = 0; i < Chaining.size(); i++)
5563 NamedChain[i] = Chaining[i];
5567 VD->
getType(), {NamedChain, Chaining.size()});
5581 Chaining.resize(OldChainingSize);
5595 "Parser allowed 'typedef' as storage class VarDecl.");
5596 switch (StorageClassSpec) {
5610 llvm_unreachable(
"unknown storage class specifier");
5614 assert(
Record->hasInClassInitializer());
5616 for (
const auto *I :
Record->decls()) {
5617 const auto *FD = dyn_cast<FieldDecl>(I);
5618 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5619 FD = IFD->getAnonField();
5620 if (FD && FD->hasInClassInitializer())
5621 return FD->getLocation();
5624 llvm_unreachable(
"couldn't find in-class initializer");
5632 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5652 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5654 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5656 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5662 const char *PrevSpec =
nullptr;
5674 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5679 PrevSpec, DiagID, Policy);
5687 diag::err_anonymous_union_with_storage_spec)
5693 PrevSpec, DiagID,
Context.getPrintingPolicy());
5701 <<
Record->isUnion() <<
"const"
5705 diag::ext_anonymous_struct_union_qualified)
5706 <<
Record->isUnion() <<
"volatile"
5710 diag::ext_anonymous_struct_union_qualified)
5711 <<
Record->isUnion() <<
"restrict"
5715 diag::ext_anonymous_struct_union_qualified)
5716 <<
Record->isUnion() <<
"_Atomic"
5720 diag::ext_anonymous_struct_union_qualified)
5721 <<
Record->isUnion() <<
"__unaligned"
5731 for (
auto *Mem :
Record->decls()) {
5733 if (Mem->isInvalidDecl())
5736 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5740 assert(FD->getAccess() !=
AS_none);
5742 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5754 }
else if (Mem->isImplicit()) {
5761 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5762 if (!MemRecord->isAnonymousStructOrUnion() &&
5763 MemRecord->getDeclName()) {
5766 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5770 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5778 Diag(MemRecord->getLocation(),
5779 diag::ext_anonymous_record_with_anonymous_type)
5789 unsigned DK = diag::err_anonymous_record_bad_member;
5791 DK = diag::err_anonymous_record_with_type;
5793 DK = diag::err_anonymous_record_with_function;
5795 DK = diag::err_anonymous_record_with_static;
5799 DK == diag::err_anonymous_record_with_type)
5800 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5803 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5819 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5840 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5844 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5860 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5866 Record->getLocation(),
nullptr,
5882 Record->setAnonymousStructOrUnion(
true);
5893 Chain.push_back(Anon);
5899 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5902 Decl *ManglingContextDecl;
5903 std::tie(MCtx, ManglingContextDecl) =
5922 assert(
Record &&
"expected a record!");
5927 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5935 nullptr, RecTy, TInfo,
5947 Chain.push_back(Anon);
5951 diag::err_field_incomplete_or_sizeless) ||
5956 ParentDecl->setInvalidDecl();
5993 diag::err_deduction_guide_name_not_class_template)
6013 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6023 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6024 Context.getCanonicalType(Ty)));
6035 Context.getCanonicalType(Ty)));
6056 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6068 Context.getCanonicalType(Ty)));
6076 return Context.getNameForTemplate(TName, TNameLoc);
6081 llvm_unreachable(
"Unknown name kind");
6109 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6114 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6122 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6123 (DeclTyName && DeclTyName == DefTyName))
6124 Params.push_back(Idx);
6151#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6152#include "clang/Basic/TransformTypeTraits.def"
6157 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6167 if (!TSI)
return true;
6180 if (Result.isInvalid())
return true;
6225 << D << static_cast<int>(Status);
6236 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6237 llvm::omp::TraitProperty::
6238 implementation_extension_bind_to_declaration))
6263 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6274 bool IsMemberSpecialization) {
6275 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6276 "without nested-name-specifier");
6292 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6293 : diag::err_member_extra_qualification)
6297 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6305 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6307 Diag(Loc, diag::err_member_qualification)
6310 Diag(Loc, diag::err_invalid_declarator_global_scope)
6313 Diag(Loc, diag::err_invalid_declarator_in_function)
6316 Diag(Loc, diag::err_invalid_declarator_in_block)
6320 Diag(Loc, diag::err_export_non_namespace_scope_name)
6327 Diag(Loc, diag::err_invalid_declarator_scope)
6335 Diag(Loc, diag::err_member_qualification)
6362 Diag(Loc, diag::ext_template_after_declarative_nns)
6367 TL = std::exchange(NextTL,
TypeLoc())) {
6369 switch (TL.getTypeLocClass()) {
6370 case TypeLoc::TemplateSpecialization: {
6372 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6373 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6374 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6375 << TST.getLocalSourceRange();
6378 case TypeLoc::Decltype:
6379 case TypeLoc::PackIndexing: {
6380 const Type *
T = TL.getTypePtr();
6387 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6388 <<
T->isDecltypeType() << TL.getSourceRange();
6391 case TypeLoc::DependentName:
6395 case TypeLoc::DependentTemplateSpecialization: {
6397 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6398 NextTL = TST.getQualifierLoc().getAsTypeLoc();
6404 if (TemplateKeywordLoc.
isValid())
6405 Diag(Loc, diag::ext_template_after_declarative_nns)
6446 diag::err_template_qualified_declarator_no_match)
6453 if (!IsDependentContext &&
6460 diag::err_member_def_undefined_record)
6481 if (EnteringContext && IsDependentContext &&
6482 TemplateParamLists.size() != 0) {
6501 bool IsLinkageLookup =
false;
6502 bool CreateBuiltins =
false;
6516 IsLinkageLookup =
true;
6518 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6519 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6521 CreateBuiltins =
true;
6523 if (IsLinkageLookup) {
6565 bool AllowForCompatibility =
false;
6568 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6569 TemplateParamParent->isDeclScope(TPD);
6572 AllowForCompatibility);
6602 bool AddToScope =
true;
6604 if (TemplateParamLists.size()) {
6626 if (
New->getDeclName() && AddToScope)
6629 if (
OpenMP().isInOpenMPDeclareTargetContext())
6640 bool &SizeIsNegative,
6641 llvm::APSInt &Oversized) {
6646 SizeIsNegative =
false;
6649 if (
T->isDependentType())
6655 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6660 if (FixedType.
isNull())
return FixedType;
6661 FixedType = Context.getPointerType(FixedType);
6662 return Qs.
apply(Context, FixedType);
6664 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6665 QualType Inner = PTy->getInnerType();
6669 if (FixedType.
isNull())
return FixedType;
6670 FixedType = Context.getParenType(FixedType);
6671 return Qs.
apply(Context, FixedType);
6681 SizeIsNegative, Oversized);
6691 llvm::APSInt Res = Result.Val.getInt();
6694 if (Res.isSigned() && Res.isNegative()) {
6695 SizeIsNegative =
true;
6700 unsigned ActiveSizeBits =
6704 : Res.getActiveBits();
6710 QualType FoldedArrayType = Context.getConstantArrayType(
6712 return Qs.
apply(Context, FoldedArrayType);
6737 TypeLoc DstElemTL = DstATL.getElementLoc();
6756 bool &SizeIsNegative,
6757 llvm::APSInt &Oversized) {
6760 SizeIsNegative, Oversized);
6763 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6771 unsigned FailedFoldDiagID) {
6772 bool SizeIsNegative;
6773 llvm::APSInt Oversized;
6775 TInfo,
Context, SizeIsNegative, Oversized);
6777 Diag(Loc, diag::ext_vla_folded_to_constant);
6784 Diag(Loc, diag::err_typecheck_negative_array_size);
6785 else if (Oversized.getBoolValue())
6786 Diag(Loc, diag::err_array_too_large) <<
toString(Oversized, 10);
6787 else if (FailedFoldDiagID)
6788 Diag(Loc, FailedFoldDiagID);
6800 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6805 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6814 diag::err_virtual_non_function);
6818 diag::err_explicit_non_function);
6822 diag::err_noreturn_non_function);
6843 ? diag::warn_ms_inline_non_function
6844 : diag::err_inline_non_function)
6848 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6853 diag::err_deduction_guide_invalid_specifier)
6862 if (!NewTD)
return nullptr;
6883 if (
T->isVariablyModifiedType()) {
6887 bool SizeIsNegative;
6888 llvm::APSInt Oversized;
6899 else if (
T->isVariableArrayType())
6901 else if (Oversized.getBoolValue())
6938 switch (II->getNotableIdentifierID()) {
6939 case tok::NotableIdentifierKind::FILE:
6942 case tok::NotableIdentifierKind::jmp_buf:
6943 Context.setjmp_bufDecl(NewTD);
6945 case tok::NotableIdentifierKind::sigjmp_buf:
6946 Context.setsigjmp_bufDecl(NewTD);
6948 case tok::NotableIdentifierKind::ucontext_t:
6949 Context.setucontext_tDecl(NewTD);
6951 case tok::NotableIdentifierKind::float_t:
6952 case tok::NotableIdentifierKind::double_t:
6953 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
6990 if (Context.getLangOpts().CPlusPlus) {
7014 if (!OuterContext->
Equals(PrevOuterContext))
7023 if (!SS.
isSet())
return;
7028 if (
Decl->getType().hasAddressSpace())
7030 if (
Decl->getType()->isDependentType())
7042 Var->hasGlobalStorage())
7046 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
7047 auto OrigTy = DT->getOriginalType();
7048 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
7051 OrigTy =
Context.getAddrSpaceQualType(OrigTy, ImplAS);
7079 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7088 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7089 if (VD->hasInit()) {
7090 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7091 assert(VD->isThisDeclarationADefinition() &&
7092 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7094 VD->dropAttr<AliasAttr>();
7103 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7106 diag::err_attribute_selectany_non_extern_data);
7113 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7116 diag::warn_attribute_hybrid_patchable_non_extern);
7122 auto *VD = dyn_cast<VarDecl>(&ND);
7123 bool IsAnonymousNS =
false;
7126 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7127 while (NS && !IsAnonymousNS) {
7129 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7136 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7138 (!AnonNSInMicrosoftMode &&
7149 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7150 FD = FD->getMostRecentDecl();
7155 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7161 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7162 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7163 int NoImplicitObjectError = -1;
7165 NoImplicitObjectError = 0;
7166 else if (MD->isStatic())
7167 NoImplicitObjectError = 1;
7168 else if (MD->isExplicitObjectMemberFunction())
7169 NoImplicitObjectError = 2;
7170 if (NoImplicitObjectError != -1) {
7171 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7172 << NoImplicitObjectError << A->getRange();
7174 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7176 }
else if (MD->getReturnType()->isVoidType()) {
7180 err_lifetimebound_implicit_object_parameter_void_return_type);
7185 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7190 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7192 S.
Diag(A->getLocation(),
7193 diag::err_lifetimebound_parameter_void_return_type);
7216 bool IsSpecialization,
7217 bool IsDefinition) {
7221 bool IsTemplate =
false;
7222 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7223 OldDecl = OldTD->getTemplatedDecl();
7225 if (!IsSpecialization)
7226 IsDefinition =
false;
7228 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7229 NewDecl = NewTD->getTemplatedDecl();
7233 if (!OldDecl || !NewDecl)
7236 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7237 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7238 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7239 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7243 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7244 (NewExportAttr && !NewExportAttr->isInherited());
7250 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7252 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7254 bool JustWarn =
false;
7256 auto *VD = dyn_cast<VarDecl>(OldDecl);
7257 if (VD && !VD->getDescribedVarTemplate())
7259 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7271 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7272 : diag::err_attribute_dll_redeclaration;
7275 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7288 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7290 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7293 IsStaticDataMember = VD->isStaticDataMember();
7294 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7296 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7297 IsInline = FD->isInlined();
7298 IsQualifiedFriend = FD->getQualifier() &&
7302 if (OldImportAttr && !HasNewAttr &&
7303 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7305 if (IsMicrosoftABI && IsDefinition) {
7306 if (IsSpecialization) {
7309 diag::err_attribute_dllimport_function_specialization_definition);
7310 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7311 NewDecl->
dropAttr<DLLImportAttr>();
7314 diag::warn_redeclaration_without_import_attribute)
7317 NewDecl->
dropAttr<DLLImportAttr>();
7318 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7319 S.
Context, NewImportAttr->getRange()));
7321 }
else if (IsMicrosoftABI && IsSpecialization) {
7322 assert(!IsDefinition);
7326 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7327 << NewDecl << OldImportAttr;
7329 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7330 OldDecl->
dropAttr<DLLImportAttr>();
7331 NewDecl->
dropAttr<DLLImportAttr>();
7333 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7336 OldDecl->
dropAttr<DLLImportAttr>();
7337 NewDecl->
dropAttr<DLLImportAttr>();
7339 diag::warn_dllimport_dropped_from_inline_function)
7340 << NewDecl << OldImportAttr;
7347 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7349 !NewImportAttr && !NewExportAttr) {
7350 if (
const DLLExportAttr *ParentExportAttr =
7351 MD->getParent()->getAttr<DLLExportAttr>()) {
7352 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7353 NewAttr->setInherited(
true);
7405 return D->isExternC();
7422 llvm_unreachable(
"Unexpected context");
7432 llvm_unreachable(
"Unexpected context");
7477 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7478 return FD->isExternC();
7479 if (
const auto *VD = dyn_cast<VarDecl>(D))
7480 return VD->isExternC();
7482 llvm_unreachable(
"Unknown type of decl!");
7495 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7509 diag::err_invalid_type_for_program_scope_var)
7538 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7571 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7581template <
typename AttrTy>
7584 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7585 AttrTy *Clone = Attribute->clone(S.
Context);
7586 Clone->setInherited(
true);
7614 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7616 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7626 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7638 bool IsPlaceholderVariable =
false;
7644 if (!Decomp.bindings().empty()) {
7645 II = Decomp.bindings()[0].Name;
7659 IsPlaceholderVariable =
true;
7667 if (IsPlaceholderVariable)
7681 bool IsLocalExternDecl = SC ==
SC_Extern &&
7700 : diag::warn_deprecated_register)
7723 const AutoType *AT = TL.getTypePtr();
7727 bool IsMemberSpecialization =
false;
7728 bool IsVariableTemplateSpecialization =
false;
7730 bool IsVariableTemplate =
false;
7759 false, IsMemberSpecialization,
Invalid);
7761 if (TemplateParams) {
7768 if (!TemplateParams->
size() &&
7773 diag::err_template_variable_noparams)
7777 TemplateParams =
nullptr;
7785 IsVariableTemplateSpecialization =
true;
7789 IsVariableTemplate =
true;
7797 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7802 "should have a 'template<>' for this decl");
7805 bool IsExplicitSpecialization =
7816 (IsExplicitSpecialization || IsMemberSpecialization)) {
7818 diag::ext_explicit_specialization_storage_class)
7824 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7830 if (Ctxt->isFunctionOrMethod()) {
7831 FunctionOrMethod = Ctxt;
7834 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7836 AnonStruct = ParentDecl;
7840 if (FunctionOrMethod) {
7844 diag::err_static_data_member_not_allowed_in_local_class)
7845 << Name << RD->getDeclName() << RD->getTagKind();
7846 }
else if (AnonStruct) {
7851 diag::err_static_data_member_not_allowed_in_anon_struct)
7854 }
else if (RD->isUnion()) {
7858 diag_compat::static_data_member_in_union)
7876 diag::err_static_out_of_line)
7889 diag::err_storage_class_for_static_member)
7894 llvm_unreachable(
"C storage class in c++!");
7898 if (IsVariableTemplateSpecialization) {
7900 TemplateParamLists.size() > 0
7901 ? TemplateParamLists[0]->getTemplateLoc()
7904 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
7919 if (IsVariableTemplate) {
7922 TemplateParams, NewVD);
7943 unsigned VDTemplateParamLists =
7944 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
7945 if (TemplateParamLists.size() > VDTemplateParamLists)
7947 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
7954 }
else if (
CurContext->isFunctionOrMethod()) {
7957 diag::err_inline_declaration_block_scope) << Name
7962 : diag::compat_pre_cxx17_inline_variable);
7973 if (IsLocalExternDecl) {
7976 B->setLocalExternDecl();
7981 bool EmitTLSUnsupportedError =
false;
7994 diag::err_thread_non_global)
7996 else if (!
Context.getTargetInfo().isTLSSupported()) {
8001 EmitTLSUnsupportedError =
true;
8008 diag::err_thread_unsupported);
8019 diag::err_constexpr_wrong_decl_kind)
8020 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8030 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8037 diag::err_constinit_local_variable);
8041 ConstInitAttr::Keyword_constinit));
8059 diag::warn_static_local_in_extern_inline);
8065 if (IsVariableTemplateSpecialization)
8070 else if (IsMemberSpecialization)
8085 B->setModulePrivate();
8095 diag::err_opencl_unknown_type_specifier)
8105 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8106 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8132 if (EmitTLSUnsupportedError &&
8135 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8137 diag::err_thread_unsupported);
8139 if (EmitTLSUnsupportedError &&
8146 (NewVD->
hasAttr<CUDASharedAttr>() ||
8147 NewVD->
hasAttr<CUDAConstantAttr>())) {
8155 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8156 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8161 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8173 Diag(E->getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
8177 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
8179 Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
8189 const auto &TI =
Context.getTargetInfo();
8190 bool HasSizeMismatch;
8192 if (!TI.isValidGCCRegisterName(Label))
8193 Diag(E->getExprLoc(), diag::err_asm_unknown_register_name) << Label;
8194 else if (!TI.validateGlobalRegisterVariable(Label,
8197 Diag(E->getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
8198 else if (HasSizeMismatch)
8199 Diag(E->getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
8204 diag::err_asm_unsupported_register_type)
8212 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
8234 IsMemberSpecialization ||
8235 IsVariableTemplateSpecialization);
8249 if (IsMemberSpecialization && !IsVariableTemplate &&
8250 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8267 !IsVariableTemplateSpecialization) {
8275 if (!IsPlaceholderVariable)
8306 if (PrevVarTemplate &&
8326 Decl *ManglingContextDecl;
8327 std::tie(MCtx, ManglingContextDecl) =
8463 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8469 if (!MD->getParent()->isLambda() && MD->isExplicitObjectMemberFunction())
8475 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8478 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8483 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8484 if (shadowedVar->isExternC()) {
8487 for (
auto *I : shadowedVar->redecls())
8488 if (I->isFileVarDecl()) {
8496 unsigned WarningDiag = diag::warn_decl_shadow;
8499 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8501 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8503 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8509 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8515 ->ShadowingDecls.push_back({D, VD});
8526 ->ShadowingDecls.push_back({D, ShadowedDecl});
8530 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl);
8531 VD && VD->hasLocalStorage()) {
8535 ParentDC && !ParentDC->
Equals(OldDC);
8578 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8585 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8588 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
8590 Diag(Shadow.VD->getLocation(),
8591 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8592 : diag::warn_decl_shadow)
8593 << Shadow.VD->getDeclName()
8596 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8597 << Shadow.VD->getDeclName() << 0;
8600 Diag(Shadow.VD->getLocation(),
8602 : diag::warn_decl_shadow_uncaptured_local)
8603 << Shadow.VD->getDeclName()
8629 auto *DRE = dyn_cast<DeclRefExpr>(E);
8633 auto I = ShadowingDecls.find(D);
8634 if (I == ShadowingDecls.end())
8636 const NamedDecl *ShadowedDecl = I->second;
8638 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8643 ShadowingDecls.erase(I);
8651 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8710 assert(Prev &&
"should have found a previous declaration to diagnose");
8712 Prev = FD->getFirstDecl();
8716 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8738 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8750 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8770 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8780 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8788 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8804 if (
T->isUndeducedType())
8810 if (
T->isObjCObjectType()) {
8813 T =
Context.getObjCObjectPointerType(
T);
8844 if (NewVD->
hasAttr<BlocksAttr>()) {
8849 if (
T->isBlockPointerType()) {
8852 if (!
T.isConstQualified()) {
8853 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8859 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8868 if (!
T->isSamplerT() && !
T->isDependentType() &&
8875 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8876 <<
Scope <<
"global or constant";
8878 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8879 <<
Scope <<
"constant";
8895 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
8907 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
8932 && !NewVD->
hasAttr<BlocksAttr>()) {
8943 if (
T->isWebAssemblyTableType()) {
8954 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
8955 if (!ATy || ATy->getZExtSize() != 0) {
8957 diag::err_typecheck_wasm_table_must_have_zero_length);
8967 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
8970 ArrayT && ArrayT->isZeroSize()) {
8976 bool isVM =
T->isVariablyModifiedType();
8977 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
8983 bool SizeIsNegative;
8984 llvm::APSInt Oversized;
8989 FixedT = FixedTInfo->
getType();
8990 else if (FixedTInfo) {
8996 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9029 if (
T->isVoidType()) {
9047 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9053 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9066 !
T->isDependentType() &&
9068 diag::err_constexpr_var_non_literal)) {
9074 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9084 llvm::StringMap<bool> CallerFeatureMap;
9085 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9095 diag::err_sve_vector_in_non_streaming_function)
9105 llvm::StringMap<bool> CallerFeatureMap;
9106 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9139 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9144 Name =
Context.DeclarationNames.getCXXDestructorName(
9145 Context.getCanonicalTagType(BaseRecord));
9150 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9157 if (Overridden.insert(BaseMD).second) {
9174 return !Overridden.empty();
9180 struct ActOnFDArgs {
9194 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9195 CXXRecordDecl *Parent)
9196 : Context(Context), OriginalFD(TypoFD),
9199 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9203 SmallVector<unsigned, 1> MismatchedParams;
9205 CDeclEnd = candidate.
end();
9206 CDecl != CDeclEnd; ++CDecl) {
9207 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9211 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9212 CXXRecordDecl *Parent = MD->getParent();
9215 }
else if (!ExpectedParent) {
9224 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9225 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9229 ASTContext &Context;
9230 FunctionDecl *OriginalFD;
9231 CXXRecordDecl *ExpectedParent;
9251 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9259 IsLocalFriend ? diag::err_no_matching_local_friend :
9261 diag::err_member_decl_does_not_match;
9273 "Cannot have an ambiguity in previous-declaration lookup");
9275 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9277 if (!Prev.
empty()) {
9286 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9287 NearMatches.push_back(std::make_pair(FD, ParamNum));
9295 IsLocalFriend ?
nullptr : NewDC))) {
9302 CDeclEnd = Correction.
end();
9303 CDecl != CDeclEnd; ++CDecl) {
9323 ExtraArgs.S, ExtraArgs.D,
9326 ExtraArgs.AddToScope);
9337 if ((*I)->getCanonicalDecl() == Canonical)
9344 SemaRef.
PDiag(IsLocalFriend
9345 ? diag::err_no_matching_local_friend_suggest
9346 : diag::err_member_decl_does_not_match_suggest)
9347 << Name << NewDC << IsDefinition);
9360 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9363 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9369 bool NewFDisConst = NewMD && NewMD->
isConst();
9372 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9373 NearMatch != NearMatchEnd; ++NearMatch) {
9376 bool FDisConst = MD && MD->
isConst();
9377 bool IsMember = MD || !IsLocalFriend;
9380 if (
unsigned Idx = NearMatch->second) {
9384 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9385 : diag::note_local_decl_close_param_match)
9388 }
else if (FDisConst != NewFDisConst) {
9390 diag::note_member_def_close_const_match)
9395 else if (FTI.hasMethodTypeQualifiers() &&
9396 FTI.getConstQualifierLoc().isValid())
9400 IsMember ? diag::note_member_def_close_match
9401 : diag::note_local_decl_close_match);
9409 default: llvm_unreachable(
"Unknown storage class!");
9414 diag::err_typecheck_sclass_func);
9431 diag::err_static_block_func);
9447 bool &IsVirtualOkay) {
9461 diag::err_c23_constexpr_not_variable);
9464 diag::err_constexpr_wrong_decl_kind)
9465 <<
static_cast<int>(ConstexprKind);
9489 "Strict prototypes are required");
9510 "Constructors can only be declared in a member context");
9516 isInline,
false, ConstexprKind,
9527 false, ConstexprKind,
9528 TrailingRequiresClause);
9531 if (
Record->isBeingDefined())
9540 IsVirtualOkay =
true;
9552 true, ConstexprKind, TrailingRequiresClause);
9558 diag::err_conv_function_not_member);
9566 IsVirtualOkay =
true;
9571 TrailingRequiresClause);
9598 IsVirtualOkay = !Ret->isStatic();
9612 true , ConstexprKind, TrailingRequiresClause);
9629 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9637 if (Names.end() !=
Match)
9642 }
while (DesugaredTy != Ty);
9681 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9683 bool IsStandardLayoutType =
true;
9689 if (!CXXRec->hasDefinition())
9690 CXXRec = CXXRec->getTemplateInstantiationPattern();
9691 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9692 IsStandardLayoutType =
false;
9695 !IsStandardLayoutType)
9743 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9757 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9770 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9779 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9796 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9804 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9805 PT = Typedef->desugar();
9827 HistoryStack.push_back(
nullptr);
9832 VisitStack.push_back(PD);
9833 assert(VisitStack.back() &&
"First decl null?");
9836 const Decl *
Next = VisitStack.pop_back_val();
9838 assert(!HistoryStack.empty());
9840 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9841 ValidTypes.insert(Hist->getType().getTypePtr());
9850 HistoryStack.push_back(Field);
9852 QualType FieldTy = Field->getType();
9856 "Unexpected type.");
9865 VisitStack.push_back(
nullptr);
9867 for (
const auto *FD : RD->
fields()) {
9878 VisitStack.push_back(FD);
9889 S.
Diag(Param->getLocation(),
9890 diag::err_record_with_pointers_kernel_param)
9894 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9897 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
9898 << PD->getDeclName();
9903 I = HistoryStack.begin() + 1,
9904 E = HistoryStack.end();
9917 }
while (!VisitStack.empty());
9934 (LangOpts.CPlusPlus &&
9944 unsigned BuiltinID) {
9945 switch (BuiltinID) {
9946 case Builtin::BI__GetExceptionInfo:
9950 case Builtin::BIaddressof:
9951 case Builtin::BI__addressof:
9952 case Builtin::BIforward:
9953 case Builtin::BIforward_like:
9954 case Builtin::BImove:
9955 case Builtin::BImove_if_noexcept:
9956 case Builtin::BIas_const: {
9981 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
9983 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
9984 Invented->getDepth() == TemplateParamLists.back()->getDepth())
9985 TemplateParamLists.back() = Invented;
9987 TemplateParamLists.push_back(Invented);
9997 diag::err_invalid_thread)
10005 bool isFriend =
false;
10007 bool isMemberSpecialization =
false;
10008 bool isFunctionTemplateSpecialization =
false;
10010 bool HasExplicitTemplateArgs =
false;
10013 bool isVirtualOkay =
false;
10020 if (!NewFD)
return nullptr;
10030 if (IsLocalExternDecl)
10040 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10068 if (isVirtual && Parent->isUnion()) {
10072 if ((Parent->isClass() || Parent->isStruct()) &&
10073 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10076 if (
auto *Def = Parent->getDefinition())
10077 Def->setInitMethod(
true);
10082 isMemberSpecialization =
false;
10083 isFunctionTemplateSpecialization =
false;
10098 isMemberSpecialization,
Invalid);
10099 if (TemplateParams) {
10104 if (TemplateParams->
size() > 0) {
10112 }
else if (TemplateId) {
10129 Name, TemplateParams,
10135 if (TemplateParamLists.size() > 1) {
10142 isFunctionTemplateSpecialization =
true;
10144 if (TemplateParamLists.size() > 0)
10164 << Name << RemoveRange
10170 HasExplicitTemplateArgs =
true;
10177 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10183 if (TemplateParamLists.size() > 0)
10188 if (isFriend && TemplateId)
10189 isFunctionTemplateSpecialization =
true;
10195 if (isFunctionTemplateSpecialization && TemplateId) {
10196 HasExplicitTemplateArgs =
true;
10227 if (!isVirtualOkay) {
10229 diag::err_virtual_non_function);
10233 diag::err_virtual_out_of_class)
10239 diag::err_virtual_member_function_template)
10258 diag::err_inline_declaration_block_scope) << Name
10272 diag::err_explicit_out_of_class)
10279 diag::err_explicit_non_ctor_or_conv_function)
10297 <<
static_cast<int>(ConstexprKind);
10308 diag::err_invalid_consteval_decl_kind)
10316 if (isFunctionTemplateSpecialization) {
10319 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10365 if (!isFriend && SC !=
SC_None) {
10373 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10375 diag::ext_explicit_specialization_storage_class)
10382 "Out-of-line member function should be a CXXMethodDecl");
10399 ? diag::ext_static_out_of_line
10400 : diag::err_static_out_of_line)
10425 PendingInlineFuncDecls.insert(NewFD);
10432 isMemberSpecialization ||
10433 isFunctionTemplateSpecialization);
10442 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10467 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10469 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10470 Param->setDeclContext(NewFD);
10471 Params.push_back(Param);
10473 if (Param->isInvalidDecl())
10486 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10491 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10496 DeclContext *TagDC = TD->getLexicalDeclContext();
10500 TD->setDeclContext(NewFD);
10508 if (TagDC != PrototypeTagContext)
10509 TD->setLexicalDeclContext(TagDC);
10523 for (
const auto &AI : FT->param_types()) {
10526 Param->setScopeInfo(0, Params.size());
10527 Params.push_back(Param);
10531 "Should not need args for typedef of non-prototype fn");
10535 NewFD->setParams(Params);
10560 !NewFD->
hasAttr<SectionAttr>())
10561 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10567 !NewFD->
hasAttr<SectionAttr>()) {
10568 NewFD->
addAttr(SectionAttr::CreateImplicit(
10570 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10581 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10582 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10587 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10596 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10597 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10598 !NewTVA->isDefaultVersion() &&
10599 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10601 AddToScope =
false;
10613 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10628 isMemberSpecialization,
10635 "previous declaration set still overloaded");
10647 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10670 diag::ext_operator_new_delete_declared_inline)
10697 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10709 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10717 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10721 Diag(TRC->getBeginLoc(),
10722 diag::err_constrained_non_templated_function);
10739 if (isFunctionTemplateSpecialization) {
10740 bool isDependentSpecialization =
false;
10745 isDependentSpecialization =
10747 (HasExplicitTemplateArgs &&
10748 TemplateSpecializationType::
10749 anyInstantiationDependentTemplateArguments(
10751 assert((!isDependentSpecialization ||
10752 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10753 "dependent friend function specialization without template "
10759 isDependentSpecialization =
10764 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10765 if (isDependentSpecialization) {
10772 NewFD, ExplicitTemplateArgs,
Previous))
10793 isMemberSpecialization,
10802 "previous declaration set still overloaded");
10843 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10889 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10890 AddToScope = ExtraArgs.AddToScope;
10899 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10900 AddToScope = ExtraArgs.AddToScope;
10906 !isFriend && !isFunctionTemplateSpecialization &&
10907 !isMemberSpecialization) {
10925 if (NewFD->
hasAttr<HLSLShaderAttr>())
10933 if (
unsigned BuiltinID = II->getBuiltinID()) {
10934 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
10935 if (!InStdNamespace &&
10940 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
10941 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10948 Context.hasSameFunctionTypeIgnoringExceptionSpec(
10950 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10955 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10966 if (NewFD->
hasAttr<OverloadableAttr>() &&
10969 diag::err_attribute_overloadable_no_prototype)
10971 NewFD->
dropAttr<OverloadableAttr>();
11004 isMemberSpecialization ||
11005 isFunctionTemplateSpecialization,
11011 if (II && II->
isStr(
CUDA().getConfigureFuncName()) &&
11017 Context.setcudaConfigureCallDecl(NewFD);
11024 (NewFD->
hasAttr<CUDADeviceAttr>() ||
11025 NewFD->
hasAttr<CUDAGlobalAttr>()) &&
11078 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11098 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11100 QualType ElemTy = PipeTy->getElementType();
11102 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11108 if (
Context.getTargetInfo().getTriple().isWasm()) {
11110 Diag(Param->getTypeSpecStartLoc(),
11111 diag::err_wasm_table_as_function_parameter);
11119 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11120 if (NewFD->
hasAttr<ConstructorAttr>()) {
11121 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11123 NewFD->
dropAttr<AvailabilityAttr>();
11125 if (NewFD->
hasAttr<DestructorAttr>()) {
11126 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11128 NewFD->
dropAttr<AvailabilityAttr>();
11139 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11143 Diag(NBA->getLocation(),
11144 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11145 << NBA->getSpelling();
11148 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11149 << NBA->getSpelling();
11158 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11182 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11186 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11197 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11198 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11208 bool IsDefinition) {
11211 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11213 return SectionAttr::CreateImplicit(
11215 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11263 auto *VD = dyn_cast<ValueDecl>(D);
11264 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11265 return !VD || !PrevVD ||
11267 PrevVD->getType());
11275 const auto *TA = FD->
getAttr<TargetAttr>();
11276 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11278 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11291 for (
const auto &Feat : ParseInfo.
Features) {
11292 auto BareFeat = StringRef{Feat}.substr(1);
11293 if (Feat[0] ==
'-') {
11295 <<
Feature << (
"no-" + BareFeat).str();
11315 for (
auto &Feat : ParseInfo.
Features)
11316 Feats.push_back(StringRef{Feat}.substr(1));
11319 TVA->getFeatures(Feats);
11321 for (
const auto &Feat : Feats) {
11341 case attr::ArmLocallyStreaming:
11346 case attr::NonNull:
11347 case attr::NoThrow:
11356 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11357 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11358 <<
static_cast<unsigned>(MVKind) << A;
11360 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11365 switch (A->getKind()) {
11366 case attr::CPUDispatch:
11367 case attr::CPUSpecific:
11370 return Diagnose(S, A);
11374 return Diagnose(S, A);
11376 case attr::TargetVersion:
11379 return Diagnose(S, A);
11381 case attr::TargetClones:
11384 return Diagnose(S, A);
11388 return Diagnose(S, A);
11401 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11402 enum DoesntSupport {
11409 DefaultedFuncs = 6,
11410 ConstexprFuncs = 7,
11411 ConstevalFuncs = 8,
11423 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11426 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11434 if (!TemplatesSupported &&
11436 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11439 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11440 if (NewCXXFD->isVirtual())
11441 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11445 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11449 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11454 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11458 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11462 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11463 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11467 QualType NewReturnType = NewType->getReturnType();
11470 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11483 bool ArmStreamingCCMismatched =
false;
11484 if (OldFPT && NewFPT) {
11491 ArmStreamingCCMismatched =
true;
11494 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11497 QualType OldReturnType = OldType->getReturnType();
11499 if (OldReturnType != NewReturnType)
11500 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11503 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11506 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11509 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11532 bool IsCPUSpecificCPUDispatchMVKind =
11536 if (CausesMV && OldFD &&
11544 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11551 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11553 S.
PDiag(diag::note_multiversioning_caused_here)),
11555 S.
PDiag(diag::err_multiversion_doesnt_support)
11556 <<
static_cast<unsigned>(MVKind)),
11558 S.
PDiag(diag::err_multiversion_diff)),
11560 !IsCPUSpecificCPUDispatchMVKind,
11573 "Function lacks multiversion attribute");
11574 const auto *TA = FD->
getAttr<TargetAttr>();
11575 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11578 if (TA && !TA->isDefaultVersion())
11615 To->
addAttr(TargetVersionAttr::CreateImplicit(
11626 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11627 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11628 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11629 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11631 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11640 if (NewTA && !NewTA->isDefaultVersion() &&
11641 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11658 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11659 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11668 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11676 OldTA->getFeaturesStr());
11680 NewTA->getFeaturesStr());
11683 if (OldParsed == NewParsed) {
11691 for (
const auto *FD : OldFD->
redecls()) {
11692 const auto *CurTA = FD->
getAttr<TargetAttr>();
11693 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11697 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11698 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11700 << (NewTA ? 0 : 2);
11701 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11748 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11764 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11765 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11772 NewTA->getFeaturesStr());
11777 NewTVA->getFeatures(NewFeats);
11778 llvm::sort(NewFeats);
11781 bool UseMemberUsingDeclRules =
11784 bool MayNeedOverloadableChecks =
11793 if (MayNeedOverloadableChecks &&
11794 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11797 switch (NewMVKind) {
11800 "Only target_clones can be omitted in subsequent declarations");
11803 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11804 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11813 CurTA->getFeaturesStr());
11815 if (CurParsed == NewParsed) {
11824 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11825 if (CurTVA->getName() == NewTVA->getName()) {
11832 CurTVA->getFeatures(CurFeats);
11833 llvm::sort(CurFeats);
11835 if (CurFeats == NewFeats) {
11841 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11843 if (NewFeats.empty())
11846 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11848 CurClones->getFeatures(CurFeats, I);
11849 llvm::sort(CurFeats);
11851 if (CurFeats == NewFeats) {
11862 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11863 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11864 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11865 !std::equal(CurClones->featuresStrs_begin(),
11866 CurClones->featuresStrs_end(),
11867 NewClones->featuresStrs_begin())) {
11873 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11875 CurTVA->getFeatures(CurFeats);
11876 llvm::sort(CurFeats);
11879 if (CurFeats.empty())
11882 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11884 NewClones->getFeatures(NewFeats, I);
11885 llvm::sort(NewFeats);
11887 if (CurFeats == NewFeats) {
11903 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
11904 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
11909 CurFD->
hasAttr<CPUDispatchAttr>()) {
11910 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
11912 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
11913 NewCPUDisp->cpus_begin(),
11915 return Cur->getName() == New->getName();
11930 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
11932 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
11933 NewCPUSpec->cpus_begin(),
11935 return Cur->getName() == New->getName();
11946 if (CurII == NewII) {
12006 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12007 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12008 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12009 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12010 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12020 NewTVA->isDefaultVersion())) {
12021 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12029 if (NewTA && TI.
getTriple().isAArch64())
12056 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12069 if (OldFD->
isUsed(
false)) {
12071 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12092 bool IsPure = NewFD->
hasAttr<PureAttr>();
12093 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12096 if (!IsPure && !IsConst)
12103 if (IsPure && IsConst) {
12113 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12119 bool IsMemberSpecialization,
12122 "Variably modified return types are not handled here");
12127 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12132 bool MayNeedOverloadableChecks =
false;
12144 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12146 OldDecl = Candidate;
12149 MayNeedOverloadableChecks =
true;
12174 OldDecl =
Previous.getFoundDecl();
12175 MergeTypeWithPrevious =
false;
12178 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12179 NewFD->
hasAttr<OverloadableAttr>()) {
12181 MayNeedOverloadableChecks =
true;
12193 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12244 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12245 if (!OldMD || !OldMD->
isStatic()) {
12280 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12281 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12284 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12293 NewFD->
setAccess(OldTemplateDecl->getAccess());
12294 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12299 if (IsMemberSpecialization &&
12302 assert(OldTemplateDecl->isMemberSpecialization());
12305 if (OldFD->isDeleted()) {
12307 assert(OldFD->getCanonicalDecl() == OldFD);
12309 OldFD->setDeletedAsWritten(
false);
12323 !NewFD->
getAttr<OverloadableAttr>()) {
12327 return ND->hasAttr<OverloadableAttr>();
12329 "Non-redecls shouldn't happen without overloadable present");
12332 const auto *FD = dyn_cast<FunctionDecl>(ND);
12333 return FD && !FD->
hasAttr<OverloadableAttr>();
12336 if (OtherUnmarkedIter !=
Previous.end()) {
12338 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12339 Diag((*OtherUnmarkedIter)->getLocation(),
12340 diag::note_attribute_overloadable_prev_overload)
12350 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12353 if (NewFD->
hasAttr<SYCLExternalAttr>())
12363 dyn_cast<CXXDestructorDecl>(NewFD)) {
12371 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12376 Context.DeclarationNames.getCXXDestructorName(ClassType);
12383 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12384 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12390 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12396 if (!
Method->isFunctionTemplateSpecialization() &&
12397 !
Method->getDescribedFunctionTemplate() &&
12398 Method->isCanonicalDecl()) {
12405 diag::err_constrained_virtual_method);
12445 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12458 auto HasNoexcept = [&](
QualType T) ->
bool {
12463 T = RT->getPointeeType();
12464 else if (
T->isAnyPointerType())
12465 T =
T->getPointeeType();
12467 T = MPT->getPointeeType();
12469 if (FPT->isNothrow())
12475 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12477 AnyNoexcept |= HasNoexcept(
T);
12480 diag::warn_cxx17_compat_exception_spec_in_signature)
12485 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12487 if (!Parm->getType()->isDependentType() &&
12488 Parm->hasAttr<CUDAGridConstantAttr>() &&
12489 !(IsKernel && Parm->getType().isConstQualified()))
12490 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12491 diag::err_cuda_grid_constant_not_allowed);
12497 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12507 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12518 ? diag::err_static_main : diag::warn_static_main)
12526 Diag(NoreturnLoc, diag::ext_noreturn_main);
12527 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12539 << FD->
hasAttr<DeviceKernelAttr>();
12544 if (FD->
hasAttr<SYCLExternalAttr>()) {
12546 << FD->
getAttr<SYCLExternalAttr>();
12557 assert(
T->isFunctionType() &&
"function decl is not of function type");
12579 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12604 Diag(start, diag::warn_main_in_named_module)
12616 bool HasExtraParameters = (nparams > 3);
12627 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12628 HasExtraParameters =
false;
12630 if (HasExtraParameters) {
12643 for (
unsigned i = 0; i < nparams; ++i) {
12646 bool mismatch =
true;
12663 mismatch = !qs.
empty();
12692 if (
T.isOSCygMing())
12697 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12705 assert(
T->isFunctionType() &&
"function decl is not of function type");
12714 if (FD->
getName() !=
"DllMain")
12721 FT =
Context.adjustFunctionType(
12726 FT =
Context.adjustFunctionType(FT,
12748 if (
Init->isValueDependent()) {
12749 assert(
Init->containsErrors() &&
12750 "Dependent code should only occur in error-recovery path.");
12753 const Expr *Culprit;
12754 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12763 class SelfReferenceChecker
12769 bool isReferenceType;
12770 bool isInCXXOperatorCall;
12778 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12779 S(S), OrigDecl(OrigDecl) {
12782 isReferenceType =
false;
12783 isInCXXOperatorCall =
false;
12784 isInitList =
false;
12785 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12786 isPODType = VD->getType().isPODType(S.
Context);
12788 isReferenceType = VD->getType()->isReferenceType();
12795 void CheckExpr(Expr *E) {
12796 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12804 InitFieldIndex.push_back(0);
12805 for (
auto *Child : InitList->
children()) {
12807 ++InitFieldIndex.back();
12809 InitFieldIndex.pop_back();
12814 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12815 llvm::SmallVector<FieldDecl*, 4> Fields;
12817 bool ReferenceField =
false;
12820 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12821 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12824 Fields.push_back(FD);
12826 ReferenceField =
true;
12827 Base = ME->getBase()->IgnoreParenImpCasts();
12831 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12832 if (!DRE || DRE->
getDecl() != OrigDecl)
12836 if (CheckReference && !ReferenceField)
12840 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12841 for (
const FieldDecl *I : llvm::reverse(Fields))
12842 UsedFieldIndex.push_back(I->getFieldIndex());
12847 for (
auto UsedIter = UsedFieldIndex.begin(),
12848 UsedEnd = UsedFieldIndex.end(),
12849 OrigIter = InitFieldIndex.begin(),
12850 OrigEnd = InitFieldIndex.end();
12851 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12852 if (*UsedIter < *OrigIter)
12854 if (*UsedIter > *OrigIter)
12859 HandleDeclRefExpr(DRE);
12866 void HandleValue(Expr *E) {
12868 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12869 HandleDeclRefExpr(DRE);
12873 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12874 Visit(CO->getCond());
12875 HandleValue(CO->getTrueExpr());
12876 HandleValue(CO->getFalseExpr());
12880 if (BinaryConditionalOperator *BCO =
12881 dyn_cast<BinaryConditionalOperator>(E)) {
12882 Visit(BCO->getCond());
12883 HandleValue(BCO->getFalseExpr());
12887 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
12888 if (Expr *SE = OVE->getSourceExpr())
12893 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
12894 if (BO->getOpcode() == BO_Comma) {
12895 Visit(BO->getLHS());
12896 HandleValue(BO->getRHS());
12909 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12913 Base = ME->getBase()->IgnoreParenImpCasts();
12915 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
12916 HandleDeclRefExpr(DRE);
12925 void VisitDeclRefExpr(DeclRefExpr *E) {
12926 if (isReferenceType)
12927 HandleDeclRefExpr(E);
12930 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
12936 Inherited::VisitImplicitCastExpr(E);
12939 void VisitMemberExpr(MemberExpr *E) {
12941 if (CheckInitListMemberExpr(E,
true ))
12950 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
12951 bool Warn = (MD && !MD->
isStatic());
12953 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12956 Base = ME->getBase()->IgnoreParenImpCasts();
12959 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
12961 HandleDeclRefExpr(DRE);
12970 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
12971 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
12975 return Inherited::VisitCXXOperatorCallExpr(E);
12979 HandleValue(Arg->IgnoreParenImpCasts());
12983 if (!isInCXXOperatorCall) {
12984 Inherited::VisitLambdaExpr(E);
12989 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
12990 HandleDeclRefExpr(DRE);
12995 void VisitUnaryOperator(UnaryOperator *E) {
13009 Inherited::VisitUnaryOperator(E);
13012 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13014 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13016 Expr *ArgExpr = E->
getArg(0);
13017 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13018 if (ILE->getNumInits() == 1)
13019 ArgExpr = ILE->getInit(0);
13020 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13021 if (ICE->getCastKind() == CK_NoOp)
13022 ArgExpr = ICE->getSubExpr();
13023 HandleValue(ArgExpr);
13026 Inherited::VisitCXXConstructExpr(E);
13029 void VisitCallExpr(CallExpr *E) {
13032 HandleValue(E->
getArg(0));
13036 Inherited::VisitCallExpr(E);
13039 void VisitBinaryOperator(BinaryOperator *E) {
13041 HandleValue(E->
getLHS());
13046 Inherited::VisitBinaryOperator(E);
13052 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13057 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13059 if (OrigDecl != ReferenceDecl)
return;
13061 if (isReferenceType) {
13062 diag = diag::warn_uninit_self_reference_in_reference_init;
13064 diag = diag::warn_static_self_reference_in_init;
13068 diag = diag::warn_uninit_self_reference_in_init;
13082 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13094 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13095 if (ICE->getCastKind() == CK_LValueToRValue)
13096 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13097 if (DRE->
getDecl() == OrigDecl)
13100 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13107 struct VarDeclOrName {
13109 DeclarationName Name;
13111 friend const Sema::SemaDiagnosticBuilder &
13112 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13113 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13123 bool IsInitCapture = !VDecl;
13125 "init captures are expected to be deduced prior to initialization");
13127 VarDeclOrName VN{VDecl, Name};
13130 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13134 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13135 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13136 << (int)Deduced->getContainedAutoType()->getKeyword()
13143 assert(VDecl &&
"no init for init capture deduction?");
13158 DeduceInits =
Init;
13160 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13162 DeduceInits = PL->exprs();
13165 assert(VDecl &&
"non-auto type for init capture deduction?");
13176 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13177 DeduceInits = IL->inits();
13181 if (DeduceInits.empty()) {
13184 Diag(
Init->getBeginLoc(), IsInitCapture
13185 ? diag::err_init_capture_no_expression
13186 : diag::err_auto_var_init_no_expression)
13187 << VN <<
Type << Range;
13191 if (DeduceInits.size() > 1) {
13192 Diag(DeduceInits[1]->getBeginLoc(),
13193 IsInitCapture ? diag::err_init_capture_multiple_expressions
13194 : diag::err_auto_var_init_multiple_expressions)
13195 << VN <<
Type << Range;
13199 Expr *DeduceInit = DeduceInits[0];
13201 Diag(
Init->getBeginLoc(), IsInitCapture
13202 ? diag::err_init_capture_paren_braces
13203 : diag::err_auto_var_init_paren_braces)
13209 bool DefaultedAnyToId =
false;
13211 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13213 if (
Result.isInvalid()) {
13217 DefaultedAnyToId =
true;
13227 Type.getQualifiers());
13235 if (!IsInitCapture)
13238 Diag(Range.getBegin(),
13239 diag::err_init_capture_deduction_failure_from_init_list)
13245 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13260 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13263 return DeducedType;
13268 assert(!
Init || !
Init->containsErrors());
13272 if (DeducedType.
isNull()) {
13281 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13305 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13306 Init = EWC->getSubExpr();
13308 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13309 Init = CE->getSubExpr();
13314 "shouldn't be called if type doesn't have a non-trivial C struct");
13315 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13316 for (
auto *I : ILE->inits()) {
13317 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13318 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13344bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13350 return FD->
hasAttr<UnavailableAttr>();
13353struct DiagNonTrivalCUnionDefaultInitializeVisitor
13360 DiagNonTrivalCUnionDefaultInitializeVisitor(
13363 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13366 const FieldDecl *FD,
bool InNonTrivialUnion) {
13369 InNonTrivialUnion);
13370 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13373 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13374 bool InNonTrivialUnion) {
13375 if (InNonTrivialUnion)
13377 << 1 << 0 << QT << FD->
getName();
13380 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13381 if (InNonTrivialUnion)
13383 << 1 << 0 << QT << FD->
getName();
13386 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13388 if (RD->isUnion()) {
13389 if (OrigLoc.isValid()) {
13390 bool IsUnion =
false;
13391 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13392 IsUnion = OrigRD->isUnion();
13393 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13394 << 0 << OrigTy << IsUnion << UseContext;
13396 OrigLoc = SourceLocation();
13398 InNonTrivialUnion =
true;
13401 if (InNonTrivialUnion)
13402 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13405 for (
const FieldDecl *FD : RD->fields())
13406 if (!shouldIgnoreForRecordTriviality(FD))
13407 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13410 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13415 SourceLocation OrigLoc;
13420struct DiagNonTrivalCUnionDestructedTypeVisitor
13423 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13425 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13426 SourceLocation OrigLoc,
13429 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13432 const FieldDecl *FD,
bool InNonTrivialUnion) {
13435 InNonTrivialUnion);
13436 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13439 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13440 bool InNonTrivialUnion) {
13441 if (InNonTrivialUnion)
13443 << 1 << 1 << QT << FD->
getName();
13446 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13447 if (InNonTrivialUnion)
13449 << 1 << 1 << QT << FD->
getName();
13452 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13454 if (RD->isUnion()) {
13455 if (OrigLoc.isValid()) {
13456 bool IsUnion =
false;
13457 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13458 IsUnion = OrigRD->isUnion();
13459 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13460 << 1 << OrigTy << IsUnion << UseContext;
13462 OrigLoc = SourceLocation();
13464 InNonTrivialUnion =
true;
13467 if (InNonTrivialUnion)
13468 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13471 for (
const FieldDecl *FD : RD->fields())
13472 if (!shouldIgnoreForRecordTriviality(FD))
13473 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13476 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13477 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13478 bool InNonTrivialUnion) {}
13483 SourceLocation OrigLoc;
13488struct DiagNonTrivalCUnionCopyVisitor
13490 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13492 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13494 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13497 const FieldDecl *FD,
bool InNonTrivialUnion) {
13500 InNonTrivialUnion);
13501 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13504 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13505 bool InNonTrivialUnion) {
13506 if (InNonTrivialUnion)
13508 << 1 << 2 << QT << FD->
getName();
13511 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13512 if (InNonTrivialUnion)
13514 << 1 << 2 << QT << FD->
getName();
13517 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13519 if (RD->isUnion()) {
13520 if (OrigLoc.isValid()) {
13521 bool IsUnion =
false;
13522 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13523 IsUnion = OrigRD->isUnion();
13524 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13525 << 2 << OrigTy << IsUnion << UseContext;
13527 OrigLoc = SourceLocation();
13529 InNonTrivialUnion =
true;
13532 if (InNonTrivialUnion)
13533 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13536 for (
const FieldDecl *FD : RD->fields())
13537 if (!shouldIgnoreForRecordTriviality(FD))
13538 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13541 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13542 if (InNonTrivialUnion)
13544 << 1 << 2 << QT << FD->
getName();
13548 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13549 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13550 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13551 bool InNonTrivialUnion) {}
13556 SourceLocation OrigLoc;
13565 unsigned NonTrivialKind) {
13569 "shouldn't be called if type doesn't have a non-trivial C union");
13573 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13574 .visit(QT,
nullptr,
false);
13577 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13578 .visit(QT,
nullptr,
false);
13580 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13581 .visit(QT,
nullptr,
false);
13605 bool TargetIsInline = Dcl->
isInline();
13606 bool TargetWasTemplated =
13623 TargetWasTemplated =
13633 if (!TargetIsInline || TargetWasTemplated)
13643 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13644 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13650 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13651 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13673 T =
T.getNonReferenceType();
13674 if (
T->isFunctionType())
13676 if (!
T.isConstant(Ctx))
13678 if (
T->isPointerType())
13696 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13697 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13709 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13710 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13722 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13723 if (!
Method->isInvalidDecl()) {
13725 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13726 <<
Method->getDeclName() <<
Init->getSourceRange();
13727 Method->setInvalidDecl();
13732 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13734 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13743 if (
Expr *E = Recovery.
get())
13749 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13750 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13757 if (
Init->containsErrors()) {
13770 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13790 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13791 BaseDeclType = Array->getElementType();
13793 diag::err_typecheck_decl_incomplete_type)) {
13800 diag::err_abstract_type_in_decl,
13820 if (Def != VDecl &&
13840 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13843 diag::note_previous_initializer)
13868 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
13869 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
13875 if (!
HLSL().handleInitialization(VDecl,
Init))
13887 if (!
Result.isUsable()) {
13895 bool InitializedFromParenListExpr =
false;
13896 bool IsParenListInit =
false;
13903 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
13905 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
13906 InitializedFromParenListExpr =
true;
13907 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
13908 Args = CXXDirectInit->getInitExprs();
13909 InitializedFromParenListExpr =
true;
13916 if (!
Result.isUsable()) {
13936 IsParenListInit = !InitSeq.
steps().empty() &&
13940 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
13942 Context.getAsIncompleteArrayType(VDeclType) &&
13943 Context.getAsIncompleteArrayType(
Init->getType())) {
13972 if (VDecl->
hasAttr<BlocksAttr>())
13985 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
13986 Init->getBeginLoc()))
13987 FSI->markSafeWeakUse(
Init);
14004 if (!
Result.isUsable()) {
14041 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14042 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14044 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14079 <<
Init->getSourceRange();
14095 diag::ext_in_class_initializer_float_type_cxx11)
14096 << DclT <<
Init->getSourceRange();
14098 diag::note_in_class_initializer_float_type_cxx11)
14101 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14102 << DclT <<
Init->getSourceRange();
14105 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14106 <<
Init->getSourceRange();
14113 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14114 << DclT <<
Init->getSourceRange()
14120 << DclT <<
Init->getSourceRange();
14133 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14141 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14154 if (!InitType.
isNull() &&
14172 if (InitializedFromParenListExpr) {
14173 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14196 VarDecl *VD = dyn_cast<VarDecl>(D);
14200 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14201 for (
auto *BD : DD->bindings())
14202 BD->setInvalidDecl();
14215 Context.getBaseElementType(Ty),
14216 diag::err_typecheck_decl_incomplete_type)) {
14223 diag::err_abstract_type_in_decl,
14238 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14243 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14244 Var->setInvalidDecl();
14258 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14259 !Var->isThisDeclarationADemotedDefinition()) {
14260 if (Var->isStaticDataMember()) {
14264 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14265 Diag(Var->getLocation(),
14266 diag::err_constexpr_static_mem_var_requires_init)
14268 Var->setInvalidDecl();
14272 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14273 Var->setInvalidDecl();
14280 if (!Var->isInvalidDecl() &&
14282 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14283 bool HasConstExprDefaultConstructor =
false;
14284 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14285 for (
auto *Ctor : RD->ctors()) {
14286 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14287 Ctor->getMethodQualifiers().getAddressSpace() ==
14289 HasConstExprDefaultConstructor =
true;
14293 if (!HasConstExprDefaultConstructor) {
14294 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14295 Var->setInvalidDecl();
14301 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14302 Diag(Var->getLocation(), diag::err_specialization_const);
14303 Var->setInvalidDecl();
14307 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14308 if (Var->getStorageClass() ==
SC_Extern) {
14309 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14311 Var->setInvalidDecl();
14315 diag::err_typecheck_decl_incomplete_type)) {
14316 Var->setInvalidDecl();
14319 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14320 if (!RD->hasTrivialDefaultConstructor()) {
14321 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14322 Var->setInvalidDecl();
14332 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14339 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14355 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14357 diag::err_typecheck_decl_incomplete_type))
14358 Var->setInvalidDecl();
14363 diag::err_abstract_type_in_decl,
14365 Var->setInvalidDecl();
14368 Diag(Var->getLocation(), diag::warn_private_extern);
14369 Diag(Var->getLocation(), diag::note_private_extern);
14372 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14373 !Var->isInvalidDecl())
14384 if (!Var->isInvalidDecl()) {
14388 Var->getLocation(), ArrayT->getElementType(),
14389 diag::err_array_incomplete_or_sizeless_type))
14390 Var->setInvalidDecl();
14392 if (Var->getStorageClass() ==
SC_Static) {
14402 if (Var->isFirstDecl())
14404 diag::ext_typecheck_decl_incomplete_type,
14410 if (!Var->isInvalidDecl())
14421 if (Var->isConstexpr())
14422 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14425 Diag(Var->getLocation(),
14426 diag::err_typecheck_incomplete_array_needs_initializer);
14427 Var->setInvalidDecl();
14434 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14435 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14444 if (Var->isInvalidDecl())
14447 if (!Var->hasAttr<AliasAttr>()) {
14450 diag::err_typecheck_decl_incomplete_type)) {
14451 Var->setInvalidDecl();
14460 diag::err_abstract_type_in_decl,
14462 Var->setInvalidDecl();
14469 unsigned DiagID = diag::warn_default_init_const_unsafe;
14470 if (Var->getStorageDuration() ==
SD_Static ||
14471 Var->getStorageDuration() ==
SD_Thread)
14472 DiagID = diag::warn_default_init_const;
14474 bool EmitCppCompat = !
Diags.isIgnored(
14475 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14476 Var->getLocation());
14478 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14492 if (
const auto *CXXRecord =
14493 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14497 if (!CXXRecord->isPOD())
14542 }
else if (
Init.isInvalid()) {
14560 VarDecl *VD = dyn_cast<VarDecl>(D);
14619 const char *PrevSpec;
14639 if (var->isInvalidDecl())
return;
14646 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14648 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14650 var->setInvalidDecl();
14658 var->hasLocalStorage()) {
14659 switch (var->getType().getObjCLifetime()) {
14672 if (var->hasLocalStorage() &&
14681 if (var->isThisDeclarationADefinition() &&
14682 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14683 var->isExternallyVisible() && var->hasLinkage() &&
14684 !var->isInline() && !var->getDescribedVarTemplate() &&
14688 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14689 var->getLocation())) {
14691 VarDecl *prev = var->getPreviousDecl();
14696 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14697 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14703 std::optional<bool> CacheHasConstInit;
14704 const Expr *CacheCulprit =
nullptr;
14705 auto checkConstInit = [&]()
mutable {
14706 const Expr *
Init = var->getInit();
14707 if (
Init->isInstantiationDependent())
14710 if (!CacheHasConstInit)
14711 CacheHasConstInit = var->getInit()->isConstantInitializer(
14712 Context, var->getType()->isReferenceType(), &CacheCulprit);
14713 return *CacheHasConstInit;
14717 if (var->getType().isDestructedType()) {
14721 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14723 Diag(var->getLocation(), diag::note_use_thread_local);
14725 if (!checkConstInit()) {
14733 Diag(var->getLocation(), diag::note_use_thread_local);
14739 if (!var->getType()->isStructureType() && var->hasInit() &&
14742 unsigned NumInits = ILE->getNumInits();
14744 for (
unsigned I = 0; I < NumInits; ++I) {
14745 const auto *
Init = ILE->getInit(I);
14748 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14752 unsigned NumConcat = SL->getNumConcatenated();
14756 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14757 bool OnlyOneMissingComma =
true;
14758 for (
unsigned J = I + 1; J < NumInits; ++J) {
14759 const auto *
Init = ILE->getInit(J);
14762 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14763 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14764 OnlyOneMissingComma =
false;
14769 if (OnlyOneMissingComma) {
14771 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14773 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
14775 Diag(SL->getStrTokenLoc(1),
14776 diag::warn_concatenated_literal_array_init)
14778 Diag(SL->getBeginLoc(),
14779 diag::note_concatenated_string_literal_silence);
14790 if (var->hasAttr<BlocksAttr>())
14794 bool GlobalStorage = var->hasGlobalStorage();
14795 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14797 bool HasConstInit =
true;
14800 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14805 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14806 (GlobalStorage || var->isConstexpr() ||
14807 var->mightBeUsableInConstantExpressions(
Context))) {
14819 HasConstInit = checkConstInit();
14823 if (HasConstInit) {
14824 if (var->isStaticDataMember() && !var->isInline() &&
14825 var->getLexicalDeclContext()->isRecord() &&
14826 type->isIntegralOrEnumerationType()) {
14831 diag::ext_in_class_initializer_non_constant)
14832 <<
Init->getSourceRange();
14835 (void)var->checkForConstantInitialization(Notes);
14837 }
else if (CacheCulprit) {
14838 Notes.emplace_back(CacheCulprit->
getExprLoc(),
14839 PDiag(diag::note_invalid_subexpr_in_const_expr));
14844 HasConstInit = var->checkForConstantInitialization(Notes);
14847 if (HasConstInit) {
14849 }
else if (var->isConstexpr()) {
14853 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
14854 diag::note_invalid_subexpr_in_const_expr) {
14855 DiagLoc = Notes[0].first;
14858 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
14859 << var <<
Init->getSourceRange();
14860 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
14861 Diag(Notes[I].first, Notes[I].second);
14862 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
14863 auto *
Attr = var->getAttr<ConstInitAttr>();
14864 Diag(var->getLocation(), diag::err_require_constant_init_failed)
14865 <<
Init->getSourceRange();
14868 for (
auto &it : Notes)
14869 Diag(it.first, it.second);
14870 }
else if (var->isStaticDataMember() && !var->isInline() &&
14871 var->getLexicalDeclContext()->isRecord()) {
14872 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
14873 <<
Init->getSourceRange();
14874 for (
auto &it : Notes)
14875 Diag(it.first, it.second);
14876 var->setInvalidDecl();
14877 }
else if (IsGlobal &&
14879 var->getLocation())) {
14888 if (!checkConstInit())
14889 Diag(var->getLocation(), diag::warn_global_constructor)
14890 <<
Init->getSourceRange();
14896 if (GlobalStorage && var->isThisDeclarationADefinition() &&
14901 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
14902 std::optional<QualType::NonConstantStorageReason> Reason;
14903 if (HasConstInit &&
14904 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
14910 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
14917 var->getType().isConstQualified()) {
14919 NonConstNonReferenceType) &&
14920 "This case should've already been handled elsewhere");
14921 Diag(var->getLocation(), diag::warn_section_msvc_compat)
14922 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
14928 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
14930 SectionAttr::Declspec_allocate));
14932 var->dropAttr<SectionAttr>();
14947 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
14948 Context.addModuleInitializer(ModuleScopes.back().Module, var);
14955 if (!
type->isDependentType())
14961 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
14962 Context.addModuleInitializer(ModuleScopes.back().Module, var);
14965 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
14976 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
14977 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
14987 NewAttr->setInherited(
true);
14989 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
14990 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
14991 NewAttr->setInherited(
true);
14996 if (!FD->
hasAttr<DLLExportAttr>())
14999 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15000 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15001 NewAttr->setInherited(
true);
15012 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15017 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15030 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15038 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15042 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15046 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15050 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15055 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15056 for (
auto *BD : DD->bindings()) {
15061 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15084 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15091 bool IsClassTemplateMember =
15093 Context->getDescribedClassTemplate();
15096 IsClassTemplateMember
15097 ? diag::warn_attribute_dllimport_static_field_definition
15098 : diag::err_attribute_dllimport_static_field_definition);
15099 Diag(IA->getLocation(), diag::note_attribute);
15100 if (!IsClassTemplateMember)
15128 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15148 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15152 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15154 if (!MagicValueExpr) {
15157 std::optional<llvm::APSInt> MagicValueInt;
15159 Diag(I->getRange().getBegin(),
15160 diag::err_type_tag_for_datatype_not_ice)
15164 if (MagicValueInt->getActiveBits() > 64) {
15165 Diag(I->getRange().getBegin(),
15166 diag::err_type_tag_for_datatype_too_large)
15170 uint64_t MagicValue = MagicValueInt->getZExtValue();
15173 I->getMatchingCType(),
15174 I->getLayoutCompatible(),
15175 I->getMustBeNull());
15180 auto *VD = dyn_cast<VarDecl>(DD);
15181 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15193 bool DiagnosedMultipleDecomps =
false;
15195 bool DiagnosedNonDeducedAuto =
false;
15197 for (
Decl *D : Group) {
15202 if (
auto *VD = dyn_cast<VarDecl>(D);
15203 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15204 VD->hasGlobalStorage())
15208 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15209 if (!FirstDeclaratorInGroup)
15210 FirstDeclaratorInGroup = DD;
15211 if (!FirstDecompDeclaratorInGroup)
15212 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15215 FirstNonDeducedAutoInGroup = DD;
15217 if (FirstDeclaratorInGroup != DD) {
15220 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15222 diag::err_decomp_decl_not_alone)
15224 << DD->getSourceRange();
15225 DiagnosedMultipleDecomps =
true;
15231 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15233 diag::err_auto_non_deduced_not_alone)
15234 << FirstNonDeducedAutoInGroup->
getType()
15237 << DD->getSourceRange();
15238 DiagnosedNonDeducedAuto =
true;
15243 Decls.push_back(D);
15249 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15251 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15263 if (Group.size() > 1) {
15265 VarDecl *DeducedDecl =
nullptr;
15266 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15267 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15271 if (!DT || DT->getDeducedType().isNull())
15274 Deduced = DT->getDeducedType();
15276 }
else if (!
Context.hasSameType(DT->getDeducedType(), Deduced)) {
15277 auto *AT = dyn_cast<AutoType>(DT);
15279 diag::err_auto_different_deductions)
15280 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
15281 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15305 if (Group.empty() || !Group[0])
15308 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15309 Group[0]->getLocation()) &&
15310 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15311 Group[0]->getLocation()))
15314 if (Group.size() >= 2) {
15322 Decl *MaybeTagDecl = Group[0];
15324 Group = Group.slice(1);
15377 const auto *VD = dyn_cast<ValueDecl>(D);
15391 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15393 Diag(TD->getLocation(), diag::note_declared_at);
15399 if (!ExplicitThisLoc.
isValid())
15402 "explicit parameter in non-cplusplus mode");
15404 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15416 LSI->ExplicitObjectParameter = P;
15439 ? diag::ext_register_storage_class
15440 : diag::warn_deprecated_register)
15446 diag::err_invalid_storage_class_in_func_decl)
15455 diag::err_invalid_storage_class_in_func_decl);
15467 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15488 PrevDecl =
nullptr;
15505 diag::err_hlsl_incomplete_resource_array_in_function_param);
15517 New->setInvalidDecl();
15536 Diag(
New->getLocation(), diag::err_module_private_local)
15540 if (
New->hasAttr<BlocksAttr>()) {
15541 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15557 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
15559 Param->setImplicit();
15572 !
Parameter->getIdentifier()->isPlaceholder()) {
15573 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15581 if (
LangOpts.NumLargeByValueCopy == 0)
15587 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15588 if (Size >
LangOpts.NumLargeByValueCopy)
15596 if (
T->isDependentType() || !
T.isPODType(
Context))
15598 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
15599 if (Size >
LangOpts.NumLargeByValueCopy)
15612 T->isObjCLifetimeType()) {
15619 if (
T->isArrayType()) {
15620 if (!
T.isConstQualified()) {
15624 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15626 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15631 lifetime =
T->getObjCARCImplicitLifetime();
15633 T =
Context.getLifetimeQualifiedType(
T, lifetime);
15637 Context.getAdjustedParameterType(
T),
15638 TSInfo, SC,
nullptr);
15643 if (
New->isParameterPack())
15645 CSI->LocalPacks.push_back(
New);
15647 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15648 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15655 if (
T->isObjCObjectType()) {
15659 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15661 T =
Context.getObjCObjectPointerType(
T);
15666 if (
T.getPointerAuth()) {
15667 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
15668 New->setInvalidDecl();
15682 !(
T->isFunctionPointerType() &&
15684 Diag(NameLoc, diag::err_arg_with_address_space);
15685 New->setInvalidDecl();
15689 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15690 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15691 New->setInvalidDecl();
15712 for (
int i = FTI.
NumParams; i != 0; ) {
15717 llvm::raw_svector_ostream(Code)
15728 const char* PrevSpec;
15731 DiagID,
Context.getPrintingPolicy());
15760 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15762 ParentScope, D, TemplateParameterLists, Bases);
15768 if (!Bases.empty())
15776 Consumer.HandleInlineFunctionDefinition(D);
15785 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15788 PossiblePrototype = Prev;
15812 if (II->isStr(
"main") || II->isStr(
"efi_main"))
15831 if (FD->
hasAttr<DeviceKernelAttr>())
15880 bool DefinitionVisible =
false;
15884 Definition->getNumTemplateParameterLists())) {
15887 if (!DefinitionVisible) {
15888 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
15902 Diag(
Definition->getLocation(), diag::note_previous_definition);
15911 LSI->
Lambda = LambdaClass;
15950 for (
const auto &
C : LambdaClass->
captures()) {
15951 if (
C.capturesVariable()) {
15955 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
15957 true,
C.getLocation(),
15958 C.isPackExpansion()
15960 I->getType(),
false);
15962 }
else if (
C.capturesThis()) {
15988 FD = FunTmpl->getTemplatedDecl();
15999 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16004 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16009 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16010 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16011 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16012 !
Attr->isDefaultVersion()) {
16021 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16023 Ctor->isDefaultConstructor() &&
16024 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16066 "There should be an active template instantiation on the stack "
16067 "when instantiating a generic lambda!");
16077 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16078 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16093 diag::err_func_def_incomplete_result) ||
16095 diag::err_abstract_type_in_decl,
16111 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16115 "parameters should not be in newly created FD yet");
16118 if (NonParmDecl->getDeclName())
16123 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16124 for (
auto *EI : ED->enumerators())
16132 Param->setOwningFunction(FD);
16135 if (Param->getIdentifier() && FnBodyScope) {
16164 assert(!FD->
hasAttr<DLLExportAttr>());
16165 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16190 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16191 FD = TD->getTemplatedDecl();
16192 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16204 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16205 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16206 if (!NRVOCandidate->isNRVOVariable()) {
16207 Diag(Returns[I]->getRetValue()->getExprLoc(),
16208 diag::warn_not_eliding_copy_on_return);
16228 Outer.Fun.hasTrailingReturnType()) {
16246 if (FD->isConstexpr())
16251 if (FD->getReturnType()->getContainedDeducedType())
16254 return Consumer.shouldSkipFunctionBody(D);
16261 FD->setHasSkippedBody();
16274 S.PopExpressionEvaluationContext();
16279 bool IsLambda =
false;
16283 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16285 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16286 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16300 return It->second = R;
16305 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16307 if (IsOrNestedInEscapingBlock(P.second))
16308 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16323 methodHasName(FD,
"get_return_object_on_allocation_failure");
16333 if (!FD->
hasAttr<CoroWrapperAttr>())
16338 bool RetainFunctionScopeInfo) {
16365 SYCLKernelEntryPointAttr *SKEPAttr =
16366 FD->
getAttr<SYCLKernelEntryPointAttr>();
16368 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16370 SKEPAttr->setInvalidAttr();
16372 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16374 SKEPAttr->setInvalidAttr();
16376 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16378 SKEPAttr->setInvalidAttr();
16380 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16382 SKEPAttr->setInvalidAttr();
16385 if (Body && !FD->
isTemplated() && !SKEPAttr->isInvalidAttr()) {
16395 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16397 Diag(SEAttr->getLocation(),
16398 diag::err_sycl_external_invalid_deleted_function)
16428 Expr *Dummy =
nullptr;
16439 if (LSI->HasImplicitReturnType) {
16446 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16450 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16451 Proto->getExtProtoInfo()));
16484 dyn_cast<CXXDestructorDecl>(FD))
16504 if (PossiblePrototype) {
16508 TypeLoc TL = TI->getTypeLoc();
16511 diag::note_declaration_not_a_prototype)
16514 FTL.getRParenLoc(),
"void")
16522 if (LocInfo.first.isInvalid())
16526 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16530 if (LocInfo.second > Buffer.size())
16533 const char *LexStart = Buffer.data() + LocInfo.second;
16534 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16536 return StartTok.consume_front(
"const") &&
16538 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16541 auto findBeginLoc = [&]() {
16557 diag::note_static_for_internal_linkage)
16568 if (!PossiblePrototype)
16614 if (PossiblePrototype)
16616 diag::warn_non_prototype_changes_behavior)
16623 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16624 if (!CmpndBody->body_empty())
16625 Diag(CmpndBody->body_front()->getBeginLoc(),
16626 diag::warn_dispatch_body_ignored);
16628 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16636 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16637 Context.setNonKeyFunction(MD);
16653 "Function parsing confused");
16654 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16666 << MD->getSelector().getAsString();
16671 bool isDesignated =
16672 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16673 assert(isDesignated && InitMethod);
16674 (void)isDesignated;
16677 auto IFace = MD->getClassInterface();
16680 auto SuperD = IFace->getSuperClass();
16690 diag::warn_objc_designated_init_missing_super_call);
16692 diag::note_objc_designated_init_marked_here);
16700 diag::warn_objc_secondary_init_missing_init_call);
16716 "This should only be set for ObjC methods, which should have been "
16717 "handled in the block above.");
16732 if (!
Destructor->getParent()->isDependentType())
16750 ActivePolicy = &WP;
16753 if (!IsInstantiation && FD &&
16759 if (FD && FD->
hasAttr<NakedAttr>()) {
16763 bool RegisterVariables =
false;
16764 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
16765 for (
const auto *
Decl : DS->decls()) {
16766 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
16767 RegisterVariables =
16768 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16769 if (!RegisterVariables)
16774 if (RegisterVariables)
16777 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16778 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16787 "Leftover temporaries in function");
16788 assert(!
Cleanup.exprNeedsCleanups() &&
16789 "Unaccounted cleanups in function");
16791 "Leftover expressions for odr-use checking");
16800 if (!IsInstantiation)
16803 if (!RetainFunctionScopeInfo)
16832 D = TD->getTemplatedDecl();
16844 assert(
LangOpts.implicitFunctionsAllowed() &&
16845 "Implicit function declarations aren't allowed in this language mode");
16852 Scope *BlockScope = S;
16860 Scope *ContextScope = BlockScope;
16864 ContextScope = ContextScope->
getParent();
16884 Diag(Loc, diag::ext_use_out_of_scope_declaration)
16887 return ExternCPrev;
16893 if (II.
getName().starts_with(
"__builtin_"))
16894 diag_id = diag::warn_builtin_unknown;
16897 diag_id = diag::ext_implicit_function_decl_c99;
16899 diag_id = diag::warn_implicit_function_decl;
16907 if (S && !ExternCPrev &&
16914 Diag(Loc, diag_id) << &II;
16930 return ExternCPrev;
16938 Context.getPrintingPolicy());
16940 assert(!
Error &&
"Error setting up implicit decl!");
16983 bool IsNothrow =
false;
16995 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17013 if (!FD->
hasAttr<AllocSizeAttr>()) {
17014 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17025 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17026 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17050 unsigned FormatIdx;
17052 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17053 if (!FD->
hasAttr<FormatAttr>()) {
17054 const char *fmt =
"printf";
17056 if (FormatIdx < NumParams &&
17062 HasVAListArg ? 0 : FormatIdx+2,
17066 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17068 if (!FD->
hasAttr<FormatAttr>())
17070 &
Context.Idents.get(
"scanf"),
17072 HasVAListArg ? 0 : FormatIdx+2,
17078 if (!FD->
hasAttr<CallbackAttr>() &&
17079 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17080 FD->
addAttr(CallbackAttr::CreateImplicit(
17086 bool NoExceptions =
17088 bool ConstWithoutErrnoAndExceptions =
17089 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17090 bool ConstWithoutExceptions =
17091 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17092 if (!FD->
hasAttr<ConstAttr>() &&
17093 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17094 (!ConstWithoutErrnoAndExceptions ||
17096 (!ConstWithoutExceptions || NoExceptions))
17102 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17103 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17105 switch (BuiltinID) {
17106 case Builtin::BI__builtin_fma:
17107 case Builtin::BI__builtin_fmaf:
17108 case Builtin::BI__builtin_fmal:
17109 case Builtin::BIfma:
17110 case Builtin::BIfmaf:
17111 case Builtin::BIfmal:
17119 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17120 !FD->
hasAttr<ReturnsTwiceAttr>())
17123 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17125 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17127 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17130 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17135 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17142 switch (BuiltinID) {
17143 case Builtin::BImemalign:
17144 case Builtin::BIaligned_alloc:
17145 if (!FD->
hasAttr<AllocAlignAttr>())
17154 switch (BuiltinID) {
17155 case Builtin::BIcalloc:
17156 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17159 case Builtin::BImemalign:
17160 case Builtin::BIaligned_alloc:
17161 case Builtin::BIrealloc:
17165 case Builtin::BImalloc:
17185 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17201 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17204 if (!FD->
hasAttr<FormatAttr>())
17206 &
Context.Idents.get(
"printf"), 2,
17207 Name->
isStr(
"vasprintf") ? 0 : 3,
17211 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17214 if (!FD->
hasAttr<FormatArgAttr>())
17222 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17223 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17226 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17227 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17280 if (
T->isDependentType())
17290 if (
T->isAtomicType())
17291 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17294 std::optional<unsigned> QualSelect;
17296 QualSelect = diag::CVQualList::Both;
17298 QualSelect = diag::CVQualList::Const;
17300 QualSelect = diag::CVQualList::Volatile;
17303 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17305 T =
T.getAtomicUnqualifiedType();
17310 if (BT->isInteger())
17313 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17314 <<
T <<
T->isBitIntType();
17318 QualType EnumUnderlyingTy,
bool IsFixed,
17320 if (IsScoped != Prev->
isScoped()) {
17321 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17327 if (IsFixed && Prev->
isFixed()) {
17330 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17333 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17339 }
else if (IsFixed != Prev->
isFixed()) {
17340 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17362 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17398 llvm_unreachable(
"invalid TTK");
17437 if (IsIgnoredLoc(NewTagLoc))
17440 auto IsIgnored = [&](
const TagDecl *Tag) {
17441 return IsIgnoredLoc(Tag->getLocation());
17458 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17466 if (isDefinition) {
17474 bool previousMismatch =
false;
17476 if (I->getTagKind() !=
NewTag) {
17481 if (!previousMismatch) {
17482 previousMismatch =
true;
17483 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17487 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17500 if (PrevDef && IsIgnored(PrevDef))
17504 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17511 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17541 if (!Namespace || Namespace->isAnonymousNamespace())
17544 Namespaces.push_back(II);
17547 if (Lookup == Namespace)
17554 llvm::raw_svector_ostream OS(Insertion);
17557 std::reverse(Namespaces.begin(), Namespaces.end());
17558 for (
auto *II : Namespaces)
17559 OS << II->getName() <<
"::";
17572 if (OldDC->
Equals(NewDC))
17591 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17592 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17597 "Nameless record must be a definition!");
17602 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17605 bool isMemberSpecialization =
false;
17606 bool IsInjectedClassName =
false;
17612 if (TemplateParameterLists.size() > 0 ||
17616 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17633 !isMemberSpecialization)
17634 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17637 if (TemplateParams) {
17639 Diag(KWLoc, diag::err_enum_template);
17643 if (TemplateParams->
size() > 0) {
17652 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17653 AS, ModulePrivateLoc,
17655 TemplateParameterLists.data(), SkipBody);
17661 isMemberSpecialization =
true;
17665 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17684 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17685 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17686 Diag(KWLoc, diag::note_enum_friend)
17687 << (ScopedEnum + ScopedEnumUsesClassTag);
17693 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17694 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17697 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17700 EnumUnderlying =
Context.IntTy.getTypePtr();
17701 }
else if (UnderlyingType.
get()) {
17709 EnumUnderlying = TI;
17713 EnumUnderlying =
Context.IntTy.getTypePtr();
17717 EnumUnderlying =
Context.IntTy.getTypePtr();
17727 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
17728 TI && TI->
getType()->isAtomicType())
17731 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
17737 EnumUnderlying =
Context.IntTy.getTypePtr();
17743 bool isStdBadAlloc =
false;
17744 bool isStdAlignValT =
false;
17753 auto createTagFromNewDecl = [&]() ->
TagDecl * {
17763 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17767 if (EnumUnderlying) {
17769 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
17775 ?
Context.getPromotedIntegerType(EnumTy)
17796 RD->addAttr(PackedAttr::CreateImplicit(
Context));
17812 goto CreateNewDecl;
17820 IsDependent =
true;
17849 if (
Previous.wasNotFoundInCurrentInstantiation() &&
17851 IsDependent =
true;
17856 Diag(NameLoc, diag::err_not_tag_in_scope)
17857 << Kind << Name << DC << SS.
getRange();
17860 goto CreateNewDecl;
17908 bool FriendSawTagOutsideEnclosingNamespace =
false;
17915 FriendSawTagOutsideEnclosingNamespace =
true;
17924 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
17926 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
17957 Previous.getFoundDecl()->isTemplateParameter()) {
17966 if (Name->
isStr(
"bad_alloc")) {
17968 isStdBadAlloc =
true;
17975 }
else if (Name->
isStr(
"align_val_t")) {
17976 isStdAlignValT =
true;
17988 IsTemplateParamOrArg)) {
17989 if (
Invalid)
goto CreateNewDecl;
18072 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18073 if (Tag->getDeclName() == Name &&
18074 Tag->getDeclContext()->getRedeclContext()
18075 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18082 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18084 RD->isInjectedClassName()) {
18091 IsInjectedClassName =
true;
18098 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18099 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18102 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18104 *
this, OldTag->getDeclContext(), SearchDC))) {
18105 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18106 Diag(Shadow->getTargetDecl()->getLocation(),
18107 diag::note_using_decl_target);
18108 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18112 goto CreateNewDecl;
18116 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18122 SS.
isNotEmpty() || isMemberSpecialization)) {
18128 bool SafeToContinue =
18131 if (SafeToContinue)
18132 Diag(KWLoc, diag::err_use_with_wrong_tag)
18135 PrevTagDecl->getKindName());
18137 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18138 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18140 if (SafeToContinue)
18141 Kind = PrevTagDecl->getTagKind();
18154 return PrevTagDecl;
18158 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18159 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18160 else if (
const Type *
T =
18161 dyn_cast_if_present<const Type *>(EnumUnderlying))
18168 ScopedEnum, EnumUnderlyingTy,
18169 IsFixed, PrevEnum))
18179 Diag(NameLoc, diag::ext_member_redeclared);
18180 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18187 if (!Attrs.
empty()) {
18191 (PrevTagDecl->getFriendObjectKind() ==
18204 return PrevTagDecl;
18209 return PrevTagDecl;
18218 if (Def->isBeingDefined()) {
18219 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18220 Diag(PrevTagDecl->getLocation(),
18221 diag::note_previous_definition);
18229 bool IsExplicitSpecializationAfterInstantiation =
false;
18230 if (isMemberSpecialization) {
18232 IsExplicitSpecializationAfterInstantiation =
18233 RD->getTemplateSpecializationKind() !=
18235 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18236 IsExplicitSpecializationAfterInstantiation =
18237 ED->getTemplateSpecializationKind() !=
18246 bool HiddenDefVisible =
false;
18260 SkipBody->
New = createTagFromNewDecl();
18269 if (!HiddenDefVisible && Hidden)
18274 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18279 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18282 Diag(NameLoc, diag::err_redefinition) << Name;
18284 NameLoc.
isValid() ? NameLoc : KWLoc);
18303 SearchDC = PrevTagDecl->getDeclContext();
18331 Diag(NameLoc, diag::err_tag_reference_non_tag)
18332 << PrevDecl << NTK << Kind;
18338 SS.
isNotEmpty() || isMemberSpecialization)) {
18344 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18350 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18353 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18354 << Name << Kind << TND->getUnderlyingType();
18362 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18394 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18395 ScopedEnumUsesClassTag, IsFixed);
18408 Diag(Loc, diag::ext_forward_ref_enum_def)
18412 unsigned DiagID = diag::ext_forward_ref_enum;
18414 DiagID = diag::ext_ms_forward_ref_enum;
18416 DiagID = diag::err_forward_ref_enum;
18421 if (EnumUnderlying) {
18423 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18429 ?
Context.getPromotedIntegerType(EnumTy)
18431 assert(ED->
isComplete() &&
"enum with type should be complete");
18441 cast_or_null<CXXRecordDecl>(PrevDecl));
18447 cast_or_null<RecordDecl>(PrevDecl));
18453 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18459 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18461 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18468 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18481 isMemberSpecialization))
18485 if (TemplateParameterLists.size() > 0) {
18486 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18505 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18511 if (ModulePrivateLoc.
isValid()) {
18512 if (isMemberSpecialization)
18513 Diag(
New->getLocation(), diag::err_module_private_specialization)
18520 New->setModulePrivate();
18540 Diag(Loc, diag::err_type_defined_in_param_type)
18546 }
else if (!PrevDecl) {
18550 Diag(Loc, diag::warn_decl_in_param_list)
18556 New->setInvalidDecl();
18578 New->startDefinition();
18580 New->setCompleteDefinition();
18581 New->demoteThisDefinitionToDeclaration();
18609 if (!
New->isInvalidDecl() &&
18610 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18617 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18630 if (isMemberSpecialization && !
New->isInvalidDecl())
18637 if (
New->isBeingDefined())
18638 if (
auto RD = dyn_cast<RecordDecl>(
New))
18639 RD->completeDefinition();
18641 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18682 if (!
Record->getIdentifier())
18690 IsFinalSpelledSealed
18691 ? FinalAttr::Keyword_sealed
18692 : FinalAttr::Keyword_final));
18695 if (TriviallyRelocatable.
isValid())
18697 TriviallyRelocatableAttr::Create(
Context, TriviallyRelocatable));
18700 Record->addAttr(ReplaceableAttr::Create(
Context, Replaceable));
18717 "Broken injected-class-name");
18724 Tag->setBraceRange(BraceRange);
18727 if (Tag->isBeingDefined()) {
18728 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18729 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18730 RD->completeDefinition();
18733 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18735 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
18736 auto *Def = RD->getDefinition();
18737 assert(Def &&
"The record is expected to have a completed definition");
18738 unsigned NumInitMethods = 0;
18739 for (
auto *
Method : Def->methods()) {
18740 if (!
Method->getIdentifier())
18742 if (
Method->getName() ==
"__init")
18745 if (NumInitMethods > 1 || !Def->hasInitMethod())
18746 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
18764 Tag->setTopLevelDeclInObjCContainer();
18767 if (!Tag->isInvalidDecl())
18768 Consumer.HandleTagDeclDefinition(Tag);
18772 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
18778 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18782 if (llvm::any_of(RD->
fields(),
18783 [](
const FieldDecl *FD) { return FD->isBitField(); }))
18784 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
18791 Tag->setInvalidDecl();
18794 if (Tag->isBeingDefined()) {
18795 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18796 RD->completeDefinition();
18809 QualType FieldTy,
bool IsMsStruct,
18820 diag::err_field_incomplete_or_sizeless))
18823 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
18825 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
18835 llvm::APSInt
Value;
18840 BitWidth = ICE.
get();
18843 if (
Value == 0 && FieldName)
18844 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
18847 if (
Value.isSigned() &&
Value.isNegative()) {
18849 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
18851 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
18858 return Diag(FieldLoc, diag::err_bitfield_too_wide)
18863 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
18864 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
18865 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
18869 bool CStdConstraintViolation =
18871 bool MSBitfieldViolation =
18872 Value.ugt(TypeStorageSize) &&
18873 (IsMsStruct ||
Context.getTargetInfo().getCXXABI().isMicrosoft());
18874 if (CStdConstraintViolation || MSBitfieldViolation) {
18875 unsigned DiagWidth =
18876 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
18877 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
18879 << !CStdConstraintViolation << DiagWidth;
18885 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
18886 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
18930 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
18941 diag::err_invalid_thread)
18949 switch (
Previous.getResultKind()) {
18956 PrevDecl =
Previous.getRepresentativeDecl();
18970 PrevDecl =
nullptr;
18974 PrevDecl =
nullptr;
18981 TSSL, AS, PrevDecl, &D);
18984 Record->setInvalidDecl();
19003 bool Mutable,
Expr *BitWidth,
19009 bool InvalidDecl =
false;
19014 if (
T.isNull() ||
T->containsErrors()) {
19015 InvalidDecl =
true;
19021 bool isIncomplete =
19025 diag::err_field_incomplete_or_sizeless);
19026 if (isIncomplete) {
19028 Record->setInvalidDecl();
19029 InvalidDecl =
true;
19034 Record->setInvalidDecl();
19035 InvalidDecl =
true;
19041 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19042 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19043 Diag(Loc, diag::err_field_with_address_space);
19044 Record->setInvalidDecl();
19045 InvalidDecl =
true;
19051 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19052 T->isBlockPointerType()) {
19053 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19054 Record->setInvalidDecl();
19055 InvalidDecl =
true;
19060 "__cl_clang_bitfields",
LangOpts)) {
19061 Diag(Loc, diag::err_opencl_bitfields);
19062 InvalidDecl =
true;
19068 T.hasQualifiers()) {
19069 InvalidDecl =
true;
19070 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19075 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19077 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19078 InvalidDecl =
true;
19083 diag::err_abstract_type_in_decl,
19085 InvalidDecl =
true;
19088 BitWidth =
nullptr;
19094 InvalidDecl =
true;
19095 BitWidth =
nullptr;
19100 if (!InvalidDecl && Mutable) {
19101 unsigned DiagID = 0;
19102 if (
T->isReferenceType())
19103 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19104 : diag::err_mutable_reference;
19105 else if (
T.isConstQualified())
19106 DiagID = diag::err_mutable_const;
19112 Diag(ErrLoc, DiagID);
19113 if (DiagID != diag::ext_mutable_reference) {
19115 InvalidDecl =
true;
19127 BitWidth, Mutable, InitStyle);
19136 Diag(Loc, diag::err_duplicate_member) << II;
19142 if (
Record->isUnion()) {
19144 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19159 const bool HaveMSExt =
19164 HaveMSExt ? diag::ext_union_member_of_reference_type
19165 : diag::err_union_member_of_reference_type)
19185 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19188 if (
T.isObjCGCWeak())
19189 Diag(Loc, diag::warn_attribute_weak_on_field);
19192 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19209 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19220 if (RDecl->hasNonTrivialCopyConstructor())
19222 else if (!RDecl->hasTrivialDefaultConstructor())
19224 else if (RDecl->hasNonTrivialCopyAssignment())
19226 else if (RDecl->hasNonTrivialDestructor())
19231 RDecl->hasObjectMember()) {
19239 if (!FD->
hasAttr<UnavailableAttr>())
19240 FD->
addAttr(UnavailableAttr::CreateImplicit(
19241 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19248 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19249 : diag::err_illegal_union_or_anon_struct_member)
19261 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19264 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19272 if (!CD->IsClassExtension())
19289 AllIvarDecls.push_back(Ivar);
19301 if (!
Record->hasUserDeclaredDestructor()) {
19309 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19310 if (DD->isInvalidDecl())
19314 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19328 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19332 Msg = diag::err_ambiguous_destructor;
19337 Msg = diag::err_no_viable_destructor;
19348 Record->setInvalidDecl();
19355 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19399 if (!Method->getTrailingRequiresClause())
19400 SatisfactionStatus.push_back(
true);
19404 SatisfactionStatus.push_back(
false);
19406 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19410 for (
size_t i = 0; i < Methods.size(); i++) {
19411 if (!SatisfactionStatus[i])
19419 bool AnotherMethodIsMoreConstrained =
false;
19420 for (
size_t j = 0; j < Methods.size(); j++) {
19421 if (i == j || !SatisfactionStatus[j])
19435 AnotherMethodIsMoreConstrained =
true;
19439 AnotherMethodIsMoreConstrained)) {
19442 AnotherMethodIsMoreConstrained =
true;
19444 if (AnotherMethodIsMoreConstrained)
19449 if (!AnotherMethodIsMoreConstrained) {
19450 Method->setIneligibleOrNotSelected(
false);
19451 Record->addedEligibleSpecialMemberFunction(Method,
19452 1 << llvm::to_underlying(CSM));
19466 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19468 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19470 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19474 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19475 if (CD->isInvalidDecl())
19477 if (CD->isDefaultConstructor())
19478 DefaultConstructors.push_back(MD);
19479 else if (CD->isCopyConstructor())
19480 CopyConstructors.push_back(MD);
19481 else if (CD->isMoveConstructor())
19482 MoveConstructors.push_back(MD);
19484 CopyAssignmentOperators.push_back(MD);
19486 MoveAssignmentOperators.push_back(MD);
19504 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19505 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19518 if (
const auto *TD = dyn_cast<TagDecl>(D))
19519 return !TD->isCompleteDefinition();
19534 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19541 assert(EnclosingDecl &&
"missing record or interface decl");
19550 case Decl::ObjCCategory:
19553 case Decl::ObjCImplementation:
19561 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19565 unsigned NumNamedMembers = 0;
19567 for (
const auto *I :
Record->decls()) {
19568 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19569 if (IFD->getDeclName())
19576 const FieldDecl *PreviousField =
nullptr;
19586 RecFields.push_back(FD);
19606 bool IsLastField = (i + 1 == Fields.end());
19621 unsigned DiagID = 0;
19622 if (!
Record->isUnion() && !IsLastField) {
19625 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19629 }
else if (
Record->isUnion())
19631 ? diag::ext_flexible_array_union_ms
19632 : diag::ext_flexible_array_union_gnu;
19633 else if (NumNamedMembers < 1)
19635 ? diag::ext_flexible_array_empty_aggregate_ms
19636 : diag::ext_flexible_array_empty_aggregate_gnu;
19646 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19660 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19667 Record->setHasFlexibleArrayMember(
true);
19676 diag::err_incomplete_type)
19679 diag::err_field_incomplete_or_sizeless))) {
19685 if (
Record && RD->hasFlexibleArrayMember()) {
19688 Record->setHasFlexibleArrayMember(
true);
19689 if (!
Record->isUnion()) {
19706 diag::err_abstract_type_in_decl,
19711 if (
Record && RD->hasObjectMember())
19712 Record->setHasObjectMember(
true);
19713 if (
Record && RD->hasVolatileMember())
19714 Record->setHasVolatileMember(
true);
19733 FD->
addAttr(UnavailableAttr::CreateImplicit(
19734 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19738 !
Record->hasObjectMember()) {
19741 Record->setHasObjectMember(
true);
19744 if (
const auto *RD = BaseType->getAsRecordDecl();
19745 RD && RD->hasObjectMember())
19746 Record->setHasObjectMember(
true);
19747 else if (BaseType->isObjCObjectPointerType() ||
19748 BaseType.isObjCGCStrong())
19749 Record->setHasObjectMember(
true);
19754 !shouldIgnoreForRecordTriviality(FD)) {
19757 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
19760 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
19764 Record->setNonTrivialToPrimitiveCopy(
true);
19766 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
19768 if (FD->
hasAttr<ExplicitInitAttr>())
19769 Record->setHasUninitializedExplicitInitFields(
true);
19771 Record->setNonTrivialToPrimitiveDestroy(
true);
19772 Record->setParamDestroyedInCallee(
true);
19774 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
19778 if (RD->getArgPassingRestrictions() ==
19780 Record->setArgPassingRestrictions(
19783 Record->setArgPassingRestrictions(
19787 Record->setArgPassingRestrictions(
19789 Record->setNonTrivialToPrimitiveCopy(
true);
19794 Record->setHasVolatileMember(
true);
19795 bool ReportMSBitfieldStoragePacking =
19796 Record && PreviousField &&
19797 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
19799 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
19803 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
19804 IsNonDependentBitField(PreviousField)) {
19808 if (FDStorageSize != PreviousFieldStorageSize) {
19810 diag::warn_ms_bitfield_mismatched_storage_packing)
19814 diag::note_ms_bitfield_mismatched_storage_size_previous)
19815 << PreviousField << PreviousField->
getType();
19825 bool Completed =
false;
19830 Record->setInvalidDecl();
19834 if (!CXXRecord->isInvalidDecl()) {
19837 I = CXXRecord->conversion_begin(),
19838 E = CXXRecord->conversion_end(); I != E; ++I)
19839 I.setAccess((*I)->getAccess());
19845 if (!CXXRecord->isDependentType()) {
19846 if (!CXXRecord->isInvalidDecl()) {
19850 if (CXXRecord->getNumVBases()) {
19852 CXXRecord->getFinalOverriders(FinalOverriders);
19854 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
19855 MEnd = FinalOverriders.end();
19858 SOEnd = M->second.end();
19859 SO != SOEnd; ++SO) {
19860 assert(SO->second.size() > 0 &&
19861 "Virtual function without overriding functions?");
19862 if (SO->second.size() == 1)
19869 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
19871 Diag(M->first->getLocation(),
19872 diag::note_overridden_virtual_function);
19874 OM = SO->second.begin(),
19875 OMEnd = SO->second.end();
19877 Diag(OM->Method->getLocation(), diag::note_final_overrider)
19878 << (
const NamedDecl *)M->first << OM->Method->getParent();
19880 Record->setInvalidDecl();
19883 CXXRecord->completeDefinition(&FinalOverriders);
19893 Record->completeDefinition();
19902 (
Record->hasAttr<RandomizeLayoutAttr>() ||
19903 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
19904 EntirelyFunctionPointers(
Record)))) {
19908 Record->reorderDecls(NewDeclOrdering);
19913 auto *Dtor = CXXRecord->getDestructor();
19914 if (Dtor && Dtor->isImplicit() &&
19916 CXXRecord->setImplicitDestructorIsDeleted();
19921 if (
Record->hasAttrs()) {
19924 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
19926 IA->getRange(), IA->getBestCase(),
19927 IA->getInheritanceModel());
19933 bool CheckForZeroSize;
19935 CheckForZeroSize =
true;
19940 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
19942 CXXRecord->isCLike();
19944 if (CheckForZeroSize) {
19945 bool ZeroSize =
true;
19946 bool IsEmpty =
true;
19947 unsigned NonBitFields = 0;
19949 E =
Record->field_end();
19950 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
19952 if (I->isUnnamedBitField()) {
19953 if (!I->isZeroLengthBitField())
19957 QualType FieldType = I->getType();
19959 !
Context.getTypeSizeInChars(FieldType).isZero())
19969 diag::warn_zero_size_struct_union_in_extern_c :
19970 diag::warn_zero_size_struct_union_compat)
19971 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
19978 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
19979 : diag::ext_no_named_members_in_struct_union)
19987 ID->setEndOfDefinitionLoc(RBrac);
19989 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
19991 ID->addDecl(ClsFields[i]);
19995 if (ID->getSuperClass())
19998 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
19999 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20000 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20006 IMPDecl->setIvarLBraceLoc(LBrac);
20007 IMPDecl->setIvarRBraceLoc(RBrac);
20009 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20017 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20021 Diag(ClsFields[i]->getLocation(),
20022 diag::err_duplicate_ivar_declaration);
20023 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20029 Diag(ClsFields[i]->getLocation(),
20030 diag::err_duplicate_ivar_declaration);
20031 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20037 CDecl->addDecl(ClsFields[i]);
20039 CDecl->setIvarLBraceLoc(LBrac);
20040 CDecl->setIvarRBraceLoc(RBrac);
20051 assert((
T->isIntegralType(Context) ||
20052 T->isEnumeralType()) &&
"Integral type required!");
20053 const unsigned NumTypes = 4;
20054 QualType SignedIntegralTypes[NumTypes] = {
20055 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20057 QualType UnsignedIntegralTypes[NumTypes] = {
20058 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20059 Context.UnsignedLongLongTy
20062 unsigned BitWidth = Context.getTypeSize(
T);
20063 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20064 : UnsignedIntegralTypes;
20065 for (
unsigned I = 0; I != NumTypes; ++I)
20066 if (Context.getTypeSize(Types[I]) > BitWidth)
20077 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20078 llvm::APSInt EnumVal(IntWidth);
20098 EltTy =
Enum->getIntegerType();
20104 Val = Converted.
get();
20111 if (
Enum->isComplete()) {
20112 EltTy =
Enum->getIntegerType();
20118 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20121 .isWindowsMSVCEnvironment()) {
20122 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20124 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20147 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20149 ? diag::warn_c17_compat_enum_value_not_int
20150 : diag::ext_c23_enum_value_not_int)
20152 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20164 if (
Enum->isDependentType())
20166 else if (!LastEnumConst) {
20175 if (
Enum->isFixed()) {
20176 EltTy =
Enum->getIntegerType();
20185 EltTy = LastEnumConst->
getType();
20188 if (EnumVal < LastEnumConst->getInitVal()) {
20200 if (
T.isNull() ||
Enum->isFixed()) {
20204 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20206 if (
Enum->isFixed())
20208 Diag(IdLoc, diag::err_enumerator_wrapped)
20212 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20223 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20235 ? diag::warn_c17_compat_enum_value_not_int
20236 : diag::ext_c23_enum_value_not_int)
20237 << 1 <<
toString(EnumVal, 10) << 1;
20239 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20242 : diag::ext_c23_enum_value_not_int)
20243 << 1 <<
toString(EnumVal, 10) << 1;
20251 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20270 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20278 Skip.Previous = Hidden;
20292 cast_or_null<EnumConstantDecl>(lastEnumConst);
20309 PrevDecl =
nullptr;
20336 "Received TagDecl when not in C++!");
20339 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20341 Diag(IdLoc, diag::err_redefinition) << Id;
20374 if (!BO->isAdditiveOp())
20382 InitExpr = BO->getLHS();
20386 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20406 if (!
Enum->getIdentifier())
20410 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20419 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20422 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20426 llvm::APSInt Val = D->getInitVal();
20427 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20430 DuplicatesVector DupVector;
20431 ValueToVectorMap EnumMap;
20435 for (
auto *Element : Elements) {
20449 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20452 if (EnumMap.size() == 0)
20456 for (
auto *Element : Elements) {
20462 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20463 if (Iter == EnumMap.end())
20466 DeclOrVector& Entry = Iter->second;
20473 auto Vec = std::make_unique<ECDVector>();
20475 Vec->push_back(ECD);
20482 DupVector.emplace_back(std::move(Vec));
20488 if (*Vec->begin() == ECD)
20491 Vec->push_back(ECD);
20495 for (
const auto &Vec : DupVector) {
20496 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20499 auto *FirstECD = Vec->front();
20500 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20501 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20502 << FirstECD->getSourceRange();
20506 for (
auto *ECD : llvm::drop_begin(*Vec))
20507 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20508 << ECD <<
toString(ECD->getInitVal(), 10)
20509 << ECD->getSourceRange();
20514 bool AllowMask)
const {
20515 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20519 llvm::APInt &FlagBits = R.first->second;
20523 const auto &EVal = E->getInitVal();
20525 if (EVal.isPowerOf2())
20526 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20538 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20539 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20551 if (
Enum->isDependentType()) {
20552 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20554 cast_or_null<EnumConstantDecl>(Elements[i]);
20555 if (!ECD)
continue;
20566 unsigned NumNegativeBits = 0;
20567 unsigned NumPositiveBits = 0;
20568 bool MembersRepresentableByInt =
20569 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20573 unsigned BestWidth;
20594 if (
Enum->isComplete()) {
20595 BestType =
Enum->getIntegerType();
20596 if (
Context.isPromotableIntegerType(BestType))
20597 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20599 BestPromotionType = BestType;
20601 BestWidth =
Context.getIntWidth(BestType);
20603 bool EnumTooLarge =
Context.computeBestEnumTypes(
20604 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20605 BestWidth =
Context.getIntWidth(BestType);
20607 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20612 for (
auto *D : Elements) {
20613 auto *ECD = cast_or_null<EnumConstantDecl>(D);
20614 if (!ECD)
continue;
20623 llvm::APSInt InitVal = ECD->getInitVal();
20631 MembersRepresentableByInt) {
20639 NewWidth =
Context.getTargetInfo().getIntWidth();
20641 }
else if (ECD->getType() == BestType) {
20647 ECD->setType(EnumType);
20651 NewWidth = BestWidth;
20656 InitVal = InitVal.extOrTrunc(NewWidth);
20657 InitVal.setIsSigned(NewSign);
20658 ECD->setInitVal(
Context, InitVal);
20661 if (ECD->getInitExpr() &&
20662 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20664 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20670 ECD->setType(EnumType);
20672 ECD->setType(NewTy);
20675 Enum->completeDefinition(BestType, BestPromotionType,
20676 NumPositiveBits, NumNegativeBits);
20680 if (
Enum->isClosedFlag()) {
20681 for (
Decl *D : Elements) {
20683 if (!ECD)
continue;
20686 if (InitVal != 0 && !InitVal.isPowerOf2() &&
20694 if (
Enum->hasAttrs())
20733 AsmLabelAttr *
Attr =
20734 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
20744 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
20757 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
20773 if (!PrevDecl->
hasAttr<AliasAttr>())
20774 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
20783 assert(FD &&
"Expected non-null FunctionDecl");
20795 auto IsEmittedForExternalSymbol = [
this, FD]() {
20807 if (
LangOpts.OpenMPIsTargetDevice) {
20810 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20817 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
20821 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
20822 if (IsEmittedForExternalSymbol())
20828 }
else if (
LangOpts.OpenMP > 45) {
20832 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20835 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
20854 if (IsEmittedForExternalSymbol())
20859 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
20861 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
20864 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.
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 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 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 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 SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const VarDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void 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
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
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.
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.
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".
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 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 takeAttributes(ParsedAttributes &attrs)
takeAttributes - Takes attributes from the given parsed-attributes set and add them to this declarato...
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.
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 isVariadic() const
Whether this function is variadic.
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...
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
FPExceptionModeKind getDefaultExceptionMode() const
bool requiresStrictPrototypes() const
Returns true if functions without prototypes or functions with an identifier list (aka K&R C function...
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....
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)
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId, bool DeferHint=false)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
void checkAllowedInitializer(VarDecl *VD)
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void CheckEntryPoint(FunctionDecl *FD)
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)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Preprocessor & getPreprocessor() const
void deduceOpenCLAddressSpace(ValueDecl *decl)
PragmaStack< FPOptionsOverride > FpPragmaStack
PragmaStack< StringLiteral * > CodeSegStack
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
DLLImportAttr * mergeDLLImportAttr(Decl *D, const AttributeCommonInfo &CI)
static NamedDecl * getAsTemplateNameDecl(NamedDecl *D, bool AllowFunctionTemplates=true, bool AllowDependent=true)
Try to interpret the lookup result D as a template-name.
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
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)
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
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.
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)
@ 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)
SourceLocation CurInitSegLoc
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
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.
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.
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
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 DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
TopLevelStmtDecl * ActOnStartTopLevelStmtDecl(Scope *S)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
bool CheckMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
Perform semantic analysis for the given non-template member specialization.
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
OptimizeNoneAttr * mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI)
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
bool IsOverride(FunctionDecl *MD, FunctionDecl *BaseMD, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
DeclGroupPtrTy FinalizeDeclaratorGroup(Scope *S, const DeclSpec &DS, ArrayRef< Decl * > Group)
void setFunctionHasBranchProtectedScope()
RedeclarationKind forRedeclarationInCurContext() const
void MergeVarDecl(VarDecl *New, LookupResult &Previous)
MergeVarDecl - We just parsed a variable 'New' which has the same name and scope as a previous declar...
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
ParsedType ActOnMSVCUnknownTypeName(const IdentifierInfo &II, SourceLocation NameLoc, bool IsTemplateTypeArg)
Attempt to behave like MSVC in situations where lookup of an unqualified type name has failed in a de...
EnforceTCBLeafAttr * mergeEnforceTCBLeafAttr(Decl *D, const EnforceTCBLeafAttr &AL)
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)
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....
FormatAttr * mergeFormatAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, int FirstArg)
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...
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...
FormatMatchesAttr * mergeFormatMatchesAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Format, int FormatIdx, StringLiteral *FormatStr)
AvailabilityAttr * mergeAvailabilityAttr(NamedDecl *D, const AttributeCommonInfo &CI, IdentifierInfo *Platform, bool Implicit, VersionTuple Introduced, VersionTuple Deprecated, VersionTuple Obsoleted, bool IsUnavailable, StringRef Message, bool IsStrict, StringRef Replacement, AvailabilityMergeKind AMK, int Priority, IdentifierInfo *IIEnvironment)
void mergeObjCMethodDecls(ObjCMethodDecl *New, ObjCMethodDecl *Old)
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
void ActOnCXXForRangeDecl(Decl *D)
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
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...
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.
void ActOnStartCXXMemberDeclarations(Scope *S, Decl *TagDecl, SourceLocation FinalLoc, bool IsFinalSpelledSealed, bool IsAbstract, SourceLocation TriviallyRelocatable, SourceLocation Replaceable, SourceLocation LBraceLoc)
ActOnStartCXXMemberDeclarations - Invoked when we have parsed a C++ record definition's base-specifie...
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.
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.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
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.
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.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
bool isDiscardableGVALinkage(GVALinkage L)
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Complete
The translation unit is a complete translation unit.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
const FunctionProtoType * T
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.
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.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
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
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.