61#include "llvm/ADT/STLForwardCompat.h"
62#include "llvm/ADT/ScopeExit.h"
63#include "llvm/ADT/SmallPtrSet.h"
64#include "llvm/ADT/SmallString.h"
65#include "llvm/ADT/StringExtras.h"
66#include "llvm/ADT/StringRef.h"
67#include "llvm/Support/SaveAndRestore.h"
68#include "llvm/TargetParser/Triple.h"
72#include <unordered_map>
79 Decl *Group[2] = { OwnedType, Ptr };
90 TypeNameValidatorCCC(
bool AllowInvalid,
bool WantClass =
false,
91 bool AllowTemplates =
false,
92 bool AllowNonTemplates =
true)
93 : AllowInvalidDecl(AllowInvalid), WantClassName(WantClass),
94 AllowTemplates(AllowTemplates), AllowNonTemplates(AllowNonTemplates) {
95 WantExpressionKeywords =
false;
96 WantCXXNamedCasts =
false;
97 WantRemainingKeywords =
false;
100 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
102 if (!AllowInvalidDecl && ND->isInvalidDecl())
106 return AllowTemplates;
112 if (AllowNonTemplates)
117 if (AllowTemplates) {
118 auto *RD = dyn_cast<CXXRecordDecl>(ND);
119 if (!RD || !RD->isInjectedClassName())
122 return RD->getDescribedClassTemplate() ||
129 return !WantClassName && candidate.
isKeyword();
132 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
133 return std::make_unique<TypeNameValidatorCCC>(*
this);
137 bool AllowInvalidDecl;
140 bool AllowNonTemplates;
147 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
148 auto *FoundRD = dyn_cast<CXXRecordDecl>(TD);
150 FoundRD->isInjectedClassName() &&
154 ? diag::ext_out_of_line_qualified_id_type_names_constructor
155 : diag::err_out_of_line_qualified_id_type_names_constructor)
165enum class UnqualifiedTypeNameLookupResult {
176static UnqualifiedTypeNameLookupResult
181 return UnqualifiedTypeNameLookupResult::NotFound;
183 UnqualifiedTypeNameLookupResult FoundTypeDecl =
184 UnqualifiedTypeNameLookupResult::NotFound;
188 }
else if (
auto *TST = dyn_cast<TemplateSpecializationType>(
189 Base.getType().getCanonicalType())) {
192 if (!TST->isDependentType())
194 auto *TD = TST->getTemplateName().getAsTemplateDecl();
197 if (
auto *BasePrimaryTemplate =
198 dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl())) {
200 BaseRD = BasePrimaryTemplate;
201 else if (
auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
203 CTD->findPartialSpecialization(
Base.getType()))
212 return UnqualifiedTypeNameLookupResult::FoundNonType;
213 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
215 if (FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound) {
217 case UnqualifiedTypeNameLookupResult::FoundNonType:
218 return UnqualifiedTypeNameLookupResult::FoundNonType;
219 case UnqualifiedTypeNameLookupResult::FoundType:
220 FoundTypeDecl = UnqualifiedTypeNameLookupResult::FoundType;
222 case UnqualifiedTypeNameLookupResult::NotFound:
229 return FoundTypeDecl;
237 UnqualifiedTypeNameLookupResult FoundTypeDecl =
238 UnqualifiedTypeNameLookupResult::NotFound;
240 DC && FoundTypeDecl == UnqualifiedTypeNameLookupResult::NotFound;
244 RD = dyn_cast<CXXRecordDecl>(DC);
248 if (FoundTypeDecl != UnqualifiedTypeNameLookupResult::FoundType)
254 S.
Diag(NameLoc, diag::ext_found_in_dependent_base) << &II;
274 bool HasTrailingDot,
ParsedType ObjectTypePtr,
275 bool IsCtorOrDtorName,
276 bool WantNontrivialTypeSourceInfo,
277 bool IsClassTemplateDeductionContext,
280 bool IsImplicitTypename = !isClassName && !IsCtorOrDtorName;
282 bool AllowDeducedTemplate = IsClassTemplateDeductionContext &&
308 if (IsImplicitTypename) {
313 auto DB =
DiagCompat(QualifiedLoc, diag_compat::implicit_typename)
322 if (WantNontrivialTypeSourceInfo)
358 if (ObjectTypePtr &&
Result.empty()) {
382 switch (
Result.getResultKind()) {
385 TypeNameValidatorCCC CCC(
true, isClassName,
386 AllowDeducedTemplate);
392 bool MemberOfUnknownSpecialization;
401 if (Correction && (NNS || NewII != &II) &&
407 Template, MemberOfUnknownSpecialization))) {
409 isClassName, HasTrailingDot, ObjectTypePtr,
411 WantNontrivialTypeSourceInfo,
412 IsClassTemplateDeductionContext);
415 PDiag(diag::err_unknown_type_or_class_name_suggest)
416 <<
Result.getLookupName() << isClassName);
419 *CorrectedII = NewII;
424 Result.suppressDiagnostics();
440 Result.suppressDiagnostics();
450 Result.suppressDiagnostics();
456 Res != ResEnd; ++Res) {
465 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*Res);
477 Result.suppressDiagnostics();
488 IIDecl =
Result.getFoundDecl();
489 FoundUsingShadow = dyn_cast<UsingShadowDecl>(*
Result.begin());
493 assert(IIDecl &&
"Didn't find decl");
496 if (
TypeDecl *TD = dyn_cast<TypeDecl>(IIDecl)) {
502 if (FoundUsingShadow) {
506 if (!WantNontrivialTypeSourceInfo)
512 }
else if (
auto *Tag = dyn_cast<TagDecl>(TD)) {
516 if (!WantNontrivialTypeSourceInfo)
522 TL.setNameLoc(NameLoc);
523 }
else if (
auto *TN = dyn_cast<TypedefNameDecl>(TD);
527 if (!WantNontrivialTypeSourceInfo)
533 }
else if (
auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TD)) {
537 if (!WantNontrivialTypeSourceInfo)
545 if (!WantNontrivialTypeSourceInfo)
556 if (!HasTrailingDot) {
559 if (!WantNontrivialTypeSourceInfo)
564 TL.setNameEndLoc(NameLoc);
567 }
else if (
auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
571 }
else if (AllowDeducedTemplate) {
573 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
582 TL.setNameLoc(NameLoc);
590 Result.suppressDiagnostics();
599 auto *ND = dyn_cast<NamespaceDecl>(DC);
600 if (ND && !ND->isInline() && !ND->isAnonymousNamespace())
602 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
607 llvm_unreachable(
"something isn't in TU scope?");
618 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DC))
619 if (MD->getParent()->hasAnyDependentBases())
627 bool IsTemplateTypeArg) {
628 assert(
getLangOpts().MSVCCompat &&
"shouldn't be called in non-MSVC mode");
631 if (IsTemplateTypeArg &&
getCurScope()->isTemplateParamScope()) {
640 Diag(NameLoc, diag::ext_ms_delayed_template_argument) << &II;
649 Diag(NameLoc, diag::ext_undeclared_unqual_id_with_dependent_base) << &II
680 switch (TD->getTagKind()) {
721 bool IsTemplateName) {
726 SuggestedType =
nullptr;
730 TypeNameValidatorCCC CCC(
false,
false,
737 bool CanRecover = !IsTemplateName;
738 if (Corrected.isKeyword()) {
741 PDiag(IsTemplateName ? diag::err_no_template_suggest
742 : diag::err_unknown_typename_suggest)
744 II = Corrected.getCorrectionAsIdentifierInfo();
747 if (!SS || !SS->
isSet()) {
749 PDiag(IsTemplateName ? diag::err_no_template_suggest
750 : diag::err_unknown_typename_suggest)
753 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
754 bool DroppedSpecifier =
755 Corrected.WillReplaceSpecifier() && II->
getName() == CorrectedStr;
758 ? diag::err_no_member_template_suggest
759 : diag::err_unknown_nested_typename_suggest)
760 << II << DC << DroppedSpecifier << SS->
getRange(),
763 llvm_unreachable(
"could not have corrected a typo here");
770 if (Corrected.getCorrectionSpecifier())
775 getTypeName(*Corrected.getCorrectionAsIdentifierInfo(), IILoc, S,
776 tmpSS.
isSet() ? &tmpSS : SS,
false,
false,
nullptr,
789 bool MemberOfUnknownSpecialization;
791 Name,
nullptr,
true, TemplateResult,
802 Diag(IILoc, IsTemplateName ? diag::err_no_template
803 : diag::err_unknown_typename)
806 Diag(IILoc, IsTemplateName ? diag::err_no_member_template
807 : diag::err_typename_nested_not_found)
813 unsigned DiagID = diag::err_typename_missing;
815 DiagID = diag::ext_typename_missing;
826 "Invalid scope specifier has already been diagnosed");
834 NextToken.
is(tok::less);
854 StringRef FixItTagName;
855 switch (Tag->getTagKind()) {
857 FixItTagName =
"class ";
861 FixItTagName =
"enum ";
865 FixItTagName =
"struct ";
869 FixItTagName =
"__interface ";
873 FixItTagName =
"union ";
877 StringRef TagName = FixItTagName.drop_back();
878 SemaRef.
Diag(NameLoc, diag::err_use_of_tag_name_without_tag)
879 << Name << TagName << SemaRef.
getLangOpts().CPlusPlus
884 SemaRef.
Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type)
899 const Token &NextToken,
904 assert(NextToken.
isNot(tok::coloncolon) &&
905 "parse nested name specifiers before calling ClassifyName");
946 bool SecondTry =
false;
947 bool IsFilteredTemplateName =
false;
950 switch (
Result.getResultKind()) {
954 if (SS.
isEmpty() && NextToken.
is(tok::l_paren)) {
1000 if (!SecondTry && CCC) {
1005 unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;
1006 unsigned QualifiedDiag = diag::err_no_member_suggest;
1009 NamedDecl *UnderlyingFirstDecl = Corrected.getCorrectionDecl();
1012 UnqualifiedDiag = diag::err_no_template_suggest;
1013 QualifiedDiag = diag::err_no_member_template_suggest;
1014 }
else if (UnderlyingFirstDecl &&
1018 UnqualifiedDiag = diag::err_unknown_typename_suggest;
1019 QualifiedDiag = diag::err_unknown_nested_typename_suggest;
1025 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
1026 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
1027 Name->
getName() == CorrectedStr;
1030 << DroppedSpecifier << SS.
getRange());
1034 Name = Corrected.getCorrectionAsIdentifierInfo();
1037 if (Corrected.isKeyword())
1043 Result.setLookupName(Corrected.getCorrection());
1065 Result.suppressDiagnostics();
1107 if (!
Result.isAmbiguous()) {
1108 IsFilteredTemplateName =
true;
1118 (IsFilteredTemplateName ||
1134 if (!IsFilteredTemplateName)
1137 bool IsFunctionTemplate;
1141 IsFunctionTemplate =
true;
1144 }
else if (!
Result.empty()) {
1152 dyn_cast<UsingShadowDecl>(*
Result.begin());
1153 assert(!FoundUsingShadow ||
1162 IsFunctionTemplate =
true;
1166 if (IsFunctionTemplate) {
1170 Result.suppressDiagnostics();
1182 if (
const auto *USD = dyn_cast<UsingShadowDecl>(
Found)) {
1194 TTL.setNameLoc(NameLoc);
1221 dyn_cast<ObjCCompatibleAliasDecl>(
FirstDecl))
1222 Class = Alias->getClassInterface();
1228 if (NextToken.
is(tok::period)) {
1231 Result.suppressDiagnostics();
1241 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl()))
1247 if (
auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(
FirstDecl)) {
1260 bool NextIsOp = NextToken.
isOneOf(tok::amp, tok::star);
1261 if ((NextToken.
is(tok::identifier) ||
1263 FirstDecl->getUnderlyingDecl()->isFunctionOrFunctionTemplate())) &&
1275 if (
Result.isSingleResult() && !ADL &&
1280 Result.suppressDiagnostics();
1300 bool IsAddressOfOperand) {
1303 NameInfo, IsAddressOfOperand,
1310 const Token &NextToken) {
1312 if (
auto *Ivar = dyn_cast<ObjCIvarDecl>(
Found->getUnderlyingDecl()))
1328 if ((*ULE->decls_begin())->isCXXClassMember()) {
1330 SS.
Adopt(ULE->getQualifierLoc());
1335 Result.setNamingClass(ULE->getNamingClass());
1336 for (
auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I)
1337 Result.addDecl(*I, I.getAccess());
1370 "The next DeclContext should be lexically contained in the current one.");
1376 assert(
CurContext &&
"DeclContext imbalance!");
1379 assert(
CurContext &&
"Popped translation unit!");
1389 assert(
CurContext &&
"skipping definition of undefined tag");
1417 assert(!S->
getEntity() &&
"scope already has entity");
1450 "expected to be initializing a template parameter scope");
1478 cast<Decl>(DC)->getDescribedTemplateParams()) {
1479 unsigned DCDepth = TPL->getDepth() + 1;
1480 if (DCDepth > ScopeDepth)
1482 if (ScopeDepth == DCDepth)
1501 "The next DeclContext should be lexically contained in the current one.");
1505 for (
unsigned P = 0, NumParams = FD->
getNumParams(); P < NumParams; ++P) {
1508 if (Param->getIdentifier()) {
1518 assert(
CurContext &&
"DeclContext imbalance!");
1520 assert(
CurContext &&
"Popped translation unit!");
1534 if (Context.getLangOpts().CPlusPlus ||
New->hasAttr<OverloadableAttr>())
1549 return ND->
hasAttr<OverloadableAttr>();
1552 return Previous.getFoundDecl()->hasAttr<OverloadableAttr>();
1587 for (; I != IEnd; ++I) {
1620 bool AllowInlineNamespace)
const {
1621 return IdResolver.isDeclInScope(D, Ctx, S, AllowInlineNamespace);
1628 if (ScopeDC->getPrimaryContext() == TargetDC)
1640 bool ConsiderLinkage,
1641 bool AllowInlineNamespace) {
1659 if (
auto *VD = dyn_cast<VarDecl>(D))
1661 if (
auto *FD = dyn_cast<FunctionDecl>(D))
1663 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1677 if (
New->getFriendObjectKind() &&
1718 if (NewIsModuleInterface || OldIsModuleInterface) {
1722 Diag(
New->getLocation(), diag::err_mismatched_owning_module)
1724 << NewIsModuleInterface
1726 << OldIsModuleInterface
1729 New->setInvalidDecl();
1742 if (!
New->getLexicalDeclContext()
1743 ->getNonTransparentContext()
1744 ->isFileContext() ||
1750 bool IsNewExported =
New->isInExportDeclContext();
1754 if (!IsNewExported && !IsOldExported)
1766 New->getOwningModule()->isImplicitGlobalModule())
1769 assert(IsNewExported);
1777 Diag(
New->getLocation(), diag::err_redeclaration_non_exported) <<
New << S;
1795 "New and Old are not the same definition, we should diagnostic it "
1796 "immediately instead of checking it.");
1799 "We shouldn't see unreachable definitions here.");
1847 return OldM == NewM;
1884 return CD->isCopyConstructor();
1891 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(DC)){
1892 if (!RD->hasNameForLinkage())
1921 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1927 FD->getMemberSpecializationInfo() && !FD->isOutOfLine())
1930 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
1935 if (FD->isInlined() && !
isMainFileLoc(*
this, FD->getLocation()))
1939 if (FD->doesThisDeclarationHaveABody() &&
1940 Context.DeclMustBeEmitted(FD))
1942 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1949 if (
Context.DeclMustBeEmitted(VD))
1952 if (VD->isStaticDataMember() &&
1955 if (VD->isStaticDataMember() &&
1957 VD->getMemberSpecializationInfo() && !VD->isOutOfLine())
1960 if (VD->isInline() && !
isMainFileLoc(*
this, VD->getLocation()))
1969 return mightHaveNonExternalLinkage(D);
1976 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
1982 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1997 if (
const auto *DD = dyn_cast<DecompositionDecl>(D)) {
2001 bool IsAllIgnored =
true;
2002 for (
const auto *BD : DD->bindings()) {
2003 if (BD->isReferenced())
2005 IsAllIgnored = IsAllIgnored && (BD->isPlaceholderVar(LangOpts) ||
2006 BD->hasAttr<UnusedAttr>());
2019 if (D->
hasAttr<UnusedAttr>() || D->
hasAttr<ObjCPreciseLifetimeAttr>() ||
2029 if (
const auto *R = dyn_cast<CXXRecordDecl>(D->
getDeclContext()))
2032 WithinFunction || (R->isLocalClass() && !R->isDependentType());
2033 if (!WithinFunction)
2044 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2047 if (
const auto *Cleanups = dyn_cast_if_present<ExprWithCleanups>(
Init))
2048 Init = Cleanups->getSubExpr();
2050 const auto *Ty = VD->getType().getTypePtr();
2055 if (TT->getDecl()->hasAttr<UnusedAttr>())
2061 if (
const auto *MTE = dyn_cast_if_present<MaterializeTemporaryExpr>(
Init);
2062 MTE && MTE->getExtendingDecl()) {
2063 Ty = VD->getType().getNonReferenceType().getTypePtr();
2064 Init = MTE->getSubExpr()->IgnoreImplicitAsWritten();
2069 if (Ty->isIncompleteType() || Ty->isDependentType())
2074 Ty = Ty->getBaseElementTypeUnsafe();
2076 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2077 if (Tag->hasAttr<UnusedAttr>())
2080 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
2081 if (!RD->hasTrivialDestructor() && !RD->hasAttr<WarnUnusedAttr>())
2085 const auto *Construct =
2086 dyn_cast<CXXConstructExpr>(
Init->IgnoreImpCasts());
2087 if (Construct && !Construct->isElidable()) {
2089 if (!CD->
isTrivial() && !RD->hasAttr<WarnUnusedAttr>() &&
2090 (VD->getInit()->isValueDependent() || !VD->evaluateValue()))
2096 if (
Init->isTypeDependent()) {
2098 if (!Ctor->isTrivial())
2139 for (
auto *TmpD : D->
decls()) {
2140 if (
const auto *
T = dyn_cast<TypedefNameDecl>(TmpD))
2142 else if(
const auto *R = dyn_cast<RecordDecl>(TmpD))
2156 if (
auto *TD = dyn_cast<TypedefNameDecl>(D)) {
2168 DiagID = diag::warn_unused_exception_param;
2170 DiagID = diag::warn_unused_label;
2172 DiagID = diag::warn_unused_variable;
2191 if (Ty->isReferenceType() || Ty->isDependentType())
2194 if (
const TagDecl *Tag = Ty->getAsTagDecl()) {
2195 if (Tag->hasAttr<UnusedAttr>())
2199 if (
const auto *RD = dyn_cast<CXXRecordDecl>(Tag);
2200 RD && !RD->hasAttr<WarnUnusedAttr>())
2207 if (VD->
hasAttr<BlocksAttr>() && Ty->isObjCObjectPointerType())
2213 if (VD->
hasAttr<ObjCPreciseLifetimeAttr>() && Ty->isObjCObjectPointerType())
2220 assert(iter->getSecond() >= 0 &&
2221 "Found a negative number of references to a VarDecl");
2222 if (
int RefCnt = iter->getSecond(); RefCnt > 0) {
2232 bool UnusedCXXCondDecl = VD->
isCXXCondDecl() && (RefCnt == 1);
2233 if (!UnusedCXXCondDecl)
2237 unsigned DiagID =
isa<ParmVarDecl>(VD) ? diag::warn_unused_but_set_parameter
2238 : diag::warn_unused_but_set_variable;
2248 bool Diagnose =
false;
2252 Diagnose = L->
getStmt() ==
nullptr;
2263 "Scope shouldn't contain decls!");
2270 std::optional<SourceLocation> PreviousDeclLoc;
2275 DeclDiags.push_back(LocAndDiag{Loc, std::nullopt, std::move(PD)});
2280 DeclDiags.push_back(LocAndDiag{Loc, PreviousDeclLoc, std::move(PD)});
2283 for (
auto *TmpD : S->
decls()) {
2284 assert(TmpD &&
"This decl didn't get pushed??");
2292 if (
const auto *RD = dyn_cast<RecordDecl>(D))
2294 if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
2303 if (
LabelDecl *LD = dyn_cast<LabelDecl>(D))
2314 auto ShadowI = ShadowingDecls.find(D);
2315 if (ShadowI != ShadowingDecls.end()) {
2316 if (
const auto *FD = dyn_cast<FieldDecl>(ShadowI->second)) {
2317 addDiagWithPrev(D->
getLocation(), FD->getLocation(),
2318 PDiag(diag::warn_ctor_parm_shadows_field)
2319 << D << FD << FD->getParent());
2321 ShadowingDecls.erase(ShadowI);
2325 llvm::sort(DeclDiags,
2326 [](
const LocAndDiag &LHS,
const LocAndDiag &RHS) ->
bool {
2331 return LHS.Loc.getRawEncoding() < RHS.Loc.getRawEncoding();
2333 for (
const LocAndDiag &D : DeclDiags) {
2335 if (D.PreviousDeclLoc)
2336 Diag(*D.PreviousDeclLoc, diag::note_previous_declaration);
2360 return "ucontext.h";
2362 llvm_unreachable(
"unhandled error kind");
2373 Parent->
addDecl(CLinkageDecl);
2374 Parent = CLinkageDecl;
2378 if (
Context.BuiltinInfo.isImmediate(ID)) {
2380 "consteval builtins should only be available in C++20 mode");
2389 New->addAttr(BuiltinAttr::CreateImplicit(
Context, ID));
2395 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i) {
2398 FT->getParamType(i),
nullptr,
SC_None,
nullptr);
2400 Params.push_back(parm);
2402 New->setParams(Params);
2410 Scope *S,
bool ForRedeclaration,
2417 if (!ForRedeclaration)
2423 Context.BuiltinInfo.allowTypeMismatch(ID))
2429 Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
2430 <<
Context.BuiltinInfo.getName(ID);
2436 Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
2438 <<
Context.BuiltinInfo.getName(ID);
2442 if (!ForRedeclaration &&
2443 (
Context.BuiltinInfo.isPredefinedLibFunction(ID) ||
2444 Context.BuiltinInfo.isHeaderDependentFunction(ID))) {
2445 Diag(Loc,
LangOpts.C99 ? diag::ext_implicit_lib_function_decl_c99
2446 : diag::ext_implicit_lib_function_decl)
2447 <<
Context.BuiltinInfo.getName(ID) << R;
2448 if (
const char *Header =
Context.BuiltinInfo.getHeaderName(ID))
2449 Diag(Loc, diag::note_include_header_or_declare)
2450 << Header <<
Context.BuiltinInfo.getName(ID);
2486 while (Filter.hasNext()) {
2495 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2497 Decl->getUnderlyingType()))
2502 if (OldTD->getAnonDeclWithTypedefName(
true) &&
2503 Decl->getAnonDeclWithTypedefName())
2515 if (
const TypedefNameDecl *OldTypedef = dyn_cast<TypedefNameDecl>(Old))
2516 OldType = OldTypedef->getUnderlyingType();
2518 OldType =
Context.getTypeDeclType(Old);
2524 Diag(
New->getLocation(), diag::err_redefinition_variably_modified_typedef)
2528 New->setInvalidDecl();
2532 if (OldType != NewType &&
2535 !
Context.hasSameType(OldType, NewType)) {
2537 Diag(
New->getLocation(), diag::err_redefinition_different_typedef)
2538 << Kind << NewType << OldType;
2541 New->setInvalidDecl();
2551 if (
New->isInvalidDecl())
return;
2557 switch (TypeID->getLength()) {
2561 if (!TypeID->isStr(
"id"))
2564 if (!
T->isPointerType())
2566 if (!
T->isVoidPointerType()) {
2571 Context.setObjCIdRedefinitionType(
T);
2573 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2578 if (!TypeID->isStr(
"Class"))
2580 Context.setObjCClassRedefinitionType(
New->getUnderlyingType());
2582 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2586 if (!TypeID->isStr(
"SEL"))
2588 Context.setObjCSelRedefinitionType(
New->getUnderlyingType());
2590 New->setModedTypeSourceInfo(
New->getTypeSourceInfo(),
2600 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
2601 <<
New->getDeclName();
2607 return New->setInvalidDecl();
2612 return New->setInvalidDecl();
2614 if (
auto *OldTD = dyn_cast<TypedefNameDecl>(Old)) {
2615 auto *OldTag = OldTD->getAnonDeclWithTypedefName(
true);
2616 auto *
NewTag =
New->getAnonDeclWithTypedefName();
2619 OldTag->getCanonicalDecl() !=
NewTag->getCanonicalDecl() &&
2623 if (OldTD->isModed())
2624 New->setModedTypeSourceInfo(OldTD->getTypeSourceInfo(),
2625 OldTD->getUnderlyingType());
2627 New->setTypeSourceInfo(OldTD->getTypeSourceInfo());
2683 Diag(
New->getLocation(), diag::err_redefinition)
2684 <<
New->getDeclName();
2686 return New->setInvalidDecl();
2701 Context.getSourceManager().isInSystemHeader(
New->getLocation())))
2704 Diag(
New->getLocation(), diag::ext_redefinition_of_typedef)
2705 <<
New->getDeclName();
2712 if (
auto *ED = dyn_cast<EnumDecl>(
New); ED && !ED->isScoped()) {
2714 for (
auto *ECD : ED->enumerators()) {
2725 const OwnershipAttr *OA = dyn_cast<OwnershipAttr>(A);
2726 const AnnotateAttr *Ann = dyn_cast<AnnotateAttr>(A);
2727 for (
const auto *i : D->
attrs())
2728 if (i->getKind() == A->
getKind()) {
2744 if (
VarDecl *VD = dyn_cast<VarDecl>(D))
2745 return VD->isThisDeclarationADefinition();
2746 if (
TagDecl *TD = dyn_cast<TagDecl>(D))
2747 return TD->isCompleteDefinition() || TD->isBeingDefined();
2758 AlignedAttr *OldAlignasAttr =
nullptr;
2759 AlignedAttr *OldStrictestAlignAttr =
nullptr;
2760 unsigned OldAlign = 0;
2768 if (I->isAlignmentDependent())
2774 unsigned Align = I->getAlignment(S.
Context);
2775 if (Align > OldAlign) {
2777 OldStrictestAlignAttr = I;
2782 AlignedAttr *NewAlignasAttr =
nullptr;
2783 unsigned NewAlign = 0;
2784 for (
auto *I :
New->specific_attrs<AlignedAttr>()) {
2785 if (I->isAlignmentDependent())
2791 unsigned Align = I->getAlignment(S.
Context);
2792 if (Align > NewAlign)
2796 if (OldAlignasAttr && NewAlignasAttr && OldAlign != NewAlign) {
2804 if (OldAlign == 0 || NewAlign == 0) {
2817 if (OldAlign != NewAlign) {
2818 S.
Diag(NewAlignasAttr->getLocation(), diag::err_alignas_mismatch)
2821 S.
Diag(OldAlignasAttr->getLocation(), diag::note_previous_declaration);
2834 S.
Diag(
New->getLocation(), diag::err_alignas_missing_on_definition)
2836 S.
Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration)
2840 bool AnyAdded =
false;
2843 if (OldAlign > NewAlign) {
2844 AlignedAttr *Clone = OldStrictestAlignAttr->clone(S.
Context);
2845 Clone->setInherited(
true);
2846 New->addAttr(Clone);
2851 if (OldAlignasAttr && !NewAlignasAttr &&
2852 !(AnyAdded && OldStrictestAlignAttr->isAlignas())) {
2853 AlignedAttr *Clone = OldAlignasAttr->clone(S.
Context);
2854 Clone->setInherited(
true);
2855 New->addAttr(Clone);
2862#define WANT_DECL_MERGE_LOGIC
2863#include "clang/Sema/AttrParsedAttrImpl.inc"
2864#undef WANT_DECL_MERGE_LOGIC
2871 if (!DiagnoseMutualExclusions(S, D,
Attr))
2882 if (
const auto *AA = dyn_cast<AvailabilityAttr>(
Attr))
2884 D, *AA, AA->getPlatform(), AA->
isImplicit(), AA->getIntroduced(),
2885 AA->getDeprecated(), AA->getObsoleted(), AA->getUnavailable(),
2886 AA->getMessage(), AA->getStrict(), AA->getReplacement(), AMK,
2887 AA->getPriority(), AA->getEnvironment());
2888 else if (
const auto *VA = dyn_cast<VisibilityAttr>(
Attr))
2890 else if (
const auto *VA = dyn_cast<TypeVisibilityAttr>(
Attr))
2892 else if (
const auto *ImportA = dyn_cast<DLLImportAttr>(
Attr))
2894 else if (
const auto *ExportA = dyn_cast<DLLExportAttr>(
Attr))
2896 else if (
const auto *EA = dyn_cast<ErrorAttr>(
Attr))
2898 else if (
const auto *FA = dyn_cast<FormatAttr>(
Attr))
2899 NewAttr = S.
mergeFormatAttr(D, *FA, FA->getType(), FA->getFormatIdx(),
2901 else if (
const auto *FMA = dyn_cast<FormatMatchesAttr>(
Attr))
2903 D, *FMA, FMA->getType(), FMA->getFormatIdx(), FMA->getFormatString());
2904 else if (
const auto *SA = dyn_cast<SectionAttr>(
Attr))
2906 else if (
const auto *CSA = dyn_cast<CodeSegAttr>(
Attr))
2908 else if (
const auto *IA = dyn_cast<MSInheritanceAttr>(
Attr))
2910 IA->getInheritanceModel());
2911 else if (
const auto *AA = dyn_cast<AlwaysInlineAttr>(
Attr))
2920 }
else if (
const auto *MA = dyn_cast<MinSizeAttr>(
Attr))
2922 else if (
const auto *SNA = dyn_cast<SwiftNameAttr>(
Attr))
2924 else if (
const auto *OA = dyn_cast<OptimizeNoneAttr>(
Attr))
2926 else if (
const auto *InternalLinkageA = dyn_cast<InternalLinkageAttr>(
Attr))
2937 else if (
const auto *UA = dyn_cast<UuidAttr>(
Attr))
2938 NewAttr = S.
mergeUuidAttr(D, *UA, UA->getGuid(), UA->getGuidDecl());
2939 else if (
const auto *IMA = dyn_cast<WebAssemblyImportModuleAttr>(
Attr))
2941 else if (
const auto *INA = dyn_cast<WebAssemblyImportNameAttr>(
Attr))
2943 else if (
const auto *TCBA = dyn_cast<EnforceTCBAttr>(
Attr))
2945 else if (
const auto *TCBLA = dyn_cast<EnforceTCBLeafAttr>(
Attr))
2947 else if (
const auto *BTFA = dyn_cast<BTFDeclTagAttr>(
Attr))
2949 else if (
const auto *NT = dyn_cast<HLSLNumThreadsAttr>(
Attr))
2952 else if (
const auto *WS = dyn_cast<HLSLWaveSizeAttr>(
Attr))
2955 WS->getSpelledArgsCount());
2956 else if (
const auto *CI = dyn_cast<HLSLVkConstantIdAttr>(
Attr))
2958 else if (
const auto *SA = dyn_cast<HLSLShaderAttr>(
Attr))
2963 else if (
const auto *RD = dyn_cast<OpenACCRoutineDeclAttr>(
Attr))
2980 if (
const TagDecl *TD = dyn_cast<TagDecl>(D)) {
2981 if (
const auto *Def = TD->getDefinition(); Def && !Def->isBeingDefined())
2985 if (
const VarDecl *VD = dyn_cast<VarDecl>(D)) {
2991 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
2993 if (FD->isDefined(Def,
true))
3000 for (
const auto *Attribute : D->
attrs())
3001 if (Attribute->getKind() == Kind)
3009 if (!
New->hasAttrs())
3013 if (!Def || Def ==
New)
3017 for (
unsigned I = 0, E = NewAttributes.size(); I != E;) {
3018 Attr *NewAttribute = NewAttributes[I];
3027 NewAttributes.erase(NewAttributes.begin() + I);
3035 ? diag::err_alias_after_tentative
3036 : diag::err_redefinition;
3038 if (
Diag == diag::err_redefinition)
3048 if (
const VarDecl *VD = dyn_cast<VarDecl>(Def)) {
3084 }
else if (
const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {
3085 if (AA->isAlignas()) {
3096 S.
Diag(NewAttribute->
getLocation(), diag::note_alignas_on_declaration)
3098 NewAttributes.erase(NewAttributes.begin() + I);
3108 diag::err_loader_uninitialized_redeclaration);
3110 NewAttributes.erase(NewAttributes.begin() + I);
3133 diag::err_sycl_entry_point_after_definition)
3146 diag::warn_attribute_precede_definition);
3148 NewAttributes.erase(NewAttributes.begin() + I);
3154 const ConstInitAttr *CIAttr,
3155 bool AttrBeforeInit) {
3162 std::string SuitableSpelling;
3164 SuitableSpelling = std::string(
3166 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3168 InsertLoc, {tok::l_square, tok::l_square,
3169 S.PP.getIdentifierInfo(
"clang"), tok::coloncolon,
3170 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3171 tok::r_square, tok::r_square}));
3172 if (SuitableSpelling.empty())
3174 InsertLoc, {tok::kw___attribute, tok::l_paren, tok::r_paren,
3175 S.PP.getIdentifierInfo(
"require_constant_initialization"),
3176 tok::r_paren, tok::r_paren}));
3177 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus20)
3178 SuitableSpelling =
"constinit";
3179 if (SuitableSpelling.empty() && S.
getLangOpts().CPlusPlus11)
3180 SuitableSpelling =
"[[clang::require_constant_initialization]]";
3181 if (SuitableSpelling.empty())
3182 SuitableSpelling =
"__attribute__((require_constant_initialization))";
3183 SuitableSpelling +=
" ";
3185 if (AttrBeforeInit) {
3188 assert(CIAttr->isConstinit() &&
"should not diagnose this for attribute");
3191 S.
Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);
3195 S.
Diag(CIAttr->getLocation(),
3196 CIAttr->isConstinit() ? diag::err_constinit_added_too_late
3197 : diag::warn_require_const_init_added_too_late)
3200 << CIAttr->isConstinit()
3208 UsedAttr *NewAttr = OldAttr->clone(
Context);
3209 NewAttr->setInherited(
true);
3210 New->addAttr(NewAttr);
3213 RetainAttr *NewAttr = OldAttr->clone(
Context);
3214 NewAttr->setInherited(
true);
3215 New->addAttr(NewAttr);
3224 const auto *OldConstInit = Old->
getAttr<ConstInitAttr>();
3225 const auto *NewConstInit =
New->getAttr<ConstInitAttr>();
3226 if (
bool(OldConstInit) !=
bool(NewConstInit)) {
3234 (NewVD->hasInit() || NewVD->isThisDeclarationADefinition()))
3237 if (InitDecl == NewVD) {
3241 if (OldConstInit && OldConstInit->isConstinit())
3244 }
else if (NewConstInit) {
3248 if (InitDecl && InitDecl != NewVD) {
3251 NewVD->dropAttr<ConstInitAttr>();
3259 if (AsmLabelAttr *NewA =
New->getAttr<AsmLabelAttr>()) {
3260 if (AsmLabelAttr *OldA = Old->
getAttr<AsmLabelAttr>()) {
3261 if (!OldA->isEquivalent(NewA)) {
3263 Diag(
New->getLocation(), diag::err_different_asm_label);
3264 Diag(OldA->getLocation(), diag::note_previous_declaration);
3266 }
else if (Old->
isUsed()) {
3269 Diag(
New->getLocation(), diag::err_late_asm_label_name)
3275 if (
const auto *NewAbiTagAttr =
New->getAttr<AbiTagAttr>()) {
3276 if (
const auto *OldAbiTagAttr = Old->
getAttr<AbiTagAttr>()) {
3277 for (
const auto &
NewTag : NewAbiTagAttr->tags()) {
3278 if (!llvm::is_contained(OldAbiTagAttr->tags(),
NewTag)) {
3279 Diag(NewAbiTagAttr->getLocation(),
3280 diag::err_new_abi_tag_on_redeclaration)
3282 Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
3286 Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
3292 if (
New->hasAttr<SectionAttr>() && !Old->
hasAttr<SectionAttr>()) {
3293 if (
auto *VD = dyn_cast<VarDecl>(
New)) {
3295 Diag(
New->getLocation(), diag::warn_attribute_section_on_redeclaration);
3302 const auto *NewCSA =
New->getAttr<CodeSegAttr>();
3303 if (NewCSA && !Old->
hasAttr<CodeSegAttr>() &&
3305 Diag(
New->getLocation(), diag::warn_mismatched_section)
3313 bool foundAny =
New->hasAttrs();
3343 if (
auto *FD = dyn_cast<FunctionDecl>(
New);
3356 if (!foundAny)
New->dropAttrs();
3361 checkAttrIsTypeDependent(D, A);
3372 newAttr->setInherited(
true);
3394 foundAny |= std::forward<F>(propagator)(To, From) != 0;
3409 const CarriesDependencyAttr *CDA = newDecl->
getAttr<CarriesDependencyAttr>();
3410 if (CDA && !oldDecl->
hasAttr<CarriesDependencyAttr>()) {
3411 S.
Diag(CDA->getLocation(),
3412 diag::err_carries_dependency_missing_on_first_decl) << 1;
3420 diag::note_carries_dependency_missing_first_decl) << 1;
3439 auto NoSizeInfo = [&Ctx](
QualType Ty) {
3440 if (Ty->isIncompleteArrayType() || Ty->isPointerType())
3448 if (NoSizeInfo(Old) && NoSizeInfo(
New))
3480 if (*Oldnullability != *Newnullability) {
3481 S.
Diag(NewParam->
getLocation(), diag::warn_mismatched_nullability_attr)
3498 const auto *OldParamDT = dyn_cast<DecayedType>(OldParam->
getType());
3499 const auto *NewParamDT = dyn_cast<DecayedType>(NewParam->
getType());
3500 if (OldParamDT && NewParamDT &&
3501 OldParamDT->getPointeeType() == NewParamDT->getPointeeType()) {
3502 QualType OldParamOT = OldParamDT->getOriginalType();
3503 QualType NewParamOT = NewParamDT->getOriginalType();
3506 << NewParam << NewParamOT;
3517struct GNUCompatibleParamWarning {
3518 ParmVarDecl *OldParm;
3519 ParmVarDecl *NewParm;
3520 QualType PromotedType;
3527template <
typename T>
3528static std::pair<diag::kind, SourceLocation>
3532 if (Old->isThisDeclarationADefinition())
3533 PrevDiag = diag::note_previous_definition;
3534 else if (Old->isImplicit()) {
3535 PrevDiag = diag::note_previous_implicit_declaration;
3536 if (
const auto *FD = dyn_cast<FunctionDecl>(Old)) {
3537 if (FD->getBuiltinID())
3538 PrevDiag = diag::note_previous_builtin_declaration;
3541 OldLocation =
New->getLocation();
3543 PrevDiag = diag::note_previous_declaration;
3544 return std::make_pair(PrevDiag, OldLocation);
3552 return ((FD->
hasAttr<GNUInlineAttr>() || LangOpts.GNUInline) &&
3553 !LangOpts.CPlusPlus &&
3559 const AttributedType *AT =
T->getAs<AttributedType>();
3560 while (AT && !AT->isCallingConv())
3561 AT = AT->getModifiedType()->getAs<AttributedType>();
3565template <
typename T>
3579template<
typename T>
static bool isExternC(
T *D) {
return D->isExternC(); }
3586template<
typename ExpectedDecl>
3608 !Old->getDeclContext()->getRedeclContext()->Equals(
3609 New->getDeclContext()->getRedeclContext()) &&
3614 S.
Diag(
New->getLocation(), diag::err_using_decl_conflict_reverse);
3627 const auto *AttrA = A->
getAttr<PassObjectSizeAttr>();
3628 const auto *AttrB = B->
getAttr<PassObjectSizeAttr>();
3631 return AttrA && AttrB && AttrA->getType() == AttrB->getType() &&
3632 AttrA->isDynamic() == AttrB->isDynamic();
3658 if (NamedDC->Equals(SemaDC))
3661 assert((NamedDC->InEnclosingNamespaceSetOf(SemaDC) ||
3663 "unexpected context for redeclaration");
3674 if (
auto *FD = dyn_cast<FunctionDecl>(NewD))
3675 FixSemaDC(FD->getDescribedFunctionTemplate());
3676 else if (
auto *VD = dyn_cast<VarDecl>(NewD))
3677 FixSemaDC(VD->getDescribedVarTemplate());
3681 bool MergeTypeWithOld,
bool NewDeclIsDefn) {
3689 Diag(
New->getLocation(), diag::err_using_decl_friend);
3690 Diag(Shadow->getTargetDecl()->getLocation(),
3691 diag::note_using_decl_target);
3692 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
3700 New->getDescribedFunctionTemplate()) {
3712 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
3713 <<
New->getDeclName();
3737 std::tie(PrevDiag, OldLocation) =
3747 !
New->getTemplateSpecializationInfo() &&
3750 Diag(
New->getLocation(), diag::ext_static_non_static) <<
New;
3751 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3753 Diag(
New->getLocation(), diag::err_static_non_static) <<
New;
3754 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3759 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
3760 if (!Old->
hasAttr<InternalLinkageAttr>()) {
3761 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
3764 New->dropAttr<InternalLinkageAttr>();
3767 if (
auto *EA =
New->getAttr<ErrorAttr>()) {
3768 if (!Old->
hasAttr<ErrorAttr>()) {
3769 Diag(EA->getLocation(), diag::err_attribute_missing_on_first_decl) << EA;
3771 New->dropAttr<ErrorAttr>();
3779 bool OldOvl = Old->
hasAttr<OverloadableAttr>();
3780 if (OldOvl !=
New->hasAttr<OverloadableAttr>() && !Old->
isImplicit()) {
3781 Diag(
New->getLocation(), diag::err_attribute_overloadable_mismatch)
3790 const Decl *DiagOld = Old;
3792 auto OldIter = llvm::find_if(Old->
redecls(), [](
const Decl *D) {
3793 const auto *A = D->getAttr<OverloadableAttr>();
3794 return A && !A->isImplicit();
3803 diag::note_attribute_overloadable_prev_overload)
3807 New->addAttr(OverloadableAttr::CreateImplicit(
Context));
3809 New->dropAttr<OverloadableAttr>();
3816 Diag(
New->getLocation(), diag::err_sme_attr_mismatch)
3818 Diag(OldLocation, diag::note_previous_declaration);
3841 bool RequiresAdjustment =
false;
3843 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC()) {
3849 if (!NewCCExplicit) {
3853 RequiresAdjustment =
true;
3861 Diag(
New->getLocation(), diag::warn_cconv_unsupported)
3865 RequiresAdjustment =
true;
3869 Diag(
New->getLocation(), diag::err_cconv_change)
3872 << (!FirstCCExplicit ?
"" :
3876 Diag(
First->getLocation(), diag::note_previous_declaration);
3884 RequiresAdjustment =
true;
3896 NewQType =
Context.getFunctionType(FPT2->getReturnType(),
3897 FPT2->getParamTypes(), EPI2);
3899 New->setType(NewQType);
3908 Diag(
New->getLocation(), diag::err_regparm_mismatch)
3911 Diag(OldLocation, diag::note_previous_declaration);
3916 RequiresAdjustment =
true;
3922 Diag(
New->getLocation(), diag::err_function_attribute_mismatch)
3923 <<
"'ns_returns_retained'";
3924 Diag(OldLocation, diag::note_previous_declaration);
3929 RequiresAdjustment =
true;
3935 AnyX86NoCallerSavedRegistersAttr *
Attr =
3936 New->getAttr<AnyX86NoCallerSavedRegistersAttr>();
3937 Diag(
New->getLocation(), diag::err_function_attribute_mismatch) <<
Attr;
3938 Diag(OldLocation, diag::note_previous_declaration);
3943 RequiresAdjustment =
true;
3946 if (RequiresAdjustment) {
3950 NewQType =
Context.getCanonicalType(
New->getType());
3955 if (!Old->
isInlined() &&
New->isInlined() && !
New->hasAttr<GNUInlineAttr>() &&
3963 if (
New->hasAttr<GNUInlineAttr>() &&
3972 Diag(
New->getLocation(), diag::err_different_pass_object_size_params)
3973 <<
New->getDeclName();
3974 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
3978 QualType OldQTypeForComparison = OldQType;
3979 if (
Context.hasAnyFunctionEffects()) {
3981 const auto NewFX =
New->getFunctionEffects();
3982 if (OldFX != NewFX) {
3984 for (
const auto &Diff : Diffs) {
3985 if (Diff.shouldDiagnoseRedeclaration(*Old, OldFX, *
New, NewFX)) {
3987 diag::warn_mismatched_func_effect_redeclaration)
3988 << Diff.effectName();
3999 if (!MergeErrs.empty())
4006 NewFPT->getParamTypes(), EPI);
4008 New->setType(ModQT);
4009 NewQType =
New->getType();
4014 EPI = OldFPT->getExtProtoInfo();
4016 OldQTypeForComparison =
Context.getFunctionType(
4017 OldFPT->getReturnType(), OldFPT->getParamTypes(), EPI);
4019 if (OldFX.empty()) {
4030 NewQType =
Context.getCanonicalType(
New->getType());
4038 QualType NewDeclaredReturnType =
New->getDeclaredReturnType();
4039 if (!
Context.hasSameType(OldDeclaredReturnType, NewDeclaredReturnType) &&
4041 OldDeclaredReturnType)) {
4046 ResQT =
Context.mergeObjCGCQualifiers(NewQType, OldQType);
4048 if (
New->isCXXClassMember() &&
New->isOutOfLine())
4049 Diag(
New->getLocation(), diag::err_member_def_does_not_match_ret_type)
4050 <<
New <<
New->getReturnTypeSourceRange();
4052 !Old->
hasAttr<OverloadableAttr>() &&
4053 !
New->hasAttr<OverloadableAttr>())
4054 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4056 Diag(
New->getLocation(), diag::err_ovl_diff_return_type)
4057 <<
New->getReturnTypeSourceRange();
4058 Diag(OldLocation, PrevDiag) << Old << Old->
getType()
4068 if (OldReturnType != NewReturnType) {
4072 if (OldAT && OldAT->isDeduced()) {
4073 QualType DT = OldAT->getDeducedType();
4084 const CXXMethodDecl *OldMethod = dyn_cast<CXXMethodDecl>(Old);
4086 if (OldMethod && NewMethod) {
4093 bool IsClassScopeExplicitSpecialization =
4099 !IsClassScopeExplicitSpecialization) {
4104 Diag(
New->getLocation(), diag::err_ovl_static_nonstatic_member);
4105 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4116 NewDiag = diag::err_constructor_redeclared;
4118 NewDiag = diag::err_destructor_redeclared;
4120 NewDiag = diag::err_conv_function_redeclared;
4122 NewDiag = diag::err_member_redeclared;
4124 Diag(
New->getLocation(), NewDiag);
4126 Diag(
New->getLocation(), diag::err_member_redeclared_in_instantiation)
4127 <<
New <<
New->getType();
4129 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4142 diag::err_definition_of_implicitly_declared_member)
4148 diag::err_definition_of_explicitly_defaulted_member)
4171 if (
const auto *NRA =
New->getAttr<CXX11NoReturnAttr>())
4172 if (!Old->
hasAttr<CXX11NoReturnAttr>()) {
4173 Diag(NRA->getLocation(), diag::err_attribute_missing_on_first_decl)
4182 const CarriesDependencyAttr *CDA =
New->getAttr<CarriesDependencyAttr>();
4183 if (CDA && !Old->
hasAttr<CarriesDependencyAttr>()) {
4184 Diag(CDA->getLocation(),
4185 diag::err_carries_dependency_missing_on_first_decl) << 0;
4187 diag::note_carries_dependency_missing_first_decl) << 0;
4195 const SYCLExternalAttr *SEA =
New->getAttr<SYCLExternalAttr>();
4196 if (SEA && !Old->
hasAttr<SYCLExternalAttr>()) {
4197 Diag(SEA->getLocation(), diag::warn_sycl_external_missing_on_first_decl)
4212 OldQTypeForComparison =
QualType(OldTypeForComparison, 0);
4226 Diag(
New->getLocation(), diag::ext_retained_language_linkage) <<
New;
4227 Diag(OldLocation, PrevDiag);
4229 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4230 Diag(OldLocation, PrevDiag);
4237 if (
HLSL().CheckCompatibleParameterABI(
New, Old))
4245 if (
Context.hasSameFunctionTypeIgnoringParamABI(OldQTypeForComparison,
4255 if (
Context.hasSameFunctionTypeIgnoringExceptionSpec(OldQTypeForComparison,
4283 if (Old->
hasPrototype() && !
New->hasWrittenPrototype() && NewDeclIsDefn &&
4287 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New;
4305 if (
New->hasWrittenPrototype()) {
4317 bool IsWithoutProtoADef =
false, IsWithProtoADef =
false;
4318 if (WithoutProto ==
New)
4319 IsWithoutProtoADef = NewDeclIsDefn;
4321 IsWithProtoADef = NewDeclIsDefn;
4323 diag::warn_non_prototype_changes_behavior)
4324 << IsWithoutProtoADef << (WithoutProto->
getNumParams() ? 0 : 1)
4325 << (WithoutProto == Old) << IsWithProtoADef;
4335 !IsWithoutProtoADef)
4341 if (
Context.typesAreCompatible(OldQType, NewQType)) {
4346 (OldProto = dyn_cast<FunctionProtoType>(OldFuncType))) {
4349 assert(!OldProto->hasExceptionSpec() &&
"Exception spec in C");
4350 NewQType =
Context.getFunctionType(NewFuncType->getReturnType(),
4351 OldProto->getParamTypes(),
4352 OldProto->getExtProtoInfo());
4353 New->setType(NewQType);
4354 New->setHasInheritedPrototype();
4358 for (
const auto &ParamType : OldProto->param_types()) {
4361 ParamType,
nullptr,
SC_None,
nullptr);
4362 Param->setScopeInfo(0, Params.size());
4363 Param->setImplicit();
4364 Params.push_back(Param);
4367 New->setParams(Params);
4376 if (
Context.hasSameFunctionTypeIgnoringPtrSizes(OldQType, NewQType))
4403 NewProto->getReturnType());
4404 bool LooseCompatible = !MergedReturn.isNull();
4406 LooseCompatible && Idx != End; ++Idx) {
4410 NewProto->getParamType(Idx))) {
4411 ArgTypes.push_back(NewParm->
getType());
4415 GNUCompatibleParamWarning Warn = { OldParm, NewParm,
4416 NewProto->getParamType(Idx) };
4417 Warnings.push_back(Warn);
4418 ArgTypes.push_back(NewParm->
getType());
4420 LooseCompatible =
false;
4423 if (LooseCompatible) {
4424 for (
unsigned Warn = 0; Warn < Warnings.size(); ++Warn) {
4425 Diag(Warnings[Warn].NewParm->getLocation(),
4426 diag::ext_param_promoted_not_compatible_with_prototype)
4427 << Warnings[Warn].PromotedType
4428 << Warnings[Warn].OldParm->getType();
4429 if (Warnings[Warn].OldParm->getLocation().isValid())
4430 Diag(Warnings[Warn].OldParm->getLocation(),
4431 diag::note_previous_declaration);
4434 if (MergeTypeWithOld)
4435 New->setType(
Context.getFunctionType(MergedReturn, ArgTypes,
4452 if (
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) {
4453 Diag(
New->getLocation(), diag::warn_redecl_library_builtin) <<
New;
4454 Diag(OldLocation, diag::note_previous_builtin_declaration)
4459 PrevDiag = diag::note_previous_builtin_declaration;
4462 Diag(
New->getLocation(), diag::err_conflicting_types) <<
New->getDeclName();
4463 Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4468 Scope *S,
bool MergeTypeWithOld) {
4474 New->setIsPureVirtual();
4483 for (
unsigned i = 0, e =
New->getNumParams(); i != e; ++i) {
4497 if (!Merged.isNull() && MergeTypeWithOld)
4498 New->setType(Merged);
4522 ni != ne && oi != oe; ++ni, ++oi)
4531 S.
Diag(
New->getLocation(),
New->isThisDeclarationADefinition()
4532 ? diag::err_redefinition_different_type
4533 : diag::err_redeclaration_different_type)
4538 std::tie(PrevDiag, OldLocation)
4540 S.
Diag(OldLocation, PrevDiag) << Old << Old->
getType();
4541 New->setInvalidDecl();
4545 bool MergeTypeWithOld) {
4551 if (
New->getType()->isUndeducedType()) {
4573 QualType PrevVDTy = PrevVD->getType();
4577 if (!
Context.hasSameType(
New->getType(), PrevVDTy))
4585 MergedT =
New->getType();
4596 else if (
New->getType()->isObjCObjectPointerType() &&
4598 MergedT =
Context.mergeObjCGCQualifiers(
New->getType(),
4613 if ((
New->getType()->isDependentType() ||
4618 if (!
New->getType()->isDependentType() && MergeTypeWithOld)
4627 if (MergeTypeWithOld)
4628 New->setType(MergedT);
4662 if (
New->isInvalidDecl())
4675 OldTemplate = dyn_cast<VarTemplateDecl>(
Previous.getFoundDecl());
4679 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4681 return New->setInvalidDecl();
4683 Old = dyn_cast<VarDecl>(
Previous.getFoundDecl());
4686 dyn_cast<UsingShadowDecl>(
Previous.getRepresentativeDecl()))
4688 return New->setInvalidDecl();
4692 Diag(
New->getLocation(), diag::err_redefinition_different_kind)
4693 <<
New->getDeclName();
4695 New->getLocation());
4696 return New->setInvalidDecl();
4708 return New->setInvalidDecl();
4715 Diag(
New->getLocation(), diag::err_duplicate_member)
4716 <<
New->getIdentifier();
4718 New->setInvalidDecl();
4724 if (
New->hasAttr<WeakImportAttr>())
4727 Diag(
New->getLocation(), diag::warn_weak_import) <<
New->getDeclName();
4730 New->dropAttr<WeakImportAttr>();
4735 if (
const auto *ILA =
New->getAttr<InternalLinkageAttr>())
4736 if (!Old->
hasAttr<InternalLinkageAttr>()) {
4737 Diag(
New->getLocation(), diag::err_attribute_missing_on_first_decl)
4740 New->dropAttr<InternalLinkageAttr>();
4745 if (MostRecent != Old) {
4748 if (
New->isInvalidDecl())
4753 if (
New->isInvalidDecl())
4758 std::tie(PrevDiag, OldLocation) =
4763 !
New->isStaticDataMember() &&
4766 Diag(
New->getLocation(), diag::ext_static_non_static)
4767 <<
New->getDeclName();
4768 Diag(OldLocation, PrevDiag);
4770 Diag(
New->getLocation(), diag::err_static_non_static)
4771 <<
New->getDeclName();
4772 Diag(OldLocation, PrevDiag);
4773 return New->setInvalidDecl();
4787 else if (
New->getCanonicalDecl()->getStorageClass() !=
SC_Static &&
4788 !
New->isStaticDataMember() &&
4790 Diag(
New->getLocation(), diag::err_non_static_static) <<
New->getDeclName();
4791 Diag(OldLocation, PrevDiag);
4792 return New->setInvalidDecl();
4796 if (
New->hasExternalStorage() &&
4798 Diag(
New->getLocation(), diag::err_extern_non_extern) <<
New->getDeclName();
4799 Diag(OldLocation, PrevDiag);
4800 return New->setInvalidDecl();
4803 !
New->hasExternalStorage()) {
4804 Diag(
New->getLocation(), diag::err_non_extern_extern) <<
New->getDeclName();
4805 Diag(OldLocation, PrevDiag);
4806 return New->setInvalidDecl();
4816 if (!
New->hasExternalStorage() && !
New->isFileVarDecl() &&
4819 !
New->getLexicalDeclContext()->isRecord())) {
4820 Diag(
New->getLocation(), diag::err_redefinition) <<
New->getDeclName();
4821 Diag(OldLocation, PrevDiag);
4822 return New->setInvalidDecl();
4830 Diag(
New->getLocation(), diag::err_inline_decl_follows_def) <<
New;
4831 Diag(Def->getLocation(), diag::note_previous_definition);
4845 Diag(
New->getLocation(), diag::err_thread_non_thread) <<
New->getDeclName();
4846 Diag(OldLocation, PrevDiag);
4847 }
else if (!
New->getTLSKind()) {
4848 Diag(
New->getLocation(), diag::err_non_thread_thread) <<
New->getDeclName();
4849 Diag(OldLocation, PrevDiag);
4855 Diag(
New->getLocation(), diag::err_thread_thread_different_kind)
4857 Diag(OldLocation, PrevDiag);
4867 diag::warn_deprecated_redundant_constexpr_static_def);
4880 Diag(
New->getLocation(), diag::warn_cxx_compat_tentative_definition)
4887 Diag(
New->getLocation(), diag::err_different_language_linkage) <<
New;
4888 Diag(OldLocation, PrevDiag);
4889 New->setInvalidDecl();
4898 New->setPreviousDecl(Old);
4908 New->setImplicitlyInline();
4913 auto FNewDecLoc =
SrcMgr.getDecomposedLoc(
New);
4915 auto *FNew =
SrcMgr.getFileEntryForID(FNewDecLoc.first);
4916 auto FOld =
SrcMgr.getFileEntryRefForID(FOldDecLoc.first);
4917 auto &HSI =
PP.getHeaderSearchInfo();
4918 StringRef HdrFilename =
4921 auto noteFromModuleOrInclude = [&](
Module *Mod,
4927 if (IncLoc.isValid()) {
4929 Diag(IncLoc, diag::note_redefinition_modules_same_file)
4935 Diag(IncLoc, diag::note_redefinition_include_same_file)
4936 << HdrFilename.str();
4946 if (FNew == FOld && FNewDecLoc.second == FOldDecLoc.second) {
4954 if (FOld && !HSI.isFileMultipleIncludeGuarded(*FOld))
4970 New->getDescribedVarTemplate() ||
New->getNumTemplateParameterLists() ||
4971 New->getDeclContext()->isDependentContext() ||
4972 New->hasAttr<SelectAnyAttr>())) {
4975 New->demoteThisDefinitionToDeclaration();
4983 Diag(
New->getLocation(), diag::err_redefinition) <<
New;
4985 New->setInvalidDecl();
5011 if (!
Context.getLangOpts().CPlusPlus)
5017 if (!Tag->getName().empty() || Tag->getTypedefNameForAnonDecl())
5020 Context.getManglingNumberContext(Tag->getParent());
5029 Decl *ManglingContextDecl;
5030 std::tie(MCtx, ManglingContextDecl) =
5040struct NonCLikeKind {
5052 explicit operator bool() {
return Kind !=
None; }
5060 return {NonCLikeKind::Invalid, {}};
5067 return {NonCLikeKind::BaseClass,
5079 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
5080 if (FD->hasInClassInitializer()) {
5081 auto *
Init = FD->getInClassInitializer();
5082 return {NonCLikeKind::DefaultMemberInit,
5098 auto *MemberRD = dyn_cast<CXXRecordDecl>(D);
5106 if (MemberRD->isLambda())
5107 return {NonCLikeKind::Lambda, MemberRD->getSourceRange()};
5111 if (MemberRD->isThisDeclarationADefinition()) {
5117 return {
Invalid ? NonCLikeKind::Invalid : NonCLikeKind::None, {}};
5134 Context.getCanonicalTagType(TagFromDeclSpec))) {
5136 Context.addTypedefNameForUnnamedTagDecl(TagFromDeclSpec, NewTD);
5147 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TagFromDeclSpec);
5151 if (NonCLike || ChangesLinkage) {
5152 if (NonCLike.Kind == NonCLikeKind::Invalid)
5155 unsigned DiagID = diag::ext_non_c_like_anon_struct_in_typedef;
5156 if (ChangesLinkage) {
5158 if (NonCLike.Kind == NonCLikeKind::None)
5159 DiagID = diag::err_typedef_changes_linkage;
5161 DiagID = diag::err_non_c_like_anon_struct_in_typedef;
5167 TextToInsert +=
' ';
5170 Diag(FixitLoc, DiagID)
5173 if (NonCLike.Kind != NonCLikeKind::None) {
5174 Diag(NonCLike.Range.
getBegin(), diag::note_non_c_like_anon_struct)
5175 << NonCLike.Kind - 1 << NonCLike.Range;
5178 << NewTD << isa<TypeAliasDecl>(NewTD);
5203 if (
const auto *ED = dyn_cast<EnumDecl>(DS.
getRepAsDecl())) {
5204 if (ED->isScopedUsingClassTag())
5211 llvm_unreachable(
"unexpected type specifier");
5219 bool IsExplicitInstantiation,
5222 Decl *TagD =
nullptr;
5240 Tag = CTD->getTemplatedDecl();
5245 Tag->setFreeStanding();
5246 if (Tag->isInvalidDecl())
5255 diag::err_typecheck_invalid_restrict_not_pointer_noarg)
5292 "Friend ellipsis but not friend-specified?");
5295 bool DeclaresAnything =
true;
5299 if (!
Record->getDeclName() &&
Record->isCompleteDefinition() &&
5302 Record->getDeclContext()->isRecord()) {
5316 DeclaresAnything =
false;
5335 if ((Tag && Tag->getDeclName()) ||
5345 DeclaresAnything =
false;
5357 if (
Enum->enumerators().empty() && !
Enum->getIdentifier() &&
5358 !
Enum->isInvalidDecl())
5359 DeclaresAnything =
false;
5367 DeclaresAnything =
false;
5371 Tag && Tag->getDeclContext()->isFunctionOrMethod())
5373 << Tag->getTagKind()
5386 if (!DeclaresAnything) {
5389 Diag(DS.
getBeginLoc(), (IsExplicitInstantiation || !TemplateParams.empty())
5390 ? diag::err_no_declarators
5391 : diag::ext_no_declarators)
5404 unsigned DiagID = diag::warn_standalone_specifier;
5406 DiagID = diag::ext_standalone_specifier;
5447 auto EmitAttributeDiagnostic = [
this, &DS](
const ParsedAttr &AL) {
5448 unsigned DiagnosticId = diag::warn_declspec_attribute_ignored;
5450 DiagnosticId = diag::warn_attribute_ignored;
5451 else if (AL.isRegularKeywordAttribute())
5452 DiagnosticId = diag::err_declspec_keyword_has_no_effect;
5454 DiagnosticId = diag::warn_declspec_attribute_ignored;
5455 Diag(AL.getLoc(), DiagnosticId)
5459 llvm::for_each(DS.
getAttributes(), EmitAttributeDiagnostic);
5460 llvm::for_each(DeclAttrs, EmitAttributeDiagnostic);
5484 assert(PrevDecl &&
"Expected a non-null Decl");
5497 SemaRef.
Diag(NameLoc, diag::err_anonymous_record_member_redecl)
5499 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_previous_declaration);
5505 if (
auto *RD = dyn_cast_if_present<RecordDecl>(D))
5515 if (
Record->isAnonymousStructOrUnion())
5520 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
5554 for (
auto *D : AnonRecord->
decls()) {
5577 unsigned OldChainingSize = Chaining.size();
5579 Chaining.append(IF->chain_begin(), IF->chain_end());
5581 Chaining.push_back(VD);
5583 assert(Chaining.size() >= 2);
5586 for (
unsigned i = 0; i < Chaining.size(); i++)
5587 NamedChain[i] = Chaining[i];
5591 VD->
getType(), {NamedChain, Chaining.size()});
5605 Chaining.resize(OldChainingSize);
5619 "Parser allowed 'typedef' as storage class VarDecl.");
5620 switch (StorageClassSpec) {
5634 llvm_unreachable(
"unknown storage class specifier");
5638 assert(
Record->hasInClassInitializer());
5640 for (
const auto *I :
Record->decls()) {
5641 const auto *FD = dyn_cast<FieldDecl>(I);
5642 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
5643 FD = IFD->getAnonField();
5644 if (FD && FD->hasInClassInitializer())
5645 return FD->getLocation();
5648 llvm_unreachable(
"couldn't find in-class initializer");
5656 S.
Diag(DefaultInitLoc, diag::err_multiple_mem_union_initialization);
5676 Diag(
Record->getLocation(), diag::ext_anonymous_union);
5678 Diag(
Record->getLocation(), diag::ext_gnu_anonymous_struct);
5680 Diag(
Record->getLocation(), diag::ext_c11_anonymous_struct);
5686 const char *PrevSpec =
nullptr;
5698 Diag(
Record->getLocation(), diag::err_anonymous_union_not_static)
5703 PrevSpec, DiagID, Policy);
5711 diag::err_anonymous_union_with_storage_spec)
5717 PrevSpec, DiagID,
Context.getPrintingPolicy());
5725 <<
Record->isUnion() <<
"const"
5729 diag::ext_anonymous_struct_union_qualified)
5730 <<
Record->isUnion() <<
"volatile"
5734 diag::ext_anonymous_struct_union_qualified)
5735 <<
Record->isUnion() <<
"restrict"
5739 diag::ext_anonymous_struct_union_qualified)
5740 <<
Record->isUnion() <<
"_Atomic"
5744 diag::ext_anonymous_struct_union_qualified)
5745 <<
Record->isUnion() <<
"__unaligned"
5755 for (
auto *Mem :
Record->decls()) {
5757 if (Mem->isInvalidDecl())
5760 if (
auto *FD = dyn_cast<FieldDecl>(Mem)) {
5764 assert(FD->getAccess() !=
AS_none);
5766 Diag(FD->getLocation(), diag::err_anonymous_record_nonpublic_member)
5778 }
else if (Mem->isImplicit()) {
5785 }
else if (
auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {
5786 if (!MemRecord->isAnonymousStructOrUnion() &&
5787 MemRecord->getDeclName()) {
5790 Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type)
5794 Diag(MemRecord->getLocation(), diag::err_anonymous_record_with_type)
5802 Diag(MemRecord->getLocation(),
5803 diag::ext_anonymous_record_with_anonymous_type)
5813 unsigned DK = diag::err_anonymous_record_bad_member;
5815 DK = diag::err_anonymous_record_with_type;
5817 DK = diag::err_anonymous_record_with_function;
5819 DK = diag::err_anonymous_record_with_static;
5823 DK == diag::err_anonymous_record_with_type)
5824 Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type)
5827 Diag(Mem->getLocation(), DK) <<
Record->isUnion();
5843 Diag(
Record->getLocation(), diag::err_anonymous_struct_not_member)
5864 assert(TInfo &&
"couldn't build declarator info for anonymous struct/union");
5868 if (
RecordDecl *OwningClass = dyn_cast<RecordDecl>(Owner)) {
5884 Diag(
Record->getLocation(), diag::err_mutable_nonmember);
5890 Record->getLocation(),
nullptr,
5906 Record->setAnonymousStructOrUnion(
true);
5917 Chain.push_back(Anon);
5923 if (
VarDecl *NewVD = dyn_cast<VarDecl>(Anon)) {
5926 Decl *ManglingContextDecl;
5927 std::tie(MCtx, ManglingContextDecl) =
5946 assert(
Record &&
"expected a record!");
5951 assert(TInfo &&
"couldn't build declarator info for anonymous struct");
5959 nullptr, RecTy, TInfo,
5971 Chain.push_back(Anon);
5975 diag::err_field_incomplete_or_sizeless) ||
5980 ParentDecl->setInvalidDecl();
6017 diag::err_deduction_guide_name_not_class_template)
6037 NameInfo.
setName(
Context.DeclarationNames.getCXXLiteralOperatorName(
6047 NameInfo.
setName(
Context.DeclarationNames.getCXXConversionFunctionName(
6048 Context.getCanonicalType(Ty)));
6059 Context.getCanonicalType(Ty)));
6080 Context.DeclarationNames.getCXXConstructorName(CurClassType));
6092 Context.getCanonicalType(Ty)));
6100 return Context.getNameForTemplate(TName, TNameLoc);
6105 llvm_unreachable(
"Unknown name kind");
6133 for (
unsigned Idx = 0; Idx <
Declaration->param_size(); ++Idx) {
6138 if (Context.hasSameUnqualifiedType(DefParamTy, DeclParamTy))
6146 if (Context.hasSameUnqualifiedType(DeclParamBaseTy, DefParamBaseTy) ||
6147 (DeclTyName && DeclTyName == DefTyName))
6148 Params.push_back(Idx);
6175#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case DeclSpec::TST_##Trait:
6176#include "clang/Basic/TransformTypeTraits.def"
6181 if (
T.isNull() || !
T->isInstantiationDependentType())
break;
6191 if (!TSI)
return true;
6204 if (Result.isInvalid())
return true;
6249 << D << static_cast<int>(Status);
6260 if (
OpenMP().getOMPTraitInfoForSurroundingScope()->isExtensionActive(
6261 llvm::omp::TraitProperty::
6262 implementation_extension_bind_to_declaration))
6287 Diag(NameInfo.
getLoc(), diag::err_member_name_of_class) << Name;
6298 bool IsMemberSpecialization) {
6299 assert(SS.
isValid() &&
"diagnoseQualifiedDeclaration called for declaration "
6300 "without nested-name-specifier");
6316 Diag(Loc,
LangOpts.MicrosoftExt ? diag::warn_member_extra_qualification
6317 : diag::err_member_extra_qualification)
6321 Diag(Loc, diag::warn_namespace_member_extra_qualification) << Name;
6329 if (!Cur->
Encloses(DC) && !(TemplateId || IsMemberSpecialization)) {
6331 Diag(Loc, diag::err_member_qualification)
6334 Diag(Loc, diag::err_invalid_declarator_global_scope)
6337 Diag(Loc, diag::err_invalid_declarator_in_function)
6340 Diag(Loc, diag::err_invalid_declarator_in_block)
6344 Diag(Loc, diag::err_export_non_namespace_scope_name)
6351 Diag(Loc, diag::err_invalid_declarator_scope)
6359 Diag(Loc, diag::err_member_qualification)
6386 Diag(Loc, diag::ext_template_after_declarative_nns)
6391 TL = std::exchange(NextTL,
TypeLoc())) {
6393 switch (TL.getTypeLocClass()) {
6394 case TypeLoc::TemplateSpecialization: {
6396 TemplateKeywordLoc = TST.getTemplateKeywordLoc();
6397 if (
auto *
T = TST.getTypePtr();
T->isDependentType() &&
T->isTypeAlias())
6398 Diag(Loc, diag::ext_alias_template_in_declarative_nns)
6399 << TST.getLocalSourceRange();
6402 case TypeLoc::Decltype:
6403 case TypeLoc::PackIndexing: {
6404 const Type *
T = TL.getTypePtr();
6411 Diag(Loc, diag::err_computed_type_in_declarative_nns)
6412 <<
T->isDecltypeType() << TL.getSourceRange();
6415 case TypeLoc::DependentName:
6422 if (TemplateKeywordLoc.
isValid())
6423 Diag(Loc, diag::ext_template_after_declarative_nns)
6464 diag::err_template_qualified_declarator_no_match)
6471 if (!IsDependentContext &&
6478 diag::err_member_def_undefined_record)
6499 if (EnteringContext && IsDependentContext &&
6500 TemplateParamLists.size() != 0) {
6519 bool IsLinkageLookup =
false;
6520 bool CreateBuiltins =
false;
6534 IsLinkageLookup =
true;
6536 CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
6537 }
else if (
CurContext->getRedeclContext()->isTranslationUnit() &&
6539 CreateBuiltins =
true;
6541 if (IsLinkageLookup) {
6583 bool AllowForCompatibility =
false;
6586 AllowForCompatibility = DeclParent->Contains(*TemplateParamParent) &&
6587 TemplateParamParent->isDeclScope(TPD);
6590 AllowForCompatibility);
6620 bool AddToScope =
true;
6622 if (TemplateParamLists.size()) {
6644 if (
New->getDeclName() && AddToScope)
6647 if (
OpenMP().isInOpenMPDeclareTargetContext())
6658 bool &SizeIsNegative,
6659 llvm::APSInt &Oversized) {
6664 SizeIsNegative =
false;
6667 if (
T->isDependentType())
6673 if (
const PointerType* PTy = dyn_cast<PointerType>(Ty)) {
6678 if (FixedType.
isNull())
return FixedType;
6679 FixedType = Context.getPointerType(FixedType);
6680 return Qs.
apply(Context, FixedType);
6682 if (
const ParenType* PTy = dyn_cast<ParenType>(Ty)) {
6683 QualType Inner = PTy->getInnerType();
6687 if (FixedType.
isNull())
return FixedType;
6688 FixedType = Context.getParenType(FixedType);
6689 return Qs.
apply(Context, FixedType);
6699 SizeIsNegative, Oversized);
6709 llvm::APSInt Res = Result.Val.getInt();
6712 if (Res.isSigned() && Res.isNegative()) {
6713 SizeIsNegative =
true;
6718 unsigned ActiveSizeBits =
6722 : Res.getActiveBits();
6728 QualType FoldedArrayType = Context.getConstantArrayType(
6730 return Qs.
apply(Context, FoldedArrayType);
6755 TypeLoc DstElemTL = DstATL.getElementLoc();
6774 bool &SizeIsNegative,
6775 llvm::APSInt &Oversized) {
6778 SizeIsNegative, Oversized);
6781 TypeSourceInfo *FixedTInfo = Context.getTrivialTypeSourceInfo(FixedTy);
6789 unsigned FailedFoldDiagID) {
6790 bool SizeIsNegative;
6791 llvm::APSInt Oversized;
6793 TInfo,
Context, SizeIsNegative, Oversized);
6795 Diag(Loc, diag::ext_vla_folded_to_constant);
6802 Diag(Loc, diag::err_typecheck_negative_array_size);
6803 else if (Oversized.getBoolValue())
6805 Oversized, 10, Oversized.isSigned(),
false,
6807 else if (FailedFoldDiagID)
6808 Diag(Loc, FailedFoldDiagID);
6820 Context.getExternCContextDecl()->makeDeclVisibleInContext(ND);
6825 auto Result =
Context.getExternCContextDecl()->lookup(Name);
6834 diag::err_virtual_non_function);
6838 diag::err_explicit_non_function);
6842 diag::err_noreturn_non_function);
6863 ? diag::warn_ms_inline_non_function
6864 : diag::err_inline_non_function)
6868 << 1 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
6873 diag::err_deduction_guide_invalid_specifier)
6882 if (!NewTD)
return nullptr;
6903 if (
T->isVariablyModifiedType()) {
6907 bool SizeIsNegative;
6908 llvm::APSInt Oversized;
6919 else if (
T->isVariableArrayType())
6921 else if (Oversized.getBoolValue())
6958 switch (II->getNotableIdentifierID()) {
6959 case tok::NotableIdentifierKind::FILE:
6962 case tok::NotableIdentifierKind::jmp_buf:
6963 Context.setjmp_bufDecl(NewTD);
6965 case tok::NotableIdentifierKind::sigjmp_buf:
6966 Context.setsigjmp_bufDecl(NewTD);
6968 case tok::NotableIdentifierKind::ucontext_t:
6969 Context.setucontext_tDecl(NewTD);
6971 case tok::NotableIdentifierKind::float_t:
6972 case tok::NotableIdentifierKind::double_t:
6973 NewTD->
addAttr(AvailableOnlyInDefaultEvalMethodAttr::Create(
Context));
7010 if (Context.getLangOpts().CPlusPlus) {
7034 if (!OuterContext->
Equals(PrevOuterContext))
7043 if (!SS.
isSet())
return;
7048 if (
Decl->getType().hasAddressSpace())
7050 if (
Decl->getType()->isDependentType())
7062 Var->hasGlobalStorage())
7066 if (
auto DT = dyn_cast<DecayedType>(
Type)) {
7067 auto OrigTy = DT->getOriginalType();
7068 if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) {
7071 OrigTy =
Context.getAddrSpaceQualType(OrigTy, ImplAS);
7099 if (WeakRefAttr *
Attr = ND.
getAttr<WeakRefAttr>()) {
7108 if (
auto *VD = dyn_cast<VarDecl>(&ND)) {
7109 if (VD->hasInit()) {
7110 if (
const auto *
Attr = VD->getAttr<AliasAttr>()) {
7111 assert(VD->isThisDeclarationADefinition() &&
7112 !VD->isExternallyVisible() &&
"Broken AliasAttr handled late!");
7114 VD->dropAttr<AliasAttr>();
7123 if (SelectAnyAttr *
Attr = ND.
getAttr<SelectAnyAttr>()) {
7126 diag::err_attribute_selectany_non_extern_data);
7133 if (HybridPatchableAttr *
Attr = ND.
getAttr<HybridPatchableAttr>()) {
7136 diag::warn_attribute_hybrid_patchable_non_extern);
7142 auto *VD = dyn_cast<VarDecl>(&ND);
7143 bool IsAnonymousNS =
false;
7146 const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(VD->getDeclContext());
7147 while (NS && !IsAnonymousNS) {
7149 NS = dyn_cast<NamespaceDecl>(NS->
getParent());
7156 bool AnonNSInMicrosoftMode = IsAnonymousNS && IsMicrosoft;
7158 (!AnonNSInMicrosoftMode &&
7169 if (
const auto *FD = dyn_cast<FunctionDecl>(&ND)) {
7170 FD = FD->getMostRecentDecl();
7175 for (
TypeLoc TL = FD->getTypeSourceInfo()->getTypeLoc();
7181 if (
const auto *A = ATL.
getAttrAs<LifetimeBoundAttr>()) {
7182 const auto *MD = dyn_cast<CXXMethodDecl>(FD);
7183 int NoImplicitObjectError = -1;
7185 NoImplicitObjectError = 0;
7186 else if (MD->isStatic())
7187 NoImplicitObjectError = 1;
7188 else if (MD->isExplicitObjectMemberFunction())
7189 NoImplicitObjectError = 2;
7190 if (NoImplicitObjectError != -1) {
7191 S.
Diag(A->getLocation(), diag::err_lifetimebound_no_object_param)
7192 << NoImplicitObjectError << A->getRange();
7194 S.
Diag(A->getLocation(), diag::err_lifetimebound_ctor_dtor)
7196 }
else if (MD->getReturnType()->isVoidType()) {
7200 err_lifetimebound_implicit_object_parameter_void_return_type);
7205 for (
unsigned int I = 0; I < FD->getNumParams(); ++I) {
7210 if (
auto *A = P->
getAttr<LifetimeBoundAttr>()) {
7212 S.
Diag(A->getLocation(),
7213 diag::err_lifetimebound_parameter_void_return_type);
7236 bool IsSpecialization,
7237 bool IsDefinition) {
7241 bool IsTemplate =
false;
7242 if (
TemplateDecl *OldTD = dyn_cast<TemplateDecl>(OldDecl)) {
7243 OldDecl = OldTD->getTemplatedDecl();
7245 if (!IsSpecialization)
7246 IsDefinition =
false;
7248 if (
TemplateDecl *NewTD = dyn_cast<TemplateDecl>(NewDecl)) {
7249 NewDecl = NewTD->getTemplatedDecl();
7253 if (!OldDecl || !NewDecl)
7256 const DLLImportAttr *OldImportAttr = OldDecl->
getAttr<DLLImportAttr>();
7257 const DLLExportAttr *OldExportAttr = OldDecl->
getAttr<DLLExportAttr>();
7258 const DLLImportAttr *NewImportAttr = NewDecl->
getAttr<DLLImportAttr>();
7259 const DLLExportAttr *NewExportAttr = NewDecl->
getAttr<DLLExportAttr>();
7263 bool HasNewAttr = (NewImportAttr && !NewImportAttr->isInherited()) ||
7264 (NewExportAttr && !NewExportAttr->isInherited());
7270 bool AddsAttr = !(OldImportAttr || OldExportAttr) && HasNewAttr;
7272 if (AddsAttr && !IsSpecialization && !OldDecl->
isImplicit()) {
7274 bool JustWarn =
false;
7276 auto *VD = dyn_cast<VarDecl>(OldDecl);
7277 if (VD && !VD->getDescribedVarTemplate())
7279 auto *FD = dyn_cast<FunctionDecl>(OldDecl);
7291 unsigned DiagID = JustWarn ? diag::warn_attribute_dll_redeclaration
7292 : diag::err_attribute_dll_redeclaration;
7295 << (NewImportAttr ? (
const Attr *)NewImportAttr : NewExportAttr);
7308 bool IsInline =
false, IsStaticDataMember =
false, IsQualifiedFriend =
false;
7310 if (
const auto *VD = dyn_cast<VarDecl>(NewDecl)) {
7313 IsStaticDataMember = VD->isStaticDataMember();
7314 IsDefinition = VD->isThisDeclarationADefinition(S.
Context) !=
7316 }
else if (
const auto *FD = dyn_cast<FunctionDecl>(NewDecl)) {
7317 IsInline = FD->isInlined();
7318 IsQualifiedFriend = FD->getQualifier() &&
7322 if (OldImportAttr && !HasNewAttr &&
7323 (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember &&
7325 if (IsMicrosoftABI && IsDefinition) {
7326 if (IsSpecialization) {
7329 diag::err_attribute_dllimport_function_specialization_definition);
7330 S.
Diag(OldImportAttr->getLocation(), diag::note_attribute);
7331 NewDecl->
dropAttr<DLLImportAttr>();
7334 diag::warn_redeclaration_without_import_attribute)
7337 NewDecl->
dropAttr<DLLImportAttr>();
7338 NewDecl->
addAttr(DLLExportAttr::CreateImplicit(
7339 S.
Context, NewImportAttr->getRange()));
7341 }
else if (IsMicrosoftABI && IsSpecialization) {
7342 assert(!IsDefinition);
7346 diag::warn_redeclaration_without_attribute_prev_attribute_ignored)
7347 << NewDecl << OldImportAttr;
7349 S.
Diag(OldImportAttr->getLocation(), diag::note_previous_attribute);
7350 OldDecl->
dropAttr<DLLImportAttr>();
7351 NewDecl->
dropAttr<DLLImportAttr>();
7353 }
else if (IsInline && OldImportAttr && !IsMicrosoftABI) {
7356 OldDecl->
dropAttr<DLLImportAttr>();
7357 NewDecl->
dropAttr<DLLImportAttr>();
7359 diag::warn_dllimport_dropped_from_inline_function)
7360 << NewDecl << OldImportAttr;
7367 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewDecl)) {
7369 !NewImportAttr && !NewExportAttr) {
7370 if (
const DLLExportAttr *ParentExportAttr =
7371 MD->getParent()->getAttr<DLLExportAttr>()) {
7372 DLLExportAttr *NewAttr = ParentExportAttr->clone(S.
Context);
7373 NewAttr->setInherited(
true);
7425 return D->isExternC();
7442 llvm_unreachable(
"Unexpected context");
7452 llvm_unreachable(
"Unexpected context");
7497 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
7498 return FD->isExternC();
7499 if (
const auto *VD = dyn_cast<VarDecl>(D))
7500 return VD->isExternC();
7502 llvm_unreachable(
"Unknown type of decl!");
7515 diag::err_opencl_type_can_only_be_used_as_function_parameter)
7529 diag::err_invalid_type_for_program_scope_var)
7558 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_half_declaration) << R;
7591 Se.
Diag(NewVD->
getLocation(), diag::err_opencl_nonconst_global_sampler);
7601template <
typename AttrTy>
7604 if (
const auto *Attribute = TND->
getAttr<AttrTy>()) {
7605 AttrTy *Clone = Attribute->clone(S.
Context);
7606 Clone->setInherited(
true);
7634 if (
const auto *ConstDecl = RD->
getAttr<ReadOnlyPlacementAttr>()) {
7636 S.
Diag(ConstDecl->getLocation(), diag::note_enforce_read_only_placement);
7646 (VD->
getDeclContext()->getRedeclContext()->isTranslationUnit() ||
7660 QualType R = TInfo->
getType();
7665 Diag(E->
getExprLoc(), diag::warn_asm_label_on_auto_decl) << Label;
7669 if (!
Context.getTargetInfo().isValidGCCRegisterName(Label) &&
7671 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7681 const auto &TI =
Context.getTargetInfo();
7682 bool HasSizeMismatch;
7684 if (!TI.isValidGCCRegisterName(Label))
7685 Diag(E->
getExprLoc(), diag::err_asm_unknown_register_name) << Label;
7686 else if (!TI.validateGlobalRegisterVariable(Label,
Context.getTypeSize(R),
7688 Diag(E->
getExprLoc(), diag::err_asm_invalid_global_var_reg) << Label;
7689 else if (HasSizeMismatch)
7690 Diag(E->
getExprLoc(), diag::err_asm_register_size_mismatch) << Label;
7695 diag::err_asm_unsupported_register_type)
7710 bool IsPlaceholderVariable =
false;
7716 if (!Decomp.bindings().empty()) {
7717 II = Decomp.bindings()[0].Name;
7731 IsPlaceholderVariable =
true;
7739 if (IsPlaceholderVariable)
7753 bool IsLocalExternDecl = SC ==
SC_Extern &&
7772 : diag::warn_deprecated_register)
7795 const AutoType *AT = TL.getTypePtr();
7799 bool IsMemberSpecialization =
false;
7800 bool IsVariableTemplateSpecialization =
false;
7802 bool IsVariableTemplate =
false;
7831 false, IsMemberSpecialization,
Invalid);
7833 if (TemplateParams) {
7840 if (!TemplateParams->
size() &&
7845 diag::err_template_variable_noparams)
7849 TemplateParams =
nullptr;
7857 IsVariableTemplateSpecialization =
true;
7861 IsVariableTemplate =
true;
7869 if (!TemplateParamLists.empty() && IsMemberSpecialization &&
7874 "should have a 'template<>' for this decl");
7877 bool IsExplicitSpecialization =
7888 (IsExplicitSpecialization || IsMemberSpecialization)) {
7890 diag::ext_explicit_specialization_storage_class)
7896 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
7902 if (Ctxt->isFunctionOrMethod()) {
7903 FunctionOrMethod = Ctxt;
7906 const CXXRecordDecl *ParentDecl = dyn_cast<CXXRecordDecl>(Ctxt);
7908 AnonStruct = ParentDecl;
7912 if (FunctionOrMethod) {
7916 diag::err_static_data_member_not_allowed_in_local_class)
7917 << Name << RD->getDeclName() << RD->getTagKind();
7918 }
else if (AnonStruct) {
7923 diag::err_static_data_member_not_allowed_in_anon_struct)
7926 }
else if (RD->isUnion()) {
7930 diag_compat::static_data_member_in_union)
7948 diag::err_static_out_of_line)
7961 diag::err_storage_class_for_static_member)
7966 llvm_unreachable(
"C storage class in c++!");
7970 if (IsVariableTemplateSpecialization) {
7972 TemplateParamLists.size() > 0
7973 ? TemplateParamLists[0]->getTemplateLoc()
7976 S, D, TInfo,
Previous, TemplateKWLoc, TemplateParams, SC,
7991 if (IsVariableTemplate) {
7994 TemplateParams, NewVD);
8015 unsigned VDTemplateParamLists =
8016 (TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
8017 if (TemplateParamLists.size() > VDTemplateParamLists)
8019 Context, TemplateParamLists.drop_back(VDTemplateParamLists));
8026 }
else if (
CurContext->isFunctionOrMethod()) {
8029 diag::err_inline_declaration_block_scope) << Name
8034 : diag::compat_pre_cxx17_inline_variable);
8045 if (IsLocalExternDecl) {
8048 B->setLocalExternDecl();
8053 bool EmitTLSUnsupportedError =
false;
8066 diag::err_thread_non_global)
8068 else if (!
Context.getTargetInfo().isTLSSupported()) {
8073 EmitTLSUnsupportedError =
true;
8080 diag::err_thread_unsupported);
8091 diag::err_constexpr_wrong_decl_kind)
8092 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
8102 Context.getTargetInfo().getCXXABI().isMicrosoft()))
8109 diag::err_constinit_local_variable);
8113 ConstInitAttr::Keyword_constinit));
8131 diag::warn_static_local_in_extern_inline);
8137 if (IsVariableTemplateSpecialization)
8142 else if (IsMemberSpecialization)
8157 B->setModulePrivate();
8167 diag::err_opencl_unknown_type_specifier)
8177 if (
const auto *ATy = dyn_cast<ArrayType>(NewVD->
getType())) {
8178 if (ATy && ATy->getElementType().isWebAssemblyReferenceType() &&
8194 llvm::DenseMap<IdentifierInfo *, AsmLabelAttr *>::iterator I =
8224 if (EmitTLSUnsupportedError &&
8227 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))
8229 diag::err_thread_unsupported);
8231 if (EmitTLSUnsupportedError &&
8238 (NewVD->
hasAttr<CUDASharedAttr>() ||
8239 NewVD->
hasAttr<CUDAConstantAttr>())) {
8247 assert(!NewVD->
hasAttr<DLLImportAttr>() ||
8248 NewVD->
getAttr<DLLImportAttr>()->isInherited() ||
8253 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewVD))
8260 CheckAsmLabel(S, D.
getAsmLabel(), SC, TInfo, NewVD);
8272 IsMemberSpecialization ||
8273 IsVariableTemplateSpecialization);
8287 if (IsMemberSpecialization && !IsVariableTemplate &&
8288 !IsVariableTemplateSpecialization && !NewVD->
isInvalidDecl() &&
8305 !IsVariableTemplateSpecialization) {
8313 if (!IsPlaceholderVariable)
8344 if (PrevVarTemplate &&
8364 Decl *ManglingContextDecl;
8365 std::tie(MCtx, ManglingContextDecl) =
8501 if (
FieldDecl *FD = dyn_cast<FieldDecl>(ShadowedDecl)) {
8502 if (
const auto *MD =
8506 if (MD->isStatic() || MD->isExplicitObjectMemberFunction())
8512 if (
const auto PVD = dyn_cast<ParmVarDecl>(D)) {
8515 ShadowingDecls.insert({PVD->getCanonicalDecl(), FD});
8520 if (
VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
8521 if (shadowedVar->isExternC()) {
8524 for (
auto *I : shadowedVar->redecls())
8525 if (I->isFileVarDecl()) {
8533 unsigned WarningDiag = diag::warn_decl_shadow;
8536 if (
const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->
getParent())) {
8542 if (RD->getLambdaCaptureDefault() ==
LCD_None) {
8548 WarningDiag = diag::warn_decl_shadow_uncaptured_local;
8554 ->ShadowingDecls.push_back({D, VD});
8565 ->ShadowingDecls.push_back({D, ShadowedDecl});
8571 bool HasLocalStorage =
false;
8572 if (
const auto *VD = dyn_cast<VarDecl>(ShadowedDecl))
8573 HasLocalStorage = VD->hasLocalStorage();
8574 else if (
const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl))
8578 if (HasLocalStorage) {
8583 ParentDC && !ParentDC->
Equals(OldDC);
8626 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8633 const NamedDecl *ShadowedDecl = Shadow.ShadowedDecl;
8639 Diag(Shadow.VD->getLocation(),
8640 CaptureLoc.
isInvalid() ? diag::warn_decl_shadow_uncaptured_local
8641 : diag::warn_decl_shadow)
8642 << Shadow.VD->getDeclName()
8645 Diag(CaptureLoc, diag::note_var_explicitly_captured_here)
8646 << Shadow.VD->getDeclName() << 0;
8649 Diag(Shadow.VD->getLocation(),
8651 : diag::warn_decl_shadow_uncaptured_local)
8652 << Shadow.VD->getDeclName()
8678 auto *DRE = dyn_cast<DeclRefExpr>(E);
8682 auto I = ShadowingDecls.find(D);
8683 if (I == ShadowingDecls.end())
8685 const NamedDecl *ShadowedDecl = I->second;
8687 Diag(Loc, diag::warn_modifying_shadowing_decl) << D << OldDC;
8692 ShadowingDecls.erase(I);
8700 assert(S.
getLangOpts().CPlusPlus &&
"only C++ has extern \"C\"");
8759 assert(Prev &&
"should have found a previous declaration to diagnose");
8761 Prev = FD->getFirstDecl();
8765 S.
Diag(ND->getLocation(), diag::err_extern_c_global_conflict)
8787 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
8799 if (ND->getDeclContext()->getRedeclContext()->isTranslationUnit())
8819 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8829 SemaRef.
Diag(VarLoc, diag::err_c23_constexpr_invalid_type) <<
T;
8837 return CheckC23ConstexprVarType(SemaRef, VarLoc, F->getType());
8853 if (
T->isUndeducedType())
8859 if (
T->isObjCObjectType()) {
8862 T =
Context.getObjCObjectPointerType(
T);
8893 if (NewVD->
hasAttr<BlocksAttr>()) {
8898 if (
T->isBlockPointerType()) {
8901 if (!
T.isConstQualified()) {
8902 Diag(NewVD->
getLocation(), diag::err_opencl_invalid_block_declaration)
8908 Diag(NewVD->
getLocation(), diag::err_opencl_extern_block_declaration);
8917 if (!
T->isSamplerT() && !
T->isDependentType() &&
8924 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8925 <<
Scope <<
"global or constant";
8927 Diag(NewVD->
getLocation(), diag::err_opencl_global_invalid_addr_space)
8928 <<
Scope <<
"constant";
8944 if (FD && !FD->
hasAttr<DeviceKernelAttr>()) {
8956 if (FD && FD->
hasAttr<DeviceKernelAttr>()) {
8981 && !NewVD->
hasAttr<BlocksAttr>()) {
8992 if (
T->isWebAssemblyTableType()) {
9003 const auto *ATy = dyn_cast<ConstantArrayType>(
T.getTypePtr());
9004 if (!ATy || ATy->getZExtSize() != 0) {
9006 diag::err_typecheck_wasm_table_must_have_zero_length);
9016 (FD->hasAttr<CUDADeviceAttr>() || FD->hasAttr<CUDAGlobalAttr>())) {
9019 ArrayT && ArrayT->isZeroSize()) {
9025 bool isVM =
T->isVariablyModifiedType();
9026 if (isVM || NewVD->
hasAttr<CleanupAttr>() ||
9032 bool SizeIsNegative;
9033 llvm::APSInt Oversized;
9038 FixedT = FixedTInfo->
getType();
9039 else if (FixedTInfo) {
9045 if ((!FixedTInfo || FixedT.
isNull()) &&
T->isVariableArrayType()) {
9078 if (
T->isVoidType()) {
9096 !
T.isWebAssemblyReferenceType() && !
T->isHLSLSpecificType()) {
9102 if (isVM && NewVD->
hasAttr<BlocksAttr>()) {
9115 !
T->isDependentType() &&
9117 diag::err_constexpr_var_non_literal)) {
9123 if (
Context.getTargetInfo().getTriple().isPPC64() &&
9133 llvm::StringMap<bool> CallerFeatureMap;
9134 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9136 CallerFeatureMap)) {
9144 llvm::StringMap<bool> CallerFeatureMap;
9145 Context.getFunctionFeatureMap(CallerFeatureMap, FD);
9178 CXXRecordDecl *BaseRecord = Specifier->getType()->getAsCXXRecordDecl();
9183 Name =
Context.DeclarationNames.getCXXDestructorName(
9184 Context.getCanonicalTagType(BaseRecord));
9189 dyn_cast<CXXMethodDecl>(BaseND->getCanonicalDecl());
9196 if (Overridden.insert(BaseMD).second) {
9213 return !Overridden.empty();
9219 struct ActOnFDArgs {
9233 DifferentNameValidatorCCC(ASTContext &Context, FunctionDecl *TypoFD,
9234 CXXRecordDecl *Parent)
9235 : Context(Context), OriginalFD(TypoFD),
9238 bool ValidateCandidate(
const TypoCorrection &candidate)
override {
9242 SmallVector<unsigned, 1> MismatchedParams;
9244 CDeclEnd = candidate.
end();
9245 CDecl != CDeclEnd; ++CDecl) {
9246 FunctionDecl *FD = dyn_cast<FunctionDecl>(*CDecl);
9250 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
9251 CXXRecordDecl *Parent = MD->getParent();
9254 }
else if (!ExpectedParent) {
9263 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
9264 return std::make_unique<DifferentNameValidatorCCC>(*
this);
9268 ASTContext &Context;
9269 FunctionDecl *OriginalFD;
9270 CXXRecordDecl *ExpectedParent;
9290 ActOnFDArgs &ExtraArgs,
bool IsLocalFriend,
Scope *S) {
9298 IsLocalFriend ? diag::err_no_matching_local_friend :
9300 diag::err_member_decl_does_not_match;
9312 "Cannot have an ambiguity in previous-declaration lookup");
9314 DifferentNameValidatorCCC CCC(SemaRef.
Context, NewFD,
9316 if (!Prev.
empty()) {
9325 MismatchedParams.empty() ? 0 : MismatchedParams.front() + 1;
9326 NearMatches.push_back(std::make_pair(FD, ParamNum));
9334 IsLocalFriend ?
nullptr : NewDC))) {
9341 CDeclEnd = Correction.
end();
9342 CDecl != CDeclEnd; ++CDecl) {
9362 ExtraArgs.S, ExtraArgs.D,
9365 ExtraArgs.AddToScope);
9376 if ((*I)->getCanonicalDecl() == Canonical)
9383 SemaRef.
PDiag(IsLocalFriend
9384 ? diag::err_no_matching_local_friend_suggest
9385 : diag::err_member_decl_does_not_match_suggest)
9386 << Name << NewDC << IsDefinition);
9399 << Name << NewDC << IsDefinition << NewFD->
getLocation();
9402 if (NewMD && DiagMsg == diag::err_member_decl_does_not_match) {
9408 bool NewFDisConst = NewMD && NewMD->
isConst();
9411 NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
9412 NearMatch != NearMatchEnd; ++NearMatch) {
9415 bool FDisConst = MD && MD->
isConst();
9416 bool IsMember = MD || !IsLocalFriend;
9419 if (
unsigned Idx = NearMatch->second) {
9423 SemaRef.
Diag(Loc, IsMember ? diag::note_member_def_close_param_match
9424 : diag::note_local_decl_close_param_match)
9427 }
else if (FDisConst != NewFDisConst) {
9429 diag::note_member_def_close_const_match)
9434 else if (FTI.hasMethodTypeQualifiers() &&
9435 FTI.getConstQualifierLoc().isValid())
9439 IsMember ? diag::note_member_def_close_match
9440 : diag::note_local_decl_close_match);
9448 default: llvm_unreachable(
"Unknown storage class!");
9453 diag::err_typecheck_sclass_func);
9470 diag::err_static_block_func);
9486 bool &IsVirtualOkay) {
9500 diag::err_c23_constexpr_not_variable);
9503 diag::err_constexpr_wrong_decl_kind)
9504 <<
static_cast<int>(ConstexprKind);
9528 "Strict prototypes are required");
9549 "Constructors can only be declared in a member context");
9555 isInline,
false, ConstexprKind,
9566 false, ConstexprKind,
9567 TrailingRequiresClause);
9570 if (
Record->isBeingDefined())
9579 IsVirtualOkay =
true;
9591 true, ConstexprKind, TrailingRequiresClause);
9597 diag::err_conv_function_not_member);
9605 IsVirtualOkay =
true;
9610 TrailingRequiresClause);
9637 IsVirtualOkay = !Ret->isStatic();
9651 true , ConstexprKind, TrailingRequiresClause);
9668 StringRef SizeTypeNames[] = {
"size_t",
"intptr_t",
"uintptr_t",
"ptrdiff_t"};
9676 if (Names.end() !=
Match)
9681 }
while (DesugaredTy != Ty);
9720 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts())) {
9722 bool IsStandardLayoutType =
true;
9728 if (!CXXRec->hasDefinition())
9729 CXXRec = CXXRec->getTemplateInstantiationPattern();
9730 if (!CXXRec || !CXXRec->hasDefinition() || !CXXRec->isStandardLayout())
9731 IsStandardLayoutType =
false;
9734 !IsStandardLayoutType)
9782 "__cl_clang_non_portable_kernel_param_types", S.
getLangOpts()) &&
9796 llvm::SmallPtrSetImpl<const Type *> &ValidTypes) {
9809 S.
Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_param);
9818 S.
Diag(Param->getLocation(), diag::err_kernel_arg_address_space);
9835 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9843 S.
Diag(Loc, diag::note_entity_declared_at) << PT;
9844 PT = Typedef->desugar();
9866 HistoryStack.push_back(
nullptr);
9871 VisitStack.push_back(PD);
9872 assert(VisitStack.back() &&
"First decl null?");
9875 const Decl *
Next = VisitStack.pop_back_val();
9877 assert(!HistoryStack.empty());
9879 if (
const FieldDecl *Hist = HistoryStack.pop_back_val())
9880 ValidTypes.insert(Hist->getType().getTypePtr());
9889 HistoryStack.push_back(Field);
9891 QualType FieldTy = Field->getType();
9895 "Unexpected type.");
9904 VisitStack.push_back(
nullptr);
9906 for (
const auto *FD : RD->
fields()) {
9917 VisitStack.push_back(FD);
9928 S.
Diag(Param->getLocation(),
9929 diag::err_record_with_pointers_kernel_param)
9933 S.
Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
9936 S.
Diag(PD->getLocation(), diag::note_within_field_of_type)
9937 << PD->getDeclName();
9942 I = HistoryStack.begin() + 1,
9943 E = HistoryStack.end();
9956 }
while (!VisitStack.empty());
9973 (LangOpts.CPlusPlus &&
9983 unsigned BuiltinID) {
9984 switch (BuiltinID) {
9985 case Builtin::BI__GetExceptionInfo:
9989 case Builtin::BIaddressof:
9990 case Builtin::BI__addressof:
9991 case Builtin::BIforward:
9992 case Builtin::BIforward_like:
9993 case Builtin::BImove:
9994 case Builtin::BImove_if_noexcept:
9995 case Builtin::BIas_const: {
10000 return FPT->
getNumParams() == 1 && !FPT->isVariadic();
10012 bool &AddToScope) {
10020 llvm::append_range(TemplateParamLists, TemplateParamListsRef);
10022 if (!TemplateParamLists.empty() && !TemplateParamLists.back()->empty() &&
10023 Invented->getDepth() == TemplateParamLists.back()->getDepth())
10024 TemplateParamLists.back() = Invented;
10026 TemplateParamLists.push_back(Invented);
10036 diag::err_invalid_thread)
10044 bool isFriend =
false;
10046 bool isMemberSpecialization =
false;
10047 bool isFunctionTemplateSpecialization =
false;
10049 bool HasExplicitTemplateArgs =
false;
10052 bool isVirtualOkay =
false;
10059 if (!NewFD)
return nullptr;
10069 if (IsLocalExternDecl)
10079 bool ImplicitInlineCXX20 = !
getLangOpts().CPlusPlusModules ||
10107 if (isVirtual && Parent->isUnion()) {
10111 if ((Parent->isClass() || Parent->isStruct()) &&
10112 Parent->hasAttr<SYCLSpecialClassAttr>() &&
10115 if (
auto *Def = Parent->getDefinition())
10116 Def->setInitMethod(
true);
10121 isMemberSpecialization =
false;
10122 isFunctionTemplateSpecialization =
false;
10137 isMemberSpecialization,
Invalid);
10138 if (TemplateParams) {
10143 if (TemplateParams->
size() > 0) {
10151 }
else if (TemplateId) {
10168 Name, TemplateParams,
10174 if (TemplateParamLists.size() > 1) {
10181 isFunctionTemplateSpecialization =
true;
10183 if (TemplateParamLists.size() > 0)
10203 << Name << RemoveRange
10209 HasExplicitTemplateArgs =
true;
10216 if (!TemplateParamLists.empty() && isMemberSpecialization &&
10222 if (TemplateParamLists.size() > 0)
10227 if (isFriend && TemplateId)
10228 isFunctionTemplateSpecialization =
true;
10234 if (isFunctionTemplateSpecialization && TemplateId) {
10235 HasExplicitTemplateArgs =
true;
10266 if (!isVirtualOkay) {
10268 diag::err_virtual_non_function);
10272 diag::err_virtual_out_of_class)
10278 diag::err_virtual_member_function_template)
10297 diag::err_inline_declaration_block_scope) << Name
10311 diag::err_explicit_out_of_class)
10318 diag::err_explicit_non_ctor_or_conv_function)
10336 <<
static_cast<int>(ConstexprKind);
10347 diag::err_invalid_consteval_decl_kind)
10355 if (isFunctionTemplateSpecialization) {
10358 Diag(ModulePrivateLoc, diag::err_module_private_specialization)
10404 if (!isFriend && SC !=
SC_None) {
10412 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10414 diag::ext_explicit_specialization_storage_class)
10421 "Out-of-line member function should be a CXXMethodDecl");
10438 ? diag::ext_static_out_of_line
10439 : diag::err_static_out_of_line)
10464 PendingInlineFuncDecls.insert(NewFD);
10471 isMemberSpecialization ||
10472 isFunctionTemplateSpecialization);
10481 llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
10506 for (
unsigned i = 0, e = FTI.
NumParams; i != e; ++i) {
10508 assert(Param->getDeclContext() != NewFD &&
"Was set before ?");
10509 Param->setDeclContext(NewFD);
10510 Params.push_back(Param);
10512 if (Param->isInvalidDecl())
10525 auto *TD = dyn_cast<TagDecl>(NonParmDecl);
10530 if (
auto *ECD = dyn_cast<EnumConstantDecl>(NonParmDecl))
10535 DeclContext *TagDC = TD->getLexicalDeclContext();
10539 TD->setDeclContext(NewFD);
10547 if (TagDC != PrototypeTagContext)
10548 TD->setLexicalDeclContext(TagDC);
10562 for (
const auto &AI : FT->param_types()) {
10565 Param->setScopeInfo(0, Params.size());
10566 Params.push_back(Param);
10570 "Should not need args for typedef of non-prototype fn");
10574 NewFD->setParams(Params);
10599 !NewFD->
hasAttr<SectionAttr>())
10600 NewFD->
addAttr(PragmaClangTextSectionAttr::CreateImplicit(
10606 !NewFD->
hasAttr<SectionAttr>()) {
10607 NewFD->
addAttr(SectionAttr::CreateImplicit(
10609 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate));
10620 !NewFD->
hasAttr<StrictGuardStackCheckAttr>())
10621 NewFD->
addAttr(StrictGuardStackCheckAttr::CreateImplicit(
10626 if (!NewFD->
hasAttr<CodeSegAttr>()) {
10635 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
10636 if (
Context.getTargetInfo().getTriple().isAArch64() && NewTVA &&
10637 !NewTVA->isDefaultVersion() &&
10638 !
Context.getTargetInfo().hasFeature(
"fmv")) {
10640 AddToScope =
false;
10652 Diag(NewFD->
getLocation(), diag::err_return_value_with_address_space);
10667 isMemberSpecialization,
10674 "previous declaration set still overloaded");
10686 CC ==
CC_X86StdCall ? diag::warn_cconv_knr : diag::err_cconv_knr;
10709 diag::ext_operator_new_delete_declared_inline)
10736 if (isFunctionTemplateSpecialization || isMemberSpecialization) {
10748 Diag(TRC->getBeginLoc(), diag::err_non_temp_spec_requires_clause)
10756 diag::err_non_temp_friend_decl_with_requires_clause_must_be_def);
10760 Diag(TRC->getBeginLoc(),
10761 diag::err_constrained_non_templated_function);
10778 if (isFunctionTemplateSpecialization) {
10779 bool isDependentSpecialization =
false;
10784 isDependentSpecialization =
10786 (HasExplicitTemplateArgs &&
10787 TemplateSpecializationType::
10788 anyInstantiationDependentTemplateArguments(
10790 assert((!isDependentSpecialization ||
10791 (HasExplicitTemplateArgs == isDependentSpecialization)) &&
10792 "dependent friend function specialization without template "
10798 isDependentSpecialization =
10803 HasExplicitTemplateArgs ? &TemplateArgs :
nullptr;
10804 if (isDependentSpecialization) {
10811 NewFD, ExplicitTemplateArgs,
Previous))
10832 isMemberSpecialization,
10841 "previous declaration set still overloaded");
10882 struct ActOnFDArgs ExtraArgs = { S, D, TemplateParamLists,
10928 *
this,
Previous, NewFD, ExtraArgs,
false,
nullptr)) {
10929 AddToScope = ExtraArgs.AddToScope;
10938 *
this,
Previous, NewFD, ExtraArgs,
true, S)) {
10939 AddToScope = ExtraArgs.AddToScope;
10945 !isFriend && !isFunctionTemplateSpecialization &&
10946 !isMemberSpecialization) {
10964 if (NewFD->
hasAttr<HLSLShaderAttr>())
10972 if (
unsigned BuiltinID = II->getBuiltinID()) {
10973 bool InStdNamespace =
Context.BuiltinInfo.isInStdNamespace(BuiltinID);
10974 if (!InStdNamespace &&
10979 if (
Context.BuiltinInfo.allowTypeMismatch(BuiltinID)) {
10980 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10987 Context.hasSameFunctionTypeIgnoringExceptionSpec(
10989 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
10994 NewFD->
addAttr(BuiltinAttr::CreateImplicit(
Context, BuiltinID));
11005 if (NewFD->
hasAttr<OverloadableAttr>() &&
11008 diag::err_attribute_overloadable_no_prototype)
11010 NewFD->
dropAttr<OverloadableAttr>();
11043 isMemberSpecialization ||
11044 isFunctionTemplateSpecialization,
11055 Context.setcudaConfigureCallDecl(NewFD);
11057 if (II->isStr(
CUDA().getGetParameterBufferFuncName()) &&
11063 Context.setcudaGetParameterBufferDecl(NewFD);
11065 if (II->isStr(
CUDA().getLaunchDeviceFuncName()) &&
11071 Context.setcudaLaunchDeviceDecl(NewFD);
11122 diag::err_friend_decl_with_enclosing_temp_constraint_must_be_def);
11142 if (
getLangOpts().getOpenCLCompatibleVersion() >= 200) {
11144 QualType ElemTy = PipeTy->getElementType();
11146 Diag(Param->getTypeSpecStartLoc(), diag::err_reference_pipe_type);
11152 if (
Context.getTargetInfo().getTriple().isWasm()) {
11154 Diag(Param->getTypeSpecStartLoc(),
11155 diag::err_wasm_table_as_function_parameter);
11163 if (
const auto *
attr = NewFD->
getAttr<AvailabilityAttr>()) {
11164 if (NewFD->
hasAttr<ConstructorAttr>()) {
11165 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11167 NewFD->
dropAttr<AvailabilityAttr>();
11169 if (NewFD->
hasAttr<DestructorAttr>()) {
11170 Diag(
attr->getLocation(), diag::warn_availability_on_static_initializer)
11172 NewFD->
dropAttr<AvailabilityAttr>();
11183 if (
const auto *NBA = NewFD->
getAttr<NoBuiltinAttr>())
11187 Diag(NBA->getLocation(),
11188 diag::err_attribute_no_builtin_on_defaulted_deleted_function)
11189 << NBA->getSpelling();
11192 Diag(NBA->getLocation(), diag::err_attribute_no_builtin_on_non_definition)
11193 << NBA->getSpelling();
11202 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
11226 const auto *Method = dyn_cast<CXXMethodDecl>(FD);
11230 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11241 while ((Parent = dyn_cast<CXXRecordDecl>(Parent->
getParent()))) {
11242 if (
const auto *SAttr = Parent->
getAttr<CodeSegAttr>()) {
11252 bool IsDefinition) {
11255 if (!FD->
hasAttr<SectionAttr>() && IsDefinition &&
11257 return SectionAttr::CreateImplicit(
11259 CodeSegStack.CurrentPragmaLocation, SectionAttr::Declspec_allocate);
11307 auto *VD = dyn_cast<ValueDecl>(D);
11308 auto *PrevVD = dyn_cast<ValueDecl>(PrevDecl);
11309 return !VD || !PrevVD ||
11311 PrevVD->getType());
11319 const auto *TA = FD->
getAttr<TargetAttr>();
11320 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11322 assert((TA || TVA) &&
"Expecting target or target_version attribute");
11335 for (
const auto &Feat : ParseInfo.
Features) {
11336 auto BareFeat = StringRef{Feat}.substr(1);
11337 if (Feat[0] ==
'-') {
11339 <<
Feature << (
"no-" + BareFeat).str();
11359 for (
auto &Feat : ParseInfo.
Features)
11360 Feats.push_back(StringRef{Feat}.substr(1));
11363 TVA->getFeatures(Feats);
11365 for (
const auto &Feat : Feats) {
11385 case attr::ArmLocallyStreaming:
11390 case attr::NonNull:
11391 case attr::NoThrow:
11400 const auto Diagnose = [FD, CausedFD, MVKind](
Sema &S,
const Attr *A) {
11401 S.
Diag(FD->
getLocation(), diag::err_multiversion_disallowed_other_attr)
11402 <<
static_cast<unsigned>(MVKind) << A;
11404 S.
Diag(CausedFD->
getLocation(), diag::note_multiversioning_caused_here);
11409 switch (A->getKind()) {
11410 case attr::CPUDispatch:
11411 case attr::CPUSpecific:
11414 return Diagnose(S, A);
11418 return Diagnose(S, A);
11420 case attr::TargetVersion:
11423 return Diagnose(S, A);
11425 case attr::TargetClones:
11428 return Diagnose(S, A);
11432 return Diagnose(S, A);
11445 bool ConstexprSupported,
bool CLinkageMayDiffer) {
11446 enum DoesntSupport {
11453 DefaultedFuncs = 6,
11454 ConstexprFuncs = 7,
11455 ConstevalFuncs = 8,
11467 if (NoProtoDiagID.
getDiagID() != 0 && OldFD &&
11470 Diag(NoteCausedDiagIDAt.first, NoteCausedDiagIDAt.second);
11478 if (!TemplatesSupported &&
11480 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11483 if (
const auto *NewCXXFD = dyn_cast<CXXMethodDecl>(NewFD)) {
11484 if (NewCXXFD->isVirtual())
11485 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11489 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11493 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11498 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11502 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11506 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11507 << (NewFD->
isConsteval() ? ConstevalFuncs : ConstexprFuncs);
11511 QualType NewReturnType = NewType->getReturnType();
11514 return Diag(NoSupportDiagIDAt.first, NoSupportDiagIDAt.second)
11527 bool ArmStreamingCCMismatched =
false;
11528 if (OldFPT && NewFPT) {
11535 ArmStreamingCCMismatched =
true;
11538 if (OldTypeInfo.
getCC() != NewTypeInfo.
getCC() || ArmStreamingCCMismatched)
11541 QualType OldReturnType = OldType->getReturnType();
11543 if (OldReturnType != NewReturnType)
11544 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ReturnType;
11547 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << ConstexprSpec;
11550 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) << InlineSpec;
11553 return Diag(DiffDiagIDAt.first, DiffDiagIDAt.second) <<
Linkage;
11576 bool IsCPUSpecificCPUDispatchMVKind =
11580 if (CausesMV && OldFD &&
11588 if (OldFD && CausesMV && OldFD->
isUsed(
false)) {
11595 OldFD, NewFD, S.
PDiag(diag::err_multiversion_noproto),
11597 S.
PDiag(diag::note_multiversioning_caused_here)),
11599 S.
PDiag(diag::err_multiversion_doesnt_support)
11600 <<
static_cast<unsigned>(MVKind)),
11602 S.
PDiag(diag::err_multiversion_diff)),
11604 !IsCPUSpecificCPUDispatchMVKind,
11617 "Function lacks multiversion attribute");
11618 const auto *TA = FD->
getAttr<TargetAttr>();
11619 const auto *TVA = FD->
getAttr<TargetVersionAttr>();
11622 if (TA && !TA->isDefaultVersion())
11659 To->
addAttr(TargetVersionAttr::CreateImplicit(
11670 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11671 const auto *OldTA = OldFD->
getAttr<TargetAttr>();
11672 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11673 const auto *OldTVA = OldFD->
getAttr<TargetVersionAttr>();
11675 assert((NewTA || NewTVA) &&
"Excpecting target or target_version attribute");
11684 if (NewTA && !NewTA->isDefaultVersion() &&
11685 (!OldTA || OldTA->getFeaturesStr() == NewTA->getFeaturesStr()))
11702 if ((NewTA && NewTA->isDefaultVersion() && !OldTA) ||
11703 (NewTVA && NewTVA->isDefaultVersion() && !OldTVA)) {
11712 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11720 OldTA->getFeaturesStr());
11724 NewTA->getFeaturesStr());
11727 if (OldParsed == NewParsed) {
11735 for (
const auto *FD : OldFD->
redecls()) {
11736 const auto *CurTA = FD->
getAttr<TargetAttr>();
11737 const auto *CurTVA = FD->
getAttr<TargetVersionAttr>();
11741 ((NewTA && (!CurTA || CurTA->isInherited())) ||
11742 (NewTVA && (!CurTVA || CurTVA->isInherited())))) {
11744 << (NewTA ? 0 : 2);
11745 S.
Diag(NewFD->
getLocation(), diag::note_multiversioning_caused_here);
11792 const CPUDispatchAttr *NewCPUDisp,
const CPUSpecificAttr *NewCPUSpec,
11808 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
11809 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
11816 NewTA->getFeaturesStr());
11821 NewTVA->getFeatures(NewFeats);
11822 llvm::sort(NewFeats);
11825 bool UseMemberUsingDeclRules =
11828 bool MayNeedOverloadableChecks =
11837 if (MayNeedOverloadableChecks &&
11838 S.
IsOverload(NewFD, CurFD, UseMemberUsingDeclRules))
11841 switch (NewMVKind) {
11844 "Only target_clones can be omitted in subsequent declarations");
11847 const auto *CurTA = CurFD->
getAttr<TargetAttr>();
11848 if (CurTA->getFeaturesStr() == NewTA->getFeaturesStr()) {
11857 CurTA->getFeaturesStr());
11859 if (CurParsed == NewParsed) {
11868 if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11869 if (CurTVA->getName() == NewTVA->getName()) {
11876 CurTVA->getFeatures(CurFeats);
11877 llvm::sort(CurFeats);
11879 if (CurFeats == NewFeats) {
11885 }
else if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11887 if (NewFeats.empty())
11890 for (
unsigned I = 0; I < CurClones->featuresStrs_size(); ++I) {
11892 CurClones->getFeatures(CurFeats, I);
11893 llvm::sort(CurFeats);
11895 if (CurFeats == NewFeats) {
11906 assert(NewClones &&
"MultiVersionKind does not match attribute type");
11907 if (
const auto *CurClones = CurFD->
getAttr<TargetClonesAttr>()) {
11908 if (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() ||
11909 !std::equal(CurClones->featuresStrs_begin(),
11910 CurClones->featuresStrs_end(),
11911 NewClones->featuresStrs_begin())) {
11917 }
else if (
const auto *CurTVA = CurFD->
getAttr<TargetVersionAttr>()) {
11919 CurTVA->getFeatures(CurFeats);
11920 llvm::sort(CurFeats);
11923 if (CurFeats.empty())
11926 for (
unsigned I = 0; I < NewClones->featuresStrs_size(); ++I) {
11928 NewClones->getFeatures(NewFeats, I);
11929 llvm::sort(NewFeats);
11931 if (CurFeats == NewFeats) {
11947 const auto *CurCPUSpec = CurFD->
getAttr<CPUSpecificAttr>();
11948 const auto *CurCPUDisp = CurFD->
getAttr<CPUDispatchAttr>();
11953 CurFD->
hasAttr<CPUDispatchAttr>()) {
11954 if (CurCPUDisp->cpus_size() == NewCPUDisp->cpus_size() &&
11956 CurCPUDisp->cpus_begin(), CurCPUDisp->cpus_end(),
11957 NewCPUDisp->cpus_begin(),
11959 return Cur->getName() == New->getName();
11974 if (CurCPUSpec->cpus_size() == NewCPUSpec->cpus_size() &&
11976 CurCPUSpec->cpus_begin(), CurCPUSpec->cpus_end(),
11977 NewCPUSpec->cpus_begin(),
11979 return Cur->getName() == New->getName();
11990 if (CurII == NewII) {
12060 const auto *NewTA = NewFD->
getAttr<TargetAttr>();
12061 const auto *NewTVA = NewFD->
getAttr<TargetVersionAttr>();
12062 const auto *NewCPUDisp = NewFD->
getAttr<CPUDispatchAttr>();
12063 const auto *NewCPUSpec = NewFD->
getAttr<CPUSpecificAttr>();
12064 const auto *NewClones = NewFD->
getAttr<TargetClonesAttr>();
12074 NewTVA->isDefaultVersion())) {
12075 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_not_allowed_on_main);
12083 if (NewTA && TI.
getTriple().isAArch64())
12110 S.
Diag(NewFD->
getLocation(), diag::err_multiversion_required_in_redecl)
12123 if (OldFD->
isUsed(
false)) {
12125 return S.
Diag(NewFD->
getLocation(), diag::err_multiversion_after_used);
12147 bool IsPure = NewFD->
hasAttr<PureAttr>();
12148 bool IsConst = NewFD->
hasAttr<ConstAttr>();
12151 if (!IsPure && !IsConst)
12158 if (IsPure && IsConst) {
12168 NewFD->
dropAttrs<PureAttr, ConstAttr>();
12174 bool IsMemberSpecialization,
12177 "Variably modified return types are not handled here");
12182 bool MergeTypeWithPrevious = !
getLangOpts().CPlusPlus &&
12187 bool MayNeedOverloadableChecks =
false;
12199 if (shouldLinkPossiblyHiddenDecl(Candidate, NewFD)) {
12201 OldDecl = Candidate;
12204 MayNeedOverloadableChecks =
true;
12229 OldDecl =
Previous.getFoundDecl();
12230 MergeTypeWithPrevious =
false;
12233 if (OldDecl->
hasAttr<OverloadableAttr>() ||
12234 NewFD->
hasAttr<OverloadableAttr>()) {
12236 MayNeedOverloadableChecks =
true;
12248 if (
Context.getTargetInfo().getTriple().isPPC64() &&
12299 OldMD = dyn_cast_or_null<CXXMethodDecl>(OldDecl->
getAsFunction());
12300 if (!OldMD || !OldMD->
isStatic()) {
12335 dyn_cast<FunctionTemplateDecl>(OldDecl)) {
12336 auto *OldFD = OldTemplateDecl->getTemplatedDecl();
12339 assert(NewTemplateDecl &&
"Template/non-template mismatch");
12348 NewFD->
setAccess(OldTemplateDecl->getAccess());
12349 NewTemplateDecl->
setAccess(OldTemplateDecl->getAccess());
12354 if (IsMemberSpecialization &&
12357 assert(OldTemplateDecl->isMemberSpecialization());
12360 if (OldFD->isDeleted()) {
12362 assert(OldFD->getCanonicalDecl() == OldFD);
12364 OldFD->setDeletedAsWritten(
false);
12378 !NewFD->
getAttr<OverloadableAttr>()) {
12382 return ND->hasAttr<OverloadableAttr>();
12384 "Non-redecls shouldn't happen without overloadable present");
12387 const auto *FD = dyn_cast<FunctionDecl>(ND);
12388 return FD && !FD->
hasAttr<OverloadableAttr>();
12391 if (OtherUnmarkedIter !=
Previous.end()) {
12393 diag::err_attribute_overloadable_multiple_unmarked_overloads);
12394 Diag((*OtherUnmarkedIter)->getLocation(),
12395 diag::note_attribute_overloadable_prev_overload)
12405 if (NewFD->
hasAttr<SYCLKernelEntryPointAttr>())
12408 if (NewFD->
hasAttr<SYCLExternalAttr>())
12418 dyn_cast<CXXDestructorDecl>(NewFD)) {
12426 !
Destructor->getFunctionObjectParameterType()->isDependentType()) {
12431 Context.DeclarationNames.getCXXDestructorName(ClassType);
12438 }
else if (
auto *Guide = dyn_cast<CXXDeductionGuideDecl>(NewFD)) {
12439 if (
auto *TD = Guide->getDescribedFunctionTemplate())
12445 Diag(Guide->getBeginLoc(), diag::err_deduction_guide_specialized)
12451 if (!
Method->isFunctionTemplateSpecialization() &&
12452 !
Method->getDescribedFunctionTemplate() &&
12453 Method->isCanonicalDecl()) {
12460 diag::err_constrained_virtual_method);
12500 Diag(NewFD->
getLocation(), diag::warn_return_value_udt) << NewFD << R;
12513 auto HasNoexcept = [&](
QualType T) ->
bool {
12518 T = RT->getPointeeType();
12519 else if (
T->isAnyPointerType())
12520 T =
T->getPointeeType();
12522 T = MPT->getPointeeType();
12524 if (FPT->isNothrow())
12530 bool AnyNoexcept = HasNoexcept(FPT->getReturnType());
12532 AnyNoexcept |= HasNoexcept(
T);
12535 diag::warn_cxx17_compat_exception_spec_in_signature)
12540 bool IsKernel = NewFD->
hasAttr<CUDAGlobalAttr>();
12542 if (!Parm->getType()->isDependentType() &&
12543 Parm->hasAttr<CUDAGridConstantAttr>() &&
12544 !(IsKernel && Parm->getType().isConstQualified()))
12545 Diag(Parm->getAttr<CUDAGridConstantAttr>()->getLocation(),
12546 diag::err_cuda_grid_constant_not_allowed);
12552 if (DeclIsDefn &&
Context.getTargetInfo().getTriple().isAArch64())
12562 Diag(FD->
getLocation(), diag::ext_main_invalid_linkage_specification);
12573 ? diag::err_static_main : diag::warn_static_main)
12581 Diag(NoreturnLoc, diag::ext_noreturn_main);
12582 Diag(NoreturnLoc, diag::note_main_remove_noreturn)
12594 << FD->
hasAttr<DeviceKernelAttr>();
12599 if (FD->
hasAttr<SYCLExternalAttr>()) {
12601 << FD->
getAttr<SYCLExternalAttr>();
12612 assert(
T->isFunctionType() &&
"function decl is not of function type");
12634 Diag(RTRange.
getBegin(), diag::note_main_change_return_type)
12659 Diag(start, diag::warn_main_in_named_module)
12671 bool HasExtraParameters = (nparams > 3);
12682 if (nparams == 4 &&
Context.getTargetInfo().getTriple().isOSDarwin())
12683 HasExtraParameters =
false;
12685 if (HasExtraParameters) {
12698 for (
unsigned i = 0; i < nparams; ++i) {
12701 bool mismatch =
true;
12718 mismatch = !qs.
empty();
12747 if (
T.isOSCygMing())
12752 if (
T.isOSWindows() &&
T.getArch() == llvm::Triple::x86)
12760 assert(
T->isFunctionType() &&
"function decl is not of function type");
12769 if (FD->
getName() !=
"DllMain")
12776 FT =
Context.adjustFunctionType(
12781 FT =
Context.adjustFunctionType(FT,
12803 if (
Init->isValueDependent()) {
12804 assert(
Init->containsErrors() &&
12805 "Dependent code should only occur in error-recovery path.");
12808 const Expr *Culprit;
12809 if (
Init->isConstantInitializer(
Context,
false, &Culprit))
12818 class SelfReferenceChecker
12824 bool isReferenceType;
12825 bool isInCXXOperatorCall;
12833 SelfReferenceChecker(
Sema &S,
Decl *OrigDecl) : Inherited(S.Context),
12834 S(S), OrigDecl(OrigDecl) {
12837 isReferenceType =
false;
12838 isInCXXOperatorCall =
false;
12839 isInitList =
false;
12840 if (
ValueDecl *VD = dyn_cast<ValueDecl>(OrigDecl)) {
12841 isPODType = VD->getType().isPODType(S.
Context);
12843 isReferenceType = VD->getType()->isReferenceType();
12850 void CheckExpr(Expr *E) {
12851 InitListExpr *InitList = dyn_cast<InitListExpr>(E);
12859 InitFieldIndex.push_back(0);
12860 for (
auto *Child : InitList->
children()) {
12862 ++InitFieldIndex.back();
12864 InitFieldIndex.pop_back();
12869 bool CheckInitListMemberExpr(MemberExpr *E,
bool CheckReference) {
12870 llvm::SmallVector<FieldDecl*, 4> Fields;
12872 bool ReferenceField =
false;
12875 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12876 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
12879 Fields.push_back(FD);
12881 ReferenceField =
true;
12882 Base = ME->getBase()->IgnoreParenImpCasts();
12886 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base);
12887 if (!DRE || DRE->
getDecl() != OrigDecl)
12891 if (CheckReference && !ReferenceField)
12895 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
12896 for (
const FieldDecl *I : llvm::reverse(Fields))
12897 UsedFieldIndex.push_back(I->getFieldIndex());
12902 for (
auto UsedIter = UsedFieldIndex.begin(),
12903 UsedEnd = UsedFieldIndex.end(),
12904 OrigIter = InitFieldIndex.begin(),
12905 OrigEnd = InitFieldIndex.end();
12906 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
12907 if (*UsedIter < *OrigIter)
12909 if (*UsedIter > *OrigIter)
12914 HandleDeclRefExpr(DRE);
12921 void HandleValue(Expr *E) {
12923 if (DeclRefExpr* DRE = dyn_cast<DeclRefExpr>(E)) {
12924 HandleDeclRefExpr(DRE);
12928 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
12929 Visit(CO->getCond());
12930 HandleValue(CO->getTrueExpr());
12931 HandleValue(CO->getFalseExpr());
12935 if (BinaryConditionalOperator *BCO =
12936 dyn_cast<BinaryConditionalOperator>(E)) {
12937 Visit(BCO->getCond());
12938 HandleValue(BCO->getFalseExpr());
12942 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
12943 if (Expr *SE = OVE->getSourceExpr())
12948 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
12949 if (BO->getOpcode() == BO_Comma) {
12950 Visit(BO->getLHS());
12951 HandleValue(BO->getRHS());
12964 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
12968 Base = ME->getBase()->IgnoreParenImpCasts();
12970 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base))
12971 HandleDeclRefExpr(DRE);
12980 void VisitDeclRefExpr(DeclRefExpr *E) {
12981 if (isReferenceType)
12982 HandleDeclRefExpr(E);
12985 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
12991 Inherited::VisitImplicitCastExpr(E);
12994 void VisitMemberExpr(MemberExpr *E) {
12996 if (CheckInitListMemberExpr(E,
true ))
13005 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(E->
getMemberDecl());
13006 bool Warn = (MD && !MD->
isStatic());
13008 while (MemberExpr *ME = dyn_cast<MemberExpr>(Base)) {
13011 Base = ME->getBase()->IgnoreParenImpCasts();
13014 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
13016 HandleDeclRefExpr(DRE);
13025 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13026 llvm::SaveAndRestore CxxOpCallScope(isInCXXOperatorCall,
true);
13030 return Inherited::VisitCXXOperatorCallExpr(E);
13034 HandleValue(Arg->IgnoreParenImpCasts());
13038 if (!isInCXXOperatorCall) {
13039 Inherited::VisitLambdaExpr(E);
13044 if (DeclRefExpr *DRE = dyn_cast_if_present<DeclRefExpr>(
Init))
13045 HandleDeclRefExpr(DRE);
13050 void VisitUnaryOperator(UnaryOperator *E) {
13064 Inherited::VisitUnaryOperator(E);
13067 void VisitObjCMessageExpr(ObjCMessageExpr *E) {}
13069 void VisitCXXConstructExpr(CXXConstructExpr *E) {
13071 Expr *ArgExpr = E->
getArg(0);
13072 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
13073 if (ILE->getNumInits() == 1)
13074 ArgExpr = ILE->getInit(0);
13075 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
13076 if (ICE->getCastKind() == CK_NoOp)
13077 ArgExpr = ICE->getSubExpr();
13078 HandleValue(ArgExpr);
13081 Inherited::VisitCXXConstructExpr(E);
13084 void VisitCallExpr(CallExpr *E) {
13087 HandleValue(E->
getArg(0));
13091 Inherited::VisitCallExpr(E);
13094 void VisitBinaryOperator(BinaryOperator *E) {
13096 HandleValue(E->
getLHS());
13101 Inherited::VisitBinaryOperator(E);
13107 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
13112 void HandleDeclRefExpr(DeclRefExpr *DRE) {
13114 if (OrigDecl != ReferenceDecl)
return;
13116 if (isReferenceType) {
13117 diag = diag::warn_uninit_self_reference_in_reference_init;
13119 diag = diag::warn_static_self_reference_in_init;
13123 diag = diag::warn_uninit_self_reference_in_init;
13137 static void CheckSelfReference(Sema &S, Decl* OrigDecl, Expr *E,
13147 if (
auto *VD = dyn_cast<VarDecl>(OrigDecl);
13148 VD && VD->isConstexpr() && VD->isFileVarDecl())
13156 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
13157 if (ICE->getCastKind() == CK_LValueToRValue)
13158 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr()))
13159 if (DRE->
getDecl() == OrigDecl)
13162 SelfReferenceChecker(S, OrigDecl).CheckExpr(E);
13169 struct VarDeclOrName {
13171 DeclarationName Name;
13173 friend const Sema::SemaDiagnosticBuilder &
13174 operator<<(
const Sema::SemaDiagnosticBuilder &
Diag, VarDeclOrName VN) {
13175 return VN.VDecl ?
Diag << VN.VDecl :
Diag << VN.Name;
13185 bool IsInitCapture = !VDecl;
13187 "init captures are expected to be deduced prior to initialization");
13189 VarDeclOrName VN{VDecl, Name};
13192 assert(Deduced &&
"deduceVarTypeFromInitializer for non-deduced type");
13196 !isa_and_present<StringLiteral, InitListExpr>(
Init)) {
13197 Diag(Range.getBegin(), diag::err_auto_not_allowed)
13198 << (int)Deduced->getContainedAutoType()->getKeyword()
13205 assert(VDecl &&
"no init for init capture deduction?");
13220 DeduceInits =
Init;
13222 auto *PL = dyn_cast_if_present<ParenListExpr>(
Init);
13224 DeduceInits = PL->exprs();
13227 assert(VDecl &&
"non-auto type for init capture deduction?");
13238 if (
auto *IL = dyn_cast<InitListExpr>(
Init))
13239 DeduceInits = IL->inits();
13243 if (DeduceInits.empty()) {
13246 Diag(
Init->getBeginLoc(), IsInitCapture
13247 ? diag::err_init_capture_no_expression
13248 : diag::err_auto_var_init_no_expression)
13249 << VN <<
Type << Range;
13253 if (DeduceInits.size() > 1) {
13254 Diag(DeduceInits[1]->getBeginLoc(),
13255 IsInitCapture ? diag::err_init_capture_multiple_expressions
13256 : diag::err_auto_var_init_multiple_expressions)
13257 << VN <<
Type << Range;
13261 Expr *DeduceInit = DeduceInits[0];
13263 Diag(
Init->getBeginLoc(), IsInitCapture
13264 ? diag::err_init_capture_paren_braces
13265 : diag::err_auto_var_init_paren_braces)
13271 bool DefaultedAnyToId =
false;
13273 Init->getType() ==
Context.UnknownAnyTy && !IsInitCapture) {
13275 if (
Result.isInvalid()) {
13279 DefaultedAnyToId =
true;
13289 Type.getQualifiers());
13297 if (!IsInitCapture)
13300 Diag(Range.getBegin(),
13301 diag::err_init_capture_deduction_failure_from_init_list)
13307 Diag(Range.getBegin(), diag::err_init_capture_deduction_failure)
13322 Diag(Loc, diag::warn_auto_var_is_id) << VN << Range;
13325 return DeducedType;
13330 assert(!
Init || !
Init->containsErrors());
13334 if (DeducedType.
isNull()) {
13343 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(VDecl))
13367 if (
auto *EWC = dyn_cast<ExprWithCleanups>(
Init))
13368 Init = EWC->getSubExpr();
13370 if (
auto *CE = dyn_cast<ConstantExpr>(
Init))
13371 Init = CE->getSubExpr();
13376 "shouldn't be called if type doesn't have a non-trivial C struct");
13377 if (
auto *ILE = dyn_cast<InitListExpr>(
Init)) {
13378 for (
auto *I : ILE->inits()) {
13379 if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
13380 !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
13406bool shouldIgnoreForRecordTriviality(
const FieldDecl *FD) {
13412 return FD->
hasAttr<UnavailableAttr>();
13415struct DiagNonTrivalCUnionDefaultInitializeVisitor
13422 DiagNonTrivalCUnionDefaultInitializeVisitor(
13425 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13428 const FieldDecl *FD,
bool InNonTrivialUnion) {
13431 InNonTrivialUnion);
13432 return Super::visitWithKind(PDIK, QT, FD, InNonTrivialUnion);
13435 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13436 bool InNonTrivialUnion) {
13437 if (InNonTrivialUnion)
13439 << 1 << 0 << QT << FD->
getName();
13442 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13443 if (InNonTrivialUnion)
13445 << 1 << 0 << QT << FD->
getName();
13448 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13450 if (RD->isUnion()) {
13451 if (OrigLoc.isValid()) {
13452 bool IsUnion =
false;
13453 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13454 IsUnion = OrigRD->isUnion();
13455 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13456 << 0 << OrigTy << IsUnion << UseContext;
13458 OrigLoc = SourceLocation();
13460 InNonTrivialUnion =
true;
13463 if (InNonTrivialUnion)
13464 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13467 for (
const FieldDecl *FD : RD->fields())
13468 if (!shouldIgnoreForRecordTriviality(FD))
13469 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13472 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13477 SourceLocation OrigLoc;
13482struct DiagNonTrivalCUnionDestructedTypeVisitor
13485 DestructedTypeVisitor<DiagNonTrivalCUnionDestructedTypeVisitor, void>;
13487 DiagNonTrivalCUnionDestructedTypeVisitor(QualType OrigTy,
13488 SourceLocation OrigLoc,
13491 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13494 const FieldDecl *FD,
bool InNonTrivialUnion) {
13497 InNonTrivialUnion);
13498 return Super::visitWithKind(DK, QT, FD, InNonTrivialUnion);
13501 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13502 bool InNonTrivialUnion) {
13503 if (InNonTrivialUnion)
13505 << 1 << 1 << QT << FD->
getName();
13508 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13509 if (InNonTrivialUnion)
13511 << 1 << 1 << QT << FD->
getName();
13514 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13516 if (RD->isUnion()) {
13517 if (OrigLoc.isValid()) {
13518 bool IsUnion =
false;
13519 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13520 IsUnion = OrigRD->isUnion();
13521 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13522 << 1 << OrigTy << IsUnion << UseContext;
13524 OrigLoc = SourceLocation();
13526 InNonTrivialUnion =
true;
13529 if (InNonTrivialUnion)
13530 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13533 for (
const FieldDecl *FD : RD->fields())
13534 if (!shouldIgnoreForRecordTriviality(FD))
13535 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13538 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13539 void visitCXXDestructor(QualType QT,
const FieldDecl *FD,
13540 bool InNonTrivialUnion) {}
13545 SourceLocation OrigLoc;
13550struct DiagNonTrivalCUnionCopyVisitor
13552 using Super = CopiedTypeVisitor<DiagNonTrivalCUnionCopyVisitor, false, void>;
13554 DiagNonTrivalCUnionCopyVisitor(QualType OrigTy, SourceLocation OrigLoc,
13556 : OrigTy(OrigTy), OrigLoc(OrigLoc), UseContext(UseContext), S(S) {}
13559 const FieldDecl *FD,
bool InNonTrivialUnion) {
13562 InNonTrivialUnion);
13563 return Super::visitWithKind(PCK, QT, FD, InNonTrivialUnion);
13566 void visitARCStrong(QualType QT,
const FieldDecl *FD,
13567 bool InNonTrivialUnion) {
13568 if (InNonTrivialUnion)
13570 << 1 << 2 << QT << FD->
getName();
13573 void visitARCWeak(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13574 if (InNonTrivialUnion)
13576 << 1 << 2 << QT << FD->
getName();
13579 void visitStruct(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13581 if (RD->isUnion()) {
13582 if (OrigLoc.isValid()) {
13583 bool IsUnion =
false;
13584 if (
auto *OrigRD = OrigTy->getAsRecordDecl())
13585 IsUnion = OrigRD->isUnion();
13586 S.
Diag(OrigLoc, diag::err_non_trivial_c_union_in_invalid_context)
13587 << 2 << OrigTy << IsUnion << UseContext;
13589 OrigLoc = SourceLocation();
13591 InNonTrivialUnion =
true;
13594 if (InNonTrivialUnion)
13595 S.
Diag(RD->getLocation(), diag::note_non_trivial_c_union)
13598 for (
const FieldDecl *FD : RD->fields())
13599 if (!shouldIgnoreForRecordTriviality(FD))
13600 asDerived().visit(FD->
getType(), FD, InNonTrivialUnion);
13603 void visitPtrAuth(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {
13604 if (InNonTrivialUnion)
13606 << 1 << 2 << QT << FD->
getName();
13610 const FieldDecl *FD,
bool InNonTrivialUnion) {}
13611 void visitTrivial(QualType QT,
const FieldDecl *FD,
bool InNonTrivialUnion) {}
13612 void visitVolatileTrivial(QualType QT,
const FieldDecl *FD,
13613 bool InNonTrivialUnion) {}
13618 SourceLocation OrigLoc;
13627 unsigned NonTrivialKind) {
13631 "shouldn't be called if type doesn't have a non-trivial C union");
13635 DiagNonTrivalCUnionDefaultInitializeVisitor(QT, Loc, UseContext, *
this)
13636 .visit(QT,
nullptr,
false);
13639 DiagNonTrivalCUnionDestructedTypeVisitor(QT, Loc, UseContext, *
this)
13640 .visit(QT,
nullptr,
false);
13642 DiagNonTrivalCUnionCopyVisitor(QT, Loc, UseContext, *
this)
13643 .visit(QT,
nullptr,
false);
13667 bool TargetIsInline = Dcl->
isInline();
13668 bool TargetWasTemplated =
13685 TargetWasTemplated =
13695 if (!TargetIsInline || TargetWasTemplated)
13705 if (
Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
13706 if (
Target->hasAttr<DLLExportAttr>() ||
Target->hasAttr<DLLImportAttr>())
13712 dyn_cast<CXXRecordDecl>(
Target->getDeclContext());
13713 if (Ctx && (Ctx->
hasAttr<DLLExportAttr>() || Ctx->
hasAttr<DLLImportAttr>()))
13735 T =
T.getNonReferenceType();
13736 if (
T->isFunctionType())
13738 if (!
T.isConstant(Ctx))
13740 if (
T->isPointerType())
13758 Diag(VD->
getLocation(), diag::warn_possible_object_duplication_mutable)
13759 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13771 Diag(
Init->getExprLoc(), diag::warn_possible_object_duplication_init)
13772 << VD <<
Context.getTargetInfo().shouldDLLImportComdatSymbols();
13778 auto ResetDeclForInitializer = llvm::make_scope_exit([
this]() {
13789 if (
auto *
Method = dyn_cast<CXXMethodDecl>(RealDecl)) {
13790 if (!
Method->isInvalidDecl()) {
13792 Diag(
Method->getLocation(), diag::err_member_function_initialization)
13793 <<
Method->getDeclName() <<
Init->getSourceRange();
13794 Method->setInvalidDecl();
13799 VarDecl *VDecl = dyn_cast<VarDecl>(RealDecl);
13801 assert(!
isa<FieldDecl>(RealDecl) &&
"field init shouldn't get here");
13810 if (
Expr *E = Recovery.
get())
13816 if (!
Init->getType().isNull() &&
Init->getType()->isWebAssemblyTableType()) {
13817 Diag(
Init->getExprLoc(), diag::err_wasm_table_art) << 0;
13824 if (
Init->containsErrors()) {
13839 Diag(VDecl->
getLocation(), diag::err_attribute_dllimport_data_definition);
13859 if (
const ArrayType *Array =
Context.getAsIncompleteArrayType(BaseDeclType))
13860 BaseDeclType = Array->getElementType();
13862 diag::err_typecheck_decl_incomplete_type)) {
13869 diag::err_abstract_type_in_decl,
13887 !(VDecl->
hasAttr<SelectAnyAttr>() || VDecl->
hasAttr<WeakAttr>())) {
13896 if (Def != VDecl &&
13916 Diag(
Init->getExprLoc(), diag::err_static_data_member_reinitialization)
13919 diag::note_previous_initializer)
13944 if (VDecl->
hasAttr<LoaderUninitializedAttr>()) {
13945 Diag(VDecl->
getLocation(), diag::err_loader_uninitialized_cant_init);
13951 if (!
HLSL().handleInitialization(VDecl,
Init))
13963 if (!
Result.isUsable()) {
13971 bool InitializedFromParenListExpr =
false;
13972 bool IsParenListInit =
false;
13979 if (
auto *CXXDirectInit = dyn_cast<ParenListExpr>(
Init)) {
13981 MultiExprArg(CXXDirectInit->getExprs(), CXXDirectInit->getNumExprs());
13982 InitializedFromParenListExpr =
true;
13983 }
else if (
auto *CXXDirectInit = dyn_cast<CXXParenListInitExpr>(
Init)) {
13984 Args = CXXDirectInit->getInitExprs();
13985 InitializedFromParenListExpr =
true;
13992 if (!
Result.isUsable()) {
14012 IsParenListInit = !InitSeq.
steps().empty() &&
14016 if (!
Init->getType().isNull() && !
Init->getType()->isDependentType() &&
14018 Context.getAsIncompleteArrayType(VDeclType) &&
14019 Context.getAsIncompleteArrayType(
Init->getType())) {
14048 if (VDecl->
hasAttr<BlocksAttr>())
14061 !
Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
14062 Init->getBeginLoc()))
14063 FSI->markSafeWeakUse(
Init);
14080 if (!
Result.isUsable()) {
14117 if (
auto *E = dyn_cast<ExprWithCleanups>(
Init))
14118 if (
auto *BE = dyn_cast<BlockExpr>(E->getSubExpr()->
IgnoreParens()))
14120 BE->getBlockDecl()->setCanAvoidCopyToHeap();
14155 <<
Init->getSourceRange();
14171 diag::ext_in_class_initializer_float_type_cxx11)
14172 << DclT <<
Init->getSourceRange();
14174 diag::note_in_class_initializer_float_type_cxx11)
14177 Diag(VDecl->
getLocation(), diag::ext_in_class_initializer_float_type)
14178 << DclT <<
Init->getSourceRange();
14181 Diag(
Init->getExprLoc(), diag::err_in_class_initializer_non_constant)
14182 <<
Init->getSourceRange();
14189 Diag(VDecl->
getLocation(), diag::err_in_class_initializer_literal_type)
14190 << DclT <<
Init->getSourceRange()
14196 << DclT <<
Init->getSourceRange();
14209 !
Context.getBaseElementType(VDecl->
getType()).isConstQualified()) &&
14217 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14230 if (!InitType.
isNull() &&
14248 if (InitializedFromParenListExpr) {
14249 assert(
DirectInit &&
"Call-style initializer must be direct init.");
14272 VarDecl *VD = dyn_cast<VarDecl>(D);
14276 if (
auto *DD = dyn_cast<DecompositionDecl>(D))
14277 for (
auto *BD : DD->bindings())
14278 BD->setInvalidDecl();
14291 Context.getBaseElementType(Ty),
14292 diag::err_typecheck_decl_incomplete_type)) {
14299 diag::err_abstract_type_in_decl,
14314 if (
VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {
14319 Diag(Var->getLocation(), diag::err_decomp_decl_requires_init) << Var;
14320 Var->setInvalidDecl();
14336 if (Var->isConstexpr() && !Var->isThisDeclarationADefinition() &&
14337 !Var->isThisDeclarationADemotedDefinition()) {
14338 if (Var->isStaticDataMember()) {
14342 !
Context.getTargetInfo().getCXXABI().isMicrosoft()) {
14343 Diag(Var->getLocation(),
14344 diag::err_constexpr_static_mem_var_requires_init)
14346 Var->setInvalidDecl();
14350 Diag(Var->getLocation(), diag::err_invalid_constexpr_var_decl);
14351 Var->setInvalidDecl();
14358 if (!Var->isInvalidDecl() &&
14360 Var->getStorageClass() !=
SC_Extern && !Var->getInit()) {
14361 bool HasConstExprDefaultConstructor =
false;
14362 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14363 for (
auto *Ctor : RD->ctors()) {
14364 if (Ctor->isConstexpr() && Ctor->getNumParams() == 0 &&
14365 Ctor->getMethodQualifiers().getAddressSpace() ==
14367 HasConstExprDefaultConstructor =
true;
14371 if (!HasConstExprDefaultConstructor) {
14372 Diag(Var->getLocation(), diag::err_opencl_constant_no_init);
14373 Var->setInvalidDecl();
14379 if (!Var->isInvalidDecl() && Var->hasAttr<HLSLVkConstantIdAttr>()) {
14380 Diag(Var->getLocation(), diag::err_specialization_const);
14381 Var->setInvalidDecl();
14385 if (!Var->isInvalidDecl() && RealDecl->
hasAttr<LoaderUninitializedAttr>()) {
14386 if (Var->getStorageClass() ==
SC_Extern) {
14387 Diag(Var->getLocation(), diag::err_loader_uninitialized_extern_decl)
14389 Var->setInvalidDecl();
14393 diag::err_typecheck_decl_incomplete_type)) {
14394 Var->setInvalidDecl();
14397 if (
CXXRecordDecl *RD = Var->getType()->getAsCXXRecordDecl()) {
14398 if (!RD->hasTrivialDefaultConstructor()) {
14399 Diag(Var->getLocation(), diag::err_loader_uninitialized_trivial_ctor);
14400 Var->setInvalidDecl();
14410 Var->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion())
14417 if (!Var->isStaticDataMember() || !Var->getAnyInitializer())
14433 !Var->hasLinkage() && !Var->isInvalidDecl() &&
14435 diag::err_typecheck_decl_incomplete_type))
14436 Var->setInvalidDecl();
14441 diag::err_abstract_type_in_decl,
14443 Var->setInvalidDecl();
14446 Diag(Var->getLocation(), diag::warn_private_extern);
14447 Diag(Var->getLocation(), diag::note_private_extern);
14450 if (
Context.getTargetInfo().allowDebugInfoForExternalRef() &&
14451 !Var->isInvalidDecl())
14462 if (!Var->isInvalidDecl()) {
14466 Var->getLocation(), ArrayT->getElementType(),
14467 diag::err_array_incomplete_or_sizeless_type))
14468 Var->setInvalidDecl();
14470 if (Var->getStorageClass() ==
SC_Static) {
14480 if (Var->isFirstDecl())
14482 diag::ext_typecheck_decl_incomplete_type,
14488 if (!Var->isInvalidDecl())
14499 if (Var->isConstexpr())
14500 Diag(Var->getLocation(), diag::err_constexpr_var_requires_const_init)
14503 Diag(Var->getLocation(),
14504 diag::err_typecheck_incomplete_array_needs_initializer);
14505 Var->setInvalidDecl();
14512 Diag(Var->getLocation(), diag::err_reference_var_requires_init)
14513 << Var <<
SourceRange(Var->getLocation(), Var->getLocation());
14522 if (Var->isInvalidDecl())
14525 if (!Var->hasAttr<AliasAttr>()) {
14528 diag::err_typecheck_decl_incomplete_type)) {
14529 Var->setInvalidDecl();
14538 diag::err_abstract_type_in_decl,
14540 Var->setInvalidDecl();
14547 unsigned DiagID = diag::warn_default_init_const_unsafe;
14548 if (Var->getStorageDuration() ==
SD_Static ||
14549 Var->getStorageDuration() ==
SD_Thread)
14550 DiagID = diag::warn_default_init_const;
14552 bool EmitCppCompat = !
Diags.isIgnored(
14553 diag::warn_cxx_compat_hack_fake_diagnostic_do_not_emit,
14554 Var->getLocation());
14556 Diag(Var->getLocation(), DiagID) <<
Type << EmitCppCompat;
14570 if (
const auto *CXXRecord =
14571 Context.getBaseElementType(
Type)->getAsCXXRecordDecl()) {
14575 if (!CXXRecord->isPOD())
14620 }
else if (
Init.isInvalid()) {
14638 VarDecl *VD = dyn_cast<VarDecl>(D);
14697 const char *PrevSpec;
14717 if (var->isInvalidDecl())
return;
14724 if (var->getTypeSourceInfo()->getType()->isBlockPointerType() &&
14726 Diag(var->getLocation(), diag::err_opencl_invalid_block_declaration)
14728 var->setInvalidDecl();
14736 var->hasLocalStorage()) {
14737 switch (var->getType().getObjCLifetime()) {
14750 if (var->hasLocalStorage() &&
14759 if (var->isThisDeclarationADefinition() &&
14760 var->getDeclContext()->getRedeclContext()->isFileContext() &&
14761 var->isExternallyVisible() && var->hasLinkage() &&
14762 !var->isInline() && !var->getDescribedVarTemplate() &&
14766 !
getDiagnostics().isIgnored(diag::warn_missing_variable_declarations,
14767 var->getLocation())) {
14769 VarDecl *prev = var->getPreviousDecl();
14774 Diag(var->getLocation(), diag::warn_missing_variable_declarations) << var;
14775 Diag(var->getTypeSpecStartLoc(), diag::note_static_for_internal_linkage)
14781 std::optional<bool> CacheHasConstInit;
14782 const Expr *CacheCulprit =
nullptr;
14783 auto checkConstInit = [&]()
mutable {
14784 const Expr *
Init = var->getInit();
14785 if (
Init->isInstantiationDependent())
14788 if (!CacheHasConstInit)
14789 CacheHasConstInit = var->getInit()->isConstantInitializer(
14790 Context, var->getType()->isReferenceType(), &CacheCulprit);
14791 return *CacheHasConstInit;
14795 if (var->getType().isDestructedType()) {
14799 Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);
14801 Diag(var->getLocation(), diag::note_use_thread_local);
14803 if (!checkConstInit()) {
14811 Diag(var->getLocation(), diag::note_use_thread_local);
14817 if (!var->getType()->isStructureType() && var->hasInit() &&
14820 unsigned NumInits = ILE->getNumInits();
14822 for (
unsigned I = 0; I < NumInits; ++I) {
14823 const auto *
Init = ILE->getInit(I);
14826 const auto *SL = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14830 unsigned NumConcat = SL->getNumConcatenated();
14834 if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {
14835 bool OnlyOneMissingComma =
true;
14836 for (
unsigned J = I + 1; J < NumInits; ++J) {
14837 const auto *
Init = ILE->getInit(J);
14840 const auto *SLJ = dyn_cast<StringLiteral>(
Init->IgnoreImpCasts());
14841 if (!SLJ || SLJ->getNumConcatenated() > 1) {
14842 OnlyOneMissingComma =
false;
14847 if (OnlyOneMissingComma) {
14849 for (
unsigned i = 0; i < NumConcat - 1; ++i)
14851 PP.getLocForEndOfToken(SL->getStrTokenLoc(i)),
","));
14853 Diag(SL->getStrTokenLoc(1),
14854 diag::warn_concatenated_literal_array_init)
14856 Diag(SL->getBeginLoc(),
14857 diag::note_concatenated_string_literal_silence);
14868 if (var->hasAttr<BlocksAttr>())
14872 bool GlobalStorage = var->hasGlobalStorage();
14873 bool IsGlobal = GlobalStorage && !var->isStaticLocal();
14875 bool HasConstInit =
true;
14878 Diag(var->getLocation(), diag::err_constexpr_var_requires_const_init)
14883 !
type->isDependentType() &&
Init && !
Init->isValueDependent() &&
14884 (GlobalStorage || var->isConstexpr() ||
14885 var->mightBeUsableInConstantExpressions(
Context))) {
14897 HasConstInit = checkConstInit();
14901 if (HasConstInit) {
14902 if (var->isStaticDataMember() && !var->isInline() &&
14903 var->getLexicalDeclContext()->isRecord() &&
14904 type->isIntegralOrEnumerationType()) {
14909 diag::ext_in_class_initializer_non_constant)
14910 <<
Init->getSourceRange();
14913 (void)var->checkForConstantInitialization(Notes);
14915 }
else if (CacheCulprit) {
14916 Notes.emplace_back(CacheCulprit->
getExprLoc(),
14917 PDiag(diag::note_invalid_subexpr_in_const_expr));
14922 HasConstInit = var->checkForConstantInitialization(Notes);
14925 if (HasConstInit) {
14927 }
else if (var->isConstexpr()) {
14931 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
14932 diag::note_invalid_subexpr_in_const_expr) {
14933 DiagLoc = Notes[0].first;
14936 Diag(DiagLoc, diag::err_constexpr_var_requires_const_init)
14937 << var <<
Init->getSourceRange();
14938 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
14939 Diag(Notes[I].first, Notes[I].second);
14940 }
else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {
14941 auto *
Attr = var->getAttr<ConstInitAttr>();
14942 Diag(var->getLocation(), diag::err_require_constant_init_failed)
14943 <<
Init->getSourceRange();
14946 for (
auto &it : Notes)
14947 Diag(it.first, it.second);
14948 }
else if (var->isStaticDataMember() && !var->isInline() &&
14949 var->getLexicalDeclContext()->isRecord()) {
14950 Diag(var->getLocation(), diag::err_in_class_initializer_non_constant)
14951 <<
Init->getSourceRange();
14952 for (
auto &it : Notes)
14953 Diag(it.first, it.second);
14954 var->setInvalidDecl();
14955 }
else if (IsGlobal &&
14957 var->getLocation())) {
14966 if (!checkConstInit())
14967 Diag(var->getLocation(), diag::warn_global_constructor)
14968 <<
Init->getSourceRange();
14974 if (GlobalStorage && var->isThisDeclarationADefinition() &&
14979 Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment();
14980 std::optional<QualType::NonConstantStorageReason> Reason;
14981 if (HasConstInit &&
14982 !(Reason = var->getType().isNonConstantStorage(
Context,
true,
false))) {
14988 if (
const SectionAttr *SA = var->getAttr<SectionAttr>()) {
14995 var->getType().isConstQualified()) {
14997 NonConstNonReferenceType) &&
14998 "This case should've already been handled elsewhere");
14999 Diag(var->getLocation(), diag::warn_section_msvc_compat)
15000 << var <<
ConstSegStack.CurrentValue << (int)(!HasConstInit
15006 var->addAttr(SectionAttr::CreateImplicit(
Context, SectionName,
15008 SectionAttr::Declspec_allocate));
15010 var->dropAttr<SectionAttr>();
15025 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15026 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15033 if (!
type->isDependentType())
15039 if (
Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
15040 Context.addModuleInitializer(ModuleScopes.back().Module, var);
15043 if (
auto *DD = dyn_cast<DecompositionDecl>(var))
15054 !FD->
hasAttr<DLLExportStaticLocalAttr>() &&
15055 !FD->
hasAttr<DLLImportStaticLocalAttr>()) {
15065 NewAttr->setInherited(
true);
15067 }
else if (
Attr *A = FD->
getAttr<DLLExportStaticLocalAttr>()) {
15068 auto *NewAttr = DLLExportAttr::CreateImplicit(
getASTContext(), *A);
15069 NewAttr->setInherited(
true);
15074 if (!FD->
hasAttr<DLLExportAttr>())
15077 }
else if (
Attr *A = FD->
getAttr<DLLImportStaticLocalAttr>()) {
15078 auto *NewAttr = DLLImportAttr::CreateImplicit(
getASTContext(), *A);
15079 NewAttr->setInherited(
true);
15090 if (
unsigned MaxAlign =
Context.getTargetInfo().getMaxTLSAlign()) {
15095 if (
Context.getDeclAlign(VD) > MaxAlignChars) {
15108 VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl);
15120 VD->
addAttr(PragmaClangBSSSectionAttr::CreateImplicit(
15124 VD->
addAttr(PragmaClangDataSectionAttr::CreateImplicit(
15128 VD->
addAttr(PragmaClangRodataSectionAttr::CreateImplicit(
15132 VD->
addAttr(PragmaClangRelroSectionAttr::CreateImplicit(
15137 if (
auto *DD = dyn_cast<DecompositionDecl>(ThisDecl)) {
15138 for (
auto *BD : DD->bindings()) {
15143 CheckInvalidBuiltinCountedByRef(VD->
getInit(),
15166 if (
const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {
15173 bool IsClassTemplateMember =
15175 Context->getDescribedClassTemplate();
15178 IsClassTemplateMember
15179 ? diag::warn_attribute_dllimport_static_field_definition
15180 : diag::err_attribute_dllimport_static_field_definition);
15181 Diag(IA->getLocation(), diag::note_attribute);
15182 if (!IsClassTemplateMember)
15210 if (RetainAttr *
Attr = VD->
getAttr<RetainAttr>()) {
15230 if (!VD->
hasAttr<TypeTagForDatatypeAttr>() ||
15234 for (
const auto *I : ThisDecl->
specific_attrs<TypeTagForDatatypeAttr>()) {
15236 if (!MagicValueExpr) {
15239 std::optional<llvm::APSInt> MagicValueInt;
15241 Diag(I->getRange().getBegin(),
15242 diag::err_type_tag_for_datatype_not_ice)
15246 if (MagicValueInt->getActiveBits() > 64) {
15247 Diag(I->getRange().getBegin(),
15248 diag::err_type_tag_for_datatype_too_large)
15252 uint64_t MagicValue = MagicValueInt->getZExtValue();
15255 I->getMatchingCType(),
15256 I->getLayoutCompatible(),
15257 I->getMustBeNull());
15262 auto *VD = dyn_cast<VarDecl>(DD);
15263 return VD && !VD->getType()->hasAutoForTrailingReturnType();
15275 bool DiagnosedMultipleDecomps =
false;
15277 bool DiagnosedNonDeducedAuto =
false;
15279 for (
Decl *D : Group) {
15284 if (
auto *VD = dyn_cast<VarDecl>(D);
15285 LangOpts.OpenMP && VD && VD->hasAttr<OMPDeclareTargetDeclAttr>() &&
15286 VD->hasGlobalStorage())
15290 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
15291 if (!FirstDeclaratorInGroup)
15292 FirstDeclaratorInGroup = DD;
15293 if (!FirstDecompDeclaratorInGroup)
15294 FirstDecompDeclaratorInGroup = dyn_cast<DecompositionDecl>(D);
15297 FirstNonDeducedAutoInGroup = DD;
15299 if (FirstDeclaratorInGroup != DD) {
15302 if (FirstDecompDeclaratorInGroup && !DiagnosedMultipleDecomps) {
15304 diag::err_decomp_decl_not_alone)
15306 << DD->getSourceRange();
15307 DiagnosedMultipleDecomps =
true;
15313 if (FirstNonDeducedAutoInGroup && !DiagnosedNonDeducedAuto) {
15315 diag::err_auto_non_deduced_not_alone)
15316 << FirstNonDeducedAutoInGroup->
getType()
15319 << DD->getSourceRange();
15320 DiagnosedNonDeducedAuto =
true;
15325 Decls.push_back(D);
15331 if (FirstDeclaratorInGroup && !Tag->hasNameForLinkage() &&
15333 Context.addDeclaratorForUnnamedTagDecl(Tag, FirstDeclaratorInGroup);
15345 if (Group.size() > 1) {
15347 VarDecl *DeducedDecl =
nullptr;
15348 for (
unsigned i = 0, e = Group.size(); i != e; ++i) {
15349 VarDecl *D = dyn_cast<VarDecl>(Group[i]);
15353 if (!DT || DT->getDeducedType().isNull())
15356 Deduced = DT->getDeducedType();
15358 }
else if (!
Context.hasSameType(DT->getDeducedType(), Deduced)) {
15359 auto *AT = dyn_cast<AutoType>(DT);
15361 diag::err_auto_different_deductions)
15362 << (AT ? (
unsigned)AT->getKeyword() : 3) << Deduced
15363 << DeducedDecl->
getDeclName() << DT->getDeducedType()
15387 if (Group.empty() || !Group[0])
15390 if (
Diags.isIgnored(diag::warn_doc_param_not_found,
15391 Group[0]->getLocation()) &&
15392 Diags.isIgnored(diag::warn_unknown_comment_command_name,
15393 Group[0]->getLocation()))
15396 if (Group.size() >= 2) {
15404 Decl *MaybeTagDecl = Group[0];
15406 Group = Group.slice(1);
15459 const auto *VD = dyn_cast<ValueDecl>(D);
15473 unsigned Kind = TD->isEnum() ? 2 : TD->isUnion() ? 1 : 0;
15475 Diag(TD->getLocation(), diag::note_declared_at);
15481 if (!ExplicitThisLoc.
isValid())
15484 "explicit parameter in non-cplusplus mode");
15486 S.
Diag(ExplicitThisLoc, diag::err_cxx20_deducing_this)
15498 LSI->ExplicitObjectParameter = P;
15521 ? diag::ext_register_storage_class
15522 : diag::warn_deprecated_register)
15528 diag::err_invalid_storage_class_in_func_decl)
15537 diag::err_invalid_storage_class_in_func_decl);
15549 << 0 <<
static_cast<int>(D.
getDeclSpec().getConstexprSpecifier());
15570 PrevDecl =
nullptr;
15587 diag::err_hlsl_incomplete_resource_array_in_function_param);
15599 New->setInvalidDecl();
15618 Diag(
New->getLocation(), diag::err_module_private_local)
15622 if (
New->hasAttr<BlocksAttr>()) {
15623 Diag(
New->getLocation(), diag::err_block_on_nonlocal);
15639 T,
Context.getTrivialTypeSourceInfo(
T, Loc),
15641 Param->setImplicit();
15654 !
Parameter->getIdentifier()->isPlaceholder()) {
15655 Diag(
Parameter->getLocation(), diag::warn_unused_parameter)
15663 if (
LangOpts.NumLargeByValueCopy == 0)
15669 unsigned Size =
Context.getTypeSizeInChars(ReturnTy).getQuantity();
15670 if (Size >
LangOpts.NumLargeByValueCopy)
15678 if (
T->isDependentType() || !
T.isPODType(
Context))
15680 unsigned Size =
Context.getTypeSizeInChars(
T).getQuantity();
15681 if (Size >
LangOpts.NumLargeByValueCopy)
15694 T->isObjCLifetimeType()) {
15701 if (
T->isArrayType()) {
15702 if (!
T.isConstQualified()) {
15706 NameLoc, diag::err_arc_array_param_no_ownership,
T,
false));
15708 Diag(NameLoc, diag::err_arc_array_param_no_ownership)
15713 lifetime =
T->getObjCARCImplicitLifetime();
15715 T =
Context.getLifetimeQualifiedType(
T, lifetime);
15719 Context.getAdjustedParameterType(
T),
15720 TSInfo, SC,
nullptr);
15725 if (
New->isParameterPack())
15727 CSI->LocalPacks.push_back(
New);
15729 if (
New->getType().hasNonTrivialToPrimitiveDestructCUnion() ||
15730 New->getType().hasNonTrivialToPrimitiveCopyCUnion())
15737 if (
T->isObjCObjectType()) {
15741 diag::err_object_cannot_be_passed_returned_by_value) << 1 <<
T
15743 T =
Context.getObjCObjectPointerType(
T);
15748 if (
T.getPointerAuth()) {
15749 Diag(NameLoc, diag::err_ptrauth_qualifier_invalid) <<
T << 1;
15750 New->setInvalidDecl();
15764 !(
T->isFunctionPointerType() &&
15766 Diag(NameLoc, diag::err_arg_with_address_space);
15767 New->setInvalidDecl();
15771 if (
Context.getTargetInfo().getTriple().isPPC64() &&
15772 PPC().CheckPPCMMAType(
New->getOriginalType(),
New->getLocation())) {
15773 New->setInvalidDecl();
15794 for (
int i = FTI.
NumParams; i != 0; ) {
15799 llvm::raw_svector_ostream(Code)
15810 const char* PrevSpec;
15813 DiagID,
Context.getPrintingPolicy());
15842 if (
LangOpts.OpenMP &&
OpenMP().isInOpenMPDeclareVariantScope())
15844 ParentScope, D, TemplateParameterLists, Bases);
15850 if (!Bases.empty())
15858 Consumer.HandleInlineFunctionDefinition(D);
15867 if (Prev->getLexicalDeclContext()->isFunctionOrMethod())
15870 PossiblePrototype = Prev;
15894 if (II->isStr(
"main") || II->isStr(
"efi_main"))
15913 if (FD->
hasAttr<DeviceKernelAttr>())
15962 bool DefinitionVisible =
false;
15966 Definition->getNumTemplateParameterLists())) {
15969 if (!DefinitionVisible) {
15970 if (
auto *TD =
Definition->getDescribedFunctionTemplate())
15984 Diag(
Definition->getLocation(), diag::note_previous_definition);
15993 LSI->
Lambda = LambdaClass;
16032 for (
const auto &
C : LambdaClass->
captures()) {
16033 if (
C.capturesVariable()) {
16037 const bool ByRef =
C.getCaptureKind() ==
LCK_ByRef;
16039 true,
C.getLocation(),
16040 C.isPackExpansion()
16042 I->getType(),
false);
16044 }
else if (
C.capturesThis()) {
16070 FD = FunTmpl->getTemplatedDecl();
16081 if (
const auto *
Attr = FD->
getAttr<AliasAttr>()) {
16086 if (
const auto *
Attr = FD->
getAttr<IFuncAttr>()) {
16091 if (
const auto *
Attr = FD->
getAttr<TargetVersionAttr>()) {
16092 if (
Context.getTargetInfo().getTriple().isAArch64() &&
16093 !
Context.getTargetInfo().hasFeature(
"fmv") &&
16094 !
Attr->isDefaultVersion()) {
16103 if (
auto *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
16105 Ctor->isDefaultConstructor() &&
16106 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
16148 "There should be an active template instantiation on the stack "
16149 "when instantiating a generic lambda!");
16159 if (!
Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID) &&
16160 !
Context.BuiltinInfo.isPredefinedRuntimeFunction(BuiltinID)) {
16175 diag::err_func_def_incomplete_result) ||
16177 diag::err_abstract_type_in_decl,
16193 auto *NonParmDecl = dyn_cast<NamedDecl>(NPD);
16197 "parameters should not be in newly created FD yet");
16200 if (NonParmDecl->getDeclName())
16205 if (
auto *ED = dyn_cast<EnumDecl>(NonParmDecl)) {
16206 for (
auto *EI : ED->enumerators())
16214 Param->setOwningFunction(FD);
16217 if (Param->getIdentifier() && FnBodyScope) {
16254 assert(!FD->
hasAttr<DLLExportAttr>());
16255 Diag(FD->
getLocation(), diag::err_attribute_dllimport_function_definition);
16280 if (
auto *TD = dyn_cast<FunctionTemplateDecl>(FD))
16281 FD = TD->getTemplatedDecl();
16282 if (FD && FD->
hasAttr<OptimizeNoneAttr>()) {
16294 for (
unsigned I = 0, E =
Scope->Returns.size(); I != E; ++I) {
16295 if (
const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
16296 if (!NRVOCandidate->isNRVOVariable()) {
16297 Diag(Returns[I]->getRetValue()->getExprLoc(),
16298 diag::warn_not_eliding_copy_on_return);
16318 Outer.Fun.hasTrailingReturnType()) {
16336 if (FD->isConstexpr())
16341 if (FD->getReturnType()->getContainedDeducedType())
16344 return Consumer.shouldSkipFunctionBody(D);
16351 FD->setHasSkippedBody();
16364 S.PopExpressionEvaluationContext();
16369 bool IsLambda =
false;
16373 llvm::DenseMap<const BlockDecl *, bool> EscapeInfo;
16375 auto IsOrNestedInEscapingBlock = [&](
const BlockDecl *BD) {
16376 auto [It, Inserted] = EscapeInfo.try_emplace(BD);
16390 return It->second = R;
16395 for (
const std::pair<SourceLocation, const BlockDecl *> &P :
16397 if (IsOrNestedInEscapingBlock(P.second))
16398 S.
Diag(P.first, diag::warn_implicitly_retains_self)
16413 methodHasName(FD,
"get_return_object_on_allocation_failure");
16423 if (!FD->
hasAttr<CoroWrapperAttr>())
16428 bool RetainFunctionScopeInfo) {
16455 SYCLKernelEntryPointAttr *SKEPAttr =
16456 FD->
getAttr<SYCLKernelEntryPointAttr>();
16458 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16460 SKEPAttr->setInvalidAttr();
16462 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16464 SKEPAttr->setInvalidAttr();
16466 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16468 SKEPAttr->setInvalidAttr();
16470 Diag(SKEPAttr->getLocation(), diag::err_sycl_entry_point_invalid)
16472 SKEPAttr->setInvalidAttr();
16475 if (Body && !FD->
isTemplated() && !SKEPAttr->isInvalidAttr()) {
16485 SYCLExternalAttr *SEAttr = FD->
getAttr<SYCLExternalAttr>();
16487 Diag(SEAttr->getLocation(),
16488 diag::err_sycl_external_invalid_deleted_function)
16518 Expr *Dummy =
nullptr;
16529 if (LSI->HasImplicitReturnType) {
16536 LSI->ReturnType.isNull() ?
Context.VoidTy : LSI->ReturnType;
16540 FD->
setType(
Context.getFunctionType(RetType, Proto->getParamTypes(),
16541 Proto->getExtProtoInfo()));
16574 dyn_cast<CXXDestructorDecl>(FD))
16594 if (PossiblePrototype) {
16598 TypeLoc TL = TI->getTypeLoc();
16601 diag::note_declaration_not_a_prototype)
16604 FTL.getRParenLoc(),
"void")
16612 if (LocInfo.first.isInvalid())
16616 StringRef Buffer =
SM.getBufferData(LocInfo.first, &
Invalid);
16620 if (LocInfo.second > Buffer.size())
16623 const char *LexStart = Buffer.data() + LocInfo.second;
16624 StringRef StartTok(LexStart, Buffer.size() - LocInfo.second);
16626 return StartTok.consume_front(
"const") &&
16628 StartTok.starts_with(
"/*") || StartTok.starts_with(
"//"));
16631 auto findBeginLoc = [&]() {
16647 diag::note_static_for_internal_linkage)
16658 if (!PossiblePrototype)
16704 if (PossiblePrototype)
16706 diag::warn_non_prototype_changes_behavior)
16713 if (
const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))
16714 if (!CmpndBody->body_empty())
16715 Diag(CmpndBody->body_front()->getBeginLoc(),
16716 diag::warn_dispatch_body_ignored);
16718 if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
16726 !
Context.getTargetInfo().getCXXABI().canKeyFunctionBeInline()) {
16727 Context.setNonKeyFunction(MD);
16743 "Function parsing confused");
16744 }
else if (
ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(dcl)) {
16756 << MD->getSelector().getAsString();
16761 bool isDesignated =
16762 MD->isDesignatedInitializerForTheInterface(&InitMethod);
16763 assert(isDesignated && InitMethod);
16764 (void)isDesignated;
16767 auto IFace = MD->getClassInterface();
16770 auto SuperD = IFace->getSuperClass();
16780 diag::warn_objc_designated_init_missing_super_call);
16782 diag::note_objc_designated_init_marked_here);
16790 diag::warn_objc_secondary_init_missing_init_call);
16806 "This should only be set for ObjC methods, which should have been "
16807 "handled in the block above.");
16822 if (!
Destructor->getParent()->isDependentType())
16840 ActivePolicy = &WP;
16843 if (!IsInstantiation && FD &&
16849 if (FD && FD->
hasAttr<NakedAttr>()) {
16853 bool RegisterVariables =
false;
16854 if (
auto *DS = dyn_cast<DeclStmt>(S)) {
16855 for (
const auto *
Decl : DS->decls()) {
16856 if (
const auto *Var = dyn_cast<VarDecl>(
Decl)) {
16857 RegisterVariables =
16858 Var->hasAttr<AsmLabelAttr>() && !Var->hasInit();
16859 if (!RegisterVariables)
16864 if (RegisterVariables)
16867 Diag(S->getBeginLoc(), diag::err_non_asm_stmt_in_naked_function);
16868 Diag(FD->
getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
16877 "Leftover temporaries in function");
16878 assert(!
Cleanup.exprNeedsCleanups() &&
16879 "Unaccounted cleanups in function");
16881 "Leftover expressions for odr-use checking");
16890 if (!IsInstantiation)
16893 if (!RetainFunctionScopeInfo)
16922 D = TD->getTemplatedDecl();
16934 assert(
LangOpts.implicitFunctionsAllowed() &&
16935 "Implicit function declarations aren't allowed in this language mode");
16942 Scope *BlockScope = S;
16950 Scope *ContextScope = BlockScope;
16954 ContextScope = ContextScope->
getParent();
16974 Diag(Loc, diag::ext_use_out_of_scope_declaration)
16977 return ExternCPrev;
16983 if (II.
getName().starts_with(
"__builtin_"))
16984 diag_id = diag::warn_builtin_unknown;
16987 diag_id = diag::ext_implicit_function_decl_c99;
16989 diag_id = diag::warn_implicit_function_decl;
16997 if (S && !ExternCPrev &&
17004 Diag(Loc, diag_id) << &II;
17020 return ExternCPrev;
17028 Context.getPrintingPolicy());
17030 assert(!
Error &&
"Error setting up implicit decl!");
17073 bool IsNothrow =
false;
17085 if (!IsNothrow && !FD->
hasAttr<ReturnsNonNullAttr>() &&
17103 if (!FD->
hasAttr<AllocSizeAttr>()) {
17104 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17115 if (AlignmentParam && !FD->
hasAttr<AllocAlignAttr>()) {
17116 FD->
addAttr(AllocAlignAttr::CreateImplicit(
17140 unsigned FormatIdx;
17142 if (
Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
17143 if (!FD->
hasAttr<FormatAttr>()) {
17144 const char *fmt =
"printf";
17146 if (FormatIdx < NumParams &&
17152 HasVAListArg ? 0 : FormatIdx+2,
17156 if (
Context.BuiltinInfo.isScanfLike(BuiltinID, FormatIdx,
17158 if (!FD->
hasAttr<FormatAttr>())
17160 &
Context.Idents.get(
"scanf"),
17162 HasVAListArg ? 0 : FormatIdx+2,
17168 if (!FD->
hasAttr<CallbackAttr>() &&
17169 Context.BuiltinInfo.performsCallback(BuiltinID, Encoding))
17170 FD->
addAttr(CallbackAttr::CreateImplicit(
17176 bool NoExceptions =
17178 bool ConstWithoutErrnoAndExceptions =
17179 Context.BuiltinInfo.isConstWithoutErrnoAndExceptions(BuiltinID);
17180 bool ConstWithoutExceptions =
17181 Context.BuiltinInfo.isConstWithoutExceptions(BuiltinID);
17182 if (!FD->
hasAttr<ConstAttr>() &&
17183 (ConstWithoutErrnoAndExceptions || ConstWithoutExceptions) &&
17184 (!ConstWithoutErrnoAndExceptions ||
17186 (!ConstWithoutExceptions || NoExceptions))
17192 const llvm::Triple &Trip =
Context.getTargetInfo().getTriple();
17193 if ((Trip.isGNUEnvironment() || Trip.isOSMSVCRT()) &&
17195 switch (BuiltinID) {
17196 case Builtin::BI__builtin_fma:
17197 case Builtin::BI__builtin_fmaf:
17198 case Builtin::BI__builtin_fmal:
17199 case Builtin::BIfma:
17200 case Builtin::BIfmaf:
17201 case Builtin::BIfmal:
17209 if (
Context.BuiltinInfo.isReturnsTwice(BuiltinID) &&
17210 !FD->
hasAttr<ReturnsTwiceAttr>())
17213 if (
Context.BuiltinInfo.isNoThrow(BuiltinID) && !FD->
hasAttr<NoThrowAttr>())
17215 if (
Context.BuiltinInfo.isPure(BuiltinID) && !FD->
hasAttr<PureAttr>())
17217 if (
Context.BuiltinInfo.isConst(BuiltinID) && !FD->
hasAttr<ConstAttr>())
17220 !FD->
hasAttr<CUDADeviceAttr>() && !FD->
hasAttr<CUDAHostAttr>()) {
17225 Context.BuiltinInfo.isAuxBuiltinID(BuiltinID))
17232 switch (BuiltinID) {
17233 case Builtin::BImemalign:
17234 case Builtin::BIaligned_alloc:
17235 if (!FD->
hasAttr<AllocAlignAttr>())
17244 switch (BuiltinID) {
17245 case Builtin::BIcalloc:
17246 FD->
addAttr(AllocSizeAttr::CreateImplicit(
17249 case Builtin::BImemalign:
17250 case Builtin::BIaligned_alloc:
17251 case Builtin::BIrealloc:
17255 case Builtin::BImalloc:
17275 if (!FPT || FPT->getExceptionSpecType() ==
EST_None)
17291 if (Name->
isStr(
"asprintf") || Name->
isStr(
"vasprintf")) {
17294 if (!FD->
hasAttr<FormatAttr>())
17296 &
Context.Idents.get(
"printf"), 2,
17297 Name->
isStr(
"vasprintf") ? 0 : 3,
17301 if (Name->
isStr(
"__CFStringMakeConstantString")) {
17304 if (!FD->
hasAttr<FormatArgAttr>())
17312 assert(D.
getIdentifier() &&
"Wrong callback for declspec without declarator");
17313 assert(!
T.isNull() &&
"GetTypeForDeclarator() returned null type");
17316 assert(D.
isInvalidType() &&
"no declarator info for valid type");
17317 TInfo =
Context.getTrivialTypeSourceInfo(
T);
17370 if (
T->isDependentType())
17380 if (
T->isAtomicType())
17381 Diag(UnderlyingLoc, diag::warn_atomic_stripped_in_enum);
17384 std::optional<unsigned> QualSelect;
17386 QualSelect = diag::CVQualList::Both;
17388 QualSelect = diag::CVQualList::Const;
17390 QualSelect = diag::CVQualList::Volatile;
17393 Diag(UnderlyingLoc, diag::warn_cv_stripped_in_enum) << *QualSelect;
17395 T =
T.getAtomicUnqualifiedType();
17400 if (BT->isInteger())
17403 return Diag(UnderlyingLoc, diag::err_enum_invalid_underlying)
17404 <<
T <<
T->isBitIntType();
17408 QualType EnumUnderlyingTy,
bool IsFixed,
17410 if (IsScoped != Prev->
isScoped()) {
17411 Diag(EnumLoc, diag::err_enum_redeclare_scoped_mismatch)
17417 if (IsFixed && Prev->
isFixed()) {
17420 !
Context.hasSameUnqualifiedType(EnumUnderlyingTy,
17423 Diag(EnumLoc, diag::err_enum_redeclare_type_mismatch)
17429 }
else if (IsFixed != Prev->
isFixed()) {
17430 Diag(EnumLoc, diag::err_enum_redeclare_fixed_mismatch)
17452 default: llvm_unreachable(
"Invalid tag kind for redecl diagnostic!");
17488 llvm_unreachable(
"invalid TTK");
17527 if (IsIgnoredLoc(NewTagLoc))
17530 auto IsIgnored = [&](
const TagDecl *Tag) {
17531 return IsIgnoredLoc(Tag->getLocation());
17548 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17556 if (isDefinition) {
17564 bool previousMismatch =
false;
17566 if (I->getTagKind() !=
NewTag) {
17571 if (!previousMismatch) {
17572 previousMismatch =
true;
17573 Diag(NewTagLoc, diag::warn_struct_class_previous_tag_mismatch)
17577 Diag(I->getInnerLocStart(), diag::note_struct_class_suggestion)
17590 if (PrevDef && IsIgnored(PrevDef))
17594 Diag(NewTagLoc, diag::warn_struct_class_tag_mismatch)
17601 Diag(NewTagLoc, diag::note_struct_class_suggestion)
17631 if (!Namespace || Namespace->isAnonymousNamespace())
17634 Namespaces.push_back(II);
17637 if (Lookup == Namespace)
17644 llvm::raw_svector_ostream OS(Insertion);
17647 std::reverse(Namespaces.begin(), Namespaces.end());
17648 for (
auto *II : Namespaces)
17649 OS << II->getName() <<
"::";
17662 if (OldDC->
Equals(NewDC))
17681 bool ScopedEnumUsesClassTag,
TypeResult UnderlyingType,
17682 bool IsTypeSpecifier,
bool IsTemplateParamOrArg,
17687 "Nameless record must be a definition!");
17692 bool ScopedEnum = ScopedEnumKWLoc.
isValid();
17695 bool isMemberSpecialization =
false;
17696 bool IsInjectedClassName =
false;
17702 if (TemplateParameterLists.size() > 0 ||
17706 KWLoc, NameLoc, SS,
nullptr, TemplateParameterLists,
17723 !isMemberSpecialization)
17724 Diag(SS.
getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
17727 if (TemplateParams) {
17729 Diag(KWLoc, diag::err_enum_template);
17733 if (TemplateParams->
size() > 0) {
17742 S, TagSpec, TUK, KWLoc, SS, Name, NameLoc, Attrs, TemplateParams,
17743 AS, ModulePrivateLoc,
17745 TemplateParameterLists.data(), SkipBody);
17751 isMemberSpecialization =
true;
17755 if (!TemplateParameterLists.empty() && isMemberSpecialization &&
17774 ScopedEnum ?
SourceRange(KWLoc, ScopedEnumKWLoc) : KWLoc);
17775 assert(ScopedEnum || !ScopedEnumUsesClassTag);
17776 Diag(KWLoc, diag::note_enum_friend)
17777 << (ScopedEnum + ScopedEnumUsesClassTag);
17783 llvm::PointerUnion<const Type*, TypeSourceInfo*> EnumUnderlying;
17784 bool IsFixed = !UnderlyingType.
isUnset() || ScopedEnum;
17787 if (UnderlyingType.
isInvalid() || (!UnderlyingType.
get() && ScopedEnum)) {
17790 EnumUnderlying =
Context.IntTy.getTypePtr();
17791 }
else if (UnderlyingType.
get()) {
17799 EnumUnderlying = TI;
17803 EnumUnderlying =
Context.IntTy.getTypePtr();
17807 EnumUnderlying =
Context.IntTy.getTypePtr();
17817 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying);
17818 TI && TI->
getType()->isAtomicType())
17821 }
else if (
Context.getTargetInfo().getTriple().isWindowsMSVCEnvironment()) {
17827 EnumUnderlying =
Context.IntTy.getTypePtr();
17833 bool isStdBadAlloc =
false;
17834 bool isStdAlignValT =
false;
17843 auto createTagFromNewDecl = [&]() ->
TagDecl * {
17853 ScopedEnum, ScopedEnumUsesClassTag, IsFixed);
17857 if (EnumUnderlying) {
17859 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
17865 ?
Context.getPromotedIntegerType(EnumTy)
17886 RD->addAttr(PackedAttr::CreateImplicit(
Context));
17902 goto CreateNewDecl;
17910 IsDependent =
true;
17939 if (
Previous.wasNotFoundInCurrentInstantiation() &&
17941 IsDependent =
true;
17946 Diag(NameLoc, diag::err_not_tag_in_scope)
17947 << Kind << Name << DC << SS.
getRange();
17950 goto CreateNewDecl;
17998 bool FriendSawTagOutsideEnclosingNamespace =
false;
18005 FriendSawTagOutsideEnclosingNamespace =
true;
18014 if (
Previous.isSingleResult() && FriendSawTagOutsideEnclosingNamespace) {
18016 Diag(NameLoc, diag::ext_friend_tag_redecl_outside_namespace)
18047 Previous.getFoundDecl()->isTemplateParameter()) {
18056 if (Name->
isStr(
"bad_alloc")) {
18058 isStdBadAlloc =
true;
18065 }
else if (Name->
isStr(
"align_val_t")) {
18066 isStdAlignValT =
true;
18078 IsTemplateParamOrArg)) {
18079 if (
Invalid)
goto CreateNewDecl;
18162 if (
TagDecl *Tag = TD->getUnderlyingType()->getAsTagDecl()) {
18163 if (Tag->getDeclName() == Name &&
18164 Tag->getDeclContext()->getRedeclContext()
18165 ->Equals(TD->getDeclContext()->getRedeclContext())) {
18172 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(PrevDecl);
18174 RD->isInjectedClassName()) {
18181 IsInjectedClassName =
true;
18188 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {
18189 auto *OldTag = dyn_cast<TagDecl>(PrevDecl);
18192 isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) &&
18194 *
this, OldTag->getDeclContext(), SearchDC))) {
18195 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
18196 Diag(Shadow->getTargetDecl()->getLocation(),
18197 diag::note_using_decl_target);
18198 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl)
18202 goto CreateNewDecl;
18206 if (
TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {
18212 SS.
isNotEmpty() || isMemberSpecialization)) {
18218 bool SafeToContinue =
18221 if (SafeToContinue)
18222 Diag(KWLoc, diag::err_use_with_wrong_tag)
18225 PrevTagDecl->getKindName());
18227 Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;
18228 Diag(PrevTagDecl->getLocation(), diag::note_previous_use);
18230 if (SafeToContinue)
18231 Kind = PrevTagDecl->getTagKind();
18244 return PrevTagDecl;
18248 dyn_cast_if_present<TypeSourceInfo *>(EnumUnderlying))
18249 EnumUnderlyingTy = TI->getType().getUnqualifiedType();
18250 else if (
const Type *
T =
18251 dyn_cast_if_present<const Type *>(EnumUnderlying))
18258 ScopedEnum, EnumUnderlyingTy,
18259 IsFixed, PrevEnum))
18269 Diag(NameLoc, diag::ext_member_redeclared);
18270 Diag(PrevTagDecl->getLocation(), diag::note_previous_declaration);
18277 if (!Attrs.
empty()) {
18281 (PrevTagDecl->getFriendObjectKind() ==
18294 return PrevTagDecl;
18299 return PrevTagDecl;
18308 if (Def->isBeingDefined()) {
18309 Diag(NameLoc, diag::err_nested_redefinition) << Name;
18310 Diag(PrevTagDecl->getLocation(),
18311 diag::note_previous_definition);
18319 bool IsExplicitSpecializationAfterInstantiation =
false;
18320 if (isMemberSpecialization) {
18322 IsExplicitSpecializationAfterInstantiation =
18323 RD->getTemplateSpecializationKind() !=
18325 else if (
EnumDecl *ED = dyn_cast<EnumDecl>(Def))
18326 IsExplicitSpecializationAfterInstantiation =
18327 ED->getTemplateSpecializationKind() !=
18336 bool HiddenDefVisible =
false;
18350 SkipBody->
New = createTagFromNewDecl();
18359 if (!HiddenDefVisible && Hidden)
18364 }
else if (!IsExplicitSpecializationAfterInstantiation) {
18369 Diag(NameLoc, diag::warn_redefinition_in_param_list)
18372 Diag(NameLoc, diag::err_redefinition) << Name;
18374 NameLoc.
isValid() ? NameLoc : KWLoc);
18393 SearchDC = PrevTagDecl->getDeclContext();
18421 Diag(NameLoc, diag::err_tag_reference_non_tag)
18422 << PrevDecl << NTK << Kind;
18428 SS.
isNotEmpty() || isMemberSpecialization)) {
18434 Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;
18440 }
else if (
TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {
18443 Diag(NameLoc, diag::err_tag_definition_of_typedef)
18444 << Name << Kind << TND->getUnderlyingType();
18452 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
18484 cast_or_null<EnumDecl>(PrevDecl), ScopedEnum,
18485 ScopedEnumUsesClassTag, IsFixed);
18498 Diag(Loc, diag::ext_forward_ref_enum_def)
18502 unsigned DiagID = diag::ext_forward_ref_enum;
18504 DiagID = diag::ext_ms_forward_ref_enum;
18506 DiagID = diag::err_forward_ref_enum;
18511 if (EnumUnderlying) {
18513 if (
TypeSourceInfo *TI = dyn_cast<TypeSourceInfo *>(EnumUnderlying))
18519 ?
Context.getPromotedIntegerType(EnumTy)
18521 assert(ED->
isComplete() &&
"enum with type should be complete");
18531 cast_or_null<CXXRecordDecl>(PrevDecl));
18537 cast_or_null<RecordDecl>(PrevDecl));
18543 Diag(
New->getLocation(), diag::ext_type_defined_in_offsetof)
18549 (IsTypeSpecifier || IsTemplateParamOrArg) &&
18551 Diag(
New->getLocation(), diag::err_type_defined_in_type_specifier)
18558 Diag(
New->getLocation(), diag::err_type_defined_in_enum)
18571 isMemberSpecialization))
18575 if (TemplateParameterLists.size() > 0) {
18576 New->setTemplateParameterListsInfo(
Context, TemplateParameterLists);
18595 RD->addAttr(PackedAttr::CreateImplicit(
Context));
18601 if (ModulePrivateLoc.
isValid()) {
18602 if (isMemberSpecialization)
18603 Diag(
New->getLocation(), diag::err_module_private_specialization)
18610 New->setModulePrivate();
18630 Diag(Loc, diag::err_type_defined_in_param_type)
18636 }
else if (!PrevDecl) {
18640 Diag(Loc, diag::warn_decl_in_param_list)
18646 New->setInvalidDecl();
18668 New->startDefinition();
18670 New->setCompleteDefinition();
18671 New->demoteThisDefinitionToDeclaration();
18699 if (!
New->isInvalidDecl() &&
18700 New->getDeclContext()->getRedeclContext()->isTranslationUnit() &&
18707 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(
New)) {
18720 if (isMemberSpecialization && !
New->isInvalidDecl())
18727 if (
New->isBeingDefined())
18728 if (
auto RD = dyn_cast<RecordDecl>(
New))
18729 RD->completeDefinition();
18731 }
else if (SkipBody && SkipBody->
ShouldSkip) {
18772 if (!
Record->getIdentifier())
18780 IsFinalSpelledSealed
18781 ? FinalAttr::Keyword_sealed
18782 : FinalAttr::Keyword_final));
18785 if (TriviallyRelocatable.
isValid())
18787 TriviallyRelocatableAttr::Create(
Context, TriviallyRelocatable));
18790 Record->addAttr(ReplaceableAttr::Create(
Context, Replaceable));
18807 "Broken injected-class-name");
18814 Tag->setBraceRange(BraceRange);
18817 if (Tag->isBeingDefined()) {
18818 assert(Tag->isInvalidDecl() &&
"We should already have completed it");
18819 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18820 RD->completeDefinition();
18823 if (
auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {
18825 if (RD->hasAttr<SYCLSpecialClassAttr>()) {
18826 auto *Def = RD->getDefinition();
18827 assert(Def &&
"The record is expected to have a completed definition");
18828 unsigned NumInitMethods = 0;
18829 for (
auto *
Method : Def->methods()) {
18830 if (!
Method->getIdentifier())
18832 if (
Method->getName() ==
"__init")
18835 if (NumInitMethods > 1 || !Def->hasInitMethod())
18836 Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);
18854 Tag->setTopLevelDeclInObjCContainer();
18857 if (!Tag->isInvalidDecl())
18858 Consumer.HandleTagDeclDefinition(Tag);
18862 if (
Context.getTargetInfo().getTriple().isOSAIX() &&
18868 const RecordDecl *RD = dyn_cast<RecordDecl>(Tag);
18872 if (llvm::any_of(RD->
fields(),
18873 [](
const FieldDecl *FD) { return FD->isBitField(); }))
18874 Diag(BraceRange.
getBegin(), diag::warn_pragma_align_not_xl_compatible);
18881 Tag->setInvalidDecl();
18884 if (Tag->isBeingDefined()) {
18885 if (
RecordDecl *RD = dyn_cast<RecordDecl>(Tag))
18886 RD->completeDefinition();
18899 QualType FieldTy,
bool IsMsStruct,
18910 diag::err_field_incomplete_or_sizeless))
18913 return Diag(FieldLoc, diag::err_not_integral_type_bitfield)
18915 return Diag(FieldLoc, diag::err_not_integral_type_anon_bitfield)
18925 llvm::APSInt
Value;
18930 BitWidth = ICE.
get();
18933 if (
Value == 0 && FieldName)
18934 return Diag(FieldLoc, diag::err_bitfield_has_zero_width)
18937 if (
Value.isSigned() &&
Value.isNegative()) {
18939 return Diag(FieldLoc, diag::err_bitfield_has_negative_width)
18941 return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width)
18948 return Diag(FieldLoc, diag::err_bitfield_too_wide)
18953 uint64_t TypeStorageSize =
Context.getTypeSize(FieldTy);
18954 uint64_t TypeWidth =
Context.getIntWidth(FieldTy);
18955 bool BitfieldIsOverwide =
Value.ugt(TypeWidth);
18959 bool CStdConstraintViolation =
18961 bool MSBitfieldViolation =
18962 Value.ugt(TypeStorageSize) &&
18963 (IsMsStruct ||
Context.getTargetInfo().getCXXABI().isMicrosoft());
18964 if (CStdConstraintViolation || MSBitfieldViolation) {
18965 unsigned DiagWidth =
18966 CStdConstraintViolation ? TypeWidth : TypeStorageSize;
18967 return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
18969 << !CStdConstraintViolation << DiagWidth;
18975 if (BitfieldIsOverwide && !FieldTy->
isBooleanType() && FieldName) {
18976 Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width)
19019 TInfo =
Context.getTrivialTypeSourceInfo(
T, Loc);
19030 diag::err_invalid_thread)
19038 switch (
Previous.getResultKind()) {
19045 PrevDecl =
Previous.getRepresentativeDecl();
19059 PrevDecl =
nullptr;
19063 PrevDecl =
nullptr;
19070 TSSL, AS, PrevDecl, &D);
19073 Record->setInvalidDecl();
19092 bool Mutable,
Expr *BitWidth,
19098 bool InvalidDecl =
false;
19103 if (
T.isNull() ||
T->containsErrors()) {
19104 InvalidDecl =
true;
19110 bool isIncomplete =
19114 diag::err_field_incomplete_or_sizeless);
19115 if (isIncomplete) {
19117 Record->setInvalidDecl();
19118 InvalidDecl =
true;
19123 Record->setInvalidDecl();
19124 InvalidDecl =
true;
19130 if (
T.hasAddressSpace() ||
T->isDependentAddressSpaceType() ||
19131 T->getBaseElementTypeUnsafe()->isDependentAddressSpaceType()) {
19132 Diag(Loc, diag::err_field_with_address_space);
19133 Record->setInvalidDecl();
19134 InvalidDecl =
true;
19140 if (
T->isEventT() ||
T->isImageType() ||
T->isSamplerT() ||
19141 T->isBlockPointerType()) {
19142 Diag(Loc, diag::err_opencl_type_struct_or_union_field) <<
T;
19143 Record->setInvalidDecl();
19144 InvalidDecl =
true;
19149 "__cl_clang_bitfields",
LangOpts)) {
19150 Diag(Loc, diag::err_opencl_bitfields);
19151 InvalidDecl =
true;
19157 T.hasQualifiers()) {
19158 InvalidDecl =
true;
19159 Diag(Loc, diag::err_anon_bitfield_qualifiers);
19164 if (!InvalidDecl &&
T->isVariablyModifiedType()) {
19166 TInfo,
T, Loc, diag::err_typecheck_field_variable_size))
19167 InvalidDecl =
true;
19172 diag::err_abstract_type_in_decl,
19174 InvalidDecl =
true;
19177 BitWidth =
nullptr;
19183 InvalidDecl =
true;
19184 BitWidth =
nullptr;
19189 if (!InvalidDecl && Mutable) {
19190 unsigned DiagID = 0;
19191 if (
T->isReferenceType())
19192 DiagID =
getLangOpts().MSVCCompat ? diag::ext_mutable_reference
19193 : diag::err_mutable_reference;
19194 else if (
T.isConstQualified())
19195 DiagID = diag::err_mutable_const;
19201 Diag(ErrLoc, DiagID);
19202 if (DiagID != diag::ext_mutable_reference) {
19204 InvalidDecl =
true;
19216 BitWidth, Mutable, InitStyle);
19225 Diag(Loc, diag::err_duplicate_member) << II;
19231 if (
Record->isUnion()) {
19233 RD && (RD->isBeingDefined() || RD->isCompleteDefinition())) {
19248 const bool HaveMSExt =
19253 HaveMSExt ? diag::ext_union_member_of_reference_type
19254 : diag::err_union_member_of_reference_type)
19274 if (
getLangOpts().ObjCAutoRefCount &&
ObjC().inferObjCARCLifetime(NewFD))
19277 if (
T.isObjCGCWeak())
19278 Diag(Loc, diag::warn_attribute_weak_on_field);
19281 if (
Context.getTargetInfo().getTriple().isPPC64() &&
19298 RDecl && (RDecl->isBeingDefined() || RDecl->isCompleteDefinition())) {
19309 if (RDecl->hasNonTrivialCopyConstructor())
19311 else if (!RDecl->hasTrivialDefaultConstructor())
19313 else if (RDecl->hasNonTrivialCopyAssignment())
19315 else if (RDecl->hasNonTrivialDestructor())
19320 RDecl->hasObjectMember()) {
19328 if (!FD->
hasAttr<UnavailableAttr>())
19329 FD->
addAttr(UnavailableAttr::CreateImplicit(
19330 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership, Loc));
19337 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member
19338 : diag::err_illegal_union_or_anon_struct_member)
19350 if (
LangOpts.ObjCRuntime.isFragile() || AllIvarDecls.empty())
19353 Decl *ivarDecl = AllIvarDecls[AllIvarDecls.size()-1];
19361 if (!CD->IsClassExtension())
19378 AllIvarDecls.push_back(Ivar);
19390 if (!
Record->hasUserDeclaredDestructor()) {
19398 if (
auto *DD = dyn_cast<CXXDestructorDecl>(
Decl)) {
19399 if (DD->isInvalidDecl())
19403 assert(DD->isIneligibleOrNotSelected() &&
"Selecting a destructor but a destructor was already selected.");
19417 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(Best->Function));
19421 Msg = diag::err_ambiguous_destructor;
19426 Msg = diag::err_no_viable_destructor;
19437 Record->setInvalidDecl();
19444 Record->addedSelectedDestructor(dyn_cast<CXXDestructorDecl>(OCS.
begin()->Function));
19488 if (!Method->getTrailingRequiresClause())
19489 SatisfactionStatus.push_back(
true);
19493 SatisfactionStatus.push_back(
false);
19495 SatisfactionStatus.push_back(Satisfaction.
IsSatisfied);
19499 for (
size_t i = 0; i < Methods.size(); i++) {
19500 if (!SatisfactionStatus[i])
19508 bool AnotherMethodIsMoreConstrained =
false;
19509 for (
size_t j = 0; j < Methods.size(); j++) {
19510 if (i == j || !SatisfactionStatus[j])
19524 AnotherMethodIsMoreConstrained =
true;
19528 AnotherMethodIsMoreConstrained)) {
19531 AnotherMethodIsMoreConstrained =
true;
19533 if (AnotherMethodIsMoreConstrained)
19538 if (!AnotherMethodIsMoreConstrained) {
19539 Method->setIneligibleOrNotSelected(
false);
19540 Record->addedEligibleSpecialMemberFunction(Method,
19541 1 << llvm::to_underlying(CSM));
19555 auto *MD = dyn_cast<CXXMethodDecl>(
Decl);
19557 auto *FTD = dyn_cast<FunctionTemplateDecl>(
Decl);
19559 MD = dyn_cast<CXXMethodDecl>(FTD->getTemplatedDecl());
19563 if (
auto *CD = dyn_cast<CXXConstructorDecl>(MD)) {
19564 if (CD->isInvalidDecl())
19566 if (CD->isDefaultConstructor())
19567 DefaultConstructors.push_back(MD);
19568 else if (CD->isCopyConstructor())
19569 CopyConstructors.push_back(MD);
19570 else if (CD->isMoveConstructor())
19571 MoveConstructors.push_back(MD);
19573 CopyAssignmentOperators.push_back(MD);
19575 MoveAssignmentOperators.push_back(MD);
19593 auto IsFunctionPointerOrForwardDecl = [&](
const Decl *D) {
19594 const FieldDecl *FD = dyn_cast<FieldDecl>(D);
19607 if (
const auto *TD = dyn_cast<TagDecl>(D))
19608 return !TD->isCompleteDefinition();
19623 return llvm::all_of(
Record->decls(), IsFunctionPointerOrForwardDecl);
19630 assert(EnclosingDecl &&
"missing record or interface decl");
19639 case Decl::ObjCCategory:
19642 case Decl::ObjCImplementation:
19650 CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(EnclosingDecl);
19654 unsigned NumNamedMembers = 0;
19656 for (
const auto *I :
Record->decls()) {
19657 if (
const auto *IFD = dyn_cast<IndirectFieldDecl>(I))
19658 if (IFD->getDeclName())
19665 const FieldDecl *PreviousField =
nullptr;
19675 RecFields.push_back(FD);
19695 bool IsLastField = (i + 1 == Fields.end());
19710 unsigned DiagID = 0;
19711 if (!
Record->isUnion() && !IsLastField) {
19714 Diag((*(i + 1))->getLocation(), diag::note_next_field_declaration);
19718 }
else if (
Record->isUnion())
19720 ? diag::ext_flexible_array_union_ms
19721 : diag::ext_flexible_array_union_gnu;
19722 else if (NumNamedMembers < 1)
19724 ? diag::ext_flexible_array_empty_aggregate_ms
19725 : diag::ext_flexible_array_empty_aggregate_gnu;
19735 if (CXXRecord && CXXRecord->getNumVBases() != 0)
19749 Diag(FD->
getLocation(), diag::err_flexible_array_has_nontrivial_dtor)
19756 Record->setHasFlexibleArrayMember(
true);
19765 diag::err_incomplete_type)
19768 diag::err_field_incomplete_or_sizeless))) {
19774 if (
Record && RD->hasFlexibleArrayMember()) {
19777 Record->setHasFlexibleArrayMember(
true);
19778 if (!
Record->isUnion()) {
19795 diag::err_abstract_type_in_decl,
19800 if (
Record && RD->hasObjectMember())
19801 Record->setHasObjectMember(
true);
19802 if (
Record && RD->hasVolatileMember())
19803 Record->setHasVolatileMember(
true);
19822 FD->
addAttr(UnavailableAttr::CreateImplicit(
19823 Context,
"", UnavailableAttr::IR_ARCFieldWithOwnership,
19827 !
Record->hasObjectMember()) {
19830 Record->setHasObjectMember(
true);
19833 if (
const auto *RD = BaseType->getAsRecordDecl();
19834 RD && RD->hasObjectMember())
19835 Record->setHasObjectMember(
true);
19836 else if (BaseType->isObjCObjectPointerType() ||
19837 BaseType.isObjCGCStrong())
19838 Record->setHasObjectMember(
true);
19843 !shouldIgnoreForRecordTriviality(FD)) {
19846 Record->setNonTrivialToPrimitiveDefaultInitialize(
true);
19849 Record->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(
true);
19853 Record->setNonTrivialToPrimitiveCopy(
true);
19855 Record->setHasNonTrivialToPrimitiveCopyCUnion(
true);
19857 if (FD->
hasAttr<ExplicitInitAttr>())
19858 Record->setHasUninitializedExplicitInitFields(
true);
19860 Record->setNonTrivialToPrimitiveDestroy(
true);
19861 Record->setParamDestroyedInCallee(
true);
19863 Record->setHasNonTrivialToPrimitiveDestructCUnion(
true);
19867 if (RD->getArgPassingRestrictions() ==
19869 Record->setArgPassingRestrictions(
19872 Record->setArgPassingRestrictions(
19876 Record->setArgPassingRestrictions(
19878 Record->setNonTrivialToPrimitiveCopy(
true);
19883 Record->setHasVolatileMember(
true);
19884 bool ReportMSBitfieldStoragePacking =
19885 Record && PreviousField &&
19886 !
Diags.isIgnored(diag::warn_ms_bitfield_mismatched_storage_packing,
19888 auto IsNonDependentBitField = [](
const FieldDecl *FD) {
19892 if (ReportMSBitfieldStoragePacking && IsNonDependentBitField(FD) &&
19893 IsNonDependentBitField(PreviousField)) {
19897 if (FDStorageSize != PreviousFieldStorageSize) {
19899 diag::warn_ms_bitfield_mismatched_storage_packing)
19903 diag::note_ms_bitfield_mismatched_storage_size_previous)
19904 << PreviousField << PreviousField->
getType();
19914 bool Completed =
false;
19919 Record->setInvalidDecl();
19923 if (!CXXRecord->isInvalidDecl()) {
19926 I = CXXRecord->conversion_begin(),
19927 E = CXXRecord->conversion_end(); I != E; ++I)
19928 I.setAccess((*I)->getAccess());
19934 if (!CXXRecord->isDependentType()) {
19935 if (!CXXRecord->isInvalidDecl()) {
19939 if (CXXRecord->getNumVBases()) {
19941 CXXRecord->getFinalOverriders(FinalOverriders);
19943 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
19944 MEnd = FinalOverriders.end();
19947 SOEnd = M->second.end();
19948 SO != SOEnd; ++SO) {
19949 assert(SO->second.size() > 0 &&
19950 "Virtual function without overriding functions?");
19951 if (SO->second.size() == 1)
19958 Diag(
Record->getLocation(), diag::err_multiple_final_overriders)
19960 Diag(M->first->getLocation(),
19961 diag::note_overridden_virtual_function);
19963 OM = SO->second.begin(),
19964 OMEnd = SO->second.end();
19966 Diag(OM->Method->getLocation(), diag::note_final_overrider)
19967 << (
const NamedDecl *)M->first << OM->Method->getParent();
19969 Record->setInvalidDecl();
19972 CXXRecord->completeDefinition(&FinalOverriders);
19982 Record->completeDefinition();
19991 (
Record->hasAttr<RandomizeLayoutAttr>() ||
19992 (!
Record->hasAttr<NoRandomizeLayoutAttr>() &&
19993 EntirelyFunctionPointers(
Record)))) {
19997 Record->reorderDecls(NewDeclOrdering);
20002 auto *Dtor = CXXRecord->getDestructor();
20003 if (Dtor && Dtor->isImplicit() &&
20005 CXXRecord->setImplicitDestructorIsDeleted();
20010 if (
Record->hasAttrs()) {
20013 if (
const MSInheritanceAttr *IA =
Record->getAttr<MSInheritanceAttr>())
20015 IA->getRange(), IA->getBestCase(),
20016 IA->getInheritanceModel());
20022 bool CheckForZeroSize;
20024 CheckForZeroSize =
true;
20029 CXXRecord->getLexicalDeclContext()->isExternCContext() &&
20031 CXXRecord->isCLike();
20033 if (CheckForZeroSize) {
20034 bool ZeroSize =
true;
20035 bool IsEmpty =
true;
20036 unsigned NonBitFields = 0;
20038 E =
Record->field_end();
20039 (NonBitFields == 0 || ZeroSize) && I != E; ++I) {
20041 if (I->isUnnamedBitField()) {
20042 if (!I->isZeroLengthBitField())
20046 QualType FieldType = I->getType();
20048 !
Context.getTypeSizeInChars(FieldType).isZero())
20058 diag::warn_zero_size_struct_union_in_extern_c :
20059 diag::warn_zero_size_struct_union_compat)
20060 << IsEmpty <<
Record->isUnion() << (NonBitFields > 1);
20067 Diag(RecLoc, IsEmpty ? diag::ext_empty_struct_union
20068 : diag::ext_no_named_members_in_struct_union)
20076 ID->setEndOfDefinitionLoc(RBrac);
20078 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20080 ID->addDecl(ClsFields[i]);
20084 if (ID->getSuperClass())
20087 dyn_cast<ObjCImplementationDecl>(EnclosingDecl)) {
20088 assert(IMPDecl &&
"ActOnFields - missing ObjCImplementationDecl");
20089 for (
unsigned I = 0, N = RecFields.size(); I != N; ++I)
20095 IMPDecl->setIvarLBraceLoc(LBrac);
20096 IMPDecl->setIvarRBraceLoc(RBrac);
20098 dyn_cast<ObjCCategoryDecl>(EnclosingDecl)) {
20106 for (
unsigned i = 0, e = RecFields.size(); i != e; ++i) {
20110 Diag(ClsFields[i]->getLocation(),
20111 diag::err_duplicate_ivar_declaration);
20112 Diag(ClsIvar->getLocation(), diag::note_previous_definition);
20118 Diag(ClsFields[i]->getLocation(),
20119 diag::err_duplicate_ivar_declaration);
20120 Diag(ClsExtIvar->getLocation(), diag::note_previous_definition);
20126 CDecl->addDecl(ClsFields[i]);
20128 CDecl->setIvarLBraceLoc(LBrac);
20129 CDecl->setIvarRBraceLoc(RBrac);
20140 assert((
T->isIntegralType(Context) ||
20141 T->isEnumeralType()) &&
"Integral type required!");
20142 const unsigned NumTypes = 4;
20143 QualType SignedIntegralTypes[NumTypes] = {
20144 Context.ShortTy, Context.IntTy, Context.LongTy, Context.LongLongTy
20146 QualType UnsignedIntegralTypes[NumTypes] = {
20147 Context.UnsignedShortTy, Context.UnsignedIntTy, Context.UnsignedLongTy,
20148 Context.UnsignedLongLongTy
20151 unsigned BitWidth = Context.getTypeSize(
T);
20152 QualType *Types =
T->isSignedIntegerOrEnumerationType()? SignedIntegralTypes
20153 : UnsignedIntegralTypes;
20154 for (
unsigned I = 0; I != NumTypes; ++I)
20155 if (Context.getTypeSize(Types[I]) > BitWidth)
20166 unsigned IntWidth =
Context.getTargetInfo().getIntWidth();
20167 llvm::APSInt EnumVal(IntWidth);
20187 EltTy =
Enum->getIntegerType();
20193 Val = Converted.
get();
20200 if (
Enum->isComplete()) {
20201 EltTy =
Enum->getIntegerType();
20207 if (!
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20210 .isWindowsMSVCEnvironment()) {
20211 Diag(IdLoc, diag::ext_enumerator_too_large) << EltTy;
20213 Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
20236 if (!
Context.isRepresentableIntegerValue(EnumVal,
Context.IntTy)) {
20238 ? diag::warn_c17_compat_enum_value_not_int
20239 : diag::ext_c23_enum_value_not_int)
20241 << (EnumVal.isUnsigned() || EnumVal.isNonNegative());
20253 if (
Enum->isDependentType())
20255 else if (!LastEnumConst) {
20264 if (
Enum->isFixed()) {
20265 EltTy =
Enum->getIntegerType();
20274 EltTy = LastEnumConst->
getType();
20277 if (EnumVal < LastEnumConst->getInitVal()) {
20289 if (
T.isNull() ||
Enum->isFixed()) {
20293 EnumVal = EnumVal.zext(EnumVal.getBitWidth() * 2);
20295 if (
Enum->isFixed())
20297 Diag(IdLoc, diag::err_enumerator_wrapped)
20301 Diag(IdLoc, diag::ext_enumerator_increment_too_large)
20312 EnumVal = EnumVal.zextOrTrunc(
Context.getIntWidth(EltTy));
20324 ? diag::warn_c17_compat_enum_value_not_int
20325 : diag::ext_c23_enum_value_not_int)
20326 << 1 <<
toString(EnumVal, 10) << 1;
20328 !
Context.isRepresentableIntegerValue(EnumVal, EltTy)) {
20331 : diag::ext_c23_enum_value_not_int)
20332 << 1 <<
toString(EnumVal, 10) << 1;
20340 EnumVal = EnumVal.extOrTrunc(
Context.getIntWidth(EltTy));
20359 auto *PrevECD = dyn_cast_or_null<EnumConstantDecl>(PrevDecl);
20367 Skip.Previous = Hidden;
20381 cast_or_null<EnumConstantDecl>(lastEnumConst);
20398 PrevDecl =
nullptr;
20425 "Received TagDecl when not in C++!");
20428 Diag(IdLoc, diag::err_redefinition_of_enumerator) << Id;
20430 Diag(IdLoc, diag::err_redefinition) << Id;
20463 if (!BO->isAdditiveOp())
20471 InitExpr = BO->getLHS();
20475 DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InitExpr);
20495 if (!
Enum->getIdentifier())
20499 if (
Enum->getNumPositiveBits() > 63 ||
Enum->getNumNegativeBits() > 64)
20508 typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
20511 typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
20515 llvm::APSInt Val = D->getInitVal();
20516 return Val.isSigned() ? Val.getSExtValue() : Val.getZExtValue();
20519 DuplicatesVector DupVector;
20520 ValueToVectorMap EnumMap;
20524 for (
auto *Element : Elements) {
20538 EnumMap.insert({EnumConstantToKey(ECD), ECD});
20541 if (EnumMap.size() == 0)
20545 for (
auto *Element : Elements) {
20551 auto Iter = EnumMap.find(EnumConstantToKey(ECD));
20552 if (Iter == EnumMap.end())
20555 DeclOrVector& Entry = Iter->second;
20562 auto Vec = std::make_unique<ECDVector>();
20564 Vec->push_back(ECD);
20571 DupVector.emplace_back(std::move(Vec));
20577 if (*Vec->begin() == ECD)
20580 Vec->push_back(ECD);
20584 for (
const auto &Vec : DupVector) {
20585 assert(Vec->size() > 1 &&
"ECDVector should have at least 2 elements.");
20588 auto *FirstECD = Vec->front();
20589 S.
Diag(FirstECD->getLocation(), diag::warn_duplicate_enum_values)
20590 << FirstECD <<
toString(FirstECD->getInitVal(), 10)
20591 << FirstECD->getSourceRange();
20595 for (
auto *ECD : llvm::drop_begin(*Vec))
20596 S.
Diag(ECD->getLocation(), diag::note_duplicate_element)
20597 << ECD <<
toString(ECD->getInitVal(), 10)
20598 << ECD->getSourceRange();
20603 bool AllowMask)
const {
20604 assert(ED->
isClosedFlag() &&
"looking for value in non-flag or open enum");
20608 llvm::APInt &FlagBits = R.first->second;
20612 const auto &EVal = E->getInitVal();
20614 if (EVal.isPowerOf2())
20615 FlagBits = FlagBits.zext(EVal.getBitWidth()) | EVal;
20627 llvm::APInt FlagMask = ~FlagBits.zextOrTrunc(Val.getBitWidth());
20628 return !(FlagMask & Val) || (AllowMask && !(FlagMask & ~Val));
20635 bool HasBitwiseOp =
false;
20640 for (
const auto *ECD :
Enum->enumerators()) {
20641 const Expr *InitExpr = ECD->getInitExpr();
20647 if (
const auto *BinOp = dyn_cast<BinaryOperator>(E)) {
20651 if (BinOp->isBitwiseOp() || BinOp->isShiftOp()) {
20652 HasBitwiseOp =
true;
20653 }
else if (Op == BO_LT || Op == BO_GT) {
20656 if (
const auto *IntLiteral = dyn_cast<IntegerLiteral>(LHS)) {
20658 if (IntLiteral->getValue() == 1)
20659 SuspiciousCompares.push_back(BinOp);
20667 if (HasBitwiseOp) {
20668 for (
const auto *BinOp : SuspiciousCompares) {
20669 StringRef SuggestedOp = (BinOp->getOpcode() == BO_LT)
20674 Sema.
Diag(OperatorLoc, diag::warn_comparison_in_enum_initializer)
20675 << BinOp->getOpcodeStr() << SuggestedOp;
20677 Sema.
Diag(OperatorLoc, diag::note_enum_compare_typo_suggest)
20693 if (
Enum->isDependentType()) {
20694 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
20696 cast_or_null<EnumConstantDecl>(Elements[i]);
20697 if (!ECD)
continue;
20708 unsigned NumNegativeBits = 0;
20709 unsigned NumPositiveBits = 0;
20710 bool MembersRepresentableByInt =
20711 Context.computeEnumBits(Elements, NumNegativeBits, NumPositiveBits);
20715 unsigned BestWidth;
20736 if (
Enum->isComplete()) {
20737 BestType =
Enum->getIntegerType();
20738 if (
Context.isPromotableIntegerType(BestType))
20739 BestPromotionType =
Context.getPromotedIntegerType(BestType);
20741 BestPromotionType = BestType;
20743 BestWidth =
Context.getIntWidth(BestType);
20745 bool EnumTooLarge =
Context.computeBestEnumTypes(
20746 Packed, NumNegativeBits, NumPositiveBits, BestType, BestPromotionType);
20747 BestWidth =
Context.getIntWidth(BestType);
20749 Diag(
Enum->getLocation(), diag::ext_enum_too_large);
20754 for (
auto *D : Elements) {
20755 auto *ECD = cast_or_null<EnumConstantDecl>(D);
20756 if (!ECD)
continue;
20765 llvm::APSInt InitVal = ECD->getInitVal();
20773 MembersRepresentableByInt) {
20781 NewWidth =
Context.getTargetInfo().getIntWidth();
20783 }
else if (ECD->getType() == BestType) {
20789 ECD->setType(EnumType);
20793 NewWidth = BestWidth;
20798 InitVal = InitVal.extOrTrunc(NewWidth);
20799 InitVal.setIsSigned(NewSign);
20800 ECD->setInitVal(
Context, InitVal);
20803 if (ECD->getInitExpr() &&
20804 !
Context.hasSameType(NewTy, ECD->getInitExpr()->getType()))
20806 Context, NewTy, CK_IntegralCast, ECD->getInitExpr(),
20812 ECD->setType(EnumType);
20814 ECD->setType(NewTy);
20817 Enum->completeDefinition(BestType, BestPromotionType,
20818 NumPositiveBits, NumNegativeBits);
20823 if (
Enum->isClosedFlag()) {
20824 for (
Decl *D : Elements) {
20826 if (!ECD)
continue;
20829 if (InitVal != 0 && !InitVal.isPowerOf2() &&
20837 if (
Enum->hasAttrs())
20876 AsmLabelAttr *
Attr =
20877 AsmLabelAttr::CreateImplicit(
Context, AliasName->
getName(), Info);
20887 Diag(PrevDecl->
getLocation(), diag::warn_redefine_extname_not_applied)
20900 PrevDecl->
addAttr(WeakAttr::CreateImplicit(
Context, PragmaLoc));
20916 if (!PrevDecl->
hasAttr<AliasAttr>())
20917 if (
NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
20926 assert(FD &&
"Expected non-null FunctionDecl");
20938 auto IsEmittedForExternalSymbol = [
this, FD]() {
20950 if (
LangOpts.OpenMPIsTargetDevice) {
20953 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20960 if (*DevTy == OMPDeclareTargetDeclAttr::DT_Host)
20964 if (
OpenMP().isInOpenMPDeclareTargetContext() || DevTy)
20965 if (IsEmittedForExternalSymbol())
20971 }
else if (
LangOpts.OpenMP > 45) {
20975 std::optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
20978 if (*DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
20997 if (IsEmittedForExternalSymbol())
21002 if (
auto *
Destructor = dyn_cast<CXXDestructorDecl>(FD)) {
21004 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
21007 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 SourceLocation getCaptureLocation(const LambdaScopeInfo *LSI, const ValueDecl *VD)
Return the location of the capture if the given lambda captures the given variable VD,...
static bool AreSpecialMemberFunctionsSameKind(ASTContext &Context, CXXMethodDecl *M1, CXXMethodDecl *M2, CXXSpecialMemberKind CSM)
[class.mem.special]p5 Two special member functions are of the same kind if:
static const CXXRecordDecl * findRecordWithDependentBasesOfEnclosingMethod(const DeclContext *DC)
Find the parent class with dependent bases of the innermost enclosing method context.
static void ComputeSelectedDestructor(Sema &S, CXXRecordDecl *Record)
[class.dtor]p4: At the end of the definition of a class, overload resolution is performed among the p...
static bool shouldConsiderLinkage(const VarDecl *VD)
static SourceLocation findDefaultInitializer(const CXXRecordDecl *Record)
static bool CheckMultiVersionAdditionalRules(Sema &S, const FunctionDecl *OldFD, const FunctionDecl *NewFD, bool CausesMV, MultiVersionKind MVKind)
static DeclContext * getTagInjectionContext(DeclContext *DC)
Find the DeclContext in which a tag is implicitly declared if we see an elaborated type specifier in ...
static bool EquivalentArrayTypes(QualType Old, QualType New, const ASTContext &Ctx)
static bool haveIncompatibleLanguageLinkages(const T *Old, const T *New)
static unsigned getRedeclDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for redeclaration diagnostic message.
static void checkInheritableAttr(Sema &S, NamedDecl &ND)
static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver)
static void diagnoseVarDeclTypeMismatch(Sema &S, VarDecl *New, VarDecl *Old)
static NamedDecl * DiagnoseInvalidRedeclaration(Sema &SemaRef, LookupResult &Previous, FunctionDecl *NewFD, ActOnFDArgs &ExtraArgs, bool IsLocalFriend, Scope *S)
Generate diagnostics for an invalid function redeclaration.
static bool RebuildDeclaratorInCurrentInstantiation(Sema &S, Declarator &D, DeclarationName Name)
RebuildDeclaratorInCurrentInstantiation - Checks whether the given declarator needs to be rebuilt in ...
static void SetEligibleMethods(Sema &S, CXXRecordDecl *Record, ArrayRef< CXXMethodDecl * > Methods, CXXSpecialMemberKind CSM)
[class.mem.special]p6: An eligible special member function is a special member function for which:
static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc)
static bool hasParsedAttr(Scope *S, const Declarator &PD, ParsedAttr::Kind Kind)
ShadowedDeclKind
Enum describing the select options in diag::warn_decl_shadow.
static unsigned getMSManglingNumber(const LangOptions &LO, Scope *S)
static void CheckForComparisonInEnumInitializer(SemaBase &Sema, const EnumDecl *Enum)
static void emitReadOnlyPlacementAttrWarning(Sema &S, const VarDecl *VD)
static bool canRedefineFunction(const FunctionDecl *FD, const LangOptions &LangOpts)
canRedefineFunction - checks if a function can be redefined.
static void checkWeakAttr(Sema &S, NamedDecl &ND)
static void checkSelectAnyAttr(Sema &S, NamedDecl &ND)
static bool isImplicitInstantiation(NamedDecl *D)
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT)
static void checkDuplicateDefaultInit(Sema &S, CXXRecordDecl *Parent, SourceLocation DefaultInitLoc)
static bool isDefaultStdCall(FunctionDecl *FD, Sema &S)
static bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD)
Returns true if there hasn't been any invalid type diagnosed.
static void RemoveUsingDecls(LookupResult &R)
Removes using shadow declarations not at class scope from the lookup results.
static void ComputeSpecialMemberFunctionsEligiblity(Sema &S, CXXRecordDecl *Record)
static bool AttrCompatibleWithMultiVersion(attr::Kind Kind, MultiVersionKind MVKind)
static bool looksMutable(QualType T, const ASTContext &Ctx)
static bool isUsingDeclNotAtClassScope(NamedDecl *D)
static void propagateAttributes(ParmVarDecl *To, const ParmVarDecl *From, F &&propagator)
static const NamedDecl * getDefinition(const Decl *D)
static QualType TryToFixInvalidVariablyModifiedType(QualType T, ASTContext &Context, bool &SizeIsNegative, llvm::APSInt &Oversized)
Helper method to turn variable array types into constant array types in certain situations which woul...
static bool hasDeducedAuto(DeclaratorDecl *DD)
static void copyAttrFromTypedefToDecl(Sema &S, Decl *D, const TypedefType *TT)
static QualType getCoreType(QualType Ty)
static bool isMainFileLoc(const Sema &S, SourceLocation Loc)
static bool mergeDeclAttribute(Sema &S, NamedDecl *D, const InheritableAttr *Attr, AvailabilityMergeKind AMK)
static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD)
Check the target or target_version attribute of the function for MultiVersion validity.
static bool isOutOfScopePreviousDeclaration(NamedDecl *, DeclContext *, ASTContext &)
Determines whether the given declaration is an out-of-scope previous declaration.
static StorageClass StorageClassSpecToVarDeclStorageClass(const DeclSpec &DS)
StorageClassSpecToVarDeclStorageClass - Maps a DeclSpec::SCS to a VarDecl::StorageClass.
static bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
Check the validity of a new function declaration being added to an existing multiversioned declaratio...
static bool CheckMultiVersionFirstFunction(Sema &S, FunctionDecl *FD)
Check the validity of a multiversion function declaration that is the first of its kind.
static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition)
static bool checkNonMultiVersionCompatAttributes(Sema &S, const FunctionDecl *FD, const FunctionDecl *CausedFD, MultiVersionKind MVKind)
static void checkAliasAttr(Sema &S, NamedDecl &ND)
static void filterNonConflictingPreviousTypedefDecls(Sema &S, const TypedefNameDecl *Decl, LookupResult &Previous)
Typedef declarations don't have linkage, but they still denote the same entity if their types are the...
static bool ValidDuplicateEnum(EnumConstantDecl *ECD, EnumDecl *Enum)
static QualType getNextLargerIntegralType(ASTContext &Context, QualType T)
static void checkWeakRefAttr(Sema &S, NamedDecl &ND)
static bool isIncompleteDeclExternC(Sema &S, const T *D)
Determine whether a variable is extern "C" prior to attaching an initializer.
static bool isAttributeTargetADefinition(Decl *D)
static Attr * getImplicitCodeSegAttrFromClass(Sema &S, const FunctionDecl *FD)
Return a CodeSegAttr from a containing class.
static bool CheckDeclarationCausesMultiVersioning(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous)
static bool IsDisallowedCopyOrAssign(const CXXMethodDecl *D)
Check for this common pattern:
static bool isAcceptableTagRedeclContext(Sema &S, DeclContext *OldDC, DeclContext *NewDC)
Determine whether a tag originally declared in context OldDC can be redeclared with an unqualified na...
static bool isRecordType(QualType T)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenACC constructs and clauses.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to PowerPC.
This file declares semantic analysis functions specific to RISC-V.
This file declares semantic analysis for SYCL constructs.
This file declares semantic analysis functions specific to Swift.
This file declares semantic analysis functions specific to Wasm.
static CharSourceRange getRange(const CharSourceRange &EditRange, const SourceManager &SM, const LangOptions &LangOpts, bool IncludeMacroExpansion)
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
C Language Family Type Representation.
@ GE_Missing_stdio
Missing a type from <stdio.h>
@ GE_Missing_type
Missing a type.
@ GE_Missing_ucontext
Missing a type from <ucontext.h>
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
RAII object that pops an ExpressionEvaluationContext when exiting a function body.
ExitFunctionBodyRAII(Sema &S, bool IsLambda)
llvm::APInt getValue() const
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
virtual void AssignInheritanceModel(CXXRecordDecl *RD)
Callback invoked when an MSInheritanceAttr has been attached to a CXXRecordDecl.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getAttributedType(attr::Kind attrKind, QualType modifiedType, QualType equivalentType, const Attr *attr=nullptr) const
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
GVALinkage GetGVALinkageForFunction(const FunctionDecl *FD) const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const VariableArrayType * getAsVariableArrayType(QualType T) const
const TargetInfo & getTargetInfo() const
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
@ GE_Missing_type
Missing a type.
@ GE_Missing_setjmp
Missing a type from <setjmp.h>
unsigned getTypeAlign(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in bits.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
SourceLocation getLBracketLoc() const
Expr * getSizeExpr() const
TypeLoc getElementLoc() const
SourceLocation getRBracketLoc() const
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
@ AS_Declspec
__declspec(...)
SourceRange getRange() const
bool isStandardAttributeSyntax() const
The attribute is spelled [[]] in either C or C++ mode, including standard attributes spelled with a k...
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
AttributeFactory & getFactory() const
Type source information for an attributed type.
TypeLoc getModifiedLoc() const
The modified type, which is generally canonically different from the attribute type.
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Expr * getCond() const
getCond - Return the condition expression; this is defined in terms of the opaque value.
A builtin binary operation expression such as "x + y" or "x <= y".
StringRef getOpcodeStr() const
static bool isCompoundAssignmentOp(Opcode Opc)
A binding in a decomposition declaration.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool doesNotEscape() const
This class is used for builtin types like 'int'.
Holds information about both target-independent and target-specific builtins, allowing easy queries b...
const char * getHeaderName(unsigned ID) const
If this is a library function that comes from a specific header, retrieve that header name.
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getArg(unsigned Arg)
Return the specified argument.
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Represents a C++ constructor within a class.
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, const AssociatedConstraint &TrailingRequiresClause={}, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
A mapping from each virtual member function to its set of final overriders.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
void addOverriddenMethod(const CXXMethodDecl *MD)
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Qualifiers getMethodQualifiers() const
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
base_class_iterator bases_end()
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
base_class_iterator bases_begin()
capture_const_range captures() const
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
bool hasDefinition() const
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
UnresolvedSetIterator conversion_iterator
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
char * location_data() const
Retrieve the data associated with the source-location information.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
SourceRange getRange() const
SourceLocation getBeginLoc() const
bool isSet() const
Deprecated.
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
bool isInvalid() const
An error occurred during parsing of the scope specifier.
bool isEmpty() const
No scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
bool isCallToStdMove() const
CastKind getCastKind() const
static CharSourceRange getCharRange(SourceRange R)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
static unsigned getNumAddressingBits(const ASTContext &Context, QualType ElementType, const llvm::APInt &NumElements)
Determine the number of bits required to address a member of.
static unsigned getMaxSizeBits(const ASTContext &Context)
Determine the maximum number of active bits that an array's size can require, which limits the maximu...
llvm::APInt getSize() const
Return the constant array size as an APInt.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclListNode::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
Decl * getNonClosureAncestor()
Find the nearest non-closure ancestor of this context, i.e.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
const BlockDecl * getInnermostBlockDecl() const
Return this DeclContext if it is a BlockDecl.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
bool containsDecl(Decl *D) const
Checks whether a declaration is in this context.
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace context.
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
DeclContext * getLookupParent()
Find the parent context of this context that will be used for unqualified name lookup.
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
DeclContext * getNonTransparentContext()
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
static DeclGroupRef Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
A reference to a declared variable, function, enum, etc.
SourceLocation getBeginLoc() const
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
bool isModulePrivateSpecified() const
static const TST TST_typeof_unqualType
bool hasAutoTypeSpec() const
static const TST TST_typename
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
ThreadStorageClassSpecifier TSCS
void ClearStorageClassSpecs()
bool isNoreturnSpecified() const
TST getTypeSpecType() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
void SetRangeEnd(SourceLocation Loc)
static const TST TST_interface
static const TST TST_typeofExpr
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
void SetRangeStart(SourceLocation Loc)
SourceLocation getNoreturnSpecLoc() const
bool isExternInLinkageSpec() const
static const TST TST_union
SCS
storage-class-specifier
SourceLocation getExplicitSpecLoc() const
SourceLocation getModulePrivateSpecLoc() const
bool isMissingDeclaratorOk()
Checks if this DeclSpec can stand alone, without a Declarator.
ParsedType getRepAsType() const
void UpdateTypeRep(ParsedType Rep)
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
void ClearTypeQualifiers()
Clear out all of the type qualifiers.
SourceLocation getConstSpecLoc() const
SourceRange getExplicitSpecRange() const
Expr * getRepAsExpr() const
static const TST TST_enum
static const TST TST_decltype
static bool isDeclRep(TST T)
bool isInlineSpecified() const
SourceLocation getRestrictSpecLoc() const
static const TST TST_typeof_unqualExpr
static const TST TST_class
static const TST TST_void
void ClearConstexprSpec()
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
static const TST TST_atomic
SourceLocation getThreadStorageClassSpecLoc() const
Decl * getRepAsDecl() const
static const TST TST_unspecified
SourceLocation getAtomicSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getTypeSpecTypeLoc() const
void UpdateExprRep(Expr *Rep)
static const TSCS TSCS_thread_local
static const TST TST_error
ExplicitSpecifier getExplicitSpecifier() const
bool isTypeSpecOwned() const
SourceLocation getInlineSpecLoc() const
SourceLocation getUnalignedSpecLoc() const
SourceLocation getVolatileSpecLoc() const
FriendSpecified isFriendSpecified() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
static const TST TST_typeofType
static const TST TST_auto
ConstexprSpecKind getConstexprSpecifier() const
static const TST TST_struct
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
const DeclContext * getParentFunctionOrMethod(bool LexicalParent=false) const
If this decl is defined inside a function/method/block it returns the corresponding DeclContext,...
bool isInStdNamespace() const
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isFromGlobalModule() const
Whether this declaration comes from global module.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setAttrs(const AttrVec &Attrs)
bool isUnavailable(std::string *Message=nullptr) const
Determine whether this declaration is marked 'unavailable'.
bool isInNamedModule() const
Whether this declaration comes from a named module.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void setTopLevelDeclInObjCContainer(bool V=true)
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_Undeclared
A friend of a previously-undeclared entity.
@ FOK_None
Not a friend object.
@ FOK_Declared
A friend of a previously-declared entity.
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
bool isInExportDeclContext() const
Whether this declaration was exported in a lexical context.
bool isReferenced() const
Whether any declaration of this entity was referenced.
bool isInAnotherModuleUnit() const
Whether this declaration comes from another module unit.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
bool isAnyOperatorDelete() const
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
bool isEmpty() const
Evaluates true when this declaration name is empty.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Expr * getAsmLabel() const
FunctionDefinitionKind getFunctionDefinitionKind() const
const ParsedAttributes & getAttributes() const
void setRedeclaration(bool Val)
SourceLocation getIdentifierLoc() const
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
SourceLocation getEndLoc() const LLVM_READONLY
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
void takeAttributesAppending(ParsedAttributes &attrs)
takeAttributesAppending - Takes attributes from the given ParsedAttributes set and add them to this d...
void setInvalidType(bool Val=true)
TemplateParameterList * getInventedTemplateParameterList() const
The template parameter list generated from the explicit template parameters along with any invented t...
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isRedeclaration() const
const ParsedAttributesView & getDeclarationAttributes() const
const DecompositionDeclarator & getDecompositionDeclarator() const
SourceLocation getBeginLoc() const LLVM_READONLY
bool isCtorOrDtor()
Returns true if this declares a constructor or a destructor.
bool isFunctionDefinition() const
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
bool hasInitializer() const
void setFunctionDefinitionKind(FunctionDefinitionKind Val)
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, SourceLocation EndLoc)
AddTypeInfo - Add a chunk to this declarator.
bool isInvalidType() const
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
bool isFirstDeclarationOfMember()
Returns true if this declares a real member and not a friend.
bool isStaticMember()
Returns true if this declares a static member.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
const IdentifierInfo * getIdentifier() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
SourceRange getSourceRange() const
SourceLocation getLSquareLoc() const
void setElaboratedKeywordLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Concrete class used by the front-end to report problems and issues.
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
An instance of this object exists for each enum constant that is defined.
llvm::APSInt getInitVal() const
static EnumConstantDecl * Create(ASTContext &C, EnumDecl *DC, SourceLocation L, IdentifierInfo *Id, QualType T, Expr *E, const llvm::APSInt &V)
const Expr * getInitExpr() const
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
bool isComplete() const
Returns true if this can be considered a complete type.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
bool isClosedFlag() const
Returns true if this enum is annotated with flag_enum and isn't annotated with enum_extensibility(ope...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
SourceRange getIntegerTypeRange() const LLVM_READONLY
Retrieve the source range that covers the underlying type if specified.
void setPromotionType(QualType T)
Set the promotion type.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents difference between two FPOptions values.
void setDisallowOptimizations()
bool isFPConstrained() const
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
bool isZeroLengthBitField() const
Is this a zero-length bit-field?
static FileScopeAsmDecl * Create(ASTContext &C, DeclContext *DC, Expr *Str, SourceLocation AsmLoc, SourceLocation RParenLoc)
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a function declaration or definition.
bool isMultiVersion() const
True if this function is considered a multiversioned function.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
void setPreviousDeclaration(FunctionDecl *PrevDecl)
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
param_iterator param_end()
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
bool isCPUSpecificMultiVersion() const
True if this function is a multiversioned processor specific function as a part of the cpu_specific/c...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
LanguageLinkage getLanguageLinkage() const
Compute the language linkage.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool hasWrittenPrototype() const
Whether this function has a written prototype.
void setWillHaveBody(bool V=true)
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
param_iterator param_begin()
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
FunctionEffectsRef getFunctionEffects() const
bool isMSVCRTEntryPoint() const
Determines whether this function is a MSVCRT user defined entry point.
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
@ TK_MemberSpecialization
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isDeletedAsWritten() const
redecl_iterator redecls_end() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isExternC() const
Determines whether this function is a function with external, C linkage.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
bool hasImplicitReturnZero() const
Whether falling off this function implicitly returns null/zero.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isCPUDispatchMultiVersion() const
True if this function is a multiversioned dispatch function as a part of the cpu_specific/cpu_dispatc...
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
const IdentifierInfo * getLiteralIdentifier() const
getLiteralIdentifier - The literal suffix identifier this function represents, if any.
void setConstexprKind(ConstexprSpecKind CSK)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDefaulted(bool D=true)
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
bool isGlobal() const
Determines whether this is a global function.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
bool hasInheritedPrototype() const
Whether this function inherited its prototype from a previous declaration.
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
MultiVersionKind getMultiVersionKind() const
Gets the kind of multiversioning attribute this declaration has.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
A mutable set of FunctionEffects and possibly conditions attached to them.
SmallVector< Conflict > Conflicts
static FunctionEffectSet getUnion(FunctionEffectsRef LHS, FunctionEffectsRef RHS, Conflicts &Errs)
An immutable set of FunctionEffects and possibly conditions attached to them.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
bool isExplicitInstantiationOrSpecialization() const
True if this declaration is an explicit specialization, explicit instantiation declaration,...
Wrapper for source info for functions.
A class which abstracts out some details necessary for making a call.
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCC() const
ExtInfo withProducesResult(bool producesResult) const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
ExtInfo withNoReturn(bool noReturn) const
bool getHasRegParm() const
bool getProducesResult() const
ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const
ExtInfo withRegParm(unsigned RegParm) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static StringRef getNameForCallConv(CallingConv CC)
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
unsigned getRegParmType() const
CallingConv getCallConv() const
QualType getReturnType() const
bool getCmseNSCallAttr() const
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
bool isEditorPlaceholder() const
Return true if this identifier is an editor placeholder.
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
iterator - Iterate over the decls of a specified declaration name.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
step_iterator step_begin() const
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
@ SK_ParenthesizedListInit
Initialize an aggreagate with parenthesized list of values.
Describes an entity that is being initialized.
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
bool isResolvedMSAsmLabel() const
LabelStmt * getStmt() const
bool isMSAsmLabel() const
llvm::iterator_range< capture_init_iterator > capture_inits()
Retrieve the initialization expressions for this lambda's captures.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
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)
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
std::string getConfigureFuncName() const
Returns the name of the launch configuration function.
CUDAFunctionTarget IdentifyTarget(const FunctionDecl *D, bool IgnoreImplicitHDAttr=false)
Determines whether the given function is a CUDA device/host/kernel/etc.
void maybeAddHostDeviceAttrs(FunctionDecl *FD, const LookupResult &Previous)
May add implicit CUDAHostAttr and CUDADeviceAttr attributes to FD, depending on FD and the current co...
void checkTargetOverload(FunctionDecl *NewFD, const LookupResult &Previous)
Check whether NewFD is a valid overload for CUDA.
void MaybeAddConstantAttr(VarDecl *VD)
May add implicit CUDAConstantAttr attribute to VD, depending on VD and current compilation settings.
void CheckEntryPoint(FunctionDecl *FD)
HLSLVkConstantIdAttr * mergeVkConstantIdAttr(Decl *D, const AttributeCommonInfo &AL, int Id)
HLSLNumThreadsAttr * mergeNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z)
void deduceAddressSpace(VarDecl *Decl)
void ActOnTopLevelFunction(FunctionDecl *FD)
HLSLShaderAttr * mergeShaderAttr(Decl *D, const AttributeCommonInfo &AL, llvm::Triple::EnvironmentType ShaderType)
HLSLWaveSizeAttr * mergeWaveSizeAttr(Decl *D, const AttributeCommonInfo &AL, int Min, int Max, int Preferred, int SpelledArgsCount)
void ActOnVariableDeclarator(VarDecl *VD)
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID)
DiagnoseDuplicateIvars - Check for duplicate ivars in the entire class at the start of @implementatio...
void CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden)
Check whether the given new method is a valid override of the given overridden method,...
DeclResult LookupIvarInObjCMethod(LookupResult &Lookup, Scope *S, IdentifierInfo *II)
The parser has read a name in, and Sema has detected that we're currently inside an ObjC method.
void checkRetainCycles(ObjCMessageExpr *msg)
checkRetainCycles - Check whether an Objective-C message send might create an obvious retain cycle.
ExprResult BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV)
void AddCFAuditedAttribute(Decl *D)
AddCFAuditedAttribute - Check whether we're currently within '#pragma clang arc_cf_code_audited' and,...
void CheckImplementationIvars(ObjCImplementationDecl *ImpDecl, ObjCIvarDecl **Fields, unsigned nIvars, SourceLocation Loc)
CheckImplementationIvars - This routine checks if the instance variables listed in the implelementati...
std::unique_ptr< NSAPI > NSAPIObj
Caches identifiers/selectors for NSFoundation APIs.
void ActOnVariableDeclarator(VarDecl *VD)
Function called when a variable declarator is created, which lets us implement the 'routine' 'functio...
OpenACCRoutineDeclAttr * mergeRoutineDeclAttr(const OpenACCRoutineDeclAttr &Old)
void ActOnFunctionDeclarator(FunctionDecl *FD)
Called when a function decl is created, which lets us implement the 'routine' 'doesn't match next thi...
void ActOnVariableInit(VarDecl *VD, QualType InitType)
Called when a variable is initialized, so we can implement the 'routine 'doesn't match the next thing...
void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D)
Act on D, a function definition inside of an omp [begin/end] assumes.
void ActOnFinishedFunctionDefinitionInOpenMPDeclareVariantScope(Decl *D, SmallVectorImpl< FunctionDecl * > &Bases)
Register D as specialization of all base functions in Bases in the current omp begin/end declare vari...
void ActOnStartOfFunctionDefinitionInOpenMPDeclareVariantScope(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, SmallVectorImpl< FunctionDecl * > &Bases)
The declarator D defines a function in the scope S which is nested in an omp begin/end declare varian...
void ActOnOpenMPDeclareTargetInitializer(Decl *D)
Adds OMPDeclareTargetDeclAttr to referenced variables in declare target directive.
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
void checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D, const llvm::StringMap< bool > &FeatureMap)
void CheckSYCLExternalFunctionDecl(FunctionDecl *FD)
StmtResult BuildSYCLKernelCallStmt(FunctionDecl *FD, CompoundStmt *Body)
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
SwiftNameAttr * mergeNameAttr(Decl *D, const SwiftNameAttr &SNA, StringRef Name)
WebAssemblyImportNameAttr * mergeImportNameAttr(Decl *D, const WebAssemblyImportNameAttr &AL)
WebAssemblyImportModuleAttr * mergeImportModuleAttr(Decl *D, const WebAssemblyImportModuleAttr &AL)
Mode getAlignMode() const
A class which encapsulates the logic for delaying diagnostics during parsing and other processing.
bool shouldDelayDiagnostics()
Determines whether diagnostics should be delayed.
void add(const sema::DelayedDiagnostic &diag)
Adds a delayed diagnostic.
static NameClassification DependentNonType()
static NameClassification VarTemplate(TemplateName Name)
static NameClassification Unknown()
static NameClassification OverloadSet(ExprResult E)
static NameClassification UndeclaredTemplate(TemplateName Name)
static NameClassification FunctionTemplate(TemplateName Name)
static NameClassification NonType(NamedDecl *D)
static NameClassification Concept(TemplateName Name)
static NameClassification UndeclaredNonType()
static NameClassification TypeTemplate(TemplateName Name)
static NameClassification Error()
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Sema - This implements semantic analysis and AST building for C.
StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, ParsedAttributes &Attrs)
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< DeclaratorDecl *, 4 > ExternalDeclarations
All the external declarations encoutered and used in the TU.
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
Scope * getCurScope() const
Retrieve the parser's current scope.
void MergeTypedefNameDecl(Scope *S, TypedefNameDecl *New, LookupResult &OldDecls)
MergeTypedefNameDecl - We just parsed a typedef 'New' which has the same name and scope as a previous...
bool hasStructuralCompatLayout(Decl *D, Decl *Suggested)
Determine if D and Suggested have a structurally compatible layout as described in C11 6....
void RegisterLocallyScopedExternCDecl(NamedDecl *ND, Scope *S)
Register the given locally-scoped extern "C" declaration so that it can be found later for redeclarat...
BTFDeclTagAttr * mergeBTFDeclTagAttr(Decl *D, const BTFDeclTagAttr &AL)
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
void DiagnoseUnusedParameters(ArrayRef< ParmVarDecl * > Parameters)
Diagnose any unused parameters in the given sequence of ParmVarDecl pointers.
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupNestedNameSpecifierName
Look up of a name that precedes the '::' scope resolution operator in C++.
@ LookupLocalFriendName
Look up a friend of a local class.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
void ActOnPopScope(SourceLocation Loc, Scope *S)
void ActOnDefinedDeclarationSpecifier(Decl *D)
Called once it is known whether a tag declaration is an anonymous union or struct.
EnforceTCBAttr * mergeEnforceTCBAttr(Decl *D, const EnforceTCBAttr &AL)
Decl * ActOnSkippedFunctionBody(Decl *Decl)
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
bool MergeFunctionDecl(FunctionDecl *New, NamedDecl *&Old, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn)
MergeFunctionDecl - We just parsed a function 'New' from declarator D which has the same name and sco...
void RegisterTypeTagForDatatype(const IdentifierInfo *ArgumentKind, uint64_t MagicValue, QualType Type, bool LayoutCompatible, bool MustBeNull)
Register a magic integral constant to be used as a type tag.
NonTagKind getNonTagTypeDeclKind(const Decl *D, TagTypeKind TTK)
Given a non-tag type declaration, returns an enum useful for indicating what kind of non-tag type thi...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
Decl * ActOnEnumConstant(Scope *S, Decl *EnumDecl, Decl *LastEnumConstant, SourceLocation IdLoc, IdentifierInfo *Id, const ParsedAttributesView &Attrs, SourceLocation EqualLoc, Expr *Val, SkipBodyInfo *SkipBody=nullptr)
void LookupNecessaryTypesForBuiltin(Scope *S, unsigned ID)
void ActOnTagDefinitionError(Scope *S, Decl *TagDecl)
ActOnTagDefinitionError - Invoked when there was an unrecoverable error parsing the definition of a t...
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
TypeVisibilityAttr * mergeTypeVisibilityAttr(Decl *D, const AttributeCommonInfo &CI, TypeVisibilityAttr::VisibilityType Vis)
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void ActOnTagFinishDefinition(Scope *S, Decl *TagDecl, SourceRange BraceRange)
ActOnTagFinishDefinition - Invoked once we have finished parsing the definition of a tag (enumeration...
FunctionEmissionStatus
Status of the function emission on the CUDA/HIP/OpenMP host/device attrs.
llvm::SmallSetVector< const TypedefNameDecl *, 4 > UnusedLocalTypedefNameCandidates
Set containing all typedefs that are likely unused.
PragmaClangSection PragmaClangRodataSection
NamedDecl * ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II, Scope *S)
ImplicitlyDefineFunction - An undeclared identifier was used in a function call, forming a call to an...
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Decl * ActOnParamDeclarator(Scope *S, Declarator &D, SourceLocation ExplicitThisLoc={})
ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator() to introduce parameters into fun...
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
void ActOnExitFunctionContext()
void inferLifetimeCaptureByAttribute(FunctionDecl *FD)
Add [[clang:lifetime_capture_by(this)]] to STL container methods.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
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)
void CheckAttributesOnDeducedType(Decl *D)
CheckAttributesOnDeducedType - Calls Sema functions for attributes that requires the type to be deduc...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
bool UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *TheDecl)
void MergeVarDeclTypes(VarDecl *New, VarDecl *Old, bool MergeTypeWithOld)
MergeVarDeclTypes - We parsed a variable 'New' which has the same name and scope as a previous declar...
void PushFunctionScope()
Enter a new function scope.
ExprResult ActOnNameClassifiedAsNonType(Scope *S, const CXXScopeSpec &SS, NamedDecl *Found, SourceLocation NameLoc, const Token &NextToken)
Act on the result of classifying a name as a specific non-type declaration.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
llvm::function_ref< void(SourceLocation Loc, PartialDiagnostic PD)> DiagReceiverTy
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
bool FriendConstraintsDependOnEnclosingTemplate(const FunctionDecl *FD)
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
sema::LambdaScopeInfo * PushLambdaScope()
SkipBodyInfo shouldSkipAnonEnumBody(Scope *S, IdentifierInfo *II, SourceLocation IILoc)
Determine whether the body of an anonymous enumeration should be skipped.
@ UPPC_FixedUnderlyingType
The fixed underlying type of an enumeration.
@ UPPC_EnumeratorValue
The enumerator value.
@ UPPC_Initializer
An initializer.
@ UPPC_FriendDeclaration
A friend declaration.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
@ UPPC_ExplicitSpecialization
Explicit specialization.
@ UPPC_DeclarationQualifier
A declaration qualifier.
@ UPPC_DataMemberType
The type of a data member.
@ UPPC_BitFieldWidth
The size of a bit-field.
const LangOptions & getLangOpts() const
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool RebuildTemplateParamsInCurrentInstantiation(TemplateParameterList *Params)
Rebuild the template parameters now that we know we're in a current instantiation.
void DiagnoseInvalidJumps(Stmt *Body)
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.
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
void CheckShadowingDeclModification(Expr *E, SourceLocation Loc)
Warn if 'E', which is an expression that is about to be modified, refers to a shadowing declaration.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
void applyFunctionAttributesBeforeParsingBody(Decl *FD)
DLLExportAttr * mergeDLLExportAttr(Decl *D, const AttributeCommonInfo &CI)
void CleanupMergedEnum(Scope *S, Decl *New)
CleanupMergedEnum - We have just merged the decl 'New' by making another definition visible.
DeclContext * OriginalLexicalContext
Generally null except when we temporarily switch decl contexts, like in.
bool hasVisibleDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a visible definition.
CodeSegAttr * mergeCodeSegAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
SectionAttr * mergeSectionAttr(Decl *D, const AttributeCommonInfo &CI, StringRef Name)
bool canSkipFunctionBody(Decl *D)
Determine whether we can skip parsing the body of a function definition, assuming we don't care about...
bool canFullyTypeCheckRedeclaration(ValueDecl *NewD, ValueDecl *OldD, QualType NewT, QualType OldT)
Determines if we can perform a correct type check for D as a redeclaration of PrevDecl.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
SourceManager & getSourceManager() const
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
llvm::DenseMap< const EnumDecl *, llvm::APInt > FlagBitsCache
A cache of the flags available in enumerations with the flag_bits attribute.
bool MergeCompatibleFunctionDecls(FunctionDecl *New, FunctionDecl *Old, Scope *S, bool MergeTypeWithOld)
Completes the merge of two function declarations that are known to be compatible.
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool areMultiversionVariantFunctionsCompatible(const FunctionDecl *OldFD, const FunctionDecl *NewFD, const PartialDiagnostic &NoProtoDiagID, const PartialDiagnosticAt &NoteCausedDiagIDAt, const PartialDiagnosticAt &NoSupportDiagIDAt, const PartialDiagnosticAt &DiffDiagIDAt, bool TemplatesSupported, bool ConstexprSupported, bool CLinkageMayDiffer)
Checks if the variant/multiversion functions are compatible.
void ActOnTagStartDefinition(Scope *S, Decl *TagDecl)
ActOnTagStartDefinition - Invoked when we have entered the scope of a tag's definition (e....
ExprResult BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S)
Builds an expression which might be an implicit member expression.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
PragmaClangSection PragmaClangTextSection
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)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
bool CheckForConstantInitializer(Expr *Init, unsigned DiagID=diag::err_init_element_not_constant)
type checking declaration initializers (C99 6.7.8)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
@ FirstDecl
Parsing the first decl in a TU.
void CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc)
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
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.
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.
std::pair< NullabilityKind, bool > DiagNullabilityKind
A nullability kind paired with a bit indicating whether it used a context-sensitive keyword.
MutableArrayRef< Expr * > MultiExprArg
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
llvm::Expected< Decl * > ExpectedDecl
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
const FunctionProtoType * T
bool supportsVariadicCall(CallingConv CC)
Checks whether the given calling convention supports variadic calls.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ Union
The "union" keyword.
@ Enum
The "enum" keyword.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t',...
bool isDiscardableGVALinkage(GVALinkage L)
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Complete
The translation unit is a complete translation unit.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
CXXSpecialMemberKind
Kinds of C++ special members.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
bool isExternalFormalLinkage(Linkage L)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
@ Enumerator
Enumerator value with fixed underlying type.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ HiddenVisibility
Objects with "hidden" visibility are not seen by the dynamic linker.
ActionResult< Stmt * > StmtResult
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
const Expr * ConstraintExpr
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setCXXLiteralOperatorNameLoc(SourceLocation Loc)
setCXXLiteralOperatorNameLoc - Sets the location of the literal operator name (not the operator keywo...
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setCXXOperatorNameRange(SourceRange R)
setCXXOperatorNameRange - Sets the range of the operator name (without the operator keyword).
SourceRange getCXXOperatorNameRange() const
getCXXOperatorNameRange - Gets the range of the operator name (without the operator keyword).
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ArrayRef< NamedDecl * > getDeclsInPrototype() const
Get the non-parameter decls defined within this function prototype.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned hasPrototype
hasPrototype - This is true if the function had at least one typed parameter.
const IdentifierInfo * Ident
One instance of this struct is used for each type in a declarator that is parsed.
const ParsedAttributesView & getAttrs() const
If there are attributes applied to this declaratorchunk, return them.
static DeclaratorChunk getFunction(bool HasProto, bool IsAmbiguous, SourceLocation LParenLoc, ParamInfo *Params, unsigned NumParams, SourceLocation EllipsisLoc, SourceLocation RParenLoc, bool RefQualifierIsLvalueRef, SourceLocation RefQualifierLoc, SourceLocation MutableLoc, ExceptionSpecificationType ESpecType, SourceRange ESpecRange, ParsedType *Exceptions, SourceRange *ExceptionRanges, unsigned NumExceptions, Expr *NoexceptExpr, CachedTokens *ExceptionSpecTokens, ArrayRef< NamedDecl * > DeclsInPrototype, SourceLocation LocalRangeBegin, SourceLocation LocalRangeEnd, Declarator &TheDeclarator, TypeResult TrailingReturnType=TypeResult(), SourceLocation TrailingReturnTypeLoc=SourceLocation(), DeclSpec *MethodQualifiers=nullptr)
DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
MemberPointerTypeInfo Mem
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, bool lvalue)
Return a DeclaratorChunk for a reference.
EvalResult is a struct with detailed info about an evaluated expression.
Extra information about a function prototype.
FunctionEffectsRef FunctionEffects
unsigned CFIUncheckedCallee
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI)
static StringRef getTagTypeKindName(TagTypeKind Kind)
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Contains information gathered from parsing the contents of TargetAttr.
std::vector< std::string > Features
Describes how types, statements, expressions, and declarations should be printed.
SourceLocation CurrentPragmaLocation
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
OpaquePtr< T > get() const
SourceLocation SymbolLocations[3]
The source locations of the individual tokens that name the operator, e.g., the "new",...
OverloadedOperatorKind Operator
The kind of overloaded operator.