43#include "llvm/ADT/SmallBitVector.h"
44#include "llvm/ADT/StringExtras.h"
45#include "llvm/Support/Casting.h"
46#include "llvm/Support/SaveAndRestore.h"
57 return SourceRange(Ps[0]->getTemplateLoc(), Ps[N-1]->getRAngleLoc());
71 auto ParamsAtDepth = [&](
unsigned D) { Depth = std::max(Depth, D + 1); };
76 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(FSI)) {
77 if (!LSI->TemplateParams.empty()) {
78 ParamsAtDepth(LSI->AutoTemplateParameterDepth);
81 if (LSI->GLTemplateParameterList) {
82 ParamsAtDepth(LSI->GLTemplateParameterList->getDepth());
92 if (!Info.TemplateParams.empty()) {
93 ParamsAtDepth(Info.AutoTemplateParameterDepth);
108 bool AllowFunctionTemplates,
109 bool AllowDependent) {
119 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(D)) {
131 if (
Record->isInjectedClassName()) {
133 if (
Record->getDescribedClassTemplate())
134 return Record->getDescribedClassTemplate();
136 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
Record))
137 return Spec->getSpecializedTemplate();
153 bool AllowFunctionTemplates,
154 bool AllowDependent) {
165 bool AllowFunctionTemplates,
167 bool AllowNonTemplateFunctions) {
171 if (AllowNonTemplateFunctions &&
182 bool EnteringContext,
TemplateTy &TemplateResult,
183 bool &MemberOfUnknownSpecialization,
184 bool AllowTypoCorrection) {
188 MemberOfUnknownSpecialization =
false;
196 TName =
Context.DeclarationNames.getCXXOperatorName(
214 &AssumedTemplate, AllowTypoCorrection))
216 MemberOfUnknownSpecialization = R.wasNotFoundInCurrentInstantiation();
232 UsingShadowDecl *FoundUsingShadow = dyn_cast<UsingShadowDecl>(*R.begin());
233 if (R.isAmbiguous()) {
236 bool AnyFunctionTemplates =
false;
240 AnyFunctionTemplates =
true;
243 FoundUsingShadow = dyn_cast<UsingShadowDecl>(FoundD);
251 if (!D && !AnyFunctionTemplates) {
252 R.suppressDiagnostics();
269 unsigned ResultCount = R.end() - R.begin();
270 if (!D && ResultCount > 1) {
277 R.suppressDiagnostics();
281 assert(D &&
"unambiguous result is not a template name");
286 MemberOfUnknownSpecialization =
true;
293 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
296 Template =
Context.getQualifiedTemplateName(Qualifier, hasTemplateKeyword,
304 R.suppressDiagnostics();
311 ? dyn_cast<TemplateTemplateParmDecl>(TD)->templateParameterKind()
320 Diag(Name.
getBeginLoc(), diag::err_builtin_pack_outside_template) << TName;
339 if (R.empty())
return false;
340 if (R.isAmbiguous()) {
342 R.suppressDiagnostics();
376 {SS->getScopeRep(), &II, false}));
377 Diag(IILoc, diag::err_template_kw_missing)
378 << SuggestedTemplate.
get()
385 QualType ObjectType,
bool EnteringContext,
388 bool AllowTypoCorrection) {
395 Found.setTemplateNameLookup(
true);
399 bool IsDependent =
false;
400 if (!ObjectType.
isNull()) {
403 assert(SS.
isEmpty() &&
"ObjectType and scope specifier cannot coexist");
407 !ObjectType->
getAs<TagType>() ||
408 ObjectType->
castAs<TagType>()->getDecl()->isEntityBeingDefined()) &&
409 "Caller should have completed object type");
441 bool ObjectTypeSearchedInScope =
false;
442 bool AllowFunctionTemplatesInLookup =
true;
458 IsDependent |=
Found.wasNotFoundInCurrentInstantiation();
474 if (!ObjectType.
isNull()) {
478 AllowFunctionTemplatesInLookup =
false;
479 ObjectTypeSearchedInScope =
true;
482 IsDependent |=
Found.wasNotFoundInCurrentInstantiation();
485 if (
Found.isAmbiguous())
502 if (AllFunctions || (
Found.empty() && !IsDependent)) {
506 *ATK = (
Found.empty() &&
Found.getLookupName().isIdentifier())
514 if (
Found.empty() && !IsDependent && AllowTypoCorrection) {
520 class TemplateNameLookupValidatorCCC final
532 std::unique_ptr<CorrectionCandidateCallback> clone()
final {
533 return std::make_unique<TemplateNameLookupValidatorCCC>(*
this);
537 TemplateNameLookupValidatorCCC FilterCCC(!SS.
isEmpty());
538 FilterCCC.WantTypeSpecifiers =
false;
539 FilterCCC.WantExpressionKeywords =
false;
540 FilterCCC.WantRemainingKeywords =
false;
541 FilterCCC.WantCXXNamedCasts =
true;
543 Found.getLookupNameInfo(),
Found.getLookupKind(), S, &SS, FilterCCC,
545 if (
auto *ND = Corrected.getFoundDecl())
548 if (
Found.isAmbiguous()) {
550 }
else if (!
Found.empty()) {
553 AllowFunctionTemplatesInLookup =
true;
554 Found.setLookupName(Corrected.getCorrection());
556 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
557 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
560 << Name << LookupCtx << DroppedSpecifier
566 if (Corrected.WillReplaceSpecifier()) {
582 Found.setNotFoundInCurrentInstantiation();
588 if (ExampleLookupResult && RequiredTemplate) {
589 Diag(
Found.getNameLoc(), diag::err_template_kw_refers_to_non_template)
594 diag::note_template_kw_refers_to_non_template)
595 <<
Found.getLookupName();
602 if (S && !ObjectType.
isNull() && !ObjectTypeSearchedInScope &&
619 if (FoundOuter.
empty()) {
629 }
else if (!
Found.isSuppressingAmbiguousDiagnostics()) {
633 if (!
Found.isSingleResult() ||
637 diag::ext_nested_name_member_ref_lookup_ambiguous)
638 <<
Found.getLookupName()
640 Diag(
Found.getRepresentativeDecl()->getLocation(),
641 diag::note_ambig_member_ref_object_type)
644 diag::note_ambig_member_ref_scope);
667 bool MissingTemplateKeyword =
false;
670 if (
auto *DRE = dyn_cast<DeclRefExpr>(
TemplateName.get())) {
671 NameInfo = DRE->getNameInfo();
672 SS.
Adopt(DRE->getQualifierLoc());
674 Found = DRE->getFoundDecl();
675 }
else if (
auto *ME = dyn_cast<MemberExpr>(
TemplateName.get())) {
676 NameInfo = ME->getMemberNameInfo();
677 SS.
Adopt(ME->getQualifierLoc());
679 LookupCtx = ME->getBase()->getType()->getAsCXXRecordDecl();
680 Found = ME->getMemberDecl();
681 }
else if (
auto *DSDRE =
682 dyn_cast<DependentScopeDeclRefExpr>(
TemplateName.get())) {
683 NameInfo = DSDRE->getNameInfo();
684 SS.
Adopt(DSDRE->getQualifierLoc());
685 MissingTemplateKeyword =
true;
686 }
else if (
auto *DSME =
687 dyn_cast<CXXDependentScopeMemberExpr>(
TemplateName.get())) {
688 NameInfo = DSME->getMemberNameInfo();
689 SS.
Adopt(DSME->getQualifierLoc());
690 MissingTemplateKeyword =
true;
692 llvm_unreachable(
"unexpected kind of potential template name");
697 if (MissingTemplateKeyword) {
706 TemplateCandidateFilter(
Sema &S) : S(S) {
707 WantTypeSpecifiers =
false;
708 WantExpressionKeywords =
false;
709 WantRemainingKeywords =
false;
710 WantCXXNamedCasts =
true;
712 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
718 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
719 return std::make_unique<TemplateCandidateFilter>(*
this);
724 TemplateCandidateFilter CCC(*
this);
728 auto *ND = Corrected.getFoundDecl();
731 if (ND || Corrected.isKeyword()) {
733 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
734 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
737 PDiag(diag::err_non_template_in_member_template_id_suggest)
738 << Name << LookupCtx << DroppedSpecifier
742 PDiag(diag::err_non_template_in_template_id_suggest)
747 diag::note_non_template_in_template_id_found);
752 Diag(NameInfo.
getLoc(), diag::err_non_template_in_template_id)
755 Diag(
Found->getLocation(), diag::note_non_template_in_template_id_found);
762 bool isAddressOfOperand,
778 nullptr, NameInfo, TemplateArgs);
812 SemaRef.BuildExpressionFromNonTypeTemplateArgument(Arg, Loc);
815 Replacement = result.
get();
818 Replacement->getType(), Replacement->getValueKind(), Loc, Replacement,
819 AssociatedDecl, ParamType, Index,
PackIndex, Final);
824 bool InstantiatedFromMember,
828 bool Complain,
bool *Unreachable) {
832 bool IsEntityBeingDefined =
false;
833 if (
const TagDecl *TD = dyn_cast_or_null<TagDecl>(PatternDef))
834 IsEntityBeingDefined = TD->isBeingDefined();
836 if (PatternDef && !IsEntityBeingDefined) {
853 if (!Complain || (PatternDef && PatternDef->
isInvalidDecl()))
857 if (
TagDecl *TD = dyn_cast<TagDecl>(Instantiation))
858 InstantiationTy =
Context.getCanonicalTagType(TD);
860 Diag(PointOfInstantiation,
861 diag::err_template_instantiate_within_definition)
867 }
else if (InstantiatedFromMember) {
869 Diag(PointOfInstantiation,
870 diag::err_explicit_instantiation_undefined_member)
875 assert(
isa<TagDecl>(Instantiation) &&
"Must be a TagDecl!");
876 Diag(PointOfInstantiation,
877 diag::err_implicit_instantiate_member_undefined)
883 Diag(PointOfInstantiation,
884 diag::err_explicit_instantiation_undefined_func_template)
888 Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
893 assert(
isa<VarDecl>(Instantiation) &&
"Must be a VarDecl!");
895 Diag(PointOfInstantiation,
896 diag::err_explicit_instantiation_undefined_var_template)
900 Diag(PointOfInstantiation,
901 diag::err_explicit_instantiation_undefined_member)
918 bool SupportedForCompatibility) {
931 ? diag::ext_template_param_shadow
932 : (SupportedForCompatibility ? diag::ext_compat_template_param_shadow
933 : diag::err_template_param_shadow);
935 Diag(Loc, DiagId) << ND->getDeclName();
940 if (
TemplateDecl *Temp = dyn_cast_or_null<TemplateDecl>(D)) {
941 D = Temp->getTemplatedDecl();
950 "Only template template arguments can be pack expansions here");
951 assert(
getAsTemplate().get().containsUnexpandedParameterPack() &&
952 "Template template argument pack expansion without packs");
954 Result.EllipsisLoc = EllipsisLoc;
989 llvm_unreachable(
"Unhandled parsed template argument");
994 for (
unsigned I = 0,
Last = TemplateArgsIn.size(); I !=
Last; ++I)
1014 assert(TInfo &&
"template argument with no location");
1022 EllipsisLoc = PET.getEllipsisLoc();
1023 TL = PET.getPatternLoc();
1027 TemplateName Name = DTST.getTypePtr()->getTemplateName();
1029 SS.
Adopt(DTST.getQualifierLoc());
1032 DTST.getTemplateNameLoc());
1053 unsigned Depth,
unsigned Position,
1056 bool HasTypeConstraint) {
1058 "Template type parameter not in template parameter scope!");
1060 bool IsParameterPack = EllipsisLoc.
isValid();
1063 KeyLoc, ParamNameLoc, Depth, Position,
1064 ParamName,
Typename, IsParameterPack,
1068 if (Param->isParameterPack())
1070 CSI->LocalPacks.push_back(Param);
1083 if (DefaultArg && IsParameterPack) {
1084 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1085 DefaultArg =
nullptr;
1093 assert(DefaultTInfo &&
"expected source information for type");
1102 Param->setInvalidDecl();
1106 Param->setDefaultArgument(
1121 return TemplateArgs;
1128 bool IsTypeConcept =
false;
1129 bool RequiresArguments =
false;
1131 IsTypeConcept = TTP->isTypeConceptTemplateParam();
1133 TTP->getTemplateParameters()->getMinRequiredArguments() > 1;
1139 ->getTemplateParameters()
1140 ->getMinRequiredArguments() > 1;
1146 if (!IsTypeConcept) {
1148 diag::err_type_constraint_non_type_concept);
1157 if (!WereArgsSpecified && RequiresArguments) {
1159 diag::err_type_constraint_missing_arguments)
1178 bool AllowUnexpandedPack) {
1195 if (EllipsisLoc.
isInvalid() && !AllowUnexpandedPack) {
1206 ConstrainedParameter, EllipsisLoc);
1209template <
typename ArgumentLocAppender>
1224 Appender(ConstraintArgs);
1232 if (
auto *CD = dyn_cast<ConceptDecl>(NamedConcept)) {
1235 FoundDecl ? FoundDecl : CD, CD, &ConstraintArgs,
1241 assert(SS.
isEmpty() &&
"template parameter with a scope specifier?");
1242 auto *CDT = dyn_cast<TemplateTemplateParmDecl>(NamedConcept);
1243 ImmediatelyDeclaredConstraint =
1247 return ImmediatelyDeclaredConstraint;
1263 ImmediatelyDeclaredConstraint.
get(), BO_LAnd,
1264 EllipsisLoc,
nullptr,
1281 *TemplateArgs) :
nullptr;
1286 *
this,
NS, NameInfo, NamedConcept, FoundDecl,
1289 ParamAsArgument, ConstrainedParameter->
getLocation(),
1292 for (const auto &ArgLoc : TemplateArgs->arguments())
1293 ConstraintArgs.addArgument(ArgLoc);
1296 if (ImmediatelyDeclaredConstraint.
isInvalid())
1306 CL, ImmediatelyDeclaredConstraint.
get(), std::nullopt);
1317 diag::err_unsupported_placeholder_constraint)
1337 for (unsigned I = 0, C = TL.getNumArgs(); I != C; ++I)
1338 ConstraintArgs.addArgument(TL.getArgLoc(I));
1341 if (ImmediatelyDeclaredConstraint.
isInvalid() ||
1342 !ImmediatelyDeclaredConstraint.
isUsable())
1346 ImmediatelyDeclaredConstraint.
get());
1368 if (
T->isDependentType())
1374 if (
T->isStructuralType())
1378 if (
T->isRValueReferenceType()) {
1379 Diag(Loc, diag::err_template_nontype_parm_rvalue_ref) <<
T;
1388 (!
T->isScalarType() && !
T->isRecordType())) {
1389 Diag(Loc, diag::err_template_nontype_parm_bad_type) <<
T;
1397 Diag(Loc, diag::err_template_nontype_parm_not_structural) <<
T;
1404 for (
const FieldDecl *FD : RD->fields()) {
1406 Diag(FD->getLocation(), diag::note_not_structural_non_public) <<
T << 0;
1409 if (FD->isMutable()) {
1410 Diag(FD->getLocation(), diag::note_not_structural_mutable_field) <<
T;
1413 if (FD->getType()->isRValueReferenceType()) {
1414 Diag(FD->getLocation(), diag::note_not_structural_rvalue_ref_field)
1421 for (
const auto &BaseSpec : RD->bases()) {
1422 if (BaseSpec.getAccessSpecifier() !=
AS_public) {
1423 Diag(BaseSpec.getBaseTypeLoc(), diag::note_not_structural_non_public)
1434 for (
const FieldDecl *FD : RD->fields()) {
1436 if (!
T->isStructuralType()) {
1437 SubLoc = FD->getLocation();
1445 for (
const auto &BaseSpec : RD->bases()) {
1447 if (!
T->isStructuralType()) {
1448 SubLoc = BaseSpec.getBaseTypeLoc();
1456 assert(Kind != -1 &&
"couldn't find reason why type is not structural");
1457 Diag(SubLoc, diag::note_not_structural_subobject)
1458 <<
T << Kind << SubType;
1460 RD =
T->getAsCXXRecordDecl();
1470 if (
T->isVariablyModifiedType()) {
1471 Diag(Loc, diag::err_variably_modified_nontype_template_param)
1476 if (
T->isBlockPointerType()) {
1477 Diag(Loc, diag::err_template_nontype_parm_bad_type) <<
T;
1487 if (
T->isIntegralOrEnumerationType() ||
1489 T->isPointerType() ||
1491 T->isLValueReferenceType() ||
1493 T->isMemberPointerType() ||
1495 T->isNullPtrType() ||
1497 T->isUndeducedType()) {
1500 return T.getUnqualifiedType();
1508 if (
T->isArrayType() ||
T->isFunctionType())
1517 if (
T->isDependentType())
1518 return T.getUnqualifiedType();
1529 Diag(Loc, diag::err_template_nontype_parm_bad_structural_type) <<
T;
1533 Diag(Loc, diag::warn_cxx17_compat_template_nontype_parm_type) <<
T;
1534 return T.getUnqualifiedType();
1545 auto CheckValidDeclSpecifiers = [
this, &D] {
1559 Diag(Loc, diag::err_invalid_decl_specifier_in_nontype_parm)
1596 CheckValidDeclSpecifiers();
1601 diag::warn_cxx14_compat_template_nontype_parm_auto_type)
1605 "Non-type template parameter not in template parameter scope!");
1625 if (TL.isConstrained()) {
1627 T->containsUnexpandedParameterPack()) {
1628 assert(TL.getConceptReference()->getTemplateArgsAsWritten());
1630 TL.getConceptReference()->getTemplateArgsAsWritten()->arguments())
1640 Param->setInvalidDecl();
1642 if (Param->isParameterPack())
1644 CSI->LocalPacks.push_back(Param);
1658 if (
Default && IsParameterPack) {
1659 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1669 Param->setDefaultArgument(
1688 "Template template parameter not in template parameter scope!");
1690 bool IsParameterPack = EllipsisLoc.
isValid();
1693 if (Params->
size() == 0) {
1694 Diag(Loc, diag::err_template_template_parm_no_parms)
1701 Depth + 1, 0,
nullptr,
1718 IsParameterPack, Name, Kind,
Typename, Params);
1721 if (Param->isParameterPack())
1723 LSI->LocalPacks.push_back(Param);
1735 Param->setInvalidDecl();
1740 if (IsParameterPack && !
Default.isInvalid()) {
1741 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1756 Diag(DefaultArg.
getLocation(), diag::err_template_arg_not_valid_template)
1775 Param->setDefaultArgument(
Context, DefaultArg);
1782class ConstraintRefersToContainingTemplateChecker
1787 unsigned TemplateDepth = 0;
1791 bool CheckIfContainingRecord(
const CXXRecordDecl *CheckingRD) {
1797 DC && !DC->isFileContext(); DC = DC->getParent())
1798 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
1799 if (CheckingRD == RD->getMostRecentDecl()) {
1807 bool CheckNonTypeTemplateParmDecl(
const NonTypeTemplateParmDecl *D) {
1813 return TraverseType(D->
getType());
1817 ConstraintRefersToContainingTemplateChecker(
const FunctionDecl *
Friend,
1818 unsigned TemplateDepth)
1821 bool getResult()
const {
return Result; }
1827 bool VisitTemplateTypeParmType(
const TemplateTypeParmType *
Type)
override {
1828 if (
Type->getDecl()->getDepth() < TemplateDepth) {
1835 bool TraverseDeclRefExpr(
const DeclRefExpr *E)
override {
1836 return TraverseDecl(E->
getDecl());
1839 bool TraverseTypedefType(
const TypedefType *TT,
1841 return TraverseType(TT->
desugar());
1844 bool TraverseTypeLoc(TypeLoc TL,
bool TraverseQualifier)
override {
1846 return TraverseType(TL.
getType(), TraverseQualifier);
1849 bool VisitTagType(
const TagType *
T)
override {
1850 return TraverseDecl(
T->getDecl());
1853 bool TraverseDecl(
const Decl *D)
override {
1859 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
1860 return TraverseType(TD->getUnderlyingType());
1861 if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(D))
1862 return CheckNonTypeTemplateParmDecl(NTTPD);
1863 if (
auto *VD = dyn_cast<ValueDecl>(D))
1864 return TraverseType(VD->getType());
1867 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1868 return CheckIfContainingRecord(RD);
1873 llvm_unreachable(
"Don't know how to handle this declaration type yet");
1881 const Expr *Constraint) {
1882 assert(
Friend->getFriendObjectKind() &&
"Only works on a friend");
1883 ConstraintRefersToContainingTemplateChecker Checker(
Friend, TemplateDepth);
1884 Checker.TraverseStmt(Constraint);
1885 return Checker.getResult();
1895 Expr *RequiresClause) {
1897 Diag(ExportLoc, diag::warn_template_export_unsupported);
1950 assert(TemplateParams && TemplateParams->
size() > 0 &&
1951 "No template parameters");
1953 "Can only declare or define class templates");
1962 "can't build template of enumerated type");
1966 Diag(KWLoc, diag::err_template_unnamed_class);
1981 if (!SemanticContext) {
1982 Diag(NameLoc, diag::err_template_qualified_declarator_no_match)
2002 IsMemberSpecialization))
2059 dyn_cast_or_null<ClassTemplateDecl>(PrevDecl);
2064 if (!PrevClassTemplate && isa_and_nonnull<CXXRecordDecl>(PrevDecl) &&
2072 ->getSpecializedTemplate();
2095 PrevDecl = PrevClassTemplate =
nullptr;
2096 SemanticContext = OutermostContext;
2114 SemanticContext, S, SS.
isValid()))
2115 PrevDecl = PrevClassTemplate =
nullptr;
2117 if (
auto *Shadow = dyn_cast_or_null<UsingShadowDecl>(
2118 PrevDecl ?
Previous.getRepresentativeDecl() :
nullptr)) {
2120 !(PrevClassTemplate &&
2123 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
2124 Diag(Shadow->getTargetDecl()->getLocation(),
2125 diag::note_using_decl_target);
2126 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl) << 0;
2128 PrevDecl = PrevClassTemplate =
nullptr;
2132 if (PrevClassTemplate) {
2141 TemplateParams, PrevClassTemplate,
2154 Diag(KWLoc, diag::err_use_with_wrong_tag)
2167 bool HiddenDefVisible =
false;
2172 if (!HiddenDefVisible && Hidden) {
2175 assert(Tmpl &&
"original definition of a class template is not a "
2181 Diag(NameLoc, diag::err_redefinition) << Name;
2182 Diag(Def->getLocation(), diag::note_previous_definition);
2189 }
else if (PrevDecl) {
2195 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
2209 (SS.
isSet() && SemanticContext && SemanticContext->
isRecord() &&
2222 ? diag::err_friend_decl_does_not_match
2223 : diag::err_member_decl_does_not_match)
2224 << Name << SemanticContext <<
true
2233 bool ShouldAddRedecl =
2237 Context, Kind, SemanticContext, KWLoc, NameLoc, Name,
2238 PrevClassTemplate && ShouldAddRedecl
2242 if (NumOuterTemplateParamLists > 0)
2245 llvm::ArrayRef(OuterTemplateParamLists, NumOuterTemplateParamLists));
2261 if (ShouldAddRedecl)
2266 if (ModulePrivateLoc.
isValid())
2269 if (IsMemberSpecialization) {
2270 assert(PrevClassTemplate &&
2271 "Member specialization without a primary template?");
2289 if (PrevClassTemplate) {
2327 if (PrevClassTemplate)
2366 S.
DiagCompat(ParamLoc, diag_compat::templ_default_in_function_templ)
2375 S.
Diag(ParamLoc, diag::err_template_parameter_default_template_member)
2384 S.
Diag(ParamLoc, diag::err_template_parameter_default_friend_template)
2393 llvm_unreachable(
"Invalid TemplateParamListContext!");
2406 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
2411 if (TC->hasExplicitTemplateArgs())
2412 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
2420 if (!NTTP->isParameterPack() &&
2422 NTTP->getTypeSourceInfo(),
2430 = dyn_cast<TemplateTemplateParmDecl>(P))
2450 bool SawDefaultArgument =
false;
2456 OldParam = OldParams->
begin();
2458 bool RemoveDefaultArguments =
false;
2460 NewParamEnd = NewParams->
end();
2461 NewParam != NewParamEnd; ++NewParam) {
2464 bool RedundantDefaultArg =
false;
2467 bool InconsistentDefaultArg =
false;
2469 std::string PrevModuleName;
2475 bool MissingDefaultArg =
false;
2478 bool SawParameterPack =
false;
2481 = dyn_cast<TemplateTypeParmDecl>(*NewParam)) {
2483 if (NewTypeParm->hasDefaultArgument() &&
2485 *
this, TPC, NewTypeParm->getLocation(),
2486 NewTypeParm->getDefaultArgument().getSourceRange()))
2487 NewTypeParm->removeDefaultArgument();
2492 if (NewTypeParm->isParameterPack()) {
2493 assert(!NewTypeParm->hasDefaultArgument() &&
2494 "Parameter packs can't have a default argument!");
2495 SawParameterPack =
true;
2497 NewTypeParm->hasDefaultArgument() &&
2500 NewDefaultLoc = NewTypeParm->getDefaultArgumentLoc();
2501 SawDefaultArgument =
true;
2504 RedundantDefaultArg =
true;
2505 else if (!
getASTContext().isSameDefaultTemplateArgument(OldTypeParm,
2507 InconsistentDefaultArg =
true;
2511 PreviousDefaultArgLoc = NewDefaultLoc;
2515 NewTypeParm->setInheritedDefaultArgument(
Context, OldTypeParm);
2517 }
else if (NewTypeParm->hasDefaultArgument()) {
2518 SawDefaultArgument =
true;
2519 PreviousDefaultArgLoc = NewTypeParm->getDefaultArgumentLoc();
2520 }
else if (SawDefaultArgument)
2521 MissingDefaultArg =
true;
2523 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {
2528 !NewNonTypeParm->isParameterPack() &&
2530 NewNonTypeParm->getTypeSourceInfo(),
2537 if (NewNonTypeParm->hasDefaultArgument() &&
2539 *
this, TPC, NewNonTypeParm->getLocation(),
2540 NewNonTypeParm->getDefaultArgument().getSourceRange())) {
2541 NewNonTypeParm->removeDefaultArgument();
2547 if (NewNonTypeParm->isParameterPack()) {
2548 assert(!NewNonTypeParm->hasDefaultArgument() &&
2549 "Parameter packs can't have a default argument!");
2550 if (!NewNonTypeParm->isPackExpansion())
2551 SawParameterPack =
true;
2553 NewNonTypeParm->hasDefaultArgument() &&
2556 NewDefaultLoc = NewNonTypeParm->getDefaultArgumentLoc();
2557 SawDefaultArgument =
true;
2559 RedundantDefaultArg =
true;
2561 OldNonTypeParm, NewNonTypeParm)) {
2562 InconsistentDefaultArg =
true;
2566 PreviousDefaultArgLoc = NewDefaultLoc;
2570 NewNonTypeParm->setInheritedDefaultArgument(
Context, OldNonTypeParm);
2572 }
else if (NewNonTypeParm->hasDefaultArgument()) {
2573 SawDefaultArgument =
true;
2574 PreviousDefaultArgLoc = NewNonTypeParm->getDefaultArgumentLoc();
2575 }
else if (SawDefaultArgument)
2576 MissingDefaultArg =
true;
2599 "Parameter packs can't have a default argument!");
2601 SawParameterPack =
true;
2602 }
else if (OldTemplateParm &&
2608 SawDefaultArgument =
true;
2610 RedundantDefaultArg =
true;
2612 OldTemplateParm, NewTemplateParm)) {
2613 InconsistentDefaultArg =
true;
2617 PreviousDefaultArgLoc = NewDefaultLoc;
2622 PreviousDefaultArgLoc
2625 SawDefaultArgument =
true;
2626 PreviousDefaultArgLoc
2628 }
else if (SawDefaultArgument)
2629 MissingDefaultArg =
true;
2635 if (SawParameterPack && (NewParam + 1) != NewParamEnd &&
2637 Diag((*NewParam)->getLocation(),
2638 diag::err_template_param_pack_must_be_last_template_parameter);
2655 if (RedundantDefaultArg) {
2656 Diag(NewDefaultLoc, diag::err_template_param_default_arg_redefinition);
2657 Diag(OldDefaultLoc, diag::note_template_param_prev_default_arg);
2659 }
else if (InconsistentDefaultArg) {
2663 diag::err_template_param_default_arg_inconsistent_redefinition);
2665 diag::note_template_param_prev_default_arg_in_other_module)
2668 }
else if (MissingDefaultArg &&
2676 Diag((*NewParam)->getLocation(),
2677 diag::err_template_param_default_arg_missing);
2678 Diag(PreviousDefaultArgLoc, diag::note_template_param_prev_default_arg);
2680 RemoveDefaultArguments =
true;
2691 if (RemoveDefaultArguments) {
2693 NewParamEnd = NewParams->
end();
2694 NewParam != NewParamEnd; ++NewParam) {
2696 TTP->removeDefaultArgument();
2698 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam))
2699 NTTP->removeDefaultArgument();
2719 bool IgnoreNonTypeDependent;
2724 DependencyChecker(
unsigned Depth,
bool IgnoreNonTypeDependent)
2725 : Depth(Depth), IgnoreNonTypeDependent(IgnoreNonTypeDependent),
2729 : IgnoreNonTypeDependent(IgnoreNonTypeDependent),
Match(
false) {
2732 Depth = PD->getDepth();
2733 }
else if (NonTypeTemplateParmDecl *PD =
2734 dyn_cast<NonTypeTemplateParmDecl>(ND)) {
2735 Depth = PD->getDepth();
2741 bool Matches(
unsigned ParmDepth, SourceLocation Loc = SourceLocation()) {
2742 if (ParmDepth >= Depth) {
2750 bool TraverseStmt(Stmt *S)
override {
2755 if (
auto *E = dyn_cast_or_null<Expr>(S))
2756 if (IgnoreNonTypeDependent && !E->isTypeDependent())
2761 bool TraverseTypeLoc(TypeLoc TL,
bool TraverseQualifier =
true)
override {
2762 if (IgnoreNonTypeDependent && !TL.
isNull() &&
2768 bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)
override {
2772 bool VisitTemplateTypeParmType(TemplateTypeParmType *
T)
override {
2774 return IgnoreNonTypeDependent || !Matches(
T->getDepth());
2778 if (TemplateTemplateParmDecl *PD =
2780 if (Matches(PD->getDepth()))
2785 bool VisitDeclRefExpr(DeclRefExpr *E)
override {
2786 if (NonTypeTemplateParmDecl *PD =
2787 dyn_cast<NonTypeTemplateParmDecl>(E->
getDecl()))
2788 if (Matches(PD->getDepth(), E->
getExprLoc()))
2790 return DynamicRecursiveASTVisitor::VisitDeclRefExpr(E);
2793 bool VisitDependentTemplateIdExpr(DependentTemplateIdExpr *E)
override {
2796 return DynamicRecursiveASTVisitor::VisitDependentTemplateIdExpr(E);
2799 bool VisitSubstTemplateTypeParmType(SubstTemplateTypeParmType *
T)
override {
2800 return TraverseType(
T->getReplacementType());
2803 bool VisitSubstTemplateTypeParmPackType(
2804 SubstTemplateTypeParmPackType *
T)
override {
2805 return TraverseTemplateArgument(
T->getArgumentPack());
2808 bool TraverseInjectedClassNameType(InjectedClassNameType *
T,
2809 bool TraverseQualifier)
override {
2812 return TraverseTemplateArguments(
2813 T->getTemplateArgs(
T->getDecl()->getASTContext()));
2822 if (!Params->
size())
2825 DependencyChecker Checker(Params,
false);
2826 Checker.TraverseType(
T);
2827 return Checker.Match;
2853 bool &IsMemberSpecialization,
bool &
Invalid,
bool SuppressDiagnostic) {
2854 IsMemberSpecialization =
false;
2876 while (!
T.isNull()) {
2877 NestedTypes.push_back(
T);
2883 = dyn_cast<ClassTemplateSpecializationDecl>(
Record)) {
2886 ExplicitSpecLoc = Spec->getLocation();
2889 }
else if (
Record->getTemplateSpecializationKind()
2891 ExplicitSpecLoc =
Record->getLocation();
2896 T =
Context.getTypeDeclType(Parent);
2902 if (
const TemplateSpecializationType *TST
2903 =
T->getAs<TemplateSpecializationType>()) {
2916 T =
Context.getTypeDeclType(Parent);
2924 if (
const DependentNameType *DependentName =
T->getAs<DependentNameType>()){
2934 if (
const EnumType *EnumT =
T->getAsCanonical<EnumType>()) {
2940 if (
TypeDecl *Parent = dyn_cast<TypeDecl>(
Enum->getParent()))
2941 T =
Context.getCanonicalTypeDeclType(Parent);
2951 std::reverse(NestedTypes.begin(), NestedTypes.end());
2959 bool SawNonEmptyTemplateParameterList =
false;
2961 auto CheckExplicitSpecialization = [&](
SourceRange Range,
bool Recovery) {
2962 if (SawNonEmptyTemplateParameterList) {
2963 if (!SuppressDiagnostic)
2964 Diag(DeclLoc, diag::err_specialize_member_of_template)
2965 << !Recovery << Range;
2967 IsMemberSpecialization =
false;
2974 auto DiagnoseMissingExplicitSpecialization = [&] (
SourceRange Range) {
2976 if (CheckExplicitSpecialization(Range,
true))
2981 if (!ParamLists.empty())
2982 ExpectedTemplateLoc = ParamLists[0]->getTemplateLoc();
2984 ExpectedTemplateLoc = DeclStartLoc;
2986 if (!SuppressDiagnostic)
2987 Diag(DeclLoc, diag::err_template_spec_needs_header)
2994 for (
unsigned TypeIdx = 0, NumTypes = NestedTypes.size(); TypeIdx != NumTypes;
2996 T = NestedTypes[TypeIdx];
2999 bool NeedEmptyTemplateHeader =
false;
3002 bool NeedNonemptyTemplateHeader =
false;
3015 = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Record)) {
3016 ExpectedTemplateParams = Partial->getTemplateParameters();
3017 NeedNonemptyTemplateHeader =
true;
3018 }
else if (
Record->isDependentType()) {
3019 if (
Record->getDescribedClassTemplate()) {
3020 ExpectedTemplateParams =
Record->getDescribedClassTemplate()
3021 ->getTemplateParameters();
3022 NeedNonemptyTemplateHeader =
true;
3025 = dyn_cast<ClassTemplateSpecializationDecl>(
Record)) {
3031 NeedEmptyTemplateHeader =
true;
3034 }
else if (
Record->getTemplateSpecializationKind()) {
3035 if (
Record->getTemplateSpecializationKind()
3037 TypeIdx == NumTypes - 1)
3038 IsMemberSpecialization =
true;
3042 }
else if (
const auto *TST =
T->getAs<TemplateSpecializationType>()) {
3045 ExpectedTemplateParams =
Template->getTemplateParameters();
3046 NeedNonemptyTemplateHeader =
true;
3048 NeedNonemptyTemplateHeader =
true;
3052 NeedNonemptyTemplateHeader =
false;
3063 if (
ParamIdx < ParamLists.size()) {
3064 if (ParamLists[
ParamIdx]->size() == 0) {
3065 if (CheckExplicitSpecialization(ParamLists[
ParamIdx]->getSourceRange(),
3069 SawNonEmptyTemplateParameterList =
true;
3072 if (NeedEmptyTemplateHeader) {
3075 if (TypeIdx == NumTypes - 1)
3076 IsMemberSpecialization =
true;
3078 if (
ParamIdx < ParamLists.size()) {
3079 if (ParamLists[
ParamIdx]->size() > 0) {
3081 if (!SuppressDiagnostic)
3083 diag::err_template_param_list_matches_nontemplate)
3086 ParamLists[
ParamIdx]->getRAngleLoc())
3098 if (DiagnoseMissingExplicitSpecialization(
3105 if (NeedNonemptyTemplateHeader) {
3110 if (IsFriend &&
T->isDependentType()) {
3111 if (
ParamIdx < ParamLists.size() &&
3113 ExpectedTemplateParams =
nullptr;
3118 if (
ParamIdx < ParamLists.size()) {
3120 if (ExpectedTemplateParams &&
3122 ExpectedTemplateParams,
3135 if (!SuppressDiagnostic)
3136 Diag(DeclLoc, diag::err_template_spec_needs_template_parameters)
3147 if (
ParamIdx >= ParamLists.size()) {
3148 if (TemplateId && !IsFriend) {
3164 if (
ParamIdx < ParamLists.size() - 1) {
3165 bool HasAnyExplicitSpecHeader =
false;
3166 bool AllExplicitSpecHeaders =
true;
3167 for (
unsigned I =
ParamIdx, E = ParamLists.size() - 1; I != E; ++I) {
3168 if (ParamLists[I]->size() == 0)
3169 HasAnyExplicitSpecHeader =
true;
3171 AllExplicitSpecHeaders =
false;
3174 if (!SuppressDiagnostic)
3176 AllExplicitSpecHeaders ? diag::ext_template_spec_extra_headers
3177 : diag::err_template_spec_extra_headers)
3179 ParamLists[ParamLists.size() - 2]->getRAngleLoc());
3184 if (ExplicitSpecLoc.
isValid() && HasAnyExplicitSpecHeader &&
3185 !SuppressDiagnostic)
3186 Diag(ExplicitSpecLoc,
3187 diag::note_explicit_template_spec_does_not_need_header)
3188 << NestedTypes.back();
3193 if (!AllExplicitSpecHeaders)
3204 if (ParamLists.back()->size() == 0 &&
3205 CheckExplicitSpecialization(ParamLists[
ParamIdx]->getSourceRange(),
3211 return ParamLists.back();
3216 Diag(
Template->getLocation(), diag::note_template_declared_here)
3232 Diag((*I)->getLocation(), diag::note_template_declared_here)
3233 << 0 << (*I)->getDeclName();
3263 Keyword, BaseTemplate, TemplateLoc, Args,
3269 return BaseTemplateInst;
3274 switch (Ts.size()) {
3284 return lookUpCommonType(Ts[0], Ts[0]);
3298 return lookUpCommonType(D1, D2);
3303 auto CheckConditionalOperands = [&](
bool ConstRefQual) ->
QualType {
3342 if (
auto Res = CheckConditionalOperands(
false); !Res.isNull())
3355 return CheckConditionalOperands(
true);
3366 for (
auto T : llvm::drop_begin(Ts)) {
3377 DeclContext *DC = RT->getDecl()->getDeclContext();
3392 bool Literal =
false;
3395 auto SpecDecl = dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
3399 QualType ConstantType = LiteralArgs[0].getAsType();
3402 LiteralLoc = SpecDecl->getSourceRange().getBegin();
3406 RT->getDecl()->getName() ==
"integral_constant") {
3407 auto SpecDecl = dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
3412 QualType ConstantType = ConstantArgs[0].getAsType();
3413 llvm::APInt
Value = ConstantArgs[1].getAsIntegral();
3416 return SpirvOperand::createLiteral(
Value);
3417 return SpirvOperand::createConstant(ConstantType,
Value);
3418 }
else if (Literal) {
3419 SemaRef.
Diag(LiteralLoc, diag::err_hlsl_vk_literal_must_contain_constant);
3420 return SpirvOperand();
3424 diag::err_call_incomplete_argument))
3425 return SpirvOperand();
3426 return SpirvOperand::createType(OperandArg);
3436 "Builtin template arguments do not match its parameters");
3439 case BTK__make_integer_seq: {
3443 QualType OrigType = Converted[1].getAsType();
3447 SemaRef.
Diag(TemplateArgs[1].getLocation(),
3448 diag::err_integer_sequence_integral_element_type);
3462 OrigType, TemplateArgs[1].getLocation())));
3464 if (llvm::APSInt NumArgs = NumArgsArg.
getAsIntegral(); NumArgs >= 0) {
3466 for (llvm::APSInt I(NumArgs.getBitWidth(), NumArgs.isUnsigned());
3470 TA, OrigType, TemplateArgs[2].getLocation()));
3475 SemaRef.
Diag(TemplateArgs[2].getLocation(),
3476 diag::err_integer_sequence_negative_length);
3483 TemplateLoc, SyntheticTemplateArgs,
3488 case BTK__type_pack_element: {
3492 assert(Converted.size() == 2 &&
3493 "__type_pack_element should be given an index and a parameter pack");
3500 assert(Index >= 0 &&
"the index used with __type_pack_element should be of "
3501 "type std::size_t, and hence be non-negative");
3503 if (Index >= Ts.pack_size()) {
3504 SemaRef.
Diag(TemplateArgs[0].getLocation(),
3505 diag::err_type_pack_element_out_of_bounds);
3510 int64_t N = Index.getExtValue();
3511 return Ts.getPackAsArray()[N].getAsType();
3514 case BTK__builtin_common_type: {
3515 assert(Converted.size() == 4);
3516 if (llvm::any_of(Converted, [](
auto &
C) {
return C.isDependent(); }))
3519 TemplateName BaseTemplate = Converted[0].getAsTemplate();
3527 CT, TemplateArgs[1].getLocation())));
3528 TemplateName HasTypeMember = Converted[1].getAsTemplate();
3533 QualType HasNoTypeMember = Converted[2].getAsType();
3534 return HasNoTypeMember;
3537 case BTK__hlsl_spirv_type: {
3538 assert(Converted.size() == 4);
3540 if (!Context.getTargetInfo().getTriple().isSPIRV()) {
3541 SemaRef.
Diag(TemplateLoc, diag::err_hlsl_spirv_only) << BTD;
3544 if (llvm::any_of(Converted, [](
auto &
C) {
return C.isDependent(); }))
3547 uint64_t Opcode = Converted[0].getAsIntegral().getZExtValue();
3548 uint64_t Size = Converted[1].getAsIntegral().getZExtValue();
3549 uint64_t Alignment = Converted[2].getAsIntegral().getZExtValue();
3555 for (
auto &OperandTA : OperandArgs) {
3556 QualType OperandArg = OperandTA.getAsType();
3558 TemplateArgs[3].getLocation());
3559 if (!Operand.isValid())
3561 Operands.push_back(Operand);
3564 return Context.getHLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
3566 case BTK__builtin_dedup_pack: {
3567 assert(Converted.size() == 1 &&
"__builtin_dedup_pack should be given "
3568 "a parameter pack");
3577 llvm::SmallDenseSet<QualType> Seen;
3581 if (!Seen.insert(
T.getAsType().getCanonicalType()).second)
3583 OutArgs.push_back(
T);
3585 return Context.getSubstBuiltinTemplatePack(
3589 llvm_unreachable(
"unexpected BuiltinTemplateDecl!");
3607 if (
auto BinOp = dyn_cast<BinaryOperator>(Clause->IgnoreParenImpCasts())) {
3608 if (BinOp->getOpcode() == BO_LAnd) {
3615 Terms.push_back(Clause);
3623 auto *BinOp = dyn_cast<BinaryOperator>(
Cond->IgnoreParenImpCasts());
3624 if (!BinOp)
return Cond;
3626 if (BinOp->getOpcode() != BO_LOr)
return Cond;
3629 Expr *LHS = BinOp->getLHS();
3631 if (!InnerBinOp)
return Cond;
3633 if (InnerBinOp->getOpcode() != BO_EQ ||
3644 if (MacroName ==
"CONCEPT_REQUIRES" || MacroName ==
"CONCEPT_REQUIRES_")
3645 return BinOp->getRHS();
3655class FailedBooleanConditionPrinterHelper :
public PrinterHelper {
3657 explicit FailedBooleanConditionPrinterHelper(
const PrintingPolicy &P)
3660 bool handledStmt(Stmt *E, raw_ostream &OS)
override {
3661 const auto *DR = dyn_cast<DeclRefExpr>(E);
3662 if (DR && DR->getQualifier()) {
3665 DR->getQualifier().print(OS, Policy,
true);
3667 const ValueDecl *VD = DR->getDecl();
3669 if (
const auto *IV = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
3671 printTemplateArgumentList(
3672 OS, IV->getTemplateArgs().asArray(), Policy,
3673 IV->getSpecializedTemplate()->getTemplateParameters());
3681 const PrintingPolicy Policy;
3686std::pair<Expr *, std::string>
3695 Expr *FailedCond =
nullptr;
3696 for (
Expr *Term : Terms) {
3710 if (Term->EvaluateAsBooleanCondition(Succeeded,
Context) &&
3712 FailedCond = TermAsWritten;
3717 FailedCond =
Cond->IgnoreParenImpCasts();
3719 std::string Description;
3721 llvm::raw_string_ostream Out(Description);
3724 FailedBooleanConditionPrinterHelper Helper(Policy);
3725 FailedCond->
printPretty(Out, &Helper, Policy, 0,
"\n",
nullptr);
3727 return { FailedCond, Description };
3743 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
3744 return std::make_unique<CandidateCallback>(*
this);
3755 std::nullopt,
false,
3771 if (
const auto *S = UnderlyingName.getAsSubstTemplateTemplateParmPack()) {
3773 }
else if (
const auto *DTN = UnderlyingName.getAsDependentTemplateName()) {
3774 if (DTN->getName().getIdentifier())
3782 }
else if (
const auto *ATN = UnderlyingName.getAsAssumedTemplateName()) {
3784 *
this,
Scope, ATN, TemplateLoc);
3785 CorrectedName.isNull()) {
3786 Diag(TemplateLoc, diag::err_no_template) << ATN->getDeclName();
3789 Name = CorrectedName;
3797 if (ForNestedNameSpecifier)
3798 Diag(TemplateLoc, diag::err_non_type_template_in_nested_name_specifier)
3799 << isa_and_nonnull<VarTemplateDecl>(
Template) << Name << R;
3801 Diag(TemplateLoc, diag::err_template_id_not_a_type) << Name << R;
3826 dyn_cast<TypeAliasTemplateDecl>(
Template)) {
3834 SemaRef.Diag(TemplateLoc, diag::err_tag_reference_non_tag)
3871 std::optional<ContextRAII> SavedContext;
3873 SavedContext.emplace(*
this,
AliasTemplate->getDeclContext());
3878 if (CanonType.
isNull()) {
3885 Trap ? Trap->getDeductionInfo() :
nullptr) {
3888 diag::err_typename_nested_not_found_enable_if &&
3889 TemplateArgs[0].getArgument().getKind() ==
3892 std::string FailedDescription;
3893 std::tie(FailedCond, FailedDescription) =
3905 PDiag(diag::err_typename_nested_not_found_requirement)
3913 }
else if (
auto *BTD = dyn_cast<BuiltinTemplateDecl>(
Template)) {
3917 TemplateSpecializationType::anyDependentTemplateArguments(
3926 CanonType =
Context.getCanonicalTemplateSpecializationType(
3928 Context.getCanonicalTemplateName(Name,
true),
3941 if (Ctx->isFileContext())
break;
3950 !
Record->getDescribedClassTemplate())
3959 if (CanonType != Injected)
3972 dyn_cast<ClassTemplateDecl>(
Template)) {
3975 void *InsertPos =
nullptr;
4012 "type of non-dependent specialization is not a RecordType");
4014 llvm_unreachable(
"Unhandled template kind");
4020 return Context.getTemplateSpecializationType(
4032 assert(ATN &&
"not an assumed template name");
4033 II = ATN->getDeclName().getAsIdentifierInfo();
4050 SourceLocation RAngleLoc,
bool IsCtorOrDtorName,
bool IsClassName,
4055 if (!IsCtorOrDtorName && !IsClassName && SS.
isSet()) {
4081 TemplateD, TemplateII, TemplateIILoc, LAngleLoc,
4082 TemplateArgsIn, RAngleLoc);
4089 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
4090 if (LookupRD && LookupRD->getIdentifier() == TemplateII) {
4093 ? diag::err_out_of_line_qualified_id_type_names_constructor
4094 : diag::ext_out_of_line_qualified_id_type_names_constructor)
4105 ElaboratedKeyword, TemplateD.
get(), TemplateIILoc, TemplateArgs,
4114 TemplateIILoc, TemplateArgs);
4147 if (
const RecordType *RT =
Result->getAs<RecordType>()) {
4151 assert(Id &&
"templated class must have an identifier");
4155 Diag(TagLoc, diag::err_use_with_wrong_tag)
4192 const TemplateTypeParmType *TPT =
4194 return TPT && !
Type.hasQualifiers() &&
4195 TPT->getDepth() == Depth && TPT->getIndex() == Index;
4203 dyn_cast<NonTypeTemplateParmDecl>(DRE->
getDecl());
4209 dyn_cast_or_null<TemplateTemplateParmDecl>(
4213 llvm_unreachable(
"unexpected kind of template argument");
4219 if (Params->
size() != Args.size() || Params->
size() != SpecParams->
size())
4222 unsigned Depth = Params->
getDepth();
4224 for (
unsigned I = 0, N = Args.size(); I != N; ++I) {
4242 if (
auto *SpecNTTP =
4243 dyn_cast<NonTypeTemplateParmDecl>(SpecParams->
getParam(I))) {
4244 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(I));
4245 if (!NTTP || NTTP->getType().getCanonicalType() !=
4246 SpecNTTP->getType().getCanonicalType())
4254template<
typename PartialSpecDecl>
4256 if (Partial->getDeclContext()->isDependentContext())
4265 auto *
Template = Partial->getSpecializedTemplate();
4266 S.
Diag(Partial->getLocation(),
4267 diag::ext_partial_spec_not_more_specialized_than_primary)
4277 diag::note_partial_spec_not_more_specialized_than_primary)
4283 Template->getAssociatedConstraints(TemplateAC);
4284 Partial->getAssociatedConstraints(PartialAC);
4291 const llvm::SmallBitVector &DeducibleParams) {
4292 for (
unsigned I = 0, N = DeducibleParams.size(); I != N; ++I) {
4293 if (!DeducibleParams[I]) {
4295 if (Param->getDeclName())
4296 S.
Diag(Param->getLocation(), diag::note_non_deducible_parameter)
4297 << Param->getDeclName();
4299 S.
Diag(Param->getLocation(), diag::note_non_deducible_parameter)
4306template<
typename PartialSpecDecl>
4308 PartialSpecDecl *Partial) {
4321 auto *TemplateParams = Partial->getTemplateParameters();
4322 llvm::SmallBitVector DeducibleParams(TemplateParams->size());
4324 TemplateParams->getDepth(), DeducibleParams);
4326 if (!DeducibleParams.all()) {
4327 unsigned NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();
4328 S.
Diag(Partial->getLocation(), diag::ext_partial_specs_not_deducible)
4330 << (NumNonDeducible > 1)
4332 Partial->getTemplateArgsAsWritten()->RAngleLoc);
4353 llvm::SmallBitVector DeducibleParams(TemplateParams->size());
4355 for (
unsigned I = 0; I != TemplateParams->size(); ++I) {
4357 auto *Param = TemplateParams->getParam(I);
4359 DeducibleParams[I] =
true;
4362 if (!DeducibleParams.all()) {
4363 unsigned NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();
4364 Diag(TD->
getLocation(), diag::err_deduction_guide_template_not_deducible)
4365 << (NumNonDeducible > 1);
4376 "Variable template specialization is declared with a template id.");
4393 FnTemplate = *OTS->begin();
4403 if (
const auto *DSA =
VarTemplate->getAttr<NoSpecializationsAttr>()) {
4404 auto Message = DSA->getMessage();
4405 Diag(TemplateNameLoc, diag::warn_invalid_specialization)
4407 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
4411 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
4431 TemplateArgs.
size(),
4438 !TemplateSpecializationType::anyDependentTemplateArguments(
4440 Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
4447 (!
Context.getLangOpts().CPlusPlus20 ||
4453 Diag(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)
4463 void *InsertPos =
nullptr;
4467 PrevDecl =
VarTemplate->findPartialSpecialization(
4493 cast_or_null<VarTemplatePartialSpecializationDecl>(PrevDecl);
4502 VarTemplate->AddPartialSpecialization(Partial, InsertPos);
4536 Diag(TemplateNameLoc, diag::err_specialization_after_instantiation)
4540 diag::note_instantiation_required_here)
4570struct PartialSpecMatchResult {
4578 if (Var->
getName() !=
"format_kind" ||
4599 bool SetWrittenArgs) {
4600 assert(
Template &&
"A variable template id without template?");
4612 if (
Template->getDeclContext()->isDependentContext() ||
4613 TemplateSpecializationType::anyDependentTemplateArguments(
4620 return Context.isSameTemplateArgument(Arg1, Arg2);
4626 !IsLibstdcxxStdFormatKind(
PP, Var) &&
4630 IsSameTemplateArg)) {
4631 Diag(TemplateNameLoc,
4632 diag::err_auto_variable_cannot_appear_in_own_initializer)
4633 << diag::ParsingInitFor::VarTemplate << Var << Var->
getType();
4638 Template->getPartialSpecializations(PartialSpecs);
4642 Partial->getTemplateArgs().asArray(),
4643 IsSameTemplateArg)) {
4644 Diag(TemplateNameLoc,
4645 diag::err_auto_variable_cannot_appear_in_own_initializer)
4646 << diag::ParsingInitFor::VarTemplatePartialSpec << Partial
4647 << Partial->getType();
4656 void *InsertPos =
nullptr;
4660 if (Spec->getType()->isUndeducedType()) {
4662 Diag(TemplateNameLoc,
4663 diag::err_auto_variable_cannot_appear_in_own_initializer)
4664 << diag::ParsingInitFor::VarTemplateExplicitSpec << Spec
4669 Diag(TemplateNameLoc, diag::err_var_template_spec_type_depends_on_self)
4670 << Spec << Spec->getType();
4684 bool AmbiguousPartialSpec =
false;
4685 typedef PartialSpecMatchResult MatchResult;
4697 Template->getPartialSpecializations(PartialSpecs);
4709 if (
Template->isMemberSpecialization() &&
4710 !Partial->isMemberSpecialization())
4725 Matched.push_back(PartialSpecMatchResult());
4726 Matched.back().Partial = Partial;
4731 if (Matched.size() >= 1) {
4733 if (Matched.size() == 1) {
4746 PEnd = Matched.end();
4749 PointOfInstantiation) ==
4757 PEnd = Matched.end();
4760 P->Partial, Best->Partial,
4761 PointOfInstantiation) != Best->Partial) {
4762 AmbiguousPartialSpec =
true;
4769 InstantiationPattern = Best->Partial;
4770 PartialSpecArgs = Best->Args;
4781 if (AmbiguousPartialSpec) {
4783 Diag(PointOfInstantiation, diag::err_partial_spec_ordering_ambiguous)
4786 for (MatchResult P : Matched)
4787 Diag(P.Partial->getLocation(), diag::note_partial_spec_match)
4799 Decl->setTemplateArgsAsWritten(TemplateArgs);
4802 dyn_cast<VarTemplatePartialSpecializationDecl>(InstantiationPattern))
4803 Decl->setInstantiationOf(D, PartialSpecArgs);
4807 assert(
Decl &&
"No variable template specialization?");
4817 *TemplateArgs,
false);
4818 if (
Decl.isInvalid())
4836 assert(
Template &&
"A variable template id without template?");
4839 Template->templateParameterKind() !=
4861 Diag(Loc, diag::err_template_missing_args)
4869 bool TemplateKeyword,
4881 bool DoCheckConstraintSatisfaction) {
4882 assert(NamedConcept &&
"A concept template id without a template?");
4889 NamedConcept, ConceptNameInfo.
getLoc(),
4908 bool AreArgsDependent =
4909 TemplateSpecializationType::anyDependentTemplateArguments(
4916 TemplateKWLoc, ConceptNameInfo, FoundDecl, NamedConcept,
4920 if (
const auto *
Concept = dyn_cast<ConceptDecl>(NamedConcept);
4922 DoCheckConstraintSatisfaction) {
4941 Context,
CL, CSD, AreArgsDependent ?
nullptr : &Satisfaction);
4960 assert(!R.isAmbiguous() &&
"ambiguous lookup when building templateid");
4966 SS, TemplateKWLoc.
isValid(), TD, R.getNameLoc());
4970 bool KnownDependent =
false;
4975 R.getRepresentativeDecl(), TemplateKWLoc, TemplateArgs);
4979 KnownDependent =
true;
4983 R.suppressDiagnostics();
4987 "template keyword in front of a concept id?");
4989 R.getRepresentativeDecl(),
4997 assert(SS.
isEmpty() &&
"template parameter with a scope specifier?");
4999 "template keyword in front of a template parameter?");
5008 TemplateKWLoc, R.getLookupNameInfo(), RequiresADL, TemplateArgs,
5009 R.begin(), R.end(), KnownDependent,
5014 if (ULE->
getType() ==
Context.OverloadTy && R.isSingleResult() &&
5015 !R.getFoundDecl()->getAsFunction())
5025 assert(TemplateArgs || TemplateKWLoc.
isValid());
5029 false, TemplateKWLoc))
5032 if (R.isAmbiguous())
5035 if (R.wasNotFoundInCurrentInstantiation() || SS.
isInvalid())
5058 bool EnteringContext,
5060 bool AllowInjectedClassName) {
5064 diag::warn_cxx98_compat_template_outside_of_template :
5065 diag::ext_template_outside_of_template)
5075 else if (ObjectType)
5094 bool MemberOfUnknownSpecialization;
5096 ObjectType, EnteringContext,
Result,
5097 MemberOfUnknownSpecialization);
5100 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
5101 if (!AllowInjectedClassName && SS.
isNotEmpty() && LookupRD &&
5114 diag::ext_out_of_line_qualified_id_type_names_constructor)
5122 if (!MemberOfUnknownSpecialization) {
5153 {Qualifier, Name.Identifier, TemplateKWLoc.isValid()}));
5158 {Qualifier, Name.OperatorFunctionId.Operator,
5159 TemplateKWLoc.isValid()}));
5174 diag::err_template_kw_refers_to_dependent_non_template)
5176 << TemplateKWLoc.
isValid() << TemplateKWLoc;
5213 dyn_cast<DependentScopeDeclRefExpr>(Arg.
getAsExpr())) {
5214 SS.
Adopt(ArgExpr->getQualifierLoc());
5215 NameInfo = ArgExpr->getNameInfo();
5217 dyn_cast<CXXDependentScopeMemberExpr>(Arg.
getAsExpr())) {
5218 if (ArgExpr->isImplicitAccess()) {
5219 SS.
Adopt(ArgExpr->getQualifierLoc());
5220 NameInfo = ArgExpr->getMemberNameInfo();
5229 Result.wasNotFoundInCurrentInstantiation()) {
5230 assert(SS.
getScopeRep() &&
"dependent scope expr must has a scope!");
5234 ? diag::ext_ms_template_type_arg_missing_typename
5235 : diag::err_template_arg_must_be_type_suggest)
5268 SugaredConverted.push_back(Arg);
5269 CanonicalConverted.push_back(Arg);
5275 Diag(SR.
getBegin(), diag::err_template_arg_must_be_type) << SR;
5289 ArgType->isObjCLifetimeType() &&
5297 CanonicalConverted.push_back(
5332 Output = Param->getDefaultArgument();
5346 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5349 bool ForLambdaCallOperator =
false;
5350 if (
const auto *Rec = dyn_cast<CXXRecordDecl>(
Template->getDeclContext()))
5351 ForLambdaCallOperator = Rec->isLambda();
5353 !ForLambdaCallOperator);
5356 Param->getDefaultArgumentLoc(),
5357 Param->getDeclName()))
5401 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5408 TemplateArgLists, Output);
5445 SugaredConverted,
SourceRange(TemplateLoc, RAngleLoc));
5452 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5469 HasDefaultArg =
false;
5475 HasDefaultArg =
true;
5478 RAngleLoc, TypeParm, SugaredConverted,
5479 CanonicalConverted, Output))
5485 = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
5489 HasDefaultArg =
true;
5492 RAngleLoc, NonTypeParm, SugaredConverted,
5493 CanonicalConverted, Output))
5503 HasDefaultArg =
true;
5507 *
this,
Template, TemplateKWLoc, TemplateNameLoc, RAngleLoc, TempTempParm,
5508 SugaredConverted, CanonicalConverted, QualifierLoc);
5532 TemplateName Name = TagLoc.getTypePtr()->getTemplateName(Context);
5538 TagLoc.getQualifierLoc(), TagLoc.getNameLoc());
5545 unsigned ArgumentPackIndex,
5559 QualType NTTPType = NTTP->getType();
5560 if (NTTP->isParameterPack() && NTTP->isExpandedParameterPack())
5561 NTTPType = NTTP->getExpansionType(ArgumentPackIndex);
5575 if (
auto *PET = NTTPType->
getAs<PackExpansionType>()) {
5577 NTTPType =
SubstType(PET->getPattern(), MLTAL, NTTP->getLocation(),
5578 NTTP->getDeclName());
5580 NTTPType =
SubstType(NTTPType, MLTAL, NTTP->getLocation(),
5581 NTTP->getDeclName());
5588 NTTP->getLocation());
5593 auto checkExpr = [&](
Expr *E) ->
Expr * {
5596 NTTP, NTTPType, E, SugaredResult, CanonicalResult,
5608 llvm_unreachable(
"Should never see a NULL template argument here");
5612 Expr *R = checkExpr(E);
5637 assert(R.isUsable());
5638 if (!checkExpr(R.get()))
5677 NTTP, NTTPType, E.
get(), SugaredResult, CanonicalResult,
5709 if (
T->isFunctionType())
5710 Diag(SR.
getBegin(), diag::err_template_arg_nontype_ambig) << SR <<
T;
5712 Diag(SR.
getBegin(), diag::err_template_arg_must_be_expr) << SR;
5718 llvm_unreachable(
"Caller must expand template argument packs");
5763 ArgLoc = ConvertedArg;
5768 llvm_unreachable(
"Should never see a NULL template argument here");
5779 Context.getCanonicalTemplateArgument(Arg));
5807 llvm_unreachable(
"non-type argument with template template parameter");
5810 llvm_unreachable(
"Caller must expand template argument packs");
5817template<
typename TemplateParmDecl>
5820 const TemplateParmDecl *D,
5825 ->getTemplateParameters()
5826 ->getParam(D->getIndex()));
5833 D->getDefaultArgumentLoc(), Modules,
5844 S.
Diag(Loc, diag::err_template_arg_list_different_arity)
5861 DefaultArgs, PartialTemplateArgs, CTAI, UpdateArgsWithConversions,
5892 unsigned ArgIdx = 0, NumArgs = NewArgs.
size();
5895 ParamEnd = Params->
end(),
5899 if (
size_t ParamIdx = Param - ParamBegin;
5902 assert(ArgIdx == NumArgs &&
"bad default argument deduction");
5904 assert(Param + DefaultArgs.
Args.size() <= ParamEnd);
5909 Context.getCanonicalTemplateArgument(DefArg));
5919 if (*Expansions == SugaredArgumentPack.size()) {
5924 SugaredArgumentPack.clear();
5928 CanonicalArgumentPack.clear();
5933 }
else if (ArgIdx == NumArgs && !PartialTemplateArgs) {
5935 Diag(TemplateLoc, diag::err_template_arg_list_different_arity)
5947 dyn_cast<NonTypeTemplateParmDecl>(*Param);
5949 auto TL = NTTP->getTypeSourceInfo()
5954 for (
const auto &UPP : Unexpanded) {
5955 auto *TST = UPP.first.dyn_cast<
const TemplateSpecializationType *>();
5960 Diag(TL.getEllipsisLoc(),
5961 diag::err_unsupported_builtin_template_pack_expansion)
5962 << TST->getTemplateName();
5967 if (ArgIdx < NumArgs) {
5969 bool NonPackParameter =
5979 if (!(*Param)->isTemplateParameterPack() ||
5986 RAngleLoc, SugaredArgumentPack.size(), CTAI,
5991 clang::isSubstitutedDefaultArgument(
Context, Arg, *Param,
6001 RAngleLoc, SugaredArgumentPack.size(), CTAI,
6008 if (ArgIsExpansion && NonPackParameter) {
6018 diag::err_template_expansion_into_fixed_list)
6029 if (ArgIsExpansion && (CTAI.
MatchingTTP || NonPackParameter)) {
6033 if (!SugaredArgumentPack.empty()) {
6037 SugaredArgumentPack.begin(),
6038 SugaredArgumentPack.end());
6039 SugaredArgumentPack.clear();
6042 CanonicalArgumentPack.begin(),
6043 CanonicalArgumentPack.end());
6044 CanonicalArgumentPack.clear();
6047 while (ArgIdx < NumArgs) {
6051 Context.getCanonicalTemplateArgument(Arg));
6058 if ((*Param)->isTemplateParameterPack()) {
6073 if (PartialTemplateArgs) {
6074 if ((*Param)->isTemplateParameterPack() && !SugaredArgumentPack.empty()) {
6085 if ((*Param)->isTemplateParameterPack()) {
6087 "Should have dealt with this already");
6092 if (Param + 1 != ParamEnd) {
6094 (
Template->getMostRecentDecl()->getKind() != Decl::Kind::Concept) &&
6095 "Concept templates must have parameter packs at the end.");
6101 SugaredArgumentPack.clear();
6105 CanonicalArgumentPack.clear();
6124 if (!HasDefaultArg) {
6129 dyn_cast<NonTypeTemplateParmDecl>(*Param))
6163 if (isTemplateTemplateParameter)
6178 while (ArgIdx < NumArgs &&
6179 NewArgs[ArgIdx].
getArgument().isPackExpansion()) {
6183 Context.getCanonicalTemplateArgument(Arg));
6189 if (ArgIdx < NumArgs) {
6190 Diag(TemplateLoc, diag::err_template_arg_list_different_arity)
6201 if (UpdateArgsWithConversions)
6202 TemplateArgs = std::move(NewArgs);
6204 if (!PartialTemplateArgs) {
6211 if (
auto *TD = dyn_cast<TemplateDecl>(NewContext))
6213 auto *RD = dyn_cast<CXXRecordDecl>(NewContext);
6217 dyn_cast_or_null<CXXMethodDecl>(
Template->getTemplatedDecl()))
6218 ThisQuals =
Method->getMethodQualifiers();
6242 class UnnamedLocalNoLinkageFinder
6243 :
public TypeVisitor<UnnamedLocalNoLinkageFinder, bool>
6251 UnnamedLocalNoLinkageFinder(
Sema &S,
SourceRange SR) : S(S), SR(SR) { }
6254 return T.isNull() ?
false : inherited::Visit(
T.getTypePtr());
6257#define TYPE(Class, Parent) \
6258 bool Visit##Class##Type(const Class##Type *);
6259#define ABSTRACT_TYPE(Class, Parent) \
6260 bool Visit##Class##Type(const Class##Type *) { return false; }
6261#define NON_CANONICAL_TYPE(Class, Parent) \
6262 bool Visit##Class##Type(const Class##Type *) { return false; }
6263#include "clang/AST/TypeNodes.inc"
6265 bool VisitTagDecl(
const TagDecl *Tag);
6270bool UnnamedLocalNoLinkageFinder::VisitBuiltinType(
const BuiltinType*) {
6274bool UnnamedLocalNoLinkageFinder::VisitComplexType(
const ComplexType*
T) {
6275 return Visit(
T->getElementType());
6278bool UnnamedLocalNoLinkageFinder::VisitPointerType(
const PointerType*
T) {
6279 return Visit(
T->getPointeeType());
6282bool UnnamedLocalNoLinkageFinder::VisitBlockPointerType(
6284 return Visit(
T->getPointeeType());
6287bool UnnamedLocalNoLinkageFinder::VisitLValueReferenceType(
6289 return Visit(
T->getPointeeType());
6292bool UnnamedLocalNoLinkageFinder::VisitRValueReferenceType(
6294 return Visit(
T->getPointeeType());
6297bool UnnamedLocalNoLinkageFinder::VisitMemberPointerType(
6299 if (Visit(
T->getPointeeType()))
6301 if (
auto *RD =
T->getMostRecentCXXRecordDecl())
6302 return VisitTagDecl(RD);
6303 return VisitNestedNameSpecifier(
T->getQualifier());
6306bool UnnamedLocalNoLinkageFinder::VisitConstantArrayType(
6308 return Visit(
T->getElementType());
6311bool UnnamedLocalNoLinkageFinder::VisitIncompleteArrayType(
6313 return Visit(
T->getElementType());
6316bool UnnamedLocalNoLinkageFinder::VisitVariableArrayType(
6318 return Visit(
T->getElementType());
6321bool UnnamedLocalNoLinkageFinder::VisitDependentSizedArrayType(
6323 return Visit(
T->getElementType());
6326bool UnnamedLocalNoLinkageFinder::VisitDependentSizedExtVectorType(
6328 return Visit(
T->getElementType());
6331bool UnnamedLocalNoLinkageFinder::VisitDependentSizedMatrixType(
6333 return Visit(
T->getElementType());
6336bool UnnamedLocalNoLinkageFinder::VisitDependentAddressSpaceType(
6338 return Visit(
T->getPointeeType());
6341bool UnnamedLocalNoLinkageFinder::VisitVectorType(
const VectorType*
T) {
6342 return Visit(
T->getElementType());
6345bool UnnamedLocalNoLinkageFinder::VisitDependentVectorType(
6347 return Visit(
T->getElementType());
6350bool UnnamedLocalNoLinkageFinder::VisitExtVectorType(
const ExtVectorType*
T) {
6351 return Visit(
T->getElementType());
6354bool UnnamedLocalNoLinkageFinder::VisitConstantMatrixType(
6356 return Visit(
T->getElementType());
6359bool UnnamedLocalNoLinkageFinder::VisitFunctionProtoType(
6361 for (
const auto &A :
T->param_types()) {
6366 return Visit(
T->getReturnType());
6369bool UnnamedLocalNoLinkageFinder::VisitFunctionNoProtoType(
6371 return Visit(
T->getReturnType());
6374bool UnnamedLocalNoLinkageFinder::VisitUnresolvedUsingType(
6379bool UnnamedLocalNoLinkageFinder::VisitTypeOfExprType(
const TypeOfExprType*) {
6383bool UnnamedLocalNoLinkageFinder::VisitTypeOfType(
const TypeOfType*
T) {
6384 return Visit(
T->getUnmodifiedType());
6387bool UnnamedLocalNoLinkageFinder::VisitDecltypeType(
const DecltypeType*) {
6391bool UnnamedLocalNoLinkageFinder::VisitPackIndexingType(
6392 const PackIndexingType *) {
6396bool UnnamedLocalNoLinkageFinder::VisitUnaryTransformType(
6397 const UnaryTransformType*) {
6401bool UnnamedLocalNoLinkageFinder::VisitAutoType(
const AutoType *
T) {
6402 return Visit(
T->getDeducedType());
6405bool UnnamedLocalNoLinkageFinder::VisitDeducedTemplateSpecializationType(
6406 const DeducedTemplateSpecializationType *
T) {
6407 return Visit(
T->getDeducedType());
6410bool UnnamedLocalNoLinkageFinder::VisitRecordType(
const RecordType*
T) {
6411 return VisitTagDecl(
T->getDecl()->getDefinitionOrSelf());
6414bool UnnamedLocalNoLinkageFinder::VisitEnumType(
const EnumType*
T) {
6415 return VisitTagDecl(
T->getDecl()->getDefinitionOrSelf());
6418bool UnnamedLocalNoLinkageFinder::VisitTemplateTypeParmType(
6419 const TemplateTypeParmType*) {
6423bool UnnamedLocalNoLinkageFinder::VisitSubstTemplateTypeParmPackType(
6424 const SubstTemplateTypeParmPackType *) {
6428bool UnnamedLocalNoLinkageFinder::VisitSubstBuiltinTemplatePackType(
6429 const SubstBuiltinTemplatePackType *) {
6433bool UnnamedLocalNoLinkageFinder::VisitTemplateSpecializationType(
6434 const TemplateSpecializationType*) {
6438bool UnnamedLocalNoLinkageFinder::VisitInjectedClassNameType(
6439 const InjectedClassNameType*
T) {
6440 return VisitTagDecl(
T->getDecl()->getDefinitionOrSelf());
6443bool UnnamedLocalNoLinkageFinder::VisitDependentNameType(
6444 const DependentNameType*
T) {
6445 return VisitNestedNameSpecifier(
T->getQualifier());
6448bool UnnamedLocalNoLinkageFinder::VisitPackExpansionType(
6449 const PackExpansionType*
T) {
6450 return Visit(
T->getPattern());
6453bool UnnamedLocalNoLinkageFinder::VisitObjCObjectType(
const ObjCObjectType *) {
6457bool UnnamedLocalNoLinkageFinder::VisitObjCInterfaceType(
6462bool UnnamedLocalNoLinkageFinder::VisitObjCObjectPointerType(
6467bool UnnamedLocalNoLinkageFinder::VisitAtomicType(
const AtomicType*
T) {
6468 return Visit(
T->getValueType());
6471bool UnnamedLocalNoLinkageFinder::VisitOverflowBehaviorType(
6472 const OverflowBehaviorType *
T) {
6473 return Visit(
T->getUnderlyingType());
6476bool UnnamedLocalNoLinkageFinder::VisitPipeType(
const PipeType*
T) {
6480bool UnnamedLocalNoLinkageFinder::VisitBitIntType(
const BitIntType *
T) {
6484bool UnnamedLocalNoLinkageFinder::VisitArrayParameterType(
6486 return VisitConstantArrayType(
T);
6489bool UnnamedLocalNoLinkageFinder::VisitDependentBitIntType(
6494bool UnnamedLocalNoLinkageFinder::VisitTagDecl(
const TagDecl *Tag) {
6495 if (
Tag->getDeclContext()->isFunctionOrMethod()) {
6496 S.Diag(SR.getBegin(), S.getLangOpts().CPlusPlus11
6497 ? diag::warn_cxx98_compat_template_arg_local_type
6498 : diag::ext_template_arg_local_type)
6499 << S.Context.getCanonicalTagType(Tag) << SR;
6503 if (!
Tag->hasNameForLinkage()) {
6504 S.Diag(SR.getBegin(),
6505 S.getLangOpts().CPlusPlus11 ?
6506 diag::warn_cxx98_compat_template_arg_unnamed_type :
6507 diag::ext_template_arg_unnamed_type) << SR;
6508 S.Diag(
Tag->getLocation(), diag::note_template_unnamed_type_here);
6515bool UnnamedLocalNoLinkageFinder::VisitNestedNameSpecifier(
6526 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
6529bool UnnamedLocalNoLinkageFinder::VisitHLSLAttributedResourceType(
6530 const HLSLAttributedResourceType *
T) {
6531 if (
T->hasContainedType() && Visit(
T->getContainedType()))
6533 return Visit(
T->getWrappedType());
6536bool UnnamedLocalNoLinkageFinder::VisitHLSLInlineSpirvType(
6537 const HLSLInlineSpirvType *
T) {
6538 for (
auto &Operand :
T->getOperands())
6540 if (Visit(
Operand.getResultType()))
6546 assert(ArgInfo &&
"invalid TypeSourceInfo");
6552 return Diag(SR.
getBegin(), diag::err_variably_modified_template_arg) << Arg;
6553 }
else if (
Context.hasSameUnqualifiedType(Arg,
Context.OverloadTy)) {
6554 return Diag(SR.
getBegin(), diag::err_template_arg_overload_type) << SR;
6565 UnnamedLocalNoLinkageFinder Finder(*
this, SR);
6566 (void)Finder.Visit(CanonArg);
6583 Decl *Entity =
nullptr) {
6589 if (Entity && Entity->hasAttr<DLLImportAttr>())
6594 "Incomplete parameter type in isNullPointerValueTemplateArgument!");
6607 EvalResult.
Diag = &Notes;
6615 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
6616 diag::note_invalid_subexpr_in_const_expr) {
6617 DiagLoc = Notes[0].first;
6621 S.
Diag(DiagLoc, diag::err_template_arg_not_address_constant)
6623 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
6624 S.
Diag(Notes[I].first, Notes[I].second);
6642 bool ObjCLifetimeConversion;
6645 ObjCLifetimeConversion))
6650 S.
Diag(Arg->
getExprLoc(), diag::err_template_arg_wrongtype_null_constant)
6669 std::string Code =
"static_cast<" + ParamType.
getAsString() +
">(";
6670 S.
Diag(Arg->
getExprLoc(), diag::err_template_arg_untyped_null_constant)
6690 bool ObjCLifetimeConversion;
6694 ObjCLifetimeConversion)) {
6699 if (!ParamRef->getPointeeType()->isFunctionType()) {
6709 unsigned ParamQuals = ParamRef->getPointeeType().getCVRQualifiers();
6710 unsigned ArgQuals = ArgType.getCVRQualifiers();
6712 if ((ParamQuals | ArgQuals) != ParamQuals) {
6714 diag::err_template_arg_ref_bind_ignores_quals)
6751 bool AddressTaken =
false;
6758 bool ExtWarnMSTemplateArg =
false;
6761 while (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(Arg)) {
6763 if (UnOpKind == UO_Deref)
6764 ExtWarnMSTemplateArg =
true;
6765 if (UnOpKind == UO_AddrOf || UnOpKind == UO_Deref) {
6768 FirstOpKind = UnOpKind;
6769 FirstOpLoc = UnOp->getOperatorLoc();
6775 if (ExtWarnMSTemplateArg)
6779 if (FirstOpKind == UO_AddrOf)
6780 AddressTaken =
true;
6784 assert(FirstOpKind == UO_Deref);
6809 bool ExtraParens =
false;
6813 diag_compat::template_arg_extra_parens)
6818 Arg =
Parens->getSubExpr();
6823 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
6827 if (UnOp->getOpcode() == UO_AddrOf) {
6828 Arg = UnOp->getSubExpr();
6829 AddressTaken =
true;
6830 AddrOpLoc = UnOp->getOperatorLoc();
6835 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
6840 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg))
6841 Entity = DRE->getDecl();
6843 Entity = CUE->getGuidDecl();
6850 S.
Diag(Arg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
6853 CanonicalConverted =
6870 CanonicalConverted =
6891 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Entity)) {
6892 if (!Method->isStatic()) {
6901 VarDecl *Var = dyn_cast<VarDecl>(Entity);
6902 MSGuidDecl *Guid = dyn_cast<MSGuidDecl>(Entity);
6905 if (!
Func && !Var && !Guid) {
6917 ? diag::warn_cxx98_compat_template_arg_object_internal
6918 : diag::ext_template_arg_object_internal)
6920 S.
Diag(Entity->
getLocation(), diag::note_template_arg_internal_object)
6925 S.
Diag(Entity->
getLocation(), diag::note_template_arg_internal_object)
6954 S.
Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)
6960 S.
Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)
7002 CanonicalConverted =
7016 Expr *Arg = ResultArg;
7017 bool ObjCLifetimeConversion;
7029 bool ExtraParens =
false;
7031 if (!
Invalid && !ExtraParens) {
7037 Arg =
Parens->getSubExpr();
7041 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
7046 if (UnOp->getOpcode() == UO_AddrOf) {
7047 DRE = dyn_cast<DeclRefExpr>(UnOp->getSubExpr());
7053 else if ((DRE = dyn_cast<DeclRefExpr>(Arg))) {
7059 CanonicalConverted =
7063 CanonicalConverted =
7082 S.
Diag(ResultArg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
7094 ObjCLifetimeConversion)) {
7101 S.
Diag(ResultArg->
getBeginLoc(), diag::err_template_arg_not_convertible)
7109 diag::err_template_arg_not_pointer_to_member_form)
7118 ->isImplicitObjectMemberFunction()) &&
7119 "Only non-static member pointers can make it here");
7125 CanonicalConverted =
7130 CanonicalConverted =
7138 S.
Diag(Arg->
getBeginLoc(), diag::err_template_arg_not_pointer_to_member_form)
7158 auto *ArgPE = dyn_cast<PackExpansionExpr>(Arg);
7159 Expr *DeductionArg = ArgPE ? ArgPE->getPattern() : Arg;
7160 auto setDeductionArg = [&](
Expr *NewDeductionArg) {
7161 DeductionArg = NewDeductionArg;
7165 DeductionArg, ArgPE->getEllipsisLoc(), ArgPE->getNumExpansions());
7173 bool IsDeduced = DeducedT && DeducedT->getDeducedType().isNull();
7179 Context.getTrivialTypeSourceInfo(ParamType, Param->getLocation());
7184 DeductionArg->
getBeginLoc(),
false, DeductionArg);
7192 Param->getTemplateDepth() + 1);
7208 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param))
7210 diag::err_non_type_template_parm_type_deduction_failure)
7211 << Param->getDeclName() << NTTP->getType() << Arg->
getType()
7217 assert(!ParamType.
isNull() &&
"substituting DependentTy can't fail");
7225 if (ParamType.
isNull()) {
7233 "non-type template parameter type cannot be qualified");
7247 setDeductionArg(E.
get());
7251 Context.getCanonicalTemplateArgument(SugaredConverted));
7260 : !
Context.hasSameUnqualifiedType(ParamType,
7266 Diag(StartLoc, diag::err_deduced_non_type_template_arg_type_mismatch)
7279 if (ArgPE && !StrictCheck) {
7282 Context.getCanonicalTemplateArgument(SugaredConverted));
7296 Context.hasSameUnqualifiedType(ParamType, InnerArg->
getType())) {
7298 if (
auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
7307 CanonicalConverted =
7308 Context.getCanonicalTemplateArgument(SugaredConverted);
7318 bool IsConvertedConstantExpression =
true;
7321 StartLoc,
false, DeductionArg);
7337 IsConvertedConstantExpression =
false;
7346 if (IsConvertedConstantExpression) {
7348 DeductionArg, ParamType,
7356 ArgResult = DeductionArg;
7362 setDeductionArg(ArgResult.
get());
7364 CanonicalConverted =
7365 Context.getCanonicalTemplateArgument(SugaredConverted);
7372 false, PreNarrowingValue);
7375 setDeductionArg(ArgResult.
get());
7377 if (
Value.isLValue()) {
7396 if (
Value.hasLValuePath() &&
Value.getLValuePath().size() == 1 && VD &&
7398 Value.getLValuePath()[0].getAsArrayIndex() == 0 &&
7402 CanonicalConverted =
7403 Context.getCanonicalTemplateArgument(SugaredConverted);
7406 CanonicalConverted =
7415 if (!
Value.hasLValuePath() ||
Value.getLValuePath().size() ||
7416 Value.isLValueOnePastTheEnd()) {
7417 Diag(StartLoc, diag::err_non_type_template_arg_subobject)
7422 "null reference should not be a constant expression");
7424 "non-null value of type nullptr_t?");
7428 if (
Value.isAddrLabelDiff())
7429 return Diag(StartLoc, diag::err_non_type_template_arg_addr_label_diff);
7433 CanonicalConverted =
7434 Context.getCanonicalTemplateArgument(SugaredConverted);
7437 CanonicalConverted =
7444 assert(!ArgPE && !StrictCheck);
7476 Arg = ArgResult.
get();
7481 CanonicalConverted =
7482 Context.getCanonicalTemplateArgument(SugaredConverted);
7491 IntegerType = ED->getIntegerType();
7493 ?
Context.getIntWidth(IntegerType)
7494 :
Context.getTypeSize(IntegerType));
7497 CanonicalConverted =
7505 Arg = ArgResult.
get();
7517 if (!
ArgType->isIntegralOrEnumerationType()) {
7518 Diag(Arg->
getBeginLoc(), diag::err_template_arg_not_integral_or_enumeral)
7532 return S.
Diag(Loc, diag::err_template_arg_not_ice) <<
T;
7557 Diag(StartLoc, diag::err_template_arg_not_convertible)
7570 CanonicalConverted =
7571 Context.getCanonicalTemplateArgument(SugaredConverted);
7577 IntegerType = ED->getIntegerType();
7583 unsigned AllowedBits =
Context.getTypeSize(IntegerType);
7584 if (
Value.getBitWidth() != AllowedBits)
7588 llvm::APSInt OldValue =
Value;
7593 ?
Context.getIntWidth(IntegerType)
7594 :
Context.getTypeSize(IntegerType);
7595 if (
Value.getBitWidth() != AllowedBits)
7601 (OldValue.isSigned() && OldValue.isNegative())) {
7609 unsigned RequiredBits;
7611 RequiredBits = OldValue.getActiveBits();
7612 else if (OldValue.isUnsigned())
7613 RequiredBits = OldValue.getActiveBits() + 1;
7615 RequiredBits = OldValue.getSignificantBits();
7616 if (RequiredBits > AllowedBits) {
7626 CanonicalConverted =
7677 *
this, Param, ParamType, Arg, IsSpecified, SugaredConverted,
7678 CanonicalConverted))
7684 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7695 "Only object pointers allowed here");
7698 *
this, Param, ParamType, Arg, IsSpecified, SugaredConverted,
7699 CanonicalConverted))
7711 assert(ParamRefType->getPointeeType()->isIncompleteOrObjectType() &&
7712 "Only object references allowed here");
7716 ParamRefType->getPointeeType(),
7731 *
this, Param, ParamType, Arg, IsSpecified, SugaredConverted,
7732 CanonicalConverted))
7741 CanonicalConverted =
7742 Context.getCanonicalTemplateArgument(SugaredConverted);
7749 << Arg->
getType() << ParamType;
7757 Diag(Arg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
7771 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7794 unsigned DiagFoundKind = 0;
7796 if (
auto *TTP = llvm::dyn_cast<TemplateTemplateParmDecl>(
Template)) {
7797 switch (TTP->templateParameterKind()) {
7808 Kind = TTP->templateParameterKind();
7824 assert(
false &&
"Unexpected Decl");
7827 if (Kind == Param->templateParameterKind()) {
7831 unsigned DiagKind = 0;
7832 switch (Param->templateParameterKind()) {
7845 Diag(
Template->getLocation(), diag::note_template_arg_refers_to_template_here)
7859 bool *StrictPackMatch) {
7866 assert(Name.
isDependent() &&
"Non-dependent template isn't a declaration?");
7893 if (ParamsAC.empty())
7896 Template->getAssociatedConstraints(TemplateAC);
7898 bool IsParamAtLeastAsConstrained;
7900 IsParamAtLeastAsConstrained))
7902 if (!IsParamAtLeastAsConstrained) {
7904 diag::err_template_template_parameter_not_at_least_as_constrained)
7906 Diag(Param->getLocation(), diag::note_entity_declared_at) << Param;
7916 unsigned HereDiagID,
7917 unsigned ExternalDiagID) {
7922 llvm::raw_svector_ostream Out(Str);
7930 std::optional<SourceRange> ParamRange) {
7933 diag::note_template_decl_external);
7934 if (ParamRange && ParamRange->isValid()) {
7936 "Parameter range has location when Decl does not");
7943 diag::note_template_param_external);
7958 ParamType =
Context.getArrayDecayedType(ParamType);
7960 ParamType =
Context.getPointerType(ParamType);
7969 ? CK_NullToMemberPointer
7970 : CK_NullToPointer);
7973 "Only declaration template arguments permitted here");
8010 "arg for class template param not a template parameter object");
8015 "unexpected type for decl template argument");
8023 "value kind mismatch for non-type template argument");
8029 if (!
Context.hasSameType(SrcExprType, DestExprType)) {
8031 if (
Context.hasSimilarType(SrcExprType, DestExprType) ||
8042 "unexpected conversion required for non-type template argument");
8069 T = ED->getIntegerType();
8072 if (
T->isAnyCharacterType()) {
8074 if (
T->isWideCharType())
8078 else if (
T->isChar16Type())
8080 else if (
T->isChar32Type())
8086 }
else if (
T->isBooleanType()) {
8121 llvm_unreachable(
"unexpected template argument value");
8146 return MakeInitList(
8159 return MakeInitList(Elts);
8163 llvm_unreachable(
"Matrix template argument expression not yet supported");
8167 llvm_unreachable(
"Unexpected APValue kind.");
8176 if (
T->isReferenceType()) {
8177 T =
T->getPointeeType();
8183 llvm_unreachable(
"Unhandled APValue::ValueKind enum");
8195 llvm_unreachable(
"not a non-type template argument");
8213 llvm_unreachable(
"Unhandled TemplateArgument::ArgKind enum");
8220 const NamedDecl *OldInstFrom,
bool Complain,
8225 unsigned NextDiag = diag::err_template_param_different_kind;
8226 if (TemplateArgLoc.
isValid()) {
8227 S.
Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
8228 NextDiag = diag::note_template_param_different_kind;
8230 S.
Diag(
New->getLocation(), NextDiag)
8245 unsigned NextDiag = diag::err_template_parameter_pack_non_pack;
8246 if (TemplateArgLoc.
isValid()) {
8247 S.
Diag(TemplateArgLoc,
8248 diag::err_template_arg_template_params_mismatch);
8249 NextDiag = diag::note_template_parameter_pack_non_pack;
8255 S.
Diag(
New->getLocation(), NextDiag)
8256 << ParamKind <<
New->isParameterPack();
8265 dyn_cast<NonTypeTemplateParmDecl>(Old)) {
8273 (!OldNTTP->getType()->isDependentType() &&
8283 unsigned NextDiag = diag::err_template_nontype_parm_different_type;
8284 if (TemplateArgLoc.
isValid()) {
8285 S.
Diag(TemplateArgLoc,
8286 diag::err_template_arg_template_params_mismatch);
8287 NextDiag = diag::note_template_nontype_parm_different_type;
8291 S.
Diag(OldNTTP->getLocation(),
8292 diag::note_template_nontype_parm_prev_declaration)
8293 << OldNTTP->getType();
8303 dyn_cast<TemplateTemplateParmDecl>(Old)) {
8309 OldTTP->getTemplateParameters(), Complain,
8320 const Expr *NewC =
nullptr, *OldC =
nullptr;
8324 NewC = TC->getImmediatelyDeclaredConstraint();
8326 OldC = TC->getImmediatelyDeclaredConstraint();
8329 ->getPlaceholderTypeConstraint())
8332 ->getPlaceholderTypeConstraint())
8335 llvm_unreachable(
"unexpected template parameter type");
8337 auto Diagnose = [&] {
8339 diag::err_template_different_type_constraint);
8341 diag::note_template_prev_declaration) << 0;
8344 if (!NewC != !OldC) {
8371 unsigned NextDiag = diag::err_template_param_list_different_arity;
8372 if (TemplateArgLoc.
isValid()) {
8373 S.
Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
8374 NextDiag = diag::note_template_param_list_different_arity;
8376 S.
Diag(
New->getTemplateLoc(), NextDiag)
8377 << (
New->size() > Old->
size())
8389 if (Old->
size() !=
New->size()) {
8406 OldParmEnd = Old->
end();
8407 OldParm != OldParmEnd; ++OldParm, ++NewParm) {
8408 if (NewParm == NewParmEnd) {
8415 OldInstFrom, Complain, Kind,
8421 if (NewParm != NewParmEnd) {
8430 const Expr *NewRC =
New->getRequiresClause();
8435 diag::err_template_different_requires_clause);
8437 diag::note_template_prev_declaration) << 0;
8440 if (!NewRC != !OldRC) {
8476 Diag(Range.getBegin(), diag::err_template_linkage) << Range;
8478 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
8503 while (isa_and_nonnull<CapturedDecl, CXXRecordDecl>(OutCtx))
8508 diag::err_template_inside_local_class)
8516 diag::err_template_outside_namespace_or_class_scope)
8527 return Record->getTemplateSpecializationKind();
8528 if (
FunctionDecl *Function = dyn_cast<FunctionDecl>(D))
8529 return Function->getTemplateSpecializationKind();
8530 if (
VarDecl *Var = dyn_cast<VarDecl>(D))
8583 S.
Diag(Loc, diag::err_template_spec_unknown_kind)
8593 S.
Diag(Loc, diag::err_template_spec_decl_function_scope)
8608 : DC->
Equals(SpecializedContext))) {
8610 S.
Diag(Loc, diag::err_template_spec_redecl_global_scope)
8611 << EntityKind << Specialized;
8614 int Diag = diag::err_template_spec_redecl_out_of_scope;
8616 Diag = diag::ext_ms_template_spec_redecl_out_of_scope;
8617 S.
Diag(Loc,
Diag) << EntityKind << Specialized
8618 << ND << isa<CXXRecordDecl>(ND);
8621 S.
Diag(Specialized->getLocation(), diag::note_specialized_entity);
8635 DependencyChecker Checker(Depth,
true);
8636 Checker.TraverseStmt(E);
8639 return Checker.MatchLoc;
8645 DependencyChecker Checker(Depth,
true);
8646 Checker.TraverseTypeLoc(TL);
8649 return Checker.MatchLoc;
8657 bool HasError =
false;
8658 for (
unsigned I = 0; I != NumArgs; ++I) {
8661 S, TemplateNameLoc, Param, Args[I].pack_begin(),
8662 Args[I].pack_size(), IsDefaultArgument))
8679 ArgExpr = Expansion->getPattern();
8683 ArgExpr = ICE->getSubExpr();
8693 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ArgExpr))
8717 if (ParamUseRange.
isValid()) {
8718 if (IsDefaultArgument) {
8719 S.
Diag(TemplateNameLoc,
8720 diag::err_dependent_non_type_arg_in_partial_spec);
8722 diag::note_dependent_non_type_default_arg_in_partial_spec)
8726 diag::err_dependent_non_type_arg_in_partial_spec)
8733 Param->getDepth(), Param->getTypeSourceInfo()->getTypeLoc());
8734 if (ParamUseRange.
isValid()) {
8736 diag::err_dependent_typed_non_type_arg_in_partial_spec)
8737 << Param->getType();
8756 for (
unsigned I = 0, N = TemplateParams->
size(); I != N; ++I) {
8758 = dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(I));
8763 Param, &TemplateArgs[I],
8764 1, I >= NumExplicit))
8788 Diag(TemplateNameLoc, diag::err_not_class_template_specialization)
8794 if (
const auto *DSA =
ClassTemplate->getAttr<NoSpecializationsAttr>()) {
8795 auto Message = DSA->getMessage();
8796 Diag(TemplateNameLoc, diag::warn_invalid_specialization)
8798 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
8806 bool isMemberSpecialization =
false;
8807 bool isPartialSpecialization =
false;
8812 TemplateNameLoc, &TemplateId,
8824 KWLoc, TemplateNameLoc, SS, &TemplateId, TemplateParameterLists,
8839 if (TemplateParams && TemplateParams->
size() > 0) {
8840 isPartialSpecialization =
true;
8843 Diag(KWLoc, diag::err_partial_specialization_friend)
8851 for (
unsigned I = 0, N = TemplateParams->
size(); I != N; ++I) {
8854 if (TTP->hasDefaultArgument()) {
8855 Diag(TTP->getDefaultArgumentLoc(),
8856 diag::err_default_arg_in_partial_spec);
8857 TTP->removeDefaultArgument();
8860 = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
8861 if (NTTP->hasDefaultArgument()) {
8862 Diag(NTTP->getDefaultArgumentLoc(),
8863 diag::err_default_arg_in_partial_spec)
8864 << NTTP->getDefaultArgument().getSourceRange();
8865 NTTP->removeDefaultArgument();
8871 diag::err_default_arg_in_partial_spec)
8877 }
else if (TemplateParams) {
8879 Diag(KWLoc, diag::err_template_spec_friend)
8886 "should have a 'template<>' for this decl");
8893 "Invalid enum tag in class template spec!");
8897 Diag(KWLoc, diag::err_use_with_wrong_tag)
8902 diag::note_previous_use);
8911 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
8913 isPartialSpecialization
8929 if (isPartialSpecialization) {
8931 TemplateArgs.
size(),
8938 !TemplateSpecializationType::anyDependentTemplateArguments(
8940 Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
8942 isPartialSpecialization =
false;
8947 void *InsertPos =
nullptr;
8950 if (isPartialSpecialization)
8964 isPartialSpecialization))
8967 if (!isPartialSpecialization) {
8975 if (TemplateParameterLists.size() > 0) {
8977 TemplateParameterLists);
8984 Context.getCanonicalTemplateSpecializationType(
8991 (!
Context.getLangOpts().CPlusPlus20 ||
9000 Diag(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)
9008 TemplateParameterLists.data(), isMemberSpecialization);
9013 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl);
9016 Context, Kind, DC, KWLoc, TemplateNameLoc, TemplateParams,
9020 if (TemplateParameterLists.size() > 1 && SS.
isSet()) {
9022 Context, TemplateParameterLists.drop_back(1));
9026 ClassTemplate->AddPartialSpecialization(Partial, InsertPos);
9031 if (isMemberSpecialization)
9055 Diag(TemplateNameLoc, diag::err_specialization_after_instantiation)
9059 diag::note_instantiation_required_here)
9074 bool HiddenDefVisible =
false;
9075 if (Def && SkipBody &&
9079 if (!HiddenDefVisible && Hidden)
9102 if (ModulePrivateLoc.
isValid())
9104 << (isPartialSpecialization? 1 : 0)
9172 diag::err_concept_decls_may_only_appear_in_global_namespace_scope);
9176 if (TemplateParameterLists.size() > 1) {
9177 Diag(NameLoc, diag::err_concept_extra_headers);
9183 if (Params->
size() == 0) {
9184 Diag(NameLoc, diag::err_concept_no_parameters);
9191 ParamEnd = Params->
end();
9192 ParamIt != ParamEnd; ++ParamIt) {
9193 Decl const *Param = *ParamIt;
9194 if (Param->isParameterPack()) {
9195 if (++ParamIt == ParamEnd)
9197 Diag(Param->getLocation(),
9198 diag::err_template_param_pack_must_be_last_template_parameter);
9209 Diag(NameLoc, diag::err_concept_no_associated_constraints);
9246 Expr *ConstraintExpr,
9248 assert(!
C->hasDefinition() &&
"Concept already defined");
9250 C->setInvalidDecl();
9253 C->setDefinition(ConstraintExpr);
9264 bool AddToScope =
true;
9268 if (!WasAlreadyAdded && AddToScope)
9281 auto *OldConcept = dyn_cast<ConceptDecl>(
Previous.getRepresentativeDecl()->getUnderlyingDecl());
9283 auto *Old =
Previous.getRepresentativeDecl();
9291 bool IsSame =
Context.isSameEntity(NewDecl, OldConcept);
9293 Diag(NewDecl->
getLocation(), diag::err_redefinition_different_concept)
9317 if (
auto *CE = llvm::dyn_cast<ConceptDecl>(
Concept);
9318 CE && !CE->isInvalidDecl() && !CE->hasDefinition()) {
9319 Diag(Loc, diag::err_recursive_concept) << CE;
9320 Diag(CE->getLocation(), diag::note_declared_at);
9321 CE->setInvalidDecl();
9334 D->
dropAttrs<DLLImportAttr, DLLExportAttr>();
9337 FD->setInlineSpecified(
false);
9356 Context, CurContext, Spec, ExternLoc, TemplateLoc, QualifierLoc,
9357 ArgsAsWritten, NameLoc, TypeAsWritten, TSK);
9358 Context.addExplicitInstantiationDecl(Spec, EID);
9368 if (EID->getTemplateSpecializationKind() ==
9370 return EID->getTemplateLoc();
9376 for (
Decl *Prev = D; Prev && !PrevDiagLoc.
isValid();
9377 Prev = Prev->getPreviousDecl()) {
9378 PrevDiagLoc = Prev->getLocation();
9380 assert(PrevDiagLoc.
isValid() &&
9381 "Explicit instantiation without point of instantiation?");
9391 bool &HasNoEffect) {
9392 HasNoEffect =
false;
9399 "previous declaration must be implicit!");
9412 if (PrevPointOfInstantiation.
isInvalid()) {
9416 PrevDecl,
Context.getTargetInfo().getTriple().isOSCygMing());
9425 PrevPointOfInstantiation.
isValid()) &&
9426 "Explicit instantiation without point of instantiation?");
9440 Diag(NewLoc, diag::err_specialization_after_instantiation)
9442 Diag(PrevPointOfInstantiation, diag::note_instantiation_required_here)
9447 llvm_unreachable(
"The switch over PrevTSK must be exhaustive.");
9477 diag::err_explicit_instantiation_declaration_after_definition);
9483 diag::note_explicit_instantiation_definition_here);
9487 llvm_unreachable(
"Unexpected TemplateSpecializationKind!");
9503 Diag(NewLoc, diag::warn_explicit_instantiation_after_specialization)
9506 diag::note_previous_template_specialization);
9537 ? diag::ext_explicit_instantiation_duplicate
9538 : diag::err_explicit_instantiation_duplicate)
9541 diag::note_previous_explicit_instantiation);
9547 llvm_unreachable(
"Missing specialization/instantiation case?");
9557 enum DiscardReason { NotAFunctionTemplate, NotAMemberOfEnclosing };
9563 DiscardedCandidates.push_back(std::make_pair(NotAFunctionTemplate, D));
9570 DiscardedCandidates.push_back(std::make_pair(NotAMemberOfEnclosing, D));
9581 FriendQualifier.
getAsType()->
getAs<TemplateSpecializationType>()) {
9587 Diag(FD->
getLocation(), diag::err_dependent_function_template_spec_no_match)
9589 for (
auto &P : DiscardedCandidates)
9590 Diag(P.second->getLocation(),
9591 diag::note_dependent_function_template_spec_discard_reason)
9592 << P.first << IsFriend;
9597 ExplicitTemplateArgs);
9610 llvm::SmallDenseMap<FunctionDecl *, TemplateArgumentListInfo, 8>
9611 ConvertedTemplateArgs;
9634 if (
auto *NewMD = dyn_cast<CXXMethodDecl>(FD);
9635 !
getLangOpts().CPlusPlus14 && NewMD && NewMD->isConstexpr() &&
9637 auto *OldMD = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
9638 if (OldMD && OldMD->isConst()) {
9648 if (ExplicitTemplateArgs)
9649 Args = *ExplicitTemplateArgs;
9662 ExplicitTemplateArgs ? &Args :
nullptr, FT,
Specialization, Info);
9667 I.getPair(), FunTmpl->getTemplatedDecl(),
9681 CUDA().IdentifyTarget(FD,
true)) {
9683 I.getPair(), FunTmpl->getTemplatedDecl(),
9690 if (ExplicitTemplateArgs)
9699 if (QualifiedFriend && Candidates.
empty()) {
9705 if (
auto *OldFD = dyn_cast<FunctionDecl>(OldND->getUnderlyingDecl()))
9716 PDiag(diag::err_function_template_spec_ambiguous)
9717 << FD->
getDeclName() << (ExplicitTemplateArgs !=
nullptr),
9718 PDiag(diag::note_function_template_spec_matched));
9727 const auto *DSA = PT->getAttr<NoSpecializationsAttr>()) {
9728 auto Message = DSA->getMessage();
9730 << PT << !Message.empty() << Message;
9731 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
9759 auto *SpecializationFPT =
9770 assert(SpecInfo &&
"Function template specialization info missing?");
9808 bool HasNoEffect =
false;
9823 !isFriend || (InstFrom && InstFrom->getDependentSpecializationInfo())) {
9837 "This must be the only existing declaration of this specialization");
9852 FD->setFunctionTemplateSpecialization(
9855 ExplicitTemplateArgs ? &ConvertedTemplateArgs[
Specialization] :
nullptr);
9874 assert(!
Member->isTemplateDecl() && !
Member->getDescribedTemplate() &&
9875 "Only for non-template members");
9878 NamedDecl *FoundInstantiation =
nullptr;
9888 auto *
Method = dyn_cast<CXXMethodDecl>(Candidate->getUnderlyingDecl());
9906 Method->getTrailingRequiresClause() &&
9910 !Satisfaction.IsSatisfied))
9913 Candidates.
addDecl(Candidate);
9917 if (Candidates.
empty())
9934 FoundInstantiation = *Best;
9935 Instantiation = BestMethod;
9952 Diag(
Member->getLocation(), diag::err_function_member_spec_ambiguous)
9953 <<
Member << (InstantiatedFrom ? InstantiatedFrom : Instantiation);
9954 for (
NamedDecl *Candidate : Candidates) {
9955 Candidate = Candidate->getUnderlyingDecl();
9956 Diag(Candidate->getLocation(), diag::note_function_member_spec_matched)
9964 (PrevVar = dyn_cast<VarDecl>(
Previous.getFoundDecl())))
9966 FoundInstantiation =
Previous.getRepresentativeDecl();
9967 Instantiation = PrevVar;
9974 (PrevRecord = dyn_cast<CXXRecordDecl>(
Previous.getFoundDecl()))) {
9975 FoundInstantiation =
Previous.getRepresentativeDecl();
9976 Instantiation = PrevRecord;
9983 (PrevEnum = dyn_cast<EnumDecl>(
Previous.getFoundDecl()))) {
9984 FoundInstantiation =
Previous.getRepresentativeDecl();
9985 Instantiation = PrevEnum;
9991 if (!Instantiation) {
10016 Previous.addDecl(FoundInstantiation);
10021 if (!InstantiatedFrom) {
10022 Diag(
Member->getLocation(), diag::err_spec_member_not_instantiated)
10034 assert(MSInfo &&
"Member specialization info missing?");
10036 bool HasNoEffect =
false;
10048 Instantiation,
Member->getLocation(),
10054 if (
auto *MemberFunction = dyn_cast<FunctionDecl>(
Member)) {
10060 if (InstantiationFunction->
isDeleted()) {
10063 InstantiationFunction);
10069 MemberFunction->setInstantiationOfMemberFunction(
10071 }
else if (
auto *MemberVar = dyn_cast<VarDecl>(
Member)) {
10072 MemberVar->setInstantiationOfStaticDataMember(
10074 }
else if (
auto *MemberClass = dyn_cast<CXXRecordDecl>(
Member)) {
10075 MemberClass->setInstantiationOfMemberClass(
10077 }
else if (
auto *MemberEnum = dyn_cast<EnumDecl>(
Member)) {
10078 MemberEnum->setInstantiationOfMemberEnum(
10081 llvm_unreachable(
"unknown member specialization kind");
10087 Previous.addDecl(FoundInstantiation);
10096template<
typename DeclT>
10107 OrigD->setLocation(Loc);
10113 if (Instantiation ==
Member)
10116 if (
auto *
Function = dyn_cast<CXXMethodDecl>(Instantiation))
10118 else if (
auto *Var = dyn_cast<VarDecl>(Instantiation))
10120 else if (
auto *
Record = dyn_cast<CXXRecordDecl>(Instantiation))
10122 else if (
auto *
Enum = dyn_cast<EnumDecl>(Instantiation))
10125 llvm_unreachable(
"unknown member specialization kind");
10133 bool WasQualifiedName) {
10138 S.
Diag(InstLoc, diag::err_explicit_instantiation_in_class)
10151 if (WasQualifiedName) {
10152 if (CurContext->
Encloses(OrigContext))
10159 if (
NamespaceDecl *NS = dyn_cast<NamespaceDecl>(OrigContext)) {
10160 if (WasQualifiedName)
10163 diag::err_explicit_instantiation_out_of_scope :
10164 diag::warn_explicit_instantiation_out_of_scope_0x)
10169 diag::err_explicit_instantiation_unqualified_wrong_namespace :
10170 diag::warn_explicit_instantiation_unqualified_wrong_namespace_0x)
10175 diag::err_explicit_instantiation_must_be_global :
10176 diag::warn_explicit_instantiation_must_be_global_0x)
10185 bool WasQualifiedName,
10192 S.
Diag(InstLoc, diag::err_explicit_instantiation_internal_linkage) << D;
10220 NNS =
T->getPrefix();
10229 auto *A = cast_or_null<InheritableAttr>(
getDLLAttr(Def));
10230 assert(A &&
"dllExportImportClassTemplateSpecialization called "
10231 "on Def without dllexport or dllimport");
10236 "delayed exports present at explicit instantiation");
10240 for (
auto &B : Def->
bases()) {
10241 if (
auto *BT = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
10242 B.getType()->getAsCXXRecordDecl()))
10262 "Invalid enum tag in class template explicit instantiation!");
10268 Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << TD << NTK << Kind;
10274 Kind,
false, KWLoc,
10276 Diag(KWLoc, diag::err_use_with_wrong_tag)
10281 diag::note_previous_use);
10294 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
10298 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10300 diag::warn_attribute_dllexport_explicit_instantiation_decl);
10301 Diag(AL.getLoc(), diag::note_attribute);
10306 if (
auto *A =
ClassTemplate->getTemplatedDecl()->getAttr<DLLExportAttr>()) {
10308 diag::warn_attribute_dllexport_explicit_instantiation_decl);
10309 Diag(A->getLocation(), diag::note_attribute);
10315 bool DLLImportExplicitInstantiationDef =
false;
10317 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
10320 ClassTemplate->getTemplatedDecl()->getAttr<DLLImportAttr>();
10322 if (AL.getKind() == ParsedAttr::AT_DLLImport)
10324 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10332 DLLImportExplicitInstantiationDef =
true;
10351 void *InsertPos =
nullptr;
10359 Context.getTargetInfo().getTriple().isOSCygMing()) {
10363 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10364 if (PrevDecl->
hasAttr<DLLExportAttr>()) {
10365 Diag(AL.getLoc(), diag::warn_attr_dllexport_explicit_inst_def);
10368 diag::warn_attr_dllexport_explicit_inst_def_mismatch);
10369 Diag(PrevDecl->
getLocation(), diag::note_prev_decl_missing_dllexport);
10377 !
Context.getTargetInfo().getTriple().isWindowsGNUEnvironment() &&
10379 return AL.getKind() == ParsedAttr::AT_DLLExport;
10381 if (
const auto *DEA = PrevDecl->
getAttr<DLLExportOnDeclAttr>()) {
10382 Diag(TemplateLoc, diag::warn_dllexport_on_decl_ignored);
10383 Diag(DEA->getLoc(), diag::note_dllexport_on_decl);
10393 bool HasNoEffect =
false;
10396 PrevDecl, PrevDecl_TSK,
10413 PrevDecl =
nullptr;
10417 DLLImportExplicitInstantiationDef) {
10419 HasNoEffect =
false;
10434 if (
const auto *A = PrevDecl->
getAttr<MSInheritanceAttr>()) {
10436 Clone->setInherited(
true);
10442 if (!HasNoEffect && !PrevDecl) {
10455 bool PreviouslyDLLExported =
Specialization->hasAttr<DLLExportAttr>();
10477 TemplateNameLoc, TSI, TSK);
10489 = cast_or_null<ClassTemplateSpecializationDecl>(
10501 Def = cast_or_null<ClassTemplateSpecializationDecl>(
10509 DLLImportExplicitInstantiationDef)) {
10514 Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
10520 A->setInherited(
true);
10528 bool NewlyDLLExported =
10529 !PreviouslyDLLExported &&
Specialization->hasAttr<DLLExportAttr>();
10531 Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
10545 "Def and Specialization should match for implicit instantiation");
10552 Context.getTargetInfo().getTriple().isOSCygMing() &&
10553 PrevDecl->
hasAttr<DLLExportAttr>()) {
10574 TemplateNameLoc, TSI, TSK);
10585 bool Owned =
false;
10586 bool IsDependent =
false;
10594 assert(!IsDependent &&
"explicit instantiation of dependent name not yet handled");
10600 assert(!Tag->isEnum() &&
"shouldn't see enumerations here");
10602 if (Tag->isInvalidDecl())
10608 Diag(TemplateLoc, diag::err_explicit_instantiation_nontemplate_type)
10610 Diag(
Record->getLocation(), diag::note_nontemplate_decl_here);
10621 Diag(TemplateLoc, diag::ext_explicit_instantiation_without_qualified_id)
10636 = cast_or_null<CXXRecordDecl>(
Record->getPreviousDecl());
10637 if (!PrevDecl &&
Record->getDefinition())
10641 bool HasNoEffect =
false;
10642 assert(MSInfo &&
"No member specialization information?");
10656 TL.setElaboratedKeywordLoc(KWLoc);
10658 TL.setNameLoc(NameLoc);
10661 nullptr, NameLoc, TSI, TSK);
10667 = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
10675 Diag(TemplateLoc, diag::err_explicit_instantiation_undefined_member)
10676 << 0 <<
Record->getDeclName() <<
Record->getDeclContext();
10686 RecordDef = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
10704 TL.setElaboratedKeywordLoc(KWLoc);
10706 TL.setNameLoc(NameLoc);
10709 NameLoc, TSI, TSK);
10724 diag::err_explicit_instantiation_requires_name)
10763 diag::err_explicit_instantiation_inline :
10764 diag::warn_explicit_instantiation_inline_0x)
10770 diag::err_explicit_instantiation_constexpr);
10792 if (!R->isFunctionType()) {
10807 if (!PrevTemplate) {
10814 Diag((*P)->getLocation(), diag::note_explicit_instantiation_here);
10821 diag::err_explicit_instantiation_data_member_not_instantiated)
10835 if (R->isUndeducedType()) {
10836 Diag(
T->getTypeLoc().getBeginLoc(),
10837 diag::err_auto_not_allowed_var_inst);
10846 diag::err_explicit_instantiation_without_template_id)
10848 Diag(PrevTemplate->getLocation(),
10849 diag::note_explicit_instantiation_here);
10859 TemplateArgs,
true);
10890 diag::ext_explicit_instantiation_without_qualified_id)
10898 bool HasNoEffect =
false;
10900 PrevTSK, POI, HasNoEffect))
10903 if (!HasNoEffect) {
10906 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(Prev)) {
10907 VTSD->setExternKeywordLoc(ExternLoc);
10908 VTSD->setTemplateKeywordLoc(TemplateLoc);
10922 Diag(
T->getTypeLoc().getBeginLoc(),
10923 diag::err_invalid_var_template_spec_type)
10924 << 0 << PrevTemplate << R << Prev->
getType();
10925 Diag(PrevTemplate->getLocation(), diag::note_template_declared_here)
10926 << 2 << PrevTemplate->getDeclName();
10934 return (
Decl *)
nullptr;
10939 bool HasExplicitTemplateArgs =
false;
10943 HasExplicitTemplateArgs =
true;
10958 if (!HasExplicitTemplateArgs) {
10962 if (
Context.hasSameUnqualifiedType(
Method->getType(), Adjusted)) {
10963 if (
Method->getPrimaryTemplate()) {
10967 C.FoundDecl = P.getPair();
10971 if (
Method->getTrailingRequiresClause() &&
10990 FunTmpl, (HasExplicitTemplateArgs ? &TemplateArgs :
nullptr), R,
11021 if (!NonTemplateMatches.
empty()) {
11032 Msg = diag::err_explicit_instantiation_ambiguous;
11036 Msg = diag::err_explicit_instantiation_no_candidate;
11052 TemplateMatches.
begin(), TemplateMatches.
end(),
11054 PDiag(diag::err_explicit_instantiation_not_known) << Name,
11055 PDiag(diag::err_explicit_instantiation_ambiguous) << Name,
11056 PDiag(diag::note_explicit_instantiation_candidate));
11072 if (FPT->hasExceptionSpec()) {
11074 diag::err_mismatched_exception_spec_explicit_instantiation;
11076 DiagID = diag::ext_mismatched_exception_spec_explicit_instantiation;
11079 PDiag(diag::note_explicit_instantiation_here),
11090 diag::err_explicit_instantiation_member_function_not_instantiated)
11099 if (!PrevDecl &&
Specialization->isThisDeclarationADefinition())
11103 bool HasNoEffect =
false;
11113 if (HasExplicitTemplateArgs)
11120 return (
Decl *)
nullptr;
11132 if (
auto *RD = dyn_cast<CXXRecordDecl>(
Specialization->getDeclContext()))
11133 if (RD->getIdentifier() && RD->getIdentifier()->isStr(
"valarray") &&
11134 RD->isInStdNamespace())
11135 return (
Decl*)
nullptr;
11145 Context.getTargetInfo().getCXXABI().isMicrosoft())
11156 if (
const auto *RD = dyn_cast<CXXRecordDecl>(
Specialization->getParent());
11157 RD && RD->isLambda()) {
11160 Diag(RD->getLocation(), diag::note_defined_here) << RD;
11161 return (
Decl *)
nullptr;
11178 diag::ext_explicit_instantiation_without_qualified_id)
11188 if (HasExplicitTemplateArgs)
11194 return (
Decl *)
nullptr;
11203 assert(Name &&
"Expected a name in a dependent tag");
11216 Diag(NameLoc, diag::err_dependent_tag_decl)
11243 DiagCompat(TypenameLoc, diag_compat::typename_outside_of_template)
11251 TypenameLoc, QualifierLoc, II, IdLoc, &TSI,
11267 ? diag::compat_cxx11_typename_outside_of_template
11268 : diag::compat_pre_cxx11_typename_outside_of_template)
11276 if (LookupRD && LookupRD->getIdentifier() == TemplateII) {
11277 Diag(TemplateIILoc,
11278 diag::ext_out_of_line_qualified_id_type_names_constructor)
11280 << (TemplateKWLoc.
isValid() ? 1 : 0 );
11291 TemplateIn.
get(), TemplateIILoc, TemplateArgs,
11301 TemplateIILoc, TemplateArgs);
11311 if (!II.
isStr(
"type"))
11319 auto EnableIfTSTLoc =
11321 if (!EnableIfTSTLoc || EnableIfTSTLoc.getNumArgs() == 0)
11323 const TemplateSpecializationType *EnableIfTST = EnableIfTSTLoc.
getTypePtr();
11327 EnableIfTST->getTemplateName().getAsTemplateDecl();
11328 if (!EnableIfDecl || EnableIfTST->isIncompleteType())
11334 if (!EnableIfII || !EnableIfII->
isStr(
"enable_if"))
11338 CondRange = EnableIfTSTLoc.getArgLoc(0).getSourceRange();
11342 if (EnableIfTSTLoc.getArgLoc(0).getArgument().getKind()
11346 Cond = EnableIfTSTLoc.getArgLoc(0).getSourceExpression();
11362 bool DeducedTSTContext) {
11364 DeducedTSTContext);
11371 TL.setElaboratedKeywordLoc(KeywordLoc);
11372 TL.setQualifierLoc(QualifierLoc);
11373 TL.setNameLoc(IILoc);
11376 TL.setElaboratedKeywordLoc(KeywordLoc);
11377 TL.setQualifierLoc(QualifierLoc);
11378 TL.setNameLoc(IILoc);
11382 assert(!QualifierLoc);
11386 TL.setElaboratedKeywordLoc(KeywordLoc);
11387 TL.setQualifierLoc(QualifierLoc);
11388 TL.setNameLoc(IILoc);
11409 SS.
Adopt(QualifierLoc);
11412 if (QualifierLoc) {
11439 unsigned DiagID = 0;
11440 Decl *Referenced =
nullptr;
11441 switch (
Result.getResultKind()) {
11452 std::string FailedDescription;
11453 std::tie(FailedCond, FailedDescription) =
11457 diag::err_typename_nested_not_found_requirement)
11458 << FailedDescription
11464 diag::err_typename_nested_not_found_enable_if)
11465 << Ctx << CondRange;
11469 DiagID = Ctx ? diag::err_typename_nested_not_found
11470 : diag::err_unknown_typename;
11479 Diag(IILoc, diag::err_typename_refers_to_using_value_decl)
11480 << Name << Ctx << FullRange;
11482 = dyn_cast<UnresolvedUsingValueDecl>(
Result.getRepresentativeDecl())){
11484 Diag(Loc, diag::note_using_value_decl_missing_typename)
11524 assert(!QualifierLoc);
11527 return Context.getTypeDeclType(
11537 if (!DeducedTSTContext) {
11540 Diag(IILoc, diag::err_dependent_deduced_tst)
11542 <<
QualType(Qualifier.getAsType(), 0);
11544 Diag(IILoc, diag::err_deduced_tst)
11552 return Context.getDeducedTemplateSpecializationType(
11558 DiagID = Ctx ? diag::err_typename_nested_not_type
11559 : diag::err_typename_not_type;
11560 Referenced =
Result.getFoundDecl();
11564 DiagID = Ctx ? diag::err_typename_nested_not_type
11565 : diag::err_typename_not_type;
11566 Referenced = *
Result.begin();
11578 Diag(IILoc, DiagID) << FullRange << Name << Ctx;
11580 Diag(IILoc, DiagID) << FullRange << Name;
11583 Ctx ? diag::note_typename_member_refers_here
11584 : diag::note_typename_refers_here)
11591 class CurrentInstantiationRebuilder
11599 CurrentInstantiationRebuilder(
Sema &SemaRef,
11603 Loc(Loc), Entity(Entity) { }
11611 return T.isNull() || !
T->isInstantiationDependentType();
11616 SourceLocation getBaseLocation() {
return Loc; }
11619 DeclarationName getBaseEntity() {
return Entity; }
11623 void setBase(SourceLocation Loc, DeclarationName Entity) {
11625 this->Entity = Entity;
11638 if (!
T || !
T->getType()->isInstantiationDependentType())
11641 CurrentInstantiationRebuilder Rebuilder(*
this, Loc, Name);
11642 return Rebuilder.TransformType(
T);
11646 CurrentInstantiationRebuilder Rebuilder(*
this, E->
getExprLoc(),
11648 return Rebuilder.TransformExpr(E);
11659 = Rebuilder.TransformNestedNameSpecifierLoc(QualifierLoc);
11669 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
11678 = dyn_cast<TemplateTemplateParmDecl>(Param)) {
11680 TTP->getTemplateParameters()))
11722 unsigned NumArgs) {
11724 llvm::raw_svector_ostream Out(Str);
11726 if (!Params || Params->
size() == 0 || NumArgs == 0)
11727 return std::string();
11729 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
11739 Out << Id->getName();
11751 return std::string(Out.str());
11759 auto LPT = std::make_unique<LateParsedTemplate>();
11762 LPT->Toks.swap(Toks);
11809class ExplicitSpecializationVisibilityChecker {
11818 : S(S), Loc(Loc), Kind(Kind) {}
11821 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
11822 return checkImpl(FD);
11823 if (
auto *RD = dyn_cast<CXXRecordDecl>(ND))
11824 return checkImpl(RD);
11825 if (
auto *VD = dyn_cast<VarDecl>(ND))
11826 return checkImpl(VD);
11827 if (
auto *ED = dyn_cast<EnumDecl>(ND))
11828 return checkImpl(ED);
11832 void diagnose(NamedDecl *D,
bool IsPartialSpec) {
11833 auto Kind = IsPartialSpec ? Sema::MissingImportKind::PartialSpecialization
11834 : Sema::MissingImportKind::ExplicitSpecialization;
11835 const bool Recover =
true;
11840 if (Modules.empty())
11846 bool CheckMemberSpecialization(
const NamedDecl *D) {
11847 return Kind == Sema::AcceptableKind::Visible
11852 bool CheckExplicitSpecialization(
const NamedDecl *D) {
11853 return Kind == Sema::AcceptableKind::Visible
11858 bool CheckDeclaration(
const NamedDecl *D) {
11875 template<
typename SpecDecl>
11876 void checkImpl(SpecDecl *Spec) {
11877 bool IsHiddenExplicitSpecialization =
false;
11881 if constexpr (std::is_same_v<SpecDecl, FunctionDecl>)
11882 SpecKind = Spec->getTemplateSpecializationKindForInstantiation();
11884 IsHiddenExplicitSpecialization = Spec->getMemberSpecializationInfo()
11885 ? !CheckMemberSpecialization(Spec)
11886 : !CheckExplicitSpecialization(Spec);
11888 checkInstantiated(Spec);
11891 if (IsHiddenExplicitSpecialization)
11892 diagnose(Spec->getMostRecentDecl(),
false);
11895 void checkInstantiated(FunctionDecl *FD) {
11900 void checkInstantiated(CXXRecordDecl *RD) {
11901 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD);
11905 auto From = SD->getSpecializedTemplateOrPartial();
11906 if (
auto *TD = From.dyn_cast<ClassTemplateDecl *>())
11908 else if (
auto *TD =
11909 From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
11910 if (!CheckDeclaration(TD))
11911 diagnose(TD,
true);
11916 void checkInstantiated(VarDecl *RD) {
11917 auto *SD = dyn_cast<VarTemplateSpecializationDecl>(RD);
11921 auto From = SD->getSpecializedTemplateOrPartial();
11922 if (
auto *TD = From.dyn_cast<VarTemplateDecl *>())
11924 else if (
auto *TD =
11925 From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
11926 if (!CheckDeclaration(TD))
11927 diagnose(TD,
true);
11932 void checkInstantiated(EnumDecl *FD) {}
11934 template<
typename TemplDecl>
11935 void checkTemplate(TemplDecl *TD) {
11936 if (TD->isMemberSpecialization()) {
11937 if (!CheckMemberSpecialization(TD))
11938 diagnose(TD->getMostRecentDecl(),
false);
11948 ExplicitSpecializationVisibilityChecker(*
this, Loc,
11958 ExplicitSpecializationVisibilityChecker(*
this, Loc,
11966 if (
const auto *FD = dyn_cast<FunctionDecl>(N)) {
11974 if (!CSC.isInstantiationRecord() || CSC.PointOfInstantiation.isInvalid())
11976 return CSC.PointOfInstantiation;
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
Defines enum values for all the target-independent builtin functions.
static Decl::Kind getKind(const Decl *D)
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.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
Defines the clang::LangOptions interface.
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::Record Record
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis for CUDA constructs.
static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D)
static bool DependsOnTemplateParameters(QualType T, TemplateParameterList *Params)
Determines whether a given type depends on the given parameter list.
static TemplateSpecializationKind getTemplateSpecializationKind(Decl *D)
Determine what kind of template specialization the given declaration is.
static Expr * BuildExpressionFromNonTypeTemplateArgumentValue(Sema &S, QualType T, const APValue &Val, SourceLocation Loc)
static void maybeDiagnoseTemplateParameterShadow(Sema &SemaRef, Scope *S, SourceLocation Loc, const IdentifierInfo *Name)
static TemplateArgumentLoc convertTypeTemplateArgumentToTemplate(ASTContext &Context, TypeLoc TLoc)
Convert a template-argument that we parsed as a type into a template, if possible.
static bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization)
Check whether a specialization is well-formed in the current context.
static bool ScopeSpecifierHasTemplateId(const CXXScopeSpec &SS)
Determine whether the given scope specifier has a template-id in it.
static void addExplicitInstantiationDecl(ASTContext &Context, DeclContext *CurContext, NamedDecl *Spec, SourceLocation ExternLoc, SourceLocation TemplateLoc, NestedNameSpecifierLoc QualifierLoc, const ASTTemplateArgumentListInfo *ArgsAsWritten, SourceLocation NameLoc, TypeSourceInfo *TypeAsWritten, TemplateSpecializationKind TSK)
Create an ExplicitInstantiationDecl to record source-location info for an explicit template instantia...
static SourceRange findTemplateParameterInType(unsigned Depth, Expr *E)
static Sema::SemaDiagnosticBuilder noteLocation(Sema &S, const NamedDecl &Decl, unsigned HereDiagID, unsigned ExternalDiagID)
static SourceRange getRangeOfTypeInNestedNameSpecifier(ASTContext &Context, QualType T, const CXXScopeSpec &SS)
static Expr * BuildExpressionFromIntegralTemplateArgumentValue(Sema &S, QualType OrigT, const llvm::APSInt &Int, SourceLocation Loc)
Construct a new expression that refers to the given integral template argument with the given source-...
static SourceRange findTemplateParameter(unsigned Depth, TypeLoc TL)
static TemplateName resolveAssumedTemplateNameAsType(Sema &S, Scope *Scope, const AssumedTemplateStorage *ATN, SourceLocation NameLoc)
static QualType builtinCommonTypeImpl(Sema &S, ElaboratedTypeKeyword Keyword, TemplateName BaseTemplate, SourceLocation TemplateLoc, ArrayRef< TemplateArgument > Ts)
static bool isSameAsPrimaryTemplate(TemplateParameterList *Params, TemplateParameterList *SpecParams, ArrayRef< TemplateArgument > Args)
static bool SubstDefaultTemplateArgument(Sema &SemaRef, TemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, TemplateTypeParmDecl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, TemplateArgumentLoc &Output)
Substitute template arguments into the default template argument for the given template type paramete...
static bool CheckNonTypeTemplatePartialSpecializationArgs(Sema &S, SourceLocation TemplateNameLoc, NonTypeTemplateParmDecl *Param, const TemplateArgument *Args, unsigned NumArgs, bool IsDefaultArgument)
Subroutine of Sema::CheckTemplatePartialSpecializationArgs that checks non-type template partial spec...
static QualType checkBuiltinTemplateIdType(Sema &SemaRef, ElaboratedTypeKeyword Keyword, BuiltinTemplateDecl *BTD, ArrayRef< TemplateArgument > Converted, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
static void StripImplicitInstantiation(NamedDecl *D, bool MinGW)
Strips various properties off an implicit instantiation that has just been explicitly specialized.
static bool isEnableIf(NestedNameSpecifierLoc NNS, const IdentifierInfo &II, SourceRange &CondRange, Expr *&Cond)
Determine whether this failed name lookup should be treated as being disabled by a usage of std::enab...
static void DiagnoseTemplateParameterListArityMismatch(Sema &S, TemplateParameterList *New, TemplateParameterList *Old, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc)
Diagnose a known arity mismatch when comparing template argument lists.
static bool isTemplateArgumentTemplateParameter(const TemplateArgument &Arg, unsigned Depth, unsigned Index)
static bool CheckTemplateArgumentIsCompatibleWithParameter(Sema &S, NamedDecl *Param, QualType ParamType, Expr *ArgIn, Expr *Arg, QualType ArgType)
Checks whether the given template argument is compatible with its template parameter.
static bool isInVkNamespace(const RecordType *RT)
static ExprResult formImmediatelyDeclaredConstraint(Sema &S, NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, NamedDecl *NamedConcept, NamedDecl *FoundDecl, SourceLocation LAngleLoc, SourceLocation RAngleLoc, QualType ConstrainedType, SourceLocation ParamNameLoc, ArgumentLocAppender Appender, SourceLocation EllipsisLoc)
static TemplateArgumentListInfo makeTemplateArgumentListInfo(Sema &S, TemplateIdAnnotation &TemplateId)
Convert the parser's template argument list representation into our form.
static void collectConjunctionTerms(Expr *Clause, SmallVectorImpl< Expr * > &Terms)
Collect all of the separable terms in the given condition, which might be a conjunction.
static void checkMoreSpecializedThanPrimary(Sema &S, PartialSpecDecl *Partial)
static SpirvOperand checkHLSLSpirvTypeOperand(Sema &SemaRef, QualType OperandArg, SourceLocation Loc)
static SourceLocation DiagLocForExplicitInstantiation(NamedDecl *D, SourceLocation PointOfInstantiation)
Compute the diagnostic location for an explicit instantiation.
static bool RemoveLookupResult(LookupResult &R, NamedDecl *C)
static bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NamedDecl *Param, QualType ParamType, Expr *ArgIn, bool IsSpecified, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted)
Checks whether the given template argument is the address of an object or function according to C++ [...
static bool isEnableIfAliasTemplate(TypeAliasTemplateDecl *AliasTemplate)
Determine whether this alias template is "enable_if_t".
static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)
Check for unexpanded parameter packs within the template parameters of a template template parameter,...
static bool CheckExplicitInstantiationScope(Sema &S, NamedDecl *D, SourceLocation InstLoc, bool WasQualifiedName)
Check the scope of an explicit instantiation.
static TemplateArgumentLoc translateTemplateArgument(Sema &SemaRef, const ParsedTemplateArgument &Arg)
static NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NamedDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity=nullptr)
Determine whether the given template argument is a null pointer value of the appropriate type.
static void checkTemplatePartialSpecialization(Sema &S, PartialSpecDecl *Partial)
static bool CheckExplicitInstantiation(Sema &S, NamedDecl *D, SourceLocation InstLoc, bool WasQualifiedName, TemplateSpecializationKind TSK)
Common checks for whether an explicit instantiation of D is valid.
static Expr * lookThroughRangesV3Condition(Preprocessor &PP, Expr *Cond)
static bool DiagnoseDefaultTemplateArgument(Sema &S, Sema::TemplateParamListContext TPC, SourceLocation ParamLoc, SourceRange DefArgRange)
Diagnose the presence of a default template argument on a template parameter, which is ill-formed in ...
static void noteNonDeducibleParameters(Sema &S, TemplateParameterList *TemplateParams, const llvm::SmallBitVector &DeducibleParams)
static void completeMemberSpecializationImpl(Sema &S, DeclT *OrigD, SourceLocation Loc)
Complete the explicit specialization of a member of a class template by updating the instantiated mem...
static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc, TemplateDecl *TD, const TemplateParmDecl *D, TemplateArgumentListInfo &Args)
Diagnose a missing template argument.
static bool CheckTemplateArgumentPointerToMember(Sema &S, NamedDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted)
Checks whether the given template argument is a pointer to member constant according to C++ [temp....
static bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const Sema::TemplateCompareNewDeclInfo &NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc)
Match two template parameters within template parameter lists.
static void dllExportImportClassTemplateSpecialization(Sema &S, ClassTemplateSpecializationDecl *Def)
Make a dllexport or dllimport attr on a class template specialization take effect.
Defines the clang::SourceLocation class and associated facilities.
Allows QualTypes to be sorted and hence used in maps and sets.
static const TemplateArgument & getArgument(const TemplateArgument &A)
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
const LValueBase getLValueBase() const
APSInt & getComplexIntImag()
ValueKind getKind() const
APFixedPoint & getFixedPoint()
const ValueDecl * getMemberPointerDecl() const
APValue & getVectorElt(unsigned I)
unsigned getVectorLength() const
bool isMemberPointer() const
std::string getAsString(const ASTContext &Ctx, QualType Ty) const
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
bool isNullPointer() const
APSInt & getComplexIntReal()
APFloat & getComplexFloatImag()
APFloat & getComplexFloatReal()
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
ArrayRef< ExplicitInstantiationDecl * > getExplicitInstantiationDecls(const NamedDecl *Spec) const
Get all ExplicitInstantiationDecls for a given specialization.
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
A structure for storing the information associated with a name that has been assumed to be a template...
DeclarationName getDeclName() const
Get the name of the template.
Attr - This represents one attribute.
AutoTypeKeyword getAutoKeyword() const
const NestedNameSpecifierLoc getNestedNameSpecifierLoc() const
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
NamedDecl * getFoundDecl() const
TemplateDecl * getNamedConcept() const
DeclarationNameInfo getConceptNameInfo() const
A fixed int type of a specified bitwidth.
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
BuiltinTemplateKind getBuiltinTemplateKind() const
This class is used for builtin types like 'int'.
static CStyleCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, CastKind K, Expr *Op, const CXXCastPath *BasePath, FPOptionsOverride FPO, TypeSourceInfo *WrittenTy, SourceLocation L, SourceLocation R)
static CXXBoolLiteralExpr * Create(const ASTContext &C, bool Val, QualType Ty, SourceLocation Loc)
Represents a C++ member access expression where the actual member referenced could not be resolved be...
static CXXDependentScopeMemberExpr * Create(const ASTContext &Ctx, Expr *Base, QualType BaseType, bool IsArrow, SourceLocation OperatorLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierFoundInScope, DeclarationNameInfo MemberNameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents a static or instance method of a struct/union/class.
The null pointer literal (C++11 [lex.nullptr])
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)
CXXRecordDecl * getMostRecentDecl()
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
CXXRecordDecl * getDefinition() const
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
void setDescribedClassTemplate(ClassTemplateDecl *Template)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
CXXRecordDecl * getPreviousDecl()
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).
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
static CanQual< Type > CreateUnsafe(QualType Other)
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, CanQualType CanonInjectedTST, ClassTemplatePartialSpecializationDecl *PrevDecl)
void setMemberSpecialization()
Note that this member template is a specialization.
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, bool StrictPackMatch, ClassTemplateSpecializationDecl *PrevDecl)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Complex values, per C99 6.2.5p11.
Declaration of a C++20 concept.
ConceptDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
static ConceptDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, Expr *ConstraintExpr=nullptr)
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
static ConceptSpecializationExpr * Create(const ASTContext &C, ConceptReference *ConceptRef, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction)
const TypeClass * getTypePtr() const
Represents the canonical version of C arrays with a specified constant size.
static ConstantExpr * Create(const ASTContext &Context, Expr *E, const APValue &Result)
Represents a concrete matrix type with constant number of rows and columns.
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...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isTransparentContext() const
isTransparentContext - Determines whether this context is a "transparent" context,...
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
bool isStdNamespace() const
DeclContext * getEnclosingNamespaceContext()
Retrieve the nearest enclosing namespace 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...
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
A reference to a declared variable, function, enum, etc.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
Captures information about "declaration specifiers".
bool isVirtualSpecified() const
void ClearStorageClassSpecs()
bool isNoreturnSpecified() const
SourceLocation getStorageClassSpecLoc() const
SCS getStorageClassSpec() const
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getNoreturnSpecLoc() const
SourceLocation getExplicitSpecLoc() const
TSCS getThreadStorageClassSpec() const
ParsedAttributes & getAttributes()
bool isInlineSpecified() const
SourceLocation getThreadStorageClassSpecLoc() const
SourceLocation getVirtualSpecLoc() const
SourceLocation getConstexprSpecLoc() const
SourceLocation getInlineSpecLoc() const
bool hasExplicitSpecifier() const
bool hasConstexprSpecifier() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isParameterPack() const
Whether this declaration is a parameter pack.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
@ FOK_None
Not a friend object.
bool isTemplated() const
Determine whether this declaration is a templated entity (whether it is.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
static DeclContext * castToDeclContext(const Decl *)
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
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
std::string getAsString() const
Retrieve the human-readable string for this name.
NameKind getNameKind() const
Determine what kind of name this is.
void setTypeSourceInfo(TypeSourceInfo *TI)
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
SourceLocation getIdentifierLoc() const
SourceLocation getEllipsisLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
bool isInvalidType() const
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
const IdentifierInfo * getIdentifier() const
Represents an extended address space qualifier where the input address space value is dependent.
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
A qualified reference to a name whose declaration cannot yet be resolved.
static DependentScopeDeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
Represents an array type in C++ whose size is a value-dependent expression.
Represents an extended vector type where either the type or size is dependent.
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
static DependentTemplateIdExpr * Create(const ASTContext &Context, const DeclarationNameInfo &NameInfo, TemplateName Name, const TemplateArgumentListInfo &TemplateArgs)
TemplateTemplateParmDecl * getParameter() const
Represents a vector type where either the type or size is dependent.
virtual bool TraverseTypeLoc(TypeLoc TL, bool TraverseQualifier=true)
virtual bool TraverseStmt(MaybeConst< Stmt > *S)
virtual bool TraverseTemplateName(TemplateName Template)
RAII object that enters a new expression evaluation context.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
static ExplicitInstantiationDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *Specialization, SourceLocation ExternLoc, SourceLocation TemplateLoc, NestedNameSpecifierLoc QualifierLoc, const ASTTemplateArgumentListInfo *ArgsAsWritten, SourceLocation NameLoc, TypeSourceInfo *TypeAsWritten, TemplateSpecializationKind TSK)
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
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.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
@ NPC_NeverValueDependent
Specifies that the expression should never be value-dependent.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
ExtVectorType - Extended vector type.
Represents a member of a struct/union/class.
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.
static FixedPointLiteral * CreateFromRawInt(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l, unsigned Scale)
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend, SourceLocation FriendL, SourceLocation EllipsisLoc={})
Represents a function declaration or definition.
ConstexprSpecKind getConstexprKind() const
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
SourceLocation getPointOfInstantiation() const
Retrieve the (first) point of instantiation of a function template specialization or a member of a cl...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isDeleted() const
Whether this function has been deleted.
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
bool isExplicitSpecialization() const
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the template specialization kind.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this function template specialization.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
QualType getReturnType() 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.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitConceptSpecializationDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation SL, ArrayRef< TemplateArgument > ConvertedArgs)
Represents a C array with an unspecified size.
const TypeClass * getTypePtr() const
Describes an C or C++ initializer list.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
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.
Describes an entity that is being initialized.
static InitializedEntity InitializeTemplateParameter(QualType T, NamedDecl *Param)
Create the initialization entity for a template parameter.
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'.
An lvalue reference type, per C++11 [dcl.ref].
Represents a linkage specification.
A stack-allocated class that identifies which local variable declaration instantiations are present i...
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.
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void setTemplateNameLookup(bool TemplateName)
Sets whether this is a template-name lookup.
bool empty() const
Return true if no decls were found.
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.
UnresolvedSetImpl::iterator iterator
A pointer to member type per C++ 8.3.3 - Pointers to members.
QualType getPointeeType() const
Provides information a specialization of a member of a class template, which may be a member function...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Data structure that captures multiple levels of template argument lists for use in template instantia...
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)
Add a new outmost level to the multi-level template argument list.
void addOuterRetainedLevels(unsigned Num)
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.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
NamedDecl * getMostRecentDecl()
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.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
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.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
SourceLocation getDefaultArgumentLoc() const
Retrieve the location of the default argument, if any.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, int D, int P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
void setPlaceholderTypeConstraint(Expr *E)
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
Represents a pointer to an Objective C object.
static OpaquePtr make(TemplateName P)
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
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.
OverloadCandidate & addCandidate(unsigned NumConversions=0, ConversionSequenceList Conversions={})
Add a new candidate with NumConversions conversion sequence slots to the overload set.
A structure for storing the information associated with an overloaded template name.
NamedDecl *const * iterator
Represents a C++11 pack expansion that produces a sequence of expressions.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
ParenExpr - This represents a parenthesized expression, e.g.
ParsedAttr - Represents a syntactic attribute.
Represents the parsed form of a C++ template argument.
ParsedTemplateArgument()
Build an empty template argument.
KindType getKind() const
Determine what kind of template argument we have.
ParsedTemplateTy getAsTemplate() const
Retrieve the template template argument's template name.
ParsedTemplateArgument getTemplatePackExpansion(SourceLocation EllipsisLoc) const
Retrieve a pack expansion of the given template template argument.
ParsedType getAsType() const
Retrieve the template type argument's type.
@ Type
A template type parameter, stored as a type.
@ Template
A template template argument, stored as a template name.
@ NonType
A non-type template parameter, stored as an expression.
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that makes a template template argument into a pack expansion.
SourceLocation getTemplateKwLoc() const
Retrieve the location of the template argument.
Expr * getAsExpr() const
Retrieve the non-type template argument's expression.
SourceLocation getNameLoc() const
Retrieve the location of the template argument.
const CXXScopeSpec & getScopeSpec() const
Retrieve the nested-name-specifier that precedes the template name in a template template argument.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
StringRef getImmediateMacroName(SourceLocation Loc)
Retrieve the name of the immediate macro expansion.
bool NeedsStdLibCxxWorkaroundBefore(std::uint64_t FixedVersion)
A (possibly-)qualified type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType getNonPackExpansionType() const
Remove an outer pack expansion type (if any) from this type.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Callback class to reject typo corrections that look like template parameters when doing a qualified l...
bool ValidateCandidate(const TypoCorrection &Candidate) override
Simple predicate used by the default RankCandidate to determine whether to return an edit distance of...
QualifiedLookupValidatorCCC(bool HasQualifier)
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.
void setObjCLifetime(ObjCLifetime type)
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
void setMemberSpecialization()
Note that this member template is a specialization.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
Scope - A scope is a transient data structure that is used while parsing the program.
unsigned getFlags() const
getFlags - Return the flags for this scope.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
bool isTemplateParamScope() const
isTemplateParamScope - Return true if this scope is a C++ template parameter scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Scope * getTemplateParamParent()
@ TemplateParamScope
This is a scope that corresponds to the template parameters of a C++ template.
A generic diagnostic builder for errors which may or may not be deferred.
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 inheritTargetAttrs(FunctionDecl *FD, const FunctionTemplateDecl &TD)
Copies target attributes from the template TD to the function FD.
RAII object used to change the argument pack substitution index within a Sema object.
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
Whether and why a template name is required in this lookup.
SourceLocation getTemplateKeywordLoc() const
bool hasTemplateKeyword() const
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.
Abstract base class used for diagnosing integer constant expression violations.
Sema - This implements semantic analysis and AST building for C.
bool hasReachableDefinition(NamedDecl *D, NamedDecl **Suggested, bool OnlyNeedComplete=false)
Determine if D has a reachable definition.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
DeclResult ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, SourceLocation ModulePrivateLoc, CXXScopeSpec &SS, TemplateIdAnnotation &TemplateId, const ParsedAttributesView &Attr, MultiTemplateParamsArg TemplateParameterLists, SkipBodyInfo *SkipBody=nullptr)
ConceptDecl * ActOnStartConceptDefinition(Scope *S, MultiTemplateParamsArg TemplateParameterLists, const IdentifierInfo *Name, SourceLocation NameLoc)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
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.
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',...
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
LookupNameKind
Describes the kind of name lookup to perform.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ 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.
ExprResult ActOnConstantExpression(ExprResult Res)
bool LookupTemplateName(LookupResult &R, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, RequiredTemplateKind RequiredTemplate=SourceLocation(), AssumedTemplateKind *ATK=nullptr, bool AllowTypoCorrection=true)
bool SetMemberAccessSpecifier(NamedDecl *MemberDecl, NamedDecl *PrevMemberDecl, AccessSpecifier LexicalAS)
SetMemberAccessSpecifier - Set the access specifier of a member.
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
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.
TemplateParameterList * ActOnTemplateParameterList(unsigned Depth, SourceLocation ExportLoc, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
ActOnTemplateParameterList - Builds a TemplateParameterList, optionally constrained by RequiresClause...
bool ActOnTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
bool hasVisibleDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is visible.
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
void NoteAllFoundTemplates(TemplateName Name)
TemplateName SubstTemplateName(SourceLocation TemplateKWLoc, NestedNameSpecifierLoc &QualifierLoc, TemplateName Name, SourceLocation NameLoc, const MultiLevelTemplateArgumentList &TemplateArgs)
TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK, const CXXScopeSpec &SS, const IdentifierInfo *Name, SourceLocation TagLoc, SourceLocation NameLoc)
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Instantiate the definitions of all of the members of the given class template specialization,...
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.
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
void referenceDLLExportedClassMethods()
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)
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 AddAlignmentAttributesForRecord(RecordDecl *RD)
AddAlignmentAttributesForRecord - Adds any needed alignment attributes to a the record decl,...
bool RequireStructuralType(QualType T, SourceLocation Loc)
Require the given type to be a structural type, and diagnose if it is not.
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
ExprResult EvaluateConvertedConstantExpression(Expr *E, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue)
EvaluateConvertedConstantExpression - Evaluate an Expression That is a converted constant expression ...
ConceptDecl * ActOnFinishConceptDefinition(Scope *S, ConceptDecl *C, Expr *ConstraintExpr, const ParsedAttributesView &Attrs)
FPOptionsOverride CurFPFeatureOverrides()
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.
bool hasVisibleExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is an explicit specialization declaration for a...
bool IsInsideALocalClassWithinATemplateFunction()
Decl * ActOnTemplateDeclarator(Scope *S, MultiTemplateParamsArg TemplateParameterLists, Declarator &D)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc)
LateParsedTemplateMapT LateParsedTemplateMap
void UnmarkAsLateParsedTemplate(FunctionDecl *FD)
CheckTemplateArgumentKind
Specifies the context in which a particular template argument is being checked.
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)
ParsedTemplateArgument ActOnTemplateTypeArgument(TypeResult ParsedType)
Convert a parsed type into a parsed template argument.
bool DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind)
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
bool ConstraintExpressionDependsOnEnclosingTemplate(const FunctionDecl *Friend, unsigned TemplateDepth, const Expr *Constraint)
bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc, TemplateDecl *PrimaryTemplate, unsigned NumExplicitArgs, ArrayRef< TemplateArgument > Args)
Check the non-type template arguments of a class template partial specialization according to C++ [te...
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool isRedefinitionAllowedFor(NamedDecl *D, NamedDecl **Suggested, bool &Visible)
Determine if D has a definition which allows we redefine it in current TU.
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
void checkSpecializationReachability(SourceLocation Loc, NamedDecl *Spec)
bool hasVisibleDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a visible default argument.
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...
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
bool IsIntegralPromotion(Expr *From, QualType FromType, QualType ToType)
IsIntegralPromotion - Determines whether the conversion from the expression From (whose potentially-a...
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
bool IsRedefinitionInModule(const NamedDecl *New, const NamedDecl *Old) const
Check the redefinition in C++20 Modules.
ExprResult BuildTemplateIdExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, bool RequiresADL, const TemplateArgumentListInfo *TemplateArgs)
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.
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs, bool DoCheckConstraintSatisfaction=true)
TemplateParameterList * GetTemplateParameterList(TemplateDecl *TD)
Returns the template parameter list with all default template argument information.
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
void MarkAsLateParsedTemplate(FunctionDecl *FD, Decl *FnD, CachedTokens &Toks)
bool isTemplateTemplateParameterAtLeastAsSpecializedAs(TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg, const DefaultArguments &DefaultArgs, SourceLocation ArgLoc, bool PartialOrdering, bool *StrictPackMatch)
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool CheckDeclCompatibleWithTemplateTemplate(TemplateDecl *Template, TemplateTemplateParmDecl *Param, const TemplateArgumentLoc &Arg)
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...
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, UnsignedOrNone NumExpansions)
bool CheckConstraintSatisfaction(ConstrainedDeclOrNestedRequirement Entity, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction, const ConceptReference *TopLevelConceptId=nullptr, Expr **ConvertedExpr=nullptr)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
TemplateParameterListEqualKind
Enumeration describing how template parameter lists are compared for equality.
@ TPL_TemplateTemplateParmMatch
We are matching the template parameter lists of two template template parameters as part of matching ...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
NamedDecl * ActOnTypeParameter(Scope *S, bool Typename, SourceLocation EllipsisLoc, SourceLocation KeyLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedType DefaultArg, bool HasTypeConstraint)
ActOnTypeParameter - Called when a C++ template type parameter (e.g., "typename T") has been parsed.
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
@ FoundFunctions
This is assumed to be a template name because lookup found one or more functions (but no function tem...
@ None
This is not assumed to be a template name.
@ FoundNothing
This is assumed to be a template name because lookup found nothing.
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
bool RebuildNestedNameSpecifierInCurrentInstantiation(CXXScopeSpec &SS)
ArrayRef< InventedTemplateParameterInfo > getInventedParameterInfos() const
void inferGslOwnerPointerAttribute(CXXRecordDecl *Record)
Add [[gsl::Owner]] and [[gsl::Pointer]] attributes for std:: types.
NamedDecl * ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind, bool TypenameKeyword, TemplateParameterList *Params, SourceLocation EllipsisLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg)
ActOnTemplateTemplateParameter - Called when a C++ template template parameter (e....
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()
bool EnsureTemplateArgumentListConstraints(TemplateDecl *Template, const MultiLevelTemplateArgumentList &TemplateArgs, SourceRange TemplateIDRange)
Ensure that the given template arguments satisfy the constraints associated with the given template,...
@ UPPC_PartialSpecialization
Partial specialization.
@ UPPC_DefaultArgument
A default argument.
@ UPPC_ExplicitSpecialization
Explicit specialization.
@ UPPC_NonTypeTemplateParameterType
The type of a non-type template parameter.
@ UPPC_TypeConstraint
A type constraint.
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 EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
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 isPotentialImplicitMemberAccess(const CXXScopeSpec &SS, LookupResult &R, bool IsAddressOfOperand)
Check whether an expression might be an implicit class member access.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool hasVisibleMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a visible declaration of D that is a member specialization declaration (as oppo...
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
const LangOptions & LangOpts
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
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.
bool hasAnyAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true, bool AllowNonTemplateFunctions=false)
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
bool CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous)
Perform semantic analysis for the given dependent function template specialization.
bool hasExplicitCallingConv(QualType T)
bool CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted)
bool AreConstraintExpressionsEqual(const NamedDecl *Old, const Expr *OldConstr, const TemplateCompareNewDeclInfo &New, const Expr *NewConstr)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
bool DiagnosePackIndexingInFriendNNS(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
ExprResult DefaultLvalueConversion(Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
void NoteOverloadCandidate(const NamedDecl *Found, const FunctionDecl *Fn, OverloadCandidateRewriteKind RewriteKind=OverloadCandidateRewriteKind(), QualType DestType=QualType(), bool TakingAddress=false)
bool hasReachableDefaultArgument(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if the template parameter D has a reachable default argument.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
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.
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc)
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
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.
TemplateNameKindForDiagnostics getTemplateNameKindForDiagnostics(TemplateName Name)
void notePreviousDefinition(const NamedDecl *Old, SourceLocation New)
bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)
Diagnose cases where we have an explicit template specialization before/after an explicit template in...
bool CheckTypeConstraint(TemplateIdAnnotation *TypeConstraint)
TemplateNameKind ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool AllowInjectedClassName=false)
Form a template name from a name that is syntactically required to name a template,...
ExprResult BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, unsigned Index, QualType ParamType, SourceLocation loc, TemplateArgument Replacement, UnsignedOrNone PackIndex, bool Final)
void diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName, SourceLocation Less, SourceLocation Greater)
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
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.
QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI, SourceLocation Loc)
Check that the type of a non-type template parameter is well-formed.
void diagnoseMissingImport(SourceLocation Loc, const NamedDecl *Decl, MissingImportKind MIK, bool Recover=true)
Diagnose that the specified declaration needs to be visible but isn't, and suggest a module import th...
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template, SourceLocation TemplateKWLoc, SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, bool &HasDefaultArg)
If the given template parameter has a default template argument, substitute into that default templat...
void FilterAcceptableTemplateNames(LookupResult &R, bool AllowFunctionTemplates=true, bool AllowDependent=true)
TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)
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.
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
SourceLocation getTopMostPointOfInstantiation(const NamedDecl *) const
Returns the top most location responsible for the definition of N.
bool isSFINAEContext() const
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.
void ActOnUndeclaredTypeTemplateName(Scope *S, TemplateTy &Name, TemplateNameKind &TNK, SourceLocation NameLoc, IdentifierInfo *&II)
Try to resolve an undeclared template name as a type template.
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".
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
bool hasReachableMemberSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is a member specialization declaration (as op...
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
RedeclarationKind forRedeclarationInCurContext() const
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
void MarkUnusedFileScopedDecl(const DeclaratorDecl *D)
If it's a file scoped decl that must warn if not used, keep track of it.
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 ...
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *TSI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
ExprResult BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, bool IsAddressOfOperand)
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
bool CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg, bool PartialOrdering, bool *StrictPackMatch)
Check a template argument against its corresponding template template parameter.
void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are used in a given expression.
DeclResult ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS, TemplateTy Template, SourceLocation TemplateNameLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, const ParsedAttributesView &Attr)
QualType CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc)
Note that LHS is not null here, even if this is the gnu "x ?: y" extension.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
ExprResult BuildDependentDeclRefExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs)
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
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 {'.
bool inParameterMappingSubstitution() const
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
ExprResult CheckVarOrConceptTemplateTemplateId(const DeclarationNameInfo &NameInfo, TemplateTemplateParmDecl *Template, const TemplateArgumentListInfo *TemplateArgs)
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.
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
DeclResult CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, SourceLocation TemplateNameLoc, const TemplateArgumentListInfo &TemplateArgs, bool SetWrittenArgs)
Get the specialization of the given variable template corresponding to the specified argument list,...
bool hasReachableExplicitSpecialization(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine if there is a reachable declaration of D that is an explicit specialization declaration for...
bool isDeductionGuideName(Scope *S, const IdentifierInfo &Name, SourceLocation NameLoc, CXXScopeSpec &SS, ParsedTemplateTy *Template=nullptr)
Determine whether a particular identifier might be the name in a C++1z deduction-guide declaration.
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...
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
NamedDecl * ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *DefaultArg)
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 ...
TemplateParamListContext
The context in which we are checking a template parameter list.
@ TPC_TemplateTemplateParameterPack
@ TPC_FriendFunctionTemplate
@ TPC_ClassTemplateMember
@ TPC_FriendClassTemplate
@ TPC_FriendFunctionTemplateDefinition
friend class InitializationSequence
void checkSpecializationVisibility(SourceLocation Loc, NamedDecl *Spec)
We've found a use of a templated declaration that would trigger an implicit instantiation.
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.
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool AllowTypoCorrection=true)
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous, bool &AddToScope)
TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
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...
bool isMoreSpecializedThanPrimary(ClassTemplatePartialSpecializationDecl *T, sema::TemplateDeductionInfo &Info)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
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, bool IsMemberSpecialization, SkipBodyInfo *SkipBody=nullptr)
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
bool MaybeEmitAmbiguousAtomicConstraintsDiagnostic(const NamedDecl *D1, ArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, ArrayRef< AssociatedConstraint > AC2)
If D1 was not at least as constrained as D2, but would've been if a pair of atomic constraints involv...
bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr)
Check that the given template arguments can be provided to the given template, converting the argumen...
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
OpaquePtr< TemplateName > TemplateTy
unsigned getTemplateDepth(Scope *S) const
Determine the number of levels of enclosing template parameters.
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.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType, bool AdjustExceptionSpec=false)
Adjust the type ArgFunctionType to match the calling convention, noreturn, and optionally the excepti...
void NoteTemplateParameterLocation(const NamedDecl &Decl)
IdentifierResolver IdResolver
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
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)
TypeResult ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc)
Parsed an elaborated-type-specifier that refers to a template-id, such as class T::template apply.
bool hasReachableDeclaration(const NamedDecl *D, llvm::SmallVectorImpl< Module * > *Modules=nullptr)
Determine whether any declaration of an entity is reachable.
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)
Diagnose unexpanded parameter packs.
void warnOnReservedIdentifier(const NamedDecl *D)
void inferNullableClassAttribute(CXXRecordDecl *CRD)
Add _Nullable attributes for std:: types.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
SFINAETrap * getSFINAEContext() const
Returns a pointer to the current SFINAE context, if any.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
SourceLocation getEndLoc() const LLVM_READONLY
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
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
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Represents the declaration of a struct/union/class/enum.
StringRef getKindName() const
void startDefinition()
Starts the definition of this tag declaration.
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
TagKind getTagKind() const
A convenient class for passing around template argument information.
SourceLocation getRAngleLoc() const
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
SourceLocation getLAngleLoc() const
A template argument list.
const TemplateArgument * data() const
Retrieve a pointer to the template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
Location wrapper for a TemplateArgument.
SourceLocation getLocation() const
SourceLocation getTemplateEllipsisLoc() const
TemplateArgumentLocInfo getLocInfo() const
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
TypeSourceInfo * getTypeSourceInfo() const
SourceRange getSourceRange() const LLVM_READONLY
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
bool isInstantiationDependent() const
Whether this template argument is dependent on a template parameter.
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
bool isNull() const
Determine whether this template argument has no value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
QualType getIntegralType() const
Retrieve the type of the integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
bool hasAssociatedConstraints() const
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.
DeducedTemplateStorage * getAsDeducedTemplateName() const
Retrieve the deduced template info, if any.
bool isNull() const
Determine whether this template name is NULL.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
OverloadedTemplateStorage * getAsOverloadedTemplate() const
Retrieve the underlying, overloaded function template declarations that this template name refers to,...
AssumedTemplateStorage * getAsAssumedTemplateName() const
Retrieve information on a name that has been assumed to be a template-name in order to permit a call ...
std::pair< TemplateName, DefaultArguments > getTemplateDeclAndDefaultArgs() const
Retrieves the underlying template name that this template name refers to, along with the deduced defa...
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
bool isDependent() const
Determines whether this is a dependent template name.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
NamedDecl ** iterator
Iterates through the template parameters in this list.
bool hasAssociatedConstraints() const
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
NamedDecl *const * const_iterator
Iterates through the template parameters in this list.
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
void getAssociatedConstraints(llvm::SmallVectorImpl< AssociatedConstraint > &AC) const
All associated constraints derived from this template parameter list, including the requires clause a...
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
TemplateParameterList * getExpansionTemplateParameters(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
TemplateNameKind templateParameterKind() const
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
void setInheritedDefaultArgument(const ASTContext &C, TemplateTemplateParmDecl *Prev)
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, int D, int P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
void removeDefaultArgument()
Removes the default argument of this template parameter.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
SourceLocation getDefaultArgumentLoc() const
Retrieves the location of the default argument declaration.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Represents a declaration of a type.
const Type * getTypeForDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
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.
QualType getType() const
Get the type for which this source info wrapper provides information.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired 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 getBeginLoc() const
Get the begin source location.
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
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.
SourceLocation getNameLoc() const
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIncompleteOrObjectType() const
Return true if this is an incomplete or object type, in other words, not a function type.
bool isBooleanType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool isUnsignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...
bool isRValueReferenceType() const
bool isVoidPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
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.
bool isObjCObjectOrInterfaceType() const
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isBitIntType() const
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isMemberPointerType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool hasUnnamedOrLocalType() const
Whether this type is or contains a local or unnamed type.
bool isPointerOrReferenceType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isVectorType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
QualType getUnderlyingType() const
Wrapper for source info for typedefs.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
DeclClass * getCorrectionDeclAs() const
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a C++ unqualified-id that has been parsed.
struct OFI OperatorFunctionId
When Kind == IK_OperatorFunctionId, the overloaded operator that we parsed.
SourceLocation getBeginLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
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 ...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
A set of unresolved declarations.
Wrapper for source info for unresolved typename using decls.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Represents a dependent using declaration which was not marked with typename.
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.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
TLSKind getTLSKind() const
bool isStaticDataMember() const
Determines whether this is a static data member.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
static VarTemplatePartialSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
static VarTemplateSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
Retains information about a function, method, or block that is currently being parsed.
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
void addSFINAEDiagnostic(SourceLocation Loc, PartialDiagnostic PD)
Set the diagnostic which caused the SFINAE failure.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
const PartialDiagnosticAt & peekSFINAEDiagnostic() const
Peek at the SFINAE diagnostic.
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
Defines the clang::TargetInfo interface.
__inline void unsigned int _2
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
TypeSpecifierType
Specifies the kind of type.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
bool isa(CodeGen::Address addr)
OpaquePtr< TemplateName > ParsedTemplateTy
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.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ 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...
@ ovl_fail_constraints_not_satisfied
This candidate was not viable because its associated constraints were not satisfied.
@ 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.
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
@ OK_Ordinary
An ordinary object is located at an address in memory.
NonTagKind
Common ways to introduce type names without a tag for use in diagnostics.
bool isPackProducingBuiltinTemplateName(TemplateName N)
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
ActionResult< Decl * > DeclResult
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
DynamicRecursiveASTVisitorBase< true > ConstDynamicRecursiveASTVisitor
StorageClass
Storage classes.
UnsignedOrNone getExpandedPackSize(const NamedDecl *Param)
Check whether the template parameter is a pack expansion, and if so, determine the number of paramete...
@ CRK_None
Candidate is not a rewritten candidate.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
TemplateDecl * getAsTypeTemplateDecl(Decl *D)
@ Result
The result type of a method or function.
ActionResult< ParsedType > TypeResult
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ Enum
The "enum" keyword.
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ Keyword
The name has been typo-corrected to a keyword.
@ Type
The name was classified as a type.
CastKind
CastKind - The kind of operation required for a conversion.
SourceRange getTemplateParamsRange(TemplateParameterList const *const *Params, unsigned NumParams)
Retrieves the range of the given template parameter lists.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Type_template
The name refers to a template whose specialization produces a type.
@ TNK_Dependent_template_name
The name refers to a dependent template name:
@ TNK_Function_template
The name refers to a function template or a set of overloaded functions that includes at least one fu...
@ TNK_Concept_template
The name refers to a concept.
@ TNK_Non_template
The name does not refer to a template.
@ TNK_Undeclared_template
Lookup for the name failed, but we're assuming it was a template name anyway.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
@ CUDATargetMismatch
CUDA Target attributes do not match.
@ Success
Template argument deduction was successful.
@ AlreadyDiagnosed
Some error which was already diagnosed.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
U cast(CodeGen::Address addr)
SmallVector< Token, 4 > CachedTokens
A set of tokens that has been cached for later parsing.
@ TemplateArg
Value of a non-type template parameter.
@ TempArgStrict
As above, but applies strict template checking rules.
@ PackIndex
Index of a pack indexing expression or specifier.
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ 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
@ Parens
New-expression has a C++98 paren-delimited initializer.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
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.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceLocation getEndLoc() const LLVM_READONLY
ArrayRef< TemplateArgument > Args
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
SmallVectorImpl< PartialDiagnosticAt > * Diag
Diag - If this is non-null, it will be filled in with a stack of notes indicating why evaluation fail...
bool HasSideEffects
Whether the evaluated expression has side effects.
Extra information about a function prototype.
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
NestedNameSpecifierLoc Prefix
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Describes how types, statements, expressions, and declarations should be printed.
unsigned TerseOutput
Provide a 'terse' output.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
bool PartialOrdering
The check is being performed in the context of partial ordering.
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
SmallVector< TemplateArgument, 4 > CanonicalConverted
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
@ BuildingDeductionGuides
We are building deduction guides for a class.
A stack object to be created when performing template instantiation.
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Location information for a TemplateArgument.
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.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
OverloadedOperatorKind Operator
The kind of overloaded operator.