41#include "llvm/ADT/SmallBitVector.h"
42#include "llvm/ADT/StringExtras.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/SaveAndRestore.h"
55 return SourceRange(Ps[0]->getTemplateLoc(), Ps[N-1]->getRAngleLoc());
69 auto ParamsAtDepth = [&](
unsigned D) { Depth = std::max(Depth, D + 1); };
74 if (
auto *LSI = dyn_cast<LambdaScopeInfo>(FSI)) {
75 if (!LSI->TemplateParams.empty()) {
76 ParamsAtDepth(LSI->AutoTemplateParameterDepth);
79 if (LSI->GLTemplateParameterList) {
80 ParamsAtDepth(LSI->GLTemplateParameterList->getDepth());
90 if (!Info.TemplateParams.empty()) {
91 ParamsAtDepth(Info.AutoTemplateParameterDepth);
106 bool AllowFunctionTemplates,
107 bool AllowDependent) {
117 if (
const auto *
Record = dyn_cast<CXXRecordDecl>(D)) {
129 if (
Record->isInjectedClassName()) {
131 if (
Record->getDescribedClassTemplate())
132 return Record->getDescribedClassTemplate();
134 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
Record))
135 return Spec->getSpecializedTemplate();
151 bool AllowFunctionTemplates,
152 bool AllowDependent) {
163 bool AllowFunctionTemplates,
165 bool AllowNonTemplateFunctions) {
169 if (AllowNonTemplateFunctions &&
179 bool hasTemplateKeyword,
182 bool EnteringContext,
184 bool &MemberOfUnknownSpecialization,
185 bool Disambiguation) {
189 MemberOfUnknownSpecialization =
false;
197 TName =
Context.DeclarationNames.getCXXOperatorName(
238 bool AnyFunctionTemplates =
false;
242 AnyFunctionTemplates =
true;
245 FoundUsingShadow = dyn_cast<UsingShadowDecl>(FoundD);
253 if (!D && !AnyFunctionTemplates) {
254 R.suppressDiagnostics();
271 unsigned ResultCount = R.
end() - R.
begin();
272 if (!D && ResultCount > 1) {
283 assert(D &&
"unambiguous result is not a template name");
288 MemberOfUnknownSpecialization =
true;
295 assert(!FoundUsingShadow || FoundUsingShadow->
getTargetDecl() == TD);
298 Template =
Context.getQualifiedTemplateName(Qualifier, hasTemplateKeyword,
313 ? dyn_cast<TemplateTemplateParmDecl>(TD)->templateParameterKind()
322 Diag(Name.
getBeginLoc(), diag::err_builtin_pack_outside_template) << TName;
341 if (R.
empty())
return false;
378 {SS->getScopeRep(), &II, false}));
379 Diag(IILoc, diag::err_template_kw_missing)
380 << SuggestedTemplate.
get()
387 QualType ObjectType,
bool EnteringContext,
390 bool AllowTypoCorrection) {
397 Found.setTemplateNameLookup(
true);
401 bool IsDependent =
false;
402 if (!ObjectType.
isNull()) {
405 assert(SS.
isEmpty() &&
"ObjectType and scope specifier cannot coexist");
409 !ObjectType->
getAs<TagType>() ||
410 ObjectType->
castAs<TagType>()
412 ->isEntityBeingDefined()) &&
413 "Caller should have completed object type");
445 bool ObjectTypeSearchedInScope =
false;
446 bool AllowFunctionTemplatesInLookup =
true;
462 IsDependent |=
Found.wasNotFoundInCurrentInstantiation();
478 if (!ObjectType.
isNull()) {
482 AllowFunctionTemplatesInLookup =
false;
483 ObjectTypeSearchedInScope =
true;
486 IsDependent |=
Found.wasNotFoundInCurrentInstantiation();
489 if (
Found.isAmbiguous())
506 if (AllFunctions || (
Found.empty() && !IsDependent)) {
510 *ATK = (
Found.empty() &&
Found.getLookupName().isIdentifier())
518 if (
Found.empty() && !IsDependent && AllowTypoCorrection) {
530 Found.getLookupNameInfo(),
Found.getLookupKind(), S, &SS, FilterCCC,
532 if (
auto *ND = Corrected.getFoundDecl())
535 if (
Found.isAmbiguous()) {
537 }
else if (!
Found.empty()) {
540 AllowFunctionTemplatesInLookup =
true;
541 Found.setLookupName(Corrected.getCorrection());
543 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
544 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
547 << Name << LookupCtx << DroppedSpecifier
561 Found.setNotFoundInCurrentInstantiation();
567 if (ExampleLookupResult && RequiredTemplate) {
568 Diag(
Found.getNameLoc(), diag::err_template_kw_refers_to_non_template)
573 diag::note_template_kw_refers_to_non_template)
574 <<
Found.getLookupName();
581 if (S && !ObjectType.
isNull() && !ObjectTypeSearchedInScope &&
598 if (FoundOuter.
empty()) {
608 }
else if (!
Found.isSuppressingAmbiguousDiagnostics()) {
612 if (!
Found.isSingleResult() ||
616 diag::ext_nested_name_member_ref_lookup_ambiguous)
617 <<
Found.getLookupName()
619 Diag(
Found.getRepresentativeDecl()->getLocation(),
620 diag::note_ambig_member_ref_object_type)
623 diag::note_ambig_member_ref_scope);
646 bool MissingTemplateKeyword =
false;
649 if (
auto *DRE = dyn_cast<DeclRefExpr>(
TemplateName.get())) {
650 NameInfo = DRE->getNameInfo();
651 SS.
Adopt(DRE->getQualifierLoc());
653 Found = DRE->getFoundDecl();
654 }
else if (
auto *ME = dyn_cast<MemberExpr>(
TemplateName.get())) {
655 NameInfo = ME->getMemberNameInfo();
656 SS.
Adopt(ME->getQualifierLoc());
658 LookupCtx = ME->getBase()->getType()->getAsCXXRecordDecl();
659 Found = ME->getMemberDecl();
660 }
else if (
auto *DSDRE =
661 dyn_cast<DependentScopeDeclRefExpr>(
TemplateName.get())) {
662 NameInfo = DSDRE->getNameInfo();
663 SS.
Adopt(DSDRE->getQualifierLoc());
664 MissingTemplateKeyword =
true;
665 }
else if (
auto *DSME =
666 dyn_cast<CXXDependentScopeMemberExpr>(
TemplateName.get())) {
667 NameInfo = DSME->getMemberNameInfo();
668 SS.
Adopt(DSME->getQualifierLoc());
669 MissingTemplateKeyword =
true;
671 llvm_unreachable(
"unexpected kind of potential template name");
676 if (MissingTemplateKeyword) {
685 TemplateCandidateFilter(
Sema &S) : S(S) {
686 WantTypeSpecifiers =
false;
687 WantExpressionKeywords =
false;
688 WantRemainingKeywords =
false;
689 WantCXXNamedCasts =
true;
691 bool ValidateCandidate(
const TypoCorrection &Candidate)
override {
697 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
698 return std::make_unique<TemplateCandidateFilter>(*
this);
703 TemplateCandidateFilter CCC(*
this);
707 auto *ND = Corrected.getFoundDecl();
710 if (ND || Corrected.isKeyword()) {
712 std::string CorrectedStr(Corrected.getAsString(
getLangOpts()));
713 bool DroppedSpecifier = Corrected.WillReplaceSpecifier() &&
716 PDiag(diag::err_non_template_in_member_template_id_suggest)
717 << Name << LookupCtx << DroppedSpecifier
721 PDiag(diag::err_non_template_in_template_id_suggest)
726 diag::note_non_template_in_template_id_found);
731 Diag(NameInfo.
getLoc(), diag::err_non_template_in_template_id)
734 Diag(
Found->getLocation(), diag::note_non_template_in_template_id_found);
741 bool isAddressOfOperand,
757 nullptr, NameInfo, TemplateArgs);
786 bool refParam =
true;
789 refParam = Replacement->isLValue();
790 if (refParam && Replacement->getType()->isRecordType()) {
795 if (
const auto *PET = dyn_cast<PackExpansionType>(ParamType))
796 ParamType = PET->getPattern();
801 SemaRef.BuildExpressionFromNonTypeTemplateArgument(Arg, Loc);
804 Replacement = result.
get();
808 Replacement->getType(), Replacement->getValueKind(), Loc, Replacement,
809 AssociatedDecl, NTTP->
getIndex(), PackIndex, refParam, Final);
814 bool InstantiatedFromMember,
818 bool Complain,
bool *Unreachable) {
822 bool IsEntityBeingDefined =
false;
823 if (
const TagDecl *TD = dyn_cast_or_null<TagDecl>(PatternDef))
824 IsEntityBeingDefined = TD->isBeingDefined();
826 if (PatternDef && !IsEntityBeingDefined) {
843 if (!Complain || (PatternDef && PatternDef->
isInvalidDecl()))
847 if (
TagDecl *TD = dyn_cast<TagDecl>(Instantiation))
848 InstantiationTy =
Context.getCanonicalTagType(TD);
850 Diag(PointOfInstantiation,
851 diag::err_template_instantiate_within_definition)
857 }
else if (InstantiatedFromMember) {
859 Diag(PointOfInstantiation,
860 diag::err_explicit_instantiation_undefined_member)
865 assert(
isa<TagDecl>(Instantiation) &&
"Must be a TagDecl!");
866 Diag(PointOfInstantiation,
867 diag::err_implicit_instantiate_member_undefined)
873 Diag(PointOfInstantiation,
874 diag::err_explicit_instantiation_undefined_func_template)
878 Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
883 assert(
isa<VarDecl>(Instantiation) &&
"Must be a VarDecl!");
885 Diag(PointOfInstantiation,
886 diag::err_explicit_instantiation_undefined_var_template)
890 Diag(PointOfInstantiation,
891 diag::err_explicit_instantiation_undefined_member)
908 bool SupportedForCompatibility) {
921 ? diag::ext_template_param_shadow
922 : (SupportedForCompatibility ? diag::ext_compat_template_param_shadow
923 : diag::err_template_param_shadow);
925 Diag(Loc, DiagId) << ND->getDeclName();
930 if (
TemplateDecl *Temp = dyn_cast_or_null<TemplateDecl>(D)) {
931 D = Temp->getTemplatedDecl();
940 "Only template template arguments can be pack expansions here");
941 assert(
getAsTemplate().get().containsUnexpandedParameterPack() &&
942 "Template template argument pack expansion without packs");
944 Result.EllipsisLoc = EllipsisLoc;
979 llvm_unreachable(
"Unhandled parsed template argument");
984 for (
unsigned I = 0,
Last = TemplateArgsIn.size(); I !=
Last; ++I)
1004 assert(TInfo &&
"template argument with no location");
1012 EllipsisLoc = PET.getEllipsisLoc();
1013 TL = PET.getPatternLoc();
1017 TemplateName Name = DTST.getTypePtr()->getTemplateName();
1019 SS.
Adopt(DTST.getQualifierLoc());
1022 DTST.getTemplateNameLoc());
1043 unsigned Depth,
unsigned Position,
1046 bool HasTypeConstraint) {
1048 "Template type parameter not in template parameter scope!");
1050 bool IsParameterPack = EllipsisLoc.
isValid();
1053 KeyLoc, ParamNameLoc, Depth, Position,
1054 ParamName,
Typename, IsParameterPack,
1058 if (Param->isParameterPack())
1060 CSI->LocalPacks.push_back(Param);
1073 if (DefaultArg && IsParameterPack) {
1074 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1075 DefaultArg =
nullptr;
1083 assert(DefaultTInfo &&
"expected source information for type");
1092 Param->setInvalidDecl();
1096 Param->setDefaultArgument(
1111 return TemplateArgs;
1118 bool IsTypeConcept =
false;
1119 bool RequiresArguments =
false;
1121 IsTypeConcept = TTP->isTypeConceptTemplateParam();
1123 TTP->getTemplateParameters()->getMinRequiredArguments() > 1;
1129 ->getTemplateParameters()
1130 ->getMinRequiredArguments() > 1;
1136 if (!IsTypeConcept) {
1138 diag::err_type_constraint_non_type_concept);
1147 if (!WereArgsSpecified && RequiresArguments) {
1149 diag::err_type_constraint_missing_arguments)
1168 bool AllowUnexpandedPack) {
1185 if (EllipsisLoc.
isInvalid() && !AllowUnexpandedPack) {
1196 ConstrainedParameter, EllipsisLoc);
1199template <
typename ArgumentLocAppender>
1214 Appender(ConstraintArgs);
1222 if (
auto *CD = dyn_cast<ConceptDecl>(NamedConcept)) {
1225 FoundDecl ? FoundDecl : NamedConcept, CD,
1230 auto *CDT = dyn_cast<TemplateTemplateParmDecl>(NamedConcept);
1235 return ImmediatelyDeclaredConstraint;
1251 ImmediatelyDeclaredConstraint.
get(), BO_LAnd,
1252 EllipsisLoc,
nullptr,
1269 *TemplateArgs) :
nullptr;
1274 *
this,
NS, NameInfo, NamedConcept, FoundDecl,
1277 ParamAsArgument, ConstrainedParameter->
getLocation(),
1280 for (const auto &ArgLoc : TemplateArgs->arguments())
1281 ConstraintArgs.addArgument(ArgLoc);
1284 if (ImmediatelyDeclaredConstraint.
isInvalid())
1294 CL, ImmediatelyDeclaredConstraint.
get(), std::nullopt);
1305 diag::err_unsupported_placeholder_constraint)
1324 for (unsigned I = 0, C = TL.getNumArgs(); I != C; ++I)
1325 ConstraintArgs.addArgument(TL.getArgLoc(I));
1328 if (ImmediatelyDeclaredConstraint.
isInvalid() ||
1329 !ImmediatelyDeclaredConstraint.
isUsable())
1333 ImmediatelyDeclaredConstraint.
get());
1352 if (
T->isDependentType())
1358 if (
T->isStructuralType())
1362 if (
T->isRValueReferenceType()) {
1363 Diag(Loc, diag::err_template_nontype_parm_rvalue_ref) <<
T;
1372 (!
T->isScalarType() && !
T->isRecordType())) {
1373 Diag(Loc, diag::err_template_nontype_parm_bad_type) <<
T;
1381 Diag(Loc, diag::err_template_nontype_parm_not_structural) <<
T;
1388 for (
const FieldDecl *FD : RD->fields()) {
1390 Diag(FD->getLocation(), diag::note_not_structural_non_public) <<
T << 0;
1393 if (FD->isMutable()) {
1394 Diag(FD->getLocation(), diag::note_not_structural_mutable_field) <<
T;
1397 if (FD->getType()->isRValueReferenceType()) {
1398 Diag(FD->getLocation(), diag::note_not_structural_rvalue_ref_field)
1405 for (
const auto &BaseSpec : RD->bases()) {
1406 if (BaseSpec.getAccessSpecifier() !=
AS_public) {
1407 Diag(BaseSpec.getBaseTypeLoc(), diag::note_not_structural_non_public)
1418 for (
const FieldDecl *FD : RD->fields()) {
1420 if (!
T->isStructuralType()) {
1421 SubLoc = FD->getLocation();
1429 for (
const auto &BaseSpec : RD->bases()) {
1431 if (!
T->isStructuralType()) {
1432 SubLoc = BaseSpec.getBaseTypeLoc();
1440 assert(Kind != -1 &&
"couldn't find reason why type is not structural");
1441 Diag(SubLoc, diag::note_not_structural_subobject)
1442 <<
T << Kind << SubType;
1444 RD =
T->getAsCXXRecordDecl();
1454 if (
T->isVariablyModifiedType()) {
1455 Diag(Loc, diag::err_variably_modified_nontype_template_param)
1466 if (
T->isIntegralOrEnumerationType() ||
1468 T->isPointerType() ||
1470 T->isLValueReferenceType() ||
1472 T->isMemberPointerType() ||
1474 T->isNullPtrType() ||
1476 T->isUndeducedType()) {
1479 return T.getUnqualifiedType();
1487 if (
T->isArrayType() ||
T->isFunctionType())
1496 if (
T->isDependentType())
1497 return T.getUnqualifiedType();
1508 Diag(Loc, diag::err_template_nontype_parm_bad_structural_type) <<
T;
1512 Diag(Loc, diag::warn_cxx17_compat_template_nontype_parm_type) <<
T;
1513 return T.getUnqualifiedType();
1524 auto CheckValidDeclSpecifiers = [
this, &D] {
1538 Diag(Loc, diag::err_invalid_decl_specifier_in_nontype_parm)
1575 CheckValidDeclSpecifiers();
1580 diag::warn_cxx14_compat_template_nontype_parm_auto_type)
1584 "Non-type template parameter not in template parameter scope!");
1604 if (TL.isConstrained()) {
1606 T->containsUnexpandedParameterPack()) {
1607 assert(TL.getConceptReference()->getTemplateArgsAsWritten());
1609 TL.getConceptReference()->getTemplateArgsAsWritten()->arguments())
1619 Param->setInvalidDecl();
1621 if (Param->isParameterPack())
1623 CSI->LocalPacks.push_back(Param);
1637 if (
Default && IsParameterPack) {
1638 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1648 Param->setDefaultArgument(
1667 "Template template parameter not in template parameter scope!");
1669 bool IsParameterPack = EllipsisLoc.
isValid();
1681 NameLoc.
isInvalid() ? TmpLoc : NameLoc, Depth, Position, IsParameterPack,
1685 if (Param->isParameterPack())
1687 LSI->LocalPacks.push_back(Param);
1698 if (Params->
size() == 0) {
1699 Diag(Param->getLocation(), diag::err_template_template_parm_no_parms)
1705 Param->setInvalidDecl();
1710 if (IsParameterPack && !
Default.isInvalid()) {
1711 Diag(EqualLoc, diag::err_template_param_pack_default_arg);
1726 Diag(DefaultArg.
getLocation(), diag::err_template_arg_not_valid_template)
1745 Param->setDefaultArgument(
Context, DefaultArg);
1752class ConstraintRefersToContainingTemplateChecker
1757 unsigned TemplateDepth = 0;
1761 bool CheckIfContainingRecord(
const CXXRecordDecl *CheckingRD) {
1767 DC && !DC->isFileContext(); DC = DC->getParent())
1768 if (
const auto *RD = dyn_cast<CXXRecordDecl>(DC))
1769 if (CheckingRD == RD->getMostRecentDecl()) {
1777 bool CheckNonTypeTemplateParmDecl(
const NonTypeTemplateParmDecl *D) {
1783 return TraverseType(D->
getType());
1787 ConstraintRefersToContainingTemplateChecker(
const FunctionDecl *
Friend,
1788 unsigned TemplateDepth)
1791 bool getResult()
const {
return Result; }
1797 bool VisitTemplateTypeParmType(
const TemplateTypeParmType *
Type)
override {
1798 if (
Type->getDecl()->getDepth() < TemplateDepth) {
1805 bool TraverseDeclRefExpr(
const DeclRefExpr *E)
override {
1806 return TraverseDecl(E->
getDecl());
1809 bool TraverseTypedefType(
const TypedefType *TT,
1811 return TraverseType(TT->
desugar());
1814 bool TraverseTypeLoc(TypeLoc TL,
bool TraverseQualifier)
override {
1816 return TraverseType(TL.
getType(), TraverseQualifier);
1819 bool VisitTagType(
const TagType *
T)
override {
1820 return TraverseDecl(
T->getOriginalDecl());
1823 bool TraverseDecl(
const Decl *D)
override {
1829 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
1830 return TraverseType(TD->getUnderlyingType());
1831 if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(D))
1832 return CheckNonTypeTemplateParmDecl(NTTPD);
1833 if (
auto *VD = dyn_cast<ValueDecl>(D))
1834 return TraverseType(VD->getType());
1837 if (
auto *RD = dyn_cast<CXXRecordDecl>(D))
1838 return CheckIfContainingRecord(RD);
1843 llvm_unreachable(
"Don't know how to handle this declaration type yet");
1851 const Expr *Constraint) {
1852 assert(
Friend->getFriendObjectKind() &&
"Only works on a friend");
1853 ConstraintRefersToContainingTemplateChecker Checker(
Friend, TemplateDepth);
1854 Checker.TraverseStmt(Constraint);
1855 return Checker.getResult();
1865 Expr *RequiresClause) {
1867 Diag(ExportLoc, diag::warn_template_export_unsupported);
1919 assert(TemplateParams && TemplateParams->
size() > 0 &&
1920 "No template parameters");
1922 "Can only declare or define class templates");
1931 "can't build template of enumerated type");
1935 Diag(KWLoc, diag::err_template_unnamed_class);
1950 if (!SemanticContext) {
1955 ? diag::warn_template_qualified_friend_ignored
1956 : diag::err_template_qualified_declarator_no_match)
2032 dyn_cast_or_null<ClassTemplateDecl>(PrevDecl);
2037 if (!PrevClassTemplate && isa_and_nonnull<CXXRecordDecl>(PrevDecl) &&
2045 ->getSpecializedTemplate();
2068 PrevDecl = PrevClassTemplate =
nullptr;
2069 SemanticContext = OutermostContext;
2087 SemanticContext, S, SS.
isValid()))
2088 PrevDecl = PrevClassTemplate =
nullptr;
2090 if (
auto *Shadow = dyn_cast_or_null<UsingShadowDecl>(
2091 PrevDecl ?
Previous.getRepresentativeDecl() :
nullptr)) {
2093 !(PrevClassTemplate &&
2096 Diag(KWLoc, diag::err_using_decl_conflict_reverse);
2097 Diag(Shadow->getTargetDecl()->getLocation(),
2098 diag::note_using_decl_target);
2099 Diag(Shadow->getIntroducer()->getLocation(), diag::note_using_decl) << 0;
2101 PrevDecl = PrevClassTemplate =
nullptr;
2105 if (PrevClassTemplate) {
2114 TemplateParams, PrevClassTemplate,
2127 Diag(KWLoc, diag::err_use_with_wrong_tag)
2140 bool HiddenDefVisible =
false;
2145 if (!HiddenDefVisible && Hidden) {
2148 assert(Tmpl &&
"original definition of a class template is not a "
2154 Diag(NameLoc, diag::err_redefinition) << Name;
2155 Diag(Def->getLocation(), diag::note_previous_definition);
2162 }
else if (PrevDecl) {
2168 Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
2182 (SS.
isSet() && SemanticContext && SemanticContext->
isRecord() &&
2195 ? diag::err_friend_decl_does_not_match
2196 : diag::err_member_decl_does_not_match)
2197 << Name << SemanticContext <<
true << SS.
getRange();
2207 bool ShouldAddRedecl =
2211 Context, Kind, SemanticContext, KWLoc, NameLoc, Name,
2212 PrevClassTemplate && ShouldAddRedecl
2216 if (NumOuterTemplateParamLists > 0)
2219 llvm::ArrayRef(OuterTemplateParamLists, NumOuterTemplateParamLists));
2235 if (ShouldAddRedecl)
2240 if (ModulePrivateLoc.
isValid())
2245 if (PrevClassTemplate &&
2263 if (PrevClassTemplate)
2299 if (PrevClassTemplate)
2338 S.
DiagCompat(ParamLoc, diag_compat::templ_default_in_function_templ)
2347 S.
Diag(ParamLoc, diag::err_template_parameter_default_template_member)
2356 S.
Diag(ParamLoc, diag::err_template_parameter_default_friend_template)
2365 llvm_unreachable(
"Invalid TemplateParamListContext!");
2378 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
2383 if (TC->hasExplicitTemplateArgs())
2384 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
2392 if (!NTTP->isParameterPack() &&
2394 NTTP->getTypeSourceInfo(),
2402 = dyn_cast<TemplateTemplateParmDecl>(P))
2422 bool SawDefaultArgument =
false;
2428 OldParam = OldParams->
begin();
2430 bool RemoveDefaultArguments =
false;
2432 NewParamEnd = NewParams->
end();
2433 NewParam != NewParamEnd; ++NewParam) {
2436 bool RedundantDefaultArg =
false;
2439 bool InconsistentDefaultArg =
false;
2441 std::string PrevModuleName;
2447 bool MissingDefaultArg =
false;
2450 bool SawParameterPack =
false;
2453 = dyn_cast<TemplateTypeParmDecl>(*NewParam)) {
2455 if (NewTypeParm->hasDefaultArgument() &&
2457 *
this, TPC, NewTypeParm->getLocation(),
2458 NewTypeParm->getDefaultArgument().getSourceRange()))
2459 NewTypeParm->removeDefaultArgument();
2464 if (NewTypeParm->isParameterPack()) {
2465 assert(!NewTypeParm->hasDefaultArgument() &&
2466 "Parameter packs can't have a default argument!");
2467 SawParameterPack =
true;
2469 NewTypeParm->hasDefaultArgument() &&
2472 NewDefaultLoc = NewTypeParm->getDefaultArgumentLoc();
2473 SawDefaultArgument =
true;
2476 RedundantDefaultArg =
true;
2477 else if (!
getASTContext().isSameDefaultTemplateArgument(OldTypeParm,
2479 InconsistentDefaultArg =
true;
2483 PreviousDefaultArgLoc = NewDefaultLoc;
2487 NewTypeParm->setInheritedDefaultArgument(
Context, OldTypeParm);
2489 }
else if (NewTypeParm->hasDefaultArgument()) {
2490 SawDefaultArgument =
true;
2491 PreviousDefaultArgLoc = NewTypeParm->getDefaultArgumentLoc();
2492 }
else if (SawDefaultArgument)
2493 MissingDefaultArg =
true;
2495 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {
2500 !NewNonTypeParm->isParameterPack() &&
2502 NewNonTypeParm->getTypeSourceInfo(),
2509 if (NewNonTypeParm->hasDefaultArgument() &&
2511 *
this, TPC, NewNonTypeParm->getLocation(),
2512 NewNonTypeParm->getDefaultArgument().getSourceRange())) {
2513 NewNonTypeParm->removeDefaultArgument();
2519 if (NewNonTypeParm->isParameterPack()) {
2520 assert(!NewNonTypeParm->hasDefaultArgument() &&
2521 "Parameter packs can't have a default argument!");
2522 if (!NewNonTypeParm->isPackExpansion())
2523 SawParameterPack =
true;
2525 NewNonTypeParm->hasDefaultArgument() &&
2528 NewDefaultLoc = NewNonTypeParm->getDefaultArgumentLoc();
2529 SawDefaultArgument =
true;
2531 RedundantDefaultArg =
true;
2533 OldNonTypeParm, NewNonTypeParm)) {
2534 InconsistentDefaultArg =
true;
2538 PreviousDefaultArgLoc = NewDefaultLoc;
2542 NewNonTypeParm->setInheritedDefaultArgument(
Context, OldNonTypeParm);
2544 }
else if (NewNonTypeParm->hasDefaultArgument()) {
2545 SawDefaultArgument =
true;
2546 PreviousDefaultArgLoc = NewNonTypeParm->getDefaultArgumentLoc();
2547 }
else if (SawDefaultArgument)
2548 MissingDefaultArg =
true;
2571 "Parameter packs can't have a default argument!");
2573 SawParameterPack =
true;
2574 }
else if (OldTemplateParm &&
2580 SawDefaultArgument =
true;
2582 RedundantDefaultArg =
true;
2584 OldTemplateParm, NewTemplateParm)) {
2585 InconsistentDefaultArg =
true;
2589 PreviousDefaultArgLoc = NewDefaultLoc;
2594 PreviousDefaultArgLoc
2597 SawDefaultArgument =
true;
2598 PreviousDefaultArgLoc
2600 }
else if (SawDefaultArgument)
2601 MissingDefaultArg =
true;
2607 if (SawParameterPack && (NewParam + 1) != NewParamEnd &&
2609 Diag((*NewParam)->getLocation(),
2610 diag::err_template_param_pack_must_be_last_template_parameter);
2627 if (RedundantDefaultArg) {
2628 Diag(NewDefaultLoc, diag::err_template_param_default_arg_redefinition);
2629 Diag(OldDefaultLoc, diag::note_template_param_prev_default_arg);
2631 }
else if (InconsistentDefaultArg) {
2635 diag::err_template_param_default_arg_inconsistent_redefinition);
2637 diag::note_template_param_prev_default_arg_in_other_module)
2640 }
else if (MissingDefaultArg &&
2648 Diag((*NewParam)->getLocation(),
2649 diag::err_template_param_default_arg_missing);
2650 Diag(PreviousDefaultArgLoc, diag::note_template_param_prev_default_arg);
2652 RemoveDefaultArguments =
true;
2663 if (RemoveDefaultArguments) {
2665 NewParamEnd = NewParams->
end();
2666 NewParam != NewParamEnd; ++NewParam) {
2668 TTP->removeDefaultArgument();
2670 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam))
2671 NTTP->removeDefaultArgument();
2691 bool IgnoreNonTypeDependent;
2696 DependencyChecker(
unsigned Depth,
bool IgnoreNonTypeDependent)
2697 : Depth(Depth), IgnoreNonTypeDependent(IgnoreNonTypeDependent),
2701 : IgnoreNonTypeDependent(IgnoreNonTypeDependent),
Match(
false) {
2704 Depth = PD->getDepth();
2705 }
else if (NonTypeTemplateParmDecl *PD =
2706 dyn_cast<NonTypeTemplateParmDecl>(ND)) {
2707 Depth = PD->getDepth();
2713 bool Matches(
unsigned ParmDepth, SourceLocation Loc = SourceLocation()) {
2714 if (ParmDepth >= Depth) {
2722 bool TraverseStmt(Stmt *S)
override {
2727 if (
auto *E = dyn_cast_or_null<Expr>(S))
2728 if (IgnoreNonTypeDependent && !E->isTypeDependent())
2733 bool TraverseTypeLoc(TypeLoc TL,
bool TraverseQualifier =
true)
override {
2734 if (IgnoreNonTypeDependent && !TL.
isNull() &&
2740 bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)
override {
2744 bool VisitTemplateTypeParmType(TemplateTypeParmType *
T)
override {
2746 return IgnoreNonTypeDependent || !Matches(
T->getDepth());
2750 if (TemplateTemplateParmDecl *PD =
2752 if (Matches(PD->getDepth()))
2757 bool VisitDeclRefExpr(DeclRefExpr *E)
override {
2758 if (NonTypeTemplateParmDecl *PD =
2759 dyn_cast<NonTypeTemplateParmDecl>(E->
getDecl()))
2760 if (Matches(PD->getDepth(), E->
getExprLoc()))
2762 return DynamicRecursiveASTVisitor::VisitDeclRefExpr(E);
2765 bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr *ULE)
override {
2768 if (Matches(TTP->getDepth(), ULE->
getExprLoc()))
2774 return DynamicRecursiveASTVisitor::VisitUnresolvedLookupExpr(ULE);
2777 bool VisitSubstTemplateTypeParmType(SubstTemplateTypeParmType *
T)
override {
2778 return TraverseType(
T->getReplacementType());
2781 bool VisitSubstTemplateTypeParmPackType(
2782 SubstTemplateTypeParmPackType *
T)
override {
2783 return TraverseTemplateArgument(
T->getArgumentPack());
2786 bool TraverseInjectedClassNameType(InjectedClassNameType *
T,
2787 bool TraverseQualifier)
override {
2790 return TraverseTemplateArguments(
2791 T->getTemplateArgs(
T->getOriginalDecl()->getASTContext()));
2800 if (!Params->
size())
2803 DependencyChecker Checker(Params,
false);
2804 Checker.TraverseType(
T);
2805 return Checker.Match;
2831 bool &IsMemberSpecialization,
bool &
Invalid,
bool SuppressDiagnostic) {
2832 IsMemberSpecialization =
false;
2854 while (!
T.isNull()) {
2855 NestedTypes.push_back(
T);
2861 = dyn_cast<ClassTemplateSpecializationDecl>(
Record)) {
2864 ExplicitSpecLoc = Spec->getLocation();
2867 }
else if (
Record->getTemplateSpecializationKind()
2869 ExplicitSpecLoc =
Record->getLocation();
2874 T =
Context.getTypeDeclType(Parent);
2880 if (
const TemplateSpecializationType *TST
2881 =
T->getAs<TemplateSpecializationType>()) {
2894 T =
Context.getTypeDeclType(Parent);
2902 if (
const DependentNameType *DependentName =
T->getAs<DependentNameType>()){
2912 if (
const EnumType *EnumT =
T->getAsCanonical<EnumType>()) {
2918 if (
TypeDecl *Parent = dyn_cast<TypeDecl>(
Enum->getParent()))
2919 T =
Context.getCanonicalTypeDeclType(Parent);
2929 std::reverse(NestedTypes.begin(), NestedTypes.end());
2937 bool SawNonEmptyTemplateParameterList =
false;
2939 auto CheckExplicitSpecialization = [&](
SourceRange Range,
bool Recovery) {
2940 if (SawNonEmptyTemplateParameterList) {
2941 if (!SuppressDiagnostic)
2942 Diag(DeclLoc, diag::err_specialize_member_of_template)
2943 << !Recovery << Range;
2945 IsMemberSpecialization =
false;
2952 auto DiagnoseMissingExplicitSpecialization = [&] (
SourceRange Range) {
2954 if (CheckExplicitSpecialization(Range,
true))
2959 if (!ParamLists.empty())
2960 ExpectedTemplateLoc = ParamLists[0]->getTemplateLoc();
2962 ExpectedTemplateLoc = DeclStartLoc;
2964 if (!SuppressDiagnostic)
2965 Diag(DeclLoc, diag::err_template_spec_needs_header)
2972 for (
unsigned TypeIdx = 0, NumTypes = NestedTypes.size(); TypeIdx != NumTypes;
2974 T = NestedTypes[TypeIdx];
2977 bool NeedEmptyTemplateHeader =
false;
2980 bool NeedNonemptyTemplateHeader =
false;
2993 = dyn_cast<ClassTemplatePartialSpecializationDecl>(
Record)) {
2994 ExpectedTemplateParams = Partial->getTemplateParameters();
2995 NeedNonemptyTemplateHeader =
true;
2996 }
else if (
Record->isDependentType()) {
2997 if (
Record->getDescribedClassTemplate()) {
2998 ExpectedTemplateParams =
Record->getDescribedClassTemplate()
2999 ->getTemplateParameters();
3000 NeedNonemptyTemplateHeader =
true;
3003 = dyn_cast<ClassTemplateSpecializationDecl>(
Record)) {
3009 NeedEmptyTemplateHeader =
true;
3012 }
else if (
Record->getTemplateSpecializationKind()) {
3013 if (
Record->getTemplateSpecializationKind()
3015 TypeIdx == NumTypes - 1)
3016 IsMemberSpecialization =
true;
3020 }
else if (
const auto *TST =
T->getAs<TemplateSpecializationType>()) {
3023 ExpectedTemplateParams =
Template->getTemplateParameters();
3024 NeedNonemptyTemplateHeader =
true;
3028 NeedNonemptyTemplateHeader =
false;
3039 if (
ParamIdx < ParamLists.size()) {
3040 if (ParamLists[
ParamIdx]->size() == 0) {
3041 if (CheckExplicitSpecialization(ParamLists[
ParamIdx]->getSourceRange(),
3045 SawNonEmptyTemplateParameterList =
true;
3048 if (NeedEmptyTemplateHeader) {
3051 if (TypeIdx == NumTypes - 1)
3052 IsMemberSpecialization =
true;
3054 if (
ParamIdx < ParamLists.size()) {
3055 if (ParamLists[
ParamIdx]->size() > 0) {
3057 if (!SuppressDiagnostic)
3059 diag::err_template_param_list_matches_nontemplate)
3062 ParamLists[
ParamIdx]->getRAngleLoc())
3074 if (DiagnoseMissingExplicitSpecialization(
3081 if (NeedNonemptyTemplateHeader) {
3086 if (IsFriend &&
T->isDependentType()) {
3087 if (
ParamIdx < ParamLists.size() &&
3089 ExpectedTemplateParams =
nullptr;
3094 if (
ParamIdx < ParamLists.size()) {
3096 if (ExpectedTemplateParams &&
3098 ExpectedTemplateParams,
3111 if (!SuppressDiagnostic)
3112 Diag(DeclLoc, diag::err_template_spec_needs_template_parameters)
3123 if (
ParamIdx >= ParamLists.size()) {
3124 if (TemplateId && !IsFriend) {
3140 if (
ParamIdx < ParamLists.size() - 1) {
3141 bool HasAnyExplicitSpecHeader =
false;
3142 bool AllExplicitSpecHeaders =
true;
3143 for (
unsigned I =
ParamIdx, E = ParamLists.size() - 1; I != E; ++I) {
3144 if (ParamLists[I]->size() == 0)
3145 HasAnyExplicitSpecHeader =
true;
3147 AllExplicitSpecHeaders =
false;
3150 if (!SuppressDiagnostic)
3152 AllExplicitSpecHeaders ? diag::ext_template_spec_extra_headers
3153 : diag::err_template_spec_extra_headers)
3155 ParamLists[ParamLists.size() - 2]->getRAngleLoc());
3160 if (ExplicitSpecLoc.
isValid() && HasAnyExplicitSpecHeader &&
3161 !SuppressDiagnostic)
3162 Diag(ExplicitSpecLoc,
3163 diag::note_explicit_template_spec_does_not_need_header)
3164 << NestedTypes.back();
3169 if (!AllExplicitSpecHeaders)
3180 if (ParamLists.back()->size() == 0 &&
3181 CheckExplicitSpecialization(ParamLists[
ParamIdx]->getSourceRange(),
3187 return ParamLists.back();
3192 Diag(
Template->getLocation(), diag::note_template_declared_here)
3208 Diag((*I)->getLocation(), diag::note_template_declared_here)
3209 << 0 << (*I)->getDeclName();
3239 Keyword, BaseTemplate, TemplateLoc, Args,
3245 return BaseTemplateInst;
3250 switch (Ts.size()) {
3260 return lookUpCommonType(Ts[0], Ts[0]);
3274 return lookUpCommonType(D1, D2);
3279 auto CheckConditionalOperands = [&](
bool ConstRefQual) ->
QualType {
3318 if (
auto Res = CheckConditionalOperands(
false); !Res.isNull())
3331 return CheckConditionalOperands(
true);
3341 QualType Result = Ts.front().getAsType();
3342 for (
auto T : llvm::drop_begin(Ts)) {
3343 Result = lookUpCommonType(Result,
T.getAsType());
3344 if (Result.isNull())
3353 DeclContext *DC = RT->getOriginalDecl()->getDeclContext();
3368 bool Literal =
false;
3370 if (
isInVkNamespace(RT) && RT->getOriginalDecl()->getName() ==
"Literal") {
3372 dyn_cast<ClassTemplateSpecializationDecl>(RT->getOriginalDecl());
3376 QualType ConstantType = LiteralArgs[0].getAsType();
3379 LiteralLoc = SpecDecl->getSourceRange().getBegin();
3383 RT->getOriginalDecl()->getName() ==
"integral_constant") {
3385 dyn_cast<ClassTemplateSpecializationDecl>(RT->getOriginalDecl());
3390 QualType ConstantType = ConstantArgs[0].getAsType();
3391 llvm::APInt
Value = ConstantArgs[1].getAsIntegral();
3394 return SpirvOperand::createLiteral(
Value);
3395 return SpirvOperand::createConstant(ConstantType,
Value);
3396 }
else if (Literal) {
3397 SemaRef.
Diag(LiteralLoc, diag::err_hlsl_vk_literal_must_contain_constant);
3398 return SpirvOperand();
3402 diag::err_call_incomplete_argument))
3403 return SpirvOperand();
3404 return SpirvOperand::createType(OperandArg);
3414 case BTK__make_integer_seq: {
3418 QualType OrigType = Converted[1].getAsType();
3422 SemaRef.
Diag(TemplateArgs[1].getLocation(),
3423 diag::err_integer_sequence_integral_element_type);
3437 OrigType, TemplateArgs[1].getLocation())));
3439 if (llvm::APSInt NumArgs = NumArgsArg.
getAsIntegral(); NumArgs >= 0) {
3441 for (llvm::APSInt I(NumArgs.getBitWidth(), NumArgs.isUnsigned());
3445 TA, OrigType, TemplateArgs[2].getLocation()));
3450 SemaRef.
Diag(TemplateArgs[2].getLocation(),
3451 diag::err_integer_sequence_negative_length);
3458 TemplateLoc, SyntheticTemplateArgs,
3463 case BTK__type_pack_element: {
3467 assert(Converted.size() == 2 &&
3468 "__type_pack_element should be given an index and a parameter pack");
3475 assert(Index >= 0 &&
"the index used with __type_pack_element should be of "
3476 "type std::size_t, and hence be non-negative");
3478 if (Index >= Ts.pack_size()) {
3479 SemaRef.
Diag(TemplateArgs[0].getLocation(),
3480 diag::err_type_pack_element_out_of_bounds);
3485 int64_t N = Index.getExtValue();
3486 return Ts.getPackAsArray()[N].getAsType();
3489 case BTK__builtin_common_type: {
3490 assert(Converted.size() == 4);
3491 if (llvm::any_of(Converted, [](
auto &
C) {
return C.isDependent(); }))
3494 TemplateName BaseTemplate = Converted[0].getAsTemplate();
3502 CT, TemplateArgs[1].getLocation())));
3503 TemplateName HasTypeMember = Converted[1].getAsTemplate();
3508 QualType HasNoTypeMember = Converted[2].getAsType();
3509 return HasNoTypeMember;
3512 case BTK__hlsl_spirv_type: {
3513 assert(Converted.size() == 4);
3515 if (!Context.getTargetInfo().getTriple().isSPIRV()) {
3516 SemaRef.
Diag(TemplateLoc, diag::err_hlsl_spirv_only) << BTD;
3519 if (llvm::any_of(Converted, [](
auto &
C) {
return C.isDependent(); }))
3522 uint64_t Opcode = Converted[0].getAsIntegral().getZExtValue();
3523 uint64_t Size = Converted[1].getAsIntegral().getZExtValue();
3524 uint64_t Alignment = Converted[2].getAsIntegral().getZExtValue();
3530 for (
auto &OperandTA : OperandArgs) {
3531 QualType OperandArg = OperandTA.getAsType();
3533 TemplateArgs[3].getLocation());
3534 if (!Operand.isValid())
3536 Operands.push_back(Operand);
3539 return Context.getHLSLInlineSpirvType(Opcode, Size, Alignment, Operands);
3541 case BTK__builtin_dedup_pack: {
3542 assert(Converted.size() == 1 &&
"__builtin_dedup_pack should be given "
3543 "a parameter pack");
3552 llvm::SmallDenseSet<QualType> Seen;
3556 if (!Seen.insert(
T.getAsType().getCanonicalType()).second)
3558 OutArgs.push_back(
T);
3560 return Context.getSubstBuiltinTemplatePack(
3564 llvm_unreachable(
"unexpected BuiltinTemplateDecl!");
3582 if (
auto BinOp = dyn_cast<BinaryOperator>(Clause->IgnoreParenImpCasts())) {
3583 if (BinOp->getOpcode() == BO_LAnd) {
3590 Terms.push_back(Clause);
3598 auto *BinOp = dyn_cast<BinaryOperator>(
Cond->IgnoreParenImpCasts());
3599 if (!BinOp)
return Cond;
3601 if (BinOp->getOpcode() != BO_LOr)
return Cond;
3604 Expr *LHS = BinOp->getLHS();
3606 if (!InnerBinOp)
return Cond;
3608 if (InnerBinOp->getOpcode() != BO_EQ ||
3619 if (MacroName ==
"CONCEPT_REQUIRES" || MacroName ==
"CONCEPT_REQUIRES_")
3620 return BinOp->getRHS();
3630class FailedBooleanConditionPrinterHelper :
public PrinterHelper {
3632 explicit FailedBooleanConditionPrinterHelper(
const PrintingPolicy &P)
3635 bool handledStmt(Stmt *E, raw_ostream &OS)
override {
3636 const auto *DR = dyn_cast<DeclRefExpr>(E);
3637 if (DR && DR->getQualifier()) {
3640 DR->getQualifier().print(OS, Policy,
true);
3642 const ValueDecl *VD = DR->getDecl();
3644 if (
const auto *IV = dyn_cast<VarTemplateSpecializationDecl>(VD)) {
3646 printTemplateArgumentList(
3647 OS, IV->getTemplateArgs().asArray(), Policy,
3648 IV->getSpecializedTemplate()->getTemplateParameters());
3656 const PrintingPolicy Policy;
3661std::pair<Expr *, std::string>
3670 Expr *FailedCond =
nullptr;
3671 for (
Expr *Term : Terms) {
3685 if (Term->EvaluateAsBooleanCondition(Succeeded,
Context) &&
3687 FailedCond = TermAsWritten;
3692 FailedCond =
Cond->IgnoreParenImpCasts();
3694 std::string Description;
3696 llvm::raw_string_ostream Out(Description);
3699 FailedBooleanConditionPrinterHelper Helper(Policy);
3700 FailedCond->
printPretty(Out, &Helper, Policy, 0,
"\n",
nullptr);
3702 return { FailedCond, Description };
3718 std::unique_ptr<CorrectionCandidateCallback> clone()
override {
3719 return std::make_unique<CandidateCallback>(*
this);
3730 std::nullopt,
false,
3746 if (
const auto *S = UnderlyingName.getAsSubstTemplateTemplateParmPack()) {
3748 }
else if (
const auto *DTN = UnderlyingName.getAsDependentTemplateName()) {
3749 if (DTN->getName().getIdentifier())
3757 }
else if (
const auto *ATN = UnderlyingName.getAsAssumedTemplateName()) {
3759 *
this,
Scope, ATN, TemplateLoc);
3760 CorrectedName.isNull()) {
3761 Diag(TemplateLoc, diag::err_no_template) << ATN->getDeclName();
3764 Name = CorrectedName;
3772 if (ForNestedNameSpecifier)
3773 Diag(TemplateLoc, diag::err_non_type_template_in_nested_name_specifier)
3774 << isa_and_nonnull<VarTemplateDecl>(
Template) << Name << R;
3776 Diag(TemplateLoc, diag::err_template_id_not_a_type) << Name << R;
3796 dyn_cast<TypeAliasTemplateDecl>(
Template)) {
3804 SemaRef.Diag(TemplateLoc, diag::err_tag_reference_non_tag)
3834 std::optional<ContextRAII> SavedContext;
3836 SavedContext.emplace(*
this,
AliasTemplate->getDeclContext());
3841 if (CanonType.
isNull()) {
3847 if (*DeductionInfo &&
3848 (*DeductionInfo)->hasSFINAEDiagnostic() &&
3849 (*DeductionInfo)->peekSFINAEDiagnostic().second.getDiagID() ==
3850 diag::err_typename_nested_not_found_enable_if &&
3851 TemplateArgs[0].getArgument().getKind()
3854 std::string FailedDescription;
3855 std::tie(FailedCond, FailedDescription) =
3861 (*DeductionInfo)->takeSFINAEDiagnostic(OldDiag);
3865 (*DeductionInfo)->addSFINAEDiagnostic(
3867 PDiag(diag::err_typename_nested_not_found_requirement)
3868 << FailedDescription
3876 }
else if (
auto *BTD = dyn_cast<BuiltinTemplateDecl>(
Template)) {
3880 TemplateSpecializationType::anyDependentTemplateArguments(
3889 CanonType =
Context.getCanonicalTemplateSpecializationType(
3891 Context.getCanonicalTemplateName(Name,
true),
3904 if (Ctx->isFileContext())
break;
3913 !
Record->getDescribedClassTemplate())
3922 if (CanonType != Injected)
3932 dyn_cast<ClassTemplateDecl>(
Template)) {
3935 void *InsertPos =
nullptr;
3970 "type of non-dependent specialization is not a RecordType");
3972 llvm_unreachable(
"Unhandled template kind");
3978 return Context.getTemplateSpecializationType(
3990 assert(ATN &&
"not an assumed template name");
3991 II = ATN->getDeclName().getAsIdentifierInfo();
4008 SourceLocation RAngleLoc,
bool IsCtorOrDtorName,
bool IsClassName,
4013 if (!IsCtorOrDtorName && !IsClassName && SS.
isSet()) {
4039 TemplateD, TemplateII, TemplateIILoc, LAngleLoc,
4040 TemplateArgsIn, RAngleLoc);
4047 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
4048 if (LookupRD && LookupRD->getIdentifier() == TemplateII) {
4051 ? diag::err_out_of_line_qualified_id_type_names_constructor
4052 : diag::ext_out_of_line_qualified_id_type_names_constructor)
4063 ElaboratedKeyword, TemplateD.
get(), TemplateIILoc, TemplateArgs,
4072 TemplateIILoc, TemplateArgs);
4105 if (
const RecordType *RT =
Result->getAs<RecordType>()) {
4109 assert(Id &&
"templated class must have an identifier");
4113 Diag(TagLoc, diag::err_use_with_wrong_tag)
4150 const TemplateTypeParmType *TPT =
4152 return TPT && !
Type.hasQualifiers() &&
4153 TPT->getDepth() == Depth && TPT->getIndex() == Index;
4161 dyn_cast<NonTypeTemplateParmDecl>(DRE->
getDecl());
4167 dyn_cast_or_null<TemplateTemplateParmDecl>(
4171 llvm_unreachable(
"unexpected kind of template argument");
4177 if (Params->
size() != Args.size() || Params->
size() != SpecParams->
size())
4180 unsigned Depth = Params->
getDepth();
4182 for (
unsigned I = 0, N = Args.size(); I != N; ++I) {
4200 if (
auto *SpecNTTP =
4201 dyn_cast<NonTypeTemplateParmDecl>(SpecParams->
getParam(I))) {
4202 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->
getParam(I));
4203 if (!NTTP || NTTP->getType().getCanonicalType() !=
4204 SpecNTTP->getType().getCanonicalType())
4212template<
typename PartialSpecDecl>
4214 if (Partial->getDeclContext()->isDependentContext())
4223 auto *
Template = Partial->getSpecializedTemplate();
4224 S.
Diag(Partial->getLocation(),
4225 diag::ext_partial_spec_not_more_specialized_than_primary)
4235 diag::note_partial_spec_not_more_specialized_than_primary)
4241 Template->getAssociatedConstraints(TemplateAC);
4242 Partial->getAssociatedConstraints(PartialAC);
4249 const llvm::SmallBitVector &DeducibleParams) {
4250 for (
unsigned I = 0, N = DeducibleParams.size(); I != N; ++I) {
4251 if (!DeducibleParams[I]) {
4253 if (Param->getDeclName())
4254 S.
Diag(Param->getLocation(), diag::note_non_deducible_parameter)
4255 << Param->getDeclName();
4257 S.
Diag(Param->getLocation(), diag::note_non_deducible_parameter)
4264template<
typename PartialSpecDecl>
4266 PartialSpecDecl *Partial) {
4279 auto *TemplateParams = Partial->getTemplateParameters();
4280 llvm::SmallBitVector DeducibleParams(TemplateParams->size());
4282 TemplateParams->getDepth(), DeducibleParams);
4284 if (!DeducibleParams.all()) {
4285 unsigned NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();
4286 S.
Diag(Partial->getLocation(), diag::ext_partial_specs_not_deducible)
4288 << (NumNonDeducible > 1)
4290 Partial->getTemplateArgsAsWritten()->RAngleLoc);
4311 llvm::SmallBitVector DeducibleParams(TemplateParams->size());
4313 for (
unsigned I = 0; I != TemplateParams->size(); ++I) {
4315 auto *Param = TemplateParams->getParam(I);
4317 DeducibleParams[I] =
true;
4320 if (!DeducibleParams.all()) {
4321 unsigned NumNonDeducible = DeducibleParams.size() - DeducibleParams.count();
4322 Diag(TD->
getLocation(), diag::err_deduction_guide_template_not_deducible)
4323 << (NumNonDeducible > 1);
4334 "Variable template specialization is declared with a template id.");
4351 FnTemplate = *OTS->begin();
4361 if (
const auto *DSA =
VarTemplate->getAttr<NoSpecializationsAttr>()) {
4362 auto Message = DSA->getMessage();
4363 Diag(TemplateNameLoc, diag::warn_invalid_specialization)
4365 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
4369 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
4389 TemplateArgs.
size(),
4396 !TemplateSpecializationType::anyDependentTemplateArguments(
4398 Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
4405 (!
Context.getLangOpts().CPlusPlus20 ||
4411 Diag(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)
4421 void *InsertPos =
nullptr;
4425 PrevDecl =
VarTemplate->findPartialSpecialization(
4451 cast_or_null<VarTemplatePartialSpecializationDecl>(PrevDecl);
4460 VarTemplate->AddPartialSpecialization(Partial, InsertPos);
4499 Diag(TemplateNameLoc, diag::err_specialization_after_instantiation)
4503 diag::note_instantiation_required_here)
4533struct PartialSpecMatchResult {
4541 if (Var->
getName() !=
"format_kind" ||
4562 bool SetWrittenArgs) {
4563 assert(
Template &&
"A variable template id without template?");
4575 if (
Template->getDeclContext()->isDependentContext() ||
4576 TemplateSpecializationType::anyDependentTemplateArguments(
4583 return Context.isSameTemplateArgument(Arg1, Arg2);
4589 !IsLibstdcxxStdFormatKind(
PP, Var) &&
4593 IsSameTemplateArg)) {
4594 Diag(TemplateNameLoc,
4595 diag::err_auto_variable_cannot_appear_in_own_initializer)
4596 << diag::ParsingInitFor::VarTemplate << Var << Var->
getType();
4601 Template->getPartialSpecializations(PartialSpecs);
4605 Partial->getTemplateArgs().asArray(),
4606 IsSameTemplateArg)) {
4607 Diag(TemplateNameLoc,
4608 diag::err_auto_variable_cannot_appear_in_own_initializer)
4609 << diag::ParsingInitFor::VarTemplatePartialSpec << Partial
4610 << Partial->getType();
4619 void *InsertPos =
nullptr;
4623 if (Spec->getType()->isUndeducedType()) {
4625 Diag(TemplateNameLoc,
4626 diag::err_auto_variable_cannot_appear_in_own_initializer)
4627 << diag::ParsingInitFor::VarTemplateExplicitSpec << Spec
4632 Diag(TemplateNameLoc, diag::err_var_template_spec_type_depends_on_self)
4633 << Spec << Spec->getType();
4647 bool AmbiguousPartialSpec =
false;
4648 typedef PartialSpecMatchResult MatchResult;
4660 Template->getPartialSpecializations(PartialSpecs);
4672 if (
Template->getMostRecentDecl()->isMemberSpecialization() &&
4673 !Partial->getMostRecentDecl()->isMemberSpecialization())
4688 Matched.push_back(PartialSpecMatchResult());
4689 Matched.back().Partial = Partial;
4694 if (Matched.size() >= 1) {
4696 if (Matched.size() == 1) {
4709 PEnd = Matched.end();
4712 PointOfInstantiation) ==
4720 PEnd = Matched.end();
4723 P->Partial, Best->Partial,
4724 PointOfInstantiation) != Best->Partial) {
4725 AmbiguousPartialSpec =
true;
4732 InstantiationPattern = Best->Partial;
4733 PartialSpecArgs = Best->Args;
4750 Decl->setTemplateArgsAsWritten(TemplateArgs);
4752 if (AmbiguousPartialSpec) {
4755 Diag(PointOfInstantiation, diag::err_partial_spec_ordering_ambiguous)
4759 for (MatchResult P : Matched)
4760 Diag(P.Partial->getLocation(), diag::note_partial_spec_match)
4767 dyn_cast<VarTemplatePartialSpecializationDecl>(InstantiationPattern))
4768 Decl->setInstantiationOf(D, PartialSpecArgs);
4772 assert(
Decl &&
"No variable template specialization?");
4782 *TemplateArgs,
false);
4783 if (
Decl.isInvalid())
4802 assert(
Template &&
"A variable template id without template?");
4805 Template->templateParameterKind() !=
4837 Diag(Loc, diag::err_template_missing_args)
4845 bool TemplateKeyword,
4860 assert(NamedConcept &&
"A concept template id without a template?");
4867 NamedConcept, ConceptNameInfo.
getLoc(),
4880 bool AreArgsDependent =
4881 TemplateSpecializationType::anyDependentTemplateArguments(
4890 if (!AreArgsDependent &&
4901 TemplateKWLoc, ConceptNameInfo, FoundDecl, NamedConcept,
4904 Context,
CL, CSD, AreArgsDependent ?
nullptr : &Satisfaction);
4923 assert(!R.
isAmbiguous() &&
"ambiguous lookup when building templateid");
4933 bool KnownDependent =
false;
4942 KnownDependent =
true;
4960 TemplateKWLoc, TemplateArgs);
4966 R.
begin(), R.
end(), KnownDependent,
4982 assert(TemplateArgs || TemplateKWLoc.
isValid());
4986 false, TemplateKWLoc))
5015 bool EnteringContext,
5017 bool AllowInjectedClassName) {
5021 diag::warn_cxx98_compat_template_outside_of_template :
5022 diag::ext_template_outside_of_template)
5032 else if (ObjectType)
5051 bool MemberOfUnknownSpecialization;
5053 ObjectType, EnteringContext,
Result,
5054 MemberOfUnknownSpecialization);
5057 auto *LookupRD = dyn_cast_or_null<CXXRecordDecl>(LookupCtx);
5058 if (!AllowInjectedClassName && SS.
isNotEmpty() && LookupRD &&
5071 diag::ext_out_of_line_qualified_id_type_names_constructor)
5079 if (!MemberOfUnknownSpecialization) {
5110 {Qualifier, Name.Identifier, TemplateKWLoc.isValid()}));
5115 {Qualifier, Name.OperatorFunctionId.Operator,
5116 TemplateKWLoc.isValid()}));
5131 diag::err_template_kw_refers_to_dependent_non_template)
5133 << TemplateKWLoc.
isValid() << TemplateKWLoc;
5170 dyn_cast<DependentScopeDeclRefExpr>(Arg.
getAsExpr())) {
5171 SS.
Adopt(ArgExpr->getQualifierLoc());
5172 NameInfo = ArgExpr->getNameInfo();
5174 dyn_cast<CXXDependentScopeMemberExpr>(Arg.
getAsExpr())) {
5175 if (ArgExpr->isImplicitAccess()) {
5176 SS.
Adopt(ArgExpr->getQualifierLoc());
5177 NameInfo = ArgExpr->getMemberNameInfo();
5186 Result.wasNotFoundInCurrentInstantiation()) {
5187 assert(SS.
getScopeRep() &&
"dependent scope expr must has a scope!");
5191 ? diag::ext_ms_template_type_arg_missing_typename
5192 : diag::err_template_arg_must_be_type_suggest)
5224 SugaredConverted.push_back(Arg);
5225 CanonicalConverted.push_back(Arg);
5231 Diag(SR.
getBegin(), diag::err_template_arg_must_be_type) << SR;
5245 ArgType->isObjCLifetimeType() &&
5253 CanonicalConverted.push_back(
5288 Output = Param->getDefaultArgument();
5302 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5305 bool ForLambdaCallOperator =
false;
5306 if (
const auto *Rec = dyn_cast<CXXRecordDecl>(
Template->getDeclContext()))
5307 ForLambdaCallOperator = Rec->isLambda();
5309 !ForLambdaCallOperator);
5312 Param->getDefaultArgumentLoc(),
5313 Param->getDeclName()))
5357 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5364 TemplateArgLists, Output);
5401 SugaredConverted,
SourceRange(TemplateLoc, RAngleLoc));
5408 for (
unsigned i = 0, e = Param->getDepth(); i != e; ++i)
5425 HasDefaultArg =
false;
5431 HasDefaultArg =
true;
5434 RAngleLoc, TypeParm, SugaredConverted,
5435 CanonicalConverted, Output))
5441 = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
5445 HasDefaultArg =
true;
5448 RAngleLoc, NonTypeParm, SugaredConverted,
5449 CanonicalConverted, Output))
5459 HasDefaultArg =
true;
5463 *
this,
Template, TemplateKWLoc, TemplateNameLoc, RAngleLoc, TempTempParm,
5464 SugaredConverted, CanonicalConverted, QualifierLoc);
5488 TemplateName Name = TagLoc.getTypePtr()->getTemplateName(Context);
5494 TagLoc.getQualifierLoc(), TagLoc.getNameLoc());
5501 unsigned ArgumentPackIndex,
5515 QualType NTTPType = NTTP->getType();
5516 if (NTTP->isParameterPack() && NTTP->isExpandedParameterPack())
5517 NTTPType = NTTP->getExpansionType(ArgumentPackIndex);
5531 if (
auto *PET = NTTPType->
getAs<PackExpansionType>()) {
5533 NTTPType =
SubstType(PET->getPattern(), MLTAL, NTTP->getLocation(),
5534 NTTP->getDeclName());
5536 NTTPType =
SubstType(NTTPType, MLTAL, NTTP->getLocation(),
5537 NTTP->getDeclName());
5544 NTTP->getLocation());
5549 auto checkExpr = [&](
Expr *E) ->
Expr * {
5553 NTTP, NTTPType, E, SugaredResult, CanonicalResult,
5565 llvm_unreachable(
"Should never see a NULL template argument here");
5569 Expr *R = checkExpr(E);
5595 if (!checkExpr(R.
get()))
5634 NTTP, NTTPType, E.
get(), SugaredResult, CanonicalResult,
5666 if (
T->isFunctionType())
5667 Diag(SR.
getBegin(), diag::err_template_arg_nontype_ambig) << SR <<
T;
5669 Diag(SR.
getBegin(), diag::err_template_arg_must_be_expr) << SR;
5675 llvm_unreachable(
"Caller must expand template argument packs");
5720 ArgLoc = ConvertedArg;
5725 llvm_unreachable(
"Should never see a NULL template argument here");
5736 Context.getCanonicalTemplateArgument(Arg));
5764 llvm_unreachable(
"non-type argument with template template parameter");
5767 llvm_unreachable(
"Caller must expand template argument packs");
5774template<
typename TemplateParmDecl>
5777 const TemplateParmDecl *D,
5782 ->getTemplateParameters()
5783 ->getParam(D->getIndex()));
5790 D->getDefaultArgumentLoc(), Modules,
5801 S.
Diag(Loc, diag::err_template_arg_list_different_arity)
5837 unsigned ArgIdx = 0, NumArgs = NewArgs.
size();
5840 ParamEnd = Params->
end(),
5844 if (
size_t ParamIdx = Param - ParamBegin;
5847 assert(ArgIdx == NumArgs &&
"bad default argument deduction");
5849 assert(Param + DefaultArgs.
Args.size() <= ParamEnd);
5854 Context.getCanonicalTemplateArgument(DefArg));
5864 if (*Expansions == SugaredArgumentPack.size()) {
5869 SugaredArgumentPack.clear();
5873 CanonicalArgumentPack.clear();
5878 }
else if (ArgIdx == NumArgs && !PartialTemplateArgs) {
5880 Diag(TemplateLoc, diag::err_template_arg_list_different_arity)
5892 dyn_cast<NonTypeTemplateParmDecl>(*Param);
5894 auto TL = NTTP->getTypeSourceInfo()
5899 for (
const auto &UPP : Unexpanded) {
5900 auto *TST = UPP.first.dyn_cast<
const TemplateSpecializationType *>();
5905 Diag(TL.getEllipsisLoc(),
5906 diag::err_unsupported_builtin_template_pack_expansion)
5907 << TST->getTemplateName();
5912 if (ArgIdx < NumArgs) {
5914 bool NonPackParameter =
5924 if (!(*Param)->isTemplateParameterPack() ||
5931 RAngleLoc, SugaredArgumentPack.size(), CTAI,
5936 clang::isSubstitutedDefaultArgument(
Context, Arg, *Param,
5946 RAngleLoc, SugaredArgumentPack.size(), CTAI,
5953 if (ArgIsExpansion && NonPackParameter) {
5959 diag::err_template_expansion_into_fixed_list)
5971 if (ArgIsExpansion && (CTAI.
MatchingTTP || NonPackParameter)) {
5975 if (!SugaredArgumentPack.empty()) {
5979 SugaredArgumentPack.begin(),
5980 SugaredArgumentPack.end());
5981 SugaredArgumentPack.clear();
5984 CanonicalArgumentPack.begin(),
5985 CanonicalArgumentPack.end());
5986 CanonicalArgumentPack.clear();
5989 while (ArgIdx < NumArgs) {
5993 Context.getCanonicalTemplateArgument(Arg));
6000 if ((*Param)->isTemplateParameterPack()) {
6015 if (PartialTemplateArgs) {
6016 if ((*Param)->isTemplateParameterPack() && !SugaredArgumentPack.empty()) {
6027 if ((*Param)->isTemplateParameterPack()) {
6029 "Should have dealt with this already");
6034 if (Param + 1 != ParamEnd) {
6036 (
Template->getMostRecentDecl()->getKind() != Decl::Kind::Concept) &&
6037 "Concept templates must have parameter packs at the end.");
6043 SugaredArgumentPack.clear();
6047 CanonicalArgumentPack.clear();
6066 if (!HasDefaultArg) {
6071 dyn_cast<NonTypeTemplateParmDecl>(*Param))
6105 if (isTemplateTemplateParameter)
6120 while (ArgIdx < NumArgs &&
6121 NewArgs[ArgIdx].
getArgument().isPackExpansion()) {
6125 Context.getCanonicalTemplateArgument(Arg));
6131 if (ArgIdx < NumArgs) {
6132 Diag(TemplateLoc, diag::err_template_arg_list_different_arity)
6143 if (UpdateArgsWithConversions)
6144 TemplateArgs = std::move(NewArgs);
6146 if (!PartialTemplateArgs) {
6153 if (
auto *TD = dyn_cast<TemplateDecl>(NewContext))
6155 auto *RD = dyn_cast<CXXRecordDecl>(NewContext);
6159 dyn_cast_or_null<CXXMethodDecl>(
Template->getTemplatedDecl()))
6160 ThisQuals =
Method->getMethodQualifiers();
6183 class UnnamedLocalNoLinkageFinder
6184 :
public TypeVisitor<UnnamedLocalNoLinkageFinder, bool>
6192 UnnamedLocalNoLinkageFinder(
Sema &S,
SourceRange SR) : S(S), SR(SR) { }
6195 return T.isNull() ?
false : inherited::Visit(
T.getTypePtr());
6198#define TYPE(Class, Parent) \
6199 bool Visit##Class##Type(const Class##Type *);
6200#define ABSTRACT_TYPE(Class, Parent) \
6201 bool Visit##Class##Type(const Class##Type *) { return false; }
6202#define NON_CANONICAL_TYPE(Class, Parent) \
6203 bool Visit##Class##Type(const Class##Type *) { return false; }
6204#include "clang/AST/TypeNodes.inc"
6206 bool VisitTagDecl(
const TagDecl *Tag);
6211bool UnnamedLocalNoLinkageFinder::VisitBuiltinType(
const BuiltinType*) {
6215bool UnnamedLocalNoLinkageFinder::VisitComplexType(
const ComplexType*
T) {
6216 return Visit(
T->getElementType());
6219bool UnnamedLocalNoLinkageFinder::VisitPointerType(
const PointerType*
T) {
6220 return Visit(
T->getPointeeType());
6223bool UnnamedLocalNoLinkageFinder::VisitBlockPointerType(
6225 return Visit(
T->getPointeeType());
6228bool UnnamedLocalNoLinkageFinder::VisitLValueReferenceType(
6230 return Visit(
T->getPointeeType());
6233bool UnnamedLocalNoLinkageFinder::VisitRValueReferenceType(
6235 return Visit(
T->getPointeeType());
6238bool UnnamedLocalNoLinkageFinder::VisitMemberPointerType(
6240 if (Visit(
T->getPointeeType()))
6242 if (
auto *RD =
T->getMostRecentCXXRecordDecl())
6243 return VisitTagDecl(RD);
6244 return VisitNestedNameSpecifier(
T->getQualifier());
6247bool UnnamedLocalNoLinkageFinder::VisitConstantArrayType(
6249 return Visit(
T->getElementType());
6252bool UnnamedLocalNoLinkageFinder::VisitIncompleteArrayType(
6254 return Visit(
T->getElementType());
6257bool UnnamedLocalNoLinkageFinder::VisitVariableArrayType(
6259 return Visit(
T->getElementType());
6262bool UnnamedLocalNoLinkageFinder::VisitDependentSizedArrayType(
6264 return Visit(
T->getElementType());
6267bool UnnamedLocalNoLinkageFinder::VisitDependentSizedExtVectorType(
6269 return Visit(
T->getElementType());
6272bool UnnamedLocalNoLinkageFinder::VisitDependentSizedMatrixType(
6274 return Visit(
T->getElementType());
6277bool UnnamedLocalNoLinkageFinder::VisitDependentAddressSpaceType(
6279 return Visit(
T->getPointeeType());
6282bool UnnamedLocalNoLinkageFinder::VisitVectorType(
const VectorType*
T) {
6283 return Visit(
T->getElementType());
6286bool UnnamedLocalNoLinkageFinder::VisitDependentVectorType(
6288 return Visit(
T->getElementType());
6291bool UnnamedLocalNoLinkageFinder::VisitExtVectorType(
const ExtVectorType*
T) {
6292 return Visit(
T->getElementType());
6295bool UnnamedLocalNoLinkageFinder::VisitConstantMatrixType(
6297 return Visit(
T->getElementType());
6300bool UnnamedLocalNoLinkageFinder::VisitFunctionProtoType(
6302 for (
const auto &A :
T->param_types()) {
6307 return Visit(
T->getReturnType());
6310bool UnnamedLocalNoLinkageFinder::VisitFunctionNoProtoType(
6312 return Visit(
T->getReturnType());
6315bool UnnamedLocalNoLinkageFinder::VisitUnresolvedUsingType(
6320bool UnnamedLocalNoLinkageFinder::VisitTypeOfExprType(
const TypeOfExprType*) {
6324bool UnnamedLocalNoLinkageFinder::VisitTypeOfType(
const TypeOfType*
T) {
6325 return Visit(
T->getUnmodifiedType());
6328bool UnnamedLocalNoLinkageFinder::VisitDecltypeType(
const DecltypeType*) {
6332bool UnnamedLocalNoLinkageFinder::VisitPackIndexingType(
6333 const PackIndexingType *) {
6337bool UnnamedLocalNoLinkageFinder::VisitUnaryTransformType(
6338 const UnaryTransformType*) {
6342bool UnnamedLocalNoLinkageFinder::VisitAutoType(
const AutoType *
T) {
6343 return Visit(
T->getDeducedType());
6346bool UnnamedLocalNoLinkageFinder::VisitDeducedTemplateSpecializationType(
6347 const DeducedTemplateSpecializationType *
T) {
6348 return Visit(
T->getDeducedType());
6351bool UnnamedLocalNoLinkageFinder::VisitRecordType(
const RecordType*
T) {
6352 return VisitTagDecl(
T->getOriginalDecl()->getDefinitionOrSelf());
6355bool UnnamedLocalNoLinkageFinder::VisitEnumType(
const EnumType*
T) {
6356 return VisitTagDecl(
T->getOriginalDecl()->getDefinitionOrSelf());
6359bool UnnamedLocalNoLinkageFinder::VisitTemplateTypeParmType(
6360 const TemplateTypeParmType*) {
6364bool UnnamedLocalNoLinkageFinder::VisitSubstTemplateTypeParmPackType(
6365 const SubstTemplateTypeParmPackType *) {
6369bool UnnamedLocalNoLinkageFinder::VisitSubstBuiltinTemplatePackType(
6370 const SubstBuiltinTemplatePackType *) {
6374bool UnnamedLocalNoLinkageFinder::VisitTemplateSpecializationType(
6375 const TemplateSpecializationType*) {
6379bool UnnamedLocalNoLinkageFinder::VisitInjectedClassNameType(
6380 const InjectedClassNameType*
T) {
6381 return VisitTagDecl(
T->getOriginalDecl()->getDefinitionOrSelf());
6384bool UnnamedLocalNoLinkageFinder::VisitDependentNameType(
6385 const DependentNameType*
T) {
6386 return VisitNestedNameSpecifier(
T->getQualifier());
6389bool UnnamedLocalNoLinkageFinder::VisitPackExpansionType(
6390 const PackExpansionType*
T) {
6391 return Visit(
T->getPattern());
6394bool UnnamedLocalNoLinkageFinder::VisitObjCObjectType(
const ObjCObjectType *) {
6398bool UnnamedLocalNoLinkageFinder::VisitObjCInterfaceType(
6403bool UnnamedLocalNoLinkageFinder::VisitObjCObjectPointerType(
6408bool UnnamedLocalNoLinkageFinder::VisitAtomicType(
const AtomicType*
T) {
6409 return Visit(
T->getValueType());
6412bool UnnamedLocalNoLinkageFinder::VisitPipeType(
const PipeType*
T) {
6416bool UnnamedLocalNoLinkageFinder::VisitBitIntType(
const BitIntType *
T) {
6420bool UnnamedLocalNoLinkageFinder::VisitArrayParameterType(
6422 return VisitConstantArrayType(
T);
6425bool UnnamedLocalNoLinkageFinder::VisitDependentBitIntType(
6430bool UnnamedLocalNoLinkageFinder::VisitTagDecl(
const TagDecl *Tag) {
6431 if (
Tag->getDeclContext()->isFunctionOrMethod()) {
6432 S.Diag(SR.getBegin(), S.getLangOpts().CPlusPlus11
6433 ? diag::warn_cxx98_compat_template_arg_local_type
6434 : diag::ext_template_arg_local_type)
6435 << S.Context.getCanonicalTagType(Tag) << SR;
6439 if (!
Tag->hasNameForLinkage()) {
6440 S.Diag(SR.getBegin(),
6441 S.getLangOpts().CPlusPlus11 ?
6442 diag::warn_cxx98_compat_template_arg_unnamed_type :
6443 diag::ext_template_arg_unnamed_type) << SR;
6444 S.Diag(
Tag->getLocation(), diag::note_template_unnamed_type_here);
6451bool UnnamedLocalNoLinkageFinder::VisitNestedNameSpecifier(
6462 llvm_unreachable(
"Invalid NestedNameSpecifier::Kind!");
6465bool UnnamedLocalNoLinkageFinder::VisitHLSLAttributedResourceType(
6466 const HLSLAttributedResourceType *
T) {
6467 if (
T->hasContainedType() && Visit(
T->getContainedType()))
6469 return Visit(
T->getWrappedType());
6472bool UnnamedLocalNoLinkageFinder::VisitHLSLInlineSpirvType(
6473 const HLSLInlineSpirvType *
T) {
6474 for (
auto &Operand :
T->getOperands())
6476 if (Visit(
Operand.getResultType()))
6482 assert(ArgInfo &&
"invalid TypeSourceInfo");
6488 return Diag(SR.
getBegin(), diag::err_variably_modified_template_arg) << Arg;
6489 }
else if (
Context.hasSameUnqualifiedType(Arg,
Context.OverloadTy)) {
6490 return Diag(SR.
getBegin(), diag::err_template_arg_overload_type) << SR;
6501 UnnamedLocalNoLinkageFinder Finder(*
this, SR);
6502 (void)Finder.Visit(CanonArg);
6519 Decl *Entity =
nullptr) {
6525 if (Entity && Entity->hasAttr<DLLImportAttr>())
6530 "Incomplete parameter type in isNullPointerValueTemplateArgument!");
6543 EvalResult.
Diag = &Notes;
6551 if (Notes.size() == 1 && Notes[0].second.getDiagID() ==
6552 diag::note_invalid_subexpr_in_const_expr) {
6553 DiagLoc = Notes[0].first;
6557 S.
Diag(DiagLoc, diag::err_template_arg_not_address_constant)
6559 for (
unsigned I = 0, N = Notes.size(); I != N; ++I)
6560 S.
Diag(Notes[I].first, Notes[I].second);
6578 bool ObjCLifetimeConversion;
6581 ObjCLifetimeConversion))
6586 S.
Diag(Arg->
getExprLoc(), diag::err_template_arg_wrongtype_null_constant)
6605 std::string Code =
"static_cast<" + ParamType.
getAsString() +
">(";
6606 S.
Diag(Arg->
getExprLoc(), diag::err_template_arg_untyped_null_constant)
6626 bool ObjCLifetimeConversion;
6630 ObjCLifetimeConversion)) {
6635 if (!ParamRef->getPointeeType()->isFunctionType()) {
6645 unsigned ParamQuals = ParamRef->getPointeeType().getCVRQualifiers();
6646 unsigned ArgQuals = ArgType.getCVRQualifiers();
6648 if ((ParamQuals | ArgQuals) != ParamQuals) {
6650 diag::err_template_arg_ref_bind_ignores_quals)
6687 bool AddressTaken =
false;
6694 bool ExtWarnMSTemplateArg =
false;
6697 while (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(Arg)) {
6699 if (UnOpKind == UO_Deref)
6700 ExtWarnMSTemplateArg =
true;
6701 if (UnOpKind == UO_AddrOf || UnOpKind == UO_Deref) {
6704 FirstOpKind = UnOpKind;
6705 FirstOpLoc = UnOp->getOperatorLoc();
6711 if (ExtWarnMSTemplateArg)
6715 if (FirstOpKind == UO_AddrOf)
6716 AddressTaken =
true;
6720 assert(FirstOpKind == UO_Deref);
6743 bool ExtraParens =
false;
6745 if (!
Invalid && !ExtraParens) {
6751 Arg =
Parens->getSubExpr();
6755 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
6759 if (UnOp->getOpcode() == UO_AddrOf) {
6760 Arg = UnOp->getSubExpr();
6761 AddressTaken =
true;
6762 AddrOpLoc = UnOp->getOperatorLoc();
6767 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
6772 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Arg))
6773 Entity = DRE->getDecl();
6775 Entity = CUE->getGuidDecl();
6782 S.
Diag(Arg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
6785 CanonicalConverted =
6802 CanonicalConverted =
6823 if (
CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Entity)) {
6824 if (!Method->isStatic()) {
6833 VarDecl *Var = dyn_cast<VarDecl>(Entity);
6834 MSGuidDecl *Guid = dyn_cast<MSGuidDecl>(Entity);
6837 if (!
Func && !Var && !Guid) {
6849 ? diag::warn_cxx98_compat_template_arg_object_internal
6850 : diag::ext_template_arg_object_internal)
6852 S.
Diag(Entity->
getLocation(), diag::note_template_arg_internal_object)
6857 S.
Diag(Entity->
getLocation(), diag::note_template_arg_internal_object)
6886 S.
Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)
6892 S.
Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer)
6934 CanonicalConverted =
6948 Expr *Arg = ResultArg;
6949 bool ObjCLifetimeConversion;
6961 bool ExtraParens =
false;
6963 if (!
Invalid && !ExtraParens) {
6969 Arg =
Parens->getSubExpr();
6973 dyn_cast<SubstNonTypeTemplateParmExpr>(Arg))
6978 if (UnOp->getOpcode() == UO_AddrOf) {
6979 DRE = dyn_cast<DeclRefExpr>(UnOp->getSubExpr());
6985 else if ((DRE = dyn_cast<DeclRefExpr>(Arg))) {
6991 CanonicalConverted =
6995 CanonicalConverted =
7014 S.
Diag(ResultArg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
7026 ObjCLifetimeConversion)) {
7033 S.
Diag(ResultArg->
getBeginLoc(), diag::err_template_arg_not_convertible)
7041 diag::err_template_arg_not_pointer_to_member_form)
7050 ->isImplicitObjectMemberFunction()) &&
7051 "Only non-static member pointers can make it here");
7057 CanonicalConverted =
7062 CanonicalConverted =
7070 S.
Diag(Arg->
getBeginLoc(), diag::err_template_arg_not_pointer_to_member_form)
7090 auto *ArgPE = dyn_cast<PackExpansionExpr>(Arg);
7091 Expr *DeductionArg = ArgPE ? ArgPE->getPattern() : Arg;
7092 auto setDeductionArg = [&](
Expr *NewDeductionArg) {
7093 DeductionArg = NewDeductionArg;
7097 DeductionArg, ArgPE->getEllipsisLoc(), ArgPE->getNumExpansions());
7105 bool IsDeduced = DeducedT && !DeducedT->isDeduced();
7111 Context.getTrivialTypeSourceInfo(ParamType, Param->getLocation());
7116 DeductionArg->
getBeginLoc(),
false, DeductionArg);
7117 Expr *Inits[1] = {DeductionArg};
7124 Param->getTemplateDepth() + 1);
7140 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param))
7142 diag::err_non_type_template_parm_type_deduction_failure)
7143 << Param->getDeclName() << NTTP->getType() << Arg->
getType()
7149 assert(!ParamType.
isNull() &&
"substituting DependentTy can't fail");
7157 if (ParamType.
isNull()) {
7165 "non-type template parameter type cannot be qualified");
7179 setDeductionArg(E.
get());
7183 Context.getCanonicalTemplateArgument(SugaredConverted));
7192 : !
Context.hasSameUnqualifiedType(ParamType,
7198 Diag(StartLoc, diag::err_deduced_non_type_template_arg_type_mismatch)
7211 if (ArgPE && !StrictCheck) {
7214 Context.getCanonicalTemplateArgument(SugaredConverted));
7228 Context.hasSameUnqualifiedType(ParamType, InnerArg->
getType())) {
7230 if (
auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
7239 CanonicalConverted =
7240 Context.getCanonicalTemplateArgument(SugaredConverted);
7250 bool IsConvertedConstantExpression =
true;
7253 StartLoc,
false, DeductionArg);
7254 Expr *Inits[1] = {DeductionArg};
7269 IsConvertedConstantExpression =
false;
7278 if (IsConvertedConstantExpression) {
7280 DeductionArg, ParamType,
7288 ArgResult = DeductionArg;
7294 setDeductionArg(ArgResult.
get());
7296 CanonicalConverted =
7297 Context.getCanonicalTemplateArgument(SugaredConverted);
7304 false, PreNarrowingValue);
7307 setDeductionArg(ArgResult.
get());
7309 if (
Value.isLValue()) {
7328 if (
Value.hasLValuePath() &&
Value.getLValuePath().size() == 1 && VD &&
7330 Value.getLValuePath()[0].getAsArrayIndex() == 0 &&
7334 CanonicalConverted =
7335 Context.getCanonicalTemplateArgument(SugaredConverted);
7338 CanonicalConverted =
7347 if (!
Value.hasLValuePath() ||
Value.getLValuePath().size() ||
7348 Value.isLValueOnePastTheEnd()) {
7349 Diag(StartLoc, diag::err_non_type_template_arg_subobject)
7354 "null reference should not be a constant expression");
7356 "non-null value of type nullptr_t?");
7360 if (
Value.isAddrLabelDiff())
7361 return Diag(StartLoc, diag::err_non_type_template_arg_addr_label_diff);
7365 CanonicalConverted =
7366 Context.getCanonicalTemplateArgument(SugaredConverted);
7369 CanonicalConverted =
7376 assert(!ArgPE && !StrictCheck);
7408 Arg = ArgResult.
get();
7413 CanonicalConverted =
7414 Context.getCanonicalTemplateArgument(SugaredConverted);
7423 IntegerType = ED->getIntegerType();
7425 ?
Context.getIntWidth(IntegerType)
7426 :
Context.getTypeSize(IntegerType));
7429 CanonicalConverted =
7437 Arg = ArgResult.
get();
7449 if (!
ArgType->isIntegralOrEnumerationType()) {
7450 Diag(Arg->
getBeginLoc(), diag::err_template_arg_not_integral_or_enumeral)
7464 return S.
Diag(Loc, diag::err_template_arg_not_ice) <<
T;
7489 Diag(StartLoc, diag::err_template_arg_not_convertible)
7502 CanonicalConverted =
7503 Context.getCanonicalTemplateArgument(SugaredConverted);
7509 IntegerType = ED->getIntegerType();
7515 unsigned AllowedBits =
Context.getTypeSize(IntegerType);
7516 if (
Value.getBitWidth() != AllowedBits)
7520 llvm::APSInt OldValue =
Value;
7525 ?
Context.getIntWidth(IntegerType)
7526 :
Context.getTypeSize(IntegerType);
7527 if (
Value.getBitWidth() != AllowedBits)
7533 (OldValue.isSigned() && OldValue.isNegative())) {
7541 unsigned RequiredBits;
7543 RequiredBits = OldValue.getActiveBits();
7544 else if (OldValue.isUnsigned())
7545 RequiredBits = OldValue.getActiveBits() + 1;
7547 RequiredBits = OldValue.getSignificantBits();
7548 if (RequiredBits > AllowedBits) {
7558 CanonicalConverted =
7608 *
this, Param, ParamType, Arg, SugaredConverted,
7609 CanonicalConverted))
7615 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7626 "Only object pointers allowed here");
7629 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7641 assert(ParamRefType->getPointeeType()->isIncompleteOrObjectType() &&
7642 "Only object references allowed here");
7646 ParamRefType->getPointeeType(),
7661 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7670 CanonicalConverted =
7671 Context.getCanonicalTemplateArgument(SugaredConverted);
7678 << Arg->
getType() << ParamType;
7686 Diag(Arg->
getExprLoc(), diag::warn_cxx98_compat_template_arg_null);
7700 *
this, Param, ParamType, Arg, SugaredConverted, CanonicalConverted))
7723 unsigned DiagFoundKind = 0;
7725 if (
auto *TTP = llvm::dyn_cast<TemplateTemplateParmDecl>(
Template)) {
7726 switch (TTP->templateParameterKind()) {
7737 Kind = TTP->templateParameterKind();
7753 assert(
false &&
"Unexpected Decl");
7756 if (Kind == Param->templateParameterKind()) {
7760 unsigned DiagKind = 0;
7761 switch (Param->templateParameterKind()) {
7774 Diag(
Template->getLocation(), diag::note_template_arg_refers_to_template_here)
7788 bool *StrictPackMatch) {
7795 assert(Name.
isDependent() &&
"Non-dependent template isn't a declaration?");
7822 if (ParamsAC.empty())
7825 Template->getAssociatedConstraints(TemplateAC);
7827 bool IsParamAtLeastAsConstrained;
7829 IsParamAtLeastAsConstrained))
7831 if (!IsParamAtLeastAsConstrained) {
7833 diag::err_template_template_parameter_not_at_least_as_constrained)
7835 Diag(Param->getLocation(), diag::note_entity_declared_at) << Param;
7845 unsigned HereDiagID,
7846 unsigned ExternalDiagID) {
7851 llvm::raw_svector_ostream Out(Str);
7859 std::optional<SourceRange> ParamRange) {
7862 diag::note_template_decl_external);
7863 if (ParamRange && ParamRange->isValid()) {
7865 "Parameter range has location when Decl does not");
7872 diag::note_template_param_external);
7888 ParamType =
Context.getArrayDecayedType(ParamType);
7890 ParamType =
Context.getPointerType(ParamType);
7899 ? CK_NullToMemberPointer
7900 : CK_NullToPointer);
7903 "Only declaration template arguments permitted here");
7940 "arg for class template param not a template parameter object");
7945 "unexpected type for decl template argument");
7947 dyn_cast_if_present<NonTypeTemplateParmDecl>(
TemplateParam)) {
7948 QualType TemplateParamType = NTTP->getType();
7949 const AutoType *AT = TemplateParamType->
getAs<AutoType>();
7950 if (AT && AT->isDecltypeAuto()) {
7962 "value kind mismatch for non-type template argument");
7981 "unexpected conversion required for non-type template argument");
8008 T = ED->getIntegerType();
8011 if (
T->isAnyCharacterType()) {
8013 if (
T->isWideCharType())
8017 else if (
T->isChar16Type())
8019 else if (
T->isChar32Type())
8025 }
else if (
T->isBooleanType()) {
8059 llvm_unreachable(
"unexpected template argument value");
8084 return MakeInitList(
8097 return MakeInitList(Elts);
8102 llvm_unreachable(
"Unexpected APValue kind.");
8111 if (
T->isReferenceType()) {
8112 T =
T->getPointeeType();
8118 llvm_unreachable(
"Unhandled APValue::ValueKind enum");
8130 llvm_unreachable(
"not a non-type template argument");
8148 llvm_unreachable(
"Unhandled TemplateArgument::ArgKind enum");
8155 const NamedDecl *OldInstFrom,
bool Complain,
8160 unsigned NextDiag = diag::err_template_param_different_kind;
8161 if (TemplateArgLoc.
isValid()) {
8162 S.
Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
8163 NextDiag = diag::note_template_param_different_kind;
8165 S.
Diag(
New->getLocation(), NextDiag)
8180 unsigned NextDiag = diag::err_template_parameter_pack_non_pack;
8181 if (TemplateArgLoc.
isValid()) {
8182 S.
Diag(TemplateArgLoc,
8183 diag::err_template_arg_template_params_mismatch);
8184 NextDiag = diag::note_template_parameter_pack_non_pack;
8190 S.
Diag(
New->getLocation(), NextDiag)
8191 << ParamKind <<
New->isParameterPack();
8200 dyn_cast<NonTypeTemplateParmDecl>(Old)) {
8208 (!OldNTTP->getType()->isDependentType() &&
8218 unsigned NextDiag = diag::err_template_nontype_parm_different_type;
8219 if (TemplateArgLoc.
isValid()) {
8220 S.
Diag(TemplateArgLoc,
8221 diag::err_template_arg_template_params_mismatch);
8222 NextDiag = diag::note_template_nontype_parm_different_type;
8226 S.
Diag(OldNTTP->getLocation(),
8227 diag::note_template_nontype_parm_prev_declaration)
8228 << OldNTTP->getType();
8238 dyn_cast<TemplateTemplateParmDecl>(Old)) {
8244 OldTTP->getTemplateParameters(), Complain,
8255 const Expr *NewC =
nullptr, *OldC =
nullptr;
8259 NewC = TC->getImmediatelyDeclaredConstraint();
8261 OldC = TC->getImmediatelyDeclaredConstraint();
8264 ->getPlaceholderTypeConstraint())
8267 ->getPlaceholderTypeConstraint())
8270 llvm_unreachable(
"unexpected template parameter type");
8272 auto Diagnose = [&] {
8274 diag::err_template_different_type_constraint);
8276 diag::note_template_prev_declaration) << 0;
8279 if (!NewC != !OldC) {
8306 unsigned NextDiag = diag::err_template_param_list_different_arity;
8307 if (TemplateArgLoc.
isValid()) {
8308 S.
Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);
8309 NextDiag = diag::note_template_param_list_different_arity;
8311 S.
Diag(
New->getTemplateLoc(), NextDiag)
8312 << (
New->size() > Old->
size())
8324 if (Old->
size() !=
New->size()) {
8341 OldParmEnd = Old->
end();
8342 OldParm != OldParmEnd; ++OldParm, ++NewParm) {
8343 if (NewParm == NewParmEnd) {
8350 OldInstFrom, Complain, Kind,
8356 if (NewParm != NewParmEnd) {
8365 const Expr *NewRC =
New->getRequiresClause();
8370 diag::err_template_different_requires_clause);
8372 diag::note_template_prev_declaration) << 0;
8375 if (!NewRC != !OldRC) {
8411 Diag(Range.getBegin(), diag::err_template_linkage) << Range;
8413 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
8433 if (RD->isLocalClass())
8435 diag::err_template_inside_local_class)
8443 diag::err_template_outside_namespace_or_class_scope)
8454 return Record->getTemplateSpecializationKind();
8455 if (
FunctionDecl *Function = dyn_cast<FunctionDecl>(D))
8456 return Function->getTemplateSpecializationKind();
8457 if (
VarDecl *Var = dyn_cast<VarDecl>(D))
8510 S.
Diag(Loc, diag::err_template_spec_unknown_kind)
8520 S.
Diag(Loc, diag::err_template_spec_decl_function_scope)
8535 : DC->
Equals(SpecializedContext))) {
8537 S.
Diag(Loc, diag::err_template_spec_redecl_global_scope)
8538 << EntityKind << Specialized;
8541 int Diag = diag::err_template_spec_redecl_out_of_scope;
8543 Diag = diag::ext_ms_template_spec_redecl_out_of_scope;
8544 S.
Diag(Loc,
Diag) << EntityKind << Specialized
8545 << ND << isa<CXXRecordDecl>(ND);
8548 S.
Diag(Specialized->getLocation(), diag::note_specialized_entity);
8562 DependencyChecker Checker(Depth,
true);
8563 Checker.TraverseStmt(E);
8566 return Checker.MatchLoc;
8572 DependencyChecker Checker(Depth,
true);
8573 Checker.TraverseTypeLoc(TL);
8576 return Checker.MatchLoc;
8584 bool HasError =
false;
8585 for (
unsigned I = 0; I != NumArgs; ++I) {
8588 S, TemplateNameLoc, Param, Args[I].pack_begin(),
8589 Args[I].pack_size(), IsDefaultArgument))
8606 ArgExpr = Expansion->getPattern();
8610 ArgExpr = ICE->getSubExpr();
8620 if (
DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ArgExpr))
8624 if (
auto *ULE = dyn_cast<UnresolvedLookupExpr>(ArgExpr);
8646 if (ParamUseRange.
isValid()) {
8647 if (IsDefaultArgument) {
8648 S.
Diag(TemplateNameLoc,
8649 diag::err_dependent_non_type_arg_in_partial_spec);
8651 diag::note_dependent_non_type_default_arg_in_partial_spec)
8655 diag::err_dependent_non_type_arg_in_partial_spec)
8662 Param->getDepth(), Param->getTypeSourceInfo()->getTypeLoc());
8663 if (ParamUseRange.
isValid()) {
8665 diag::err_dependent_typed_non_type_arg_in_partial_spec)
8666 << Param->getType();
8685 for (
unsigned I = 0, N = TemplateParams->
size(); I != N; ++I) {
8687 = dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->
getParam(I));
8692 Param, &TemplateArgs[I],
8693 1, I >= NumExplicit))
8717 Diag(TemplateNameLoc, diag::err_not_class_template_specialization)
8723 if (
const auto *DSA =
ClassTemplate->getAttr<NoSpecializationsAttr>()) {
8724 auto Message = DSA->getMessage();
8725 Diag(TemplateNameLoc, diag::warn_invalid_specialization)
8727 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
8735 bool isMemberSpecialization =
false;
8736 bool isPartialSpecialization =
false;
8741 TemplateNameLoc, &TemplateId,
8753 KWLoc, TemplateNameLoc, SS, &TemplateId, TemplateParameterLists,
8768 if (TemplateParams && TemplateParams->
size() > 0) {
8769 isPartialSpecialization =
true;
8772 Diag(KWLoc, diag::err_partial_specialization_friend)
8780 for (
unsigned I = 0, N = TemplateParams->
size(); I != N; ++I) {
8783 if (TTP->hasDefaultArgument()) {
8784 Diag(TTP->getDefaultArgumentLoc(),
8785 diag::err_default_arg_in_partial_spec);
8786 TTP->removeDefaultArgument();
8789 = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
8790 if (NTTP->hasDefaultArgument()) {
8791 Diag(NTTP->getDefaultArgumentLoc(),
8792 diag::err_default_arg_in_partial_spec)
8793 << NTTP->getDefaultArgument().getSourceRange();
8794 NTTP->removeDefaultArgument();
8800 diag::err_default_arg_in_partial_spec)
8806 }
else if (TemplateParams) {
8808 Diag(KWLoc, diag::err_template_spec_friend)
8815 "should have a 'template<>' for this decl");
8822 "Invalid enum tag in class template spec!");
8826 Diag(KWLoc, diag::err_use_with_wrong_tag)
8831 diag::note_previous_use);
8840 for (
unsigned I = 0, N = TemplateArgs.
size(); I != N; ++I)
8842 isPartialSpecialization
8858 if (isPartialSpecialization) {
8860 TemplateArgs.
size(),
8867 !TemplateSpecializationType::anyDependentTemplateArguments(
8869 Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
8871 isPartialSpecialization =
false;
8876 void *InsertPos =
nullptr;
8879 if (isPartialSpecialization)
8893 isPartialSpecialization))
8896 if (!isPartialSpecialization) {
8904 if (TemplateParameterLists.size() > 0) {
8906 TemplateParameterLists);
8913 Context.getCanonicalTemplateSpecializationType(
8920 (!
Context.getLangOpts().CPlusPlus20 ||
8929 Diag(TemplateNameLoc, diag::err_partial_spec_args_match_primary_template)
8937 TemplateParameterLists.data());
8942 cast_or_null<ClassTemplatePartialSpecializationDecl>(PrevDecl);
8945 Context, Kind, DC, KWLoc, TemplateNameLoc, TemplateParams,
8949 if (TemplateParameterLists.size() > 1 && SS.
isSet()) {
8951 Context, TemplateParameterLists.drop_back(1));
8955 ClassTemplate->AddPartialSpecialization(Partial, InsertPos);
8984 Diag(TemplateNameLoc, diag::err_specialization_after_instantiation)
8988 diag::note_instantiation_required_here)
9003 bool HiddenDefVisible =
false;
9004 if (Def && SkipBody &&
9008 if (!HiddenDefVisible && Hidden)
9031 if (ModulePrivateLoc.
isValid())
9033 << (isPartialSpecialization? 1 : 0)
9101 diag::err_concept_decls_may_only_appear_in_global_namespace_scope);
9105 if (TemplateParameterLists.size() > 1) {
9106 Diag(NameLoc, diag::err_concept_extra_headers);
9112 if (Params->
size() == 0) {
9113 Diag(NameLoc, diag::err_concept_no_parameters);
9120 ParamEnd = Params->
end();
9121 ParamIt != ParamEnd; ++ParamIt) {
9122 Decl const *Param = *ParamIt;
9123 if (Param->isParameterPack()) {
9124 if (++ParamIt == ParamEnd)
9126 Diag(Param->getLocation(),
9127 diag::err_template_param_pack_must_be_last_template_parameter);
9138 Diag(NameLoc, diag::err_concept_no_associated_constraints);
9175 Expr *ConstraintExpr,
9177 assert(!
C->hasDefinition() &&
"Concept already defined");
9179 C->setInvalidDecl();
9182 C->setDefinition(ConstraintExpr);
9193 bool AddToScope =
true;
9197 if (!WasAlreadyAdded && AddToScope)
9210 auto *OldConcept = dyn_cast<ConceptDecl>(
Previous.getRepresentativeDecl()->getUnderlyingDecl());
9212 auto *Old =
Previous.getRepresentativeDecl();
9220 bool IsSame =
Context.isSameEntity(NewDecl, OldConcept);
9222 Diag(NewDecl->
getLocation(), diag::err_redefinition_different_concept)
9246 if (
auto *CE = llvm::dyn_cast<ConceptDecl>(
Concept);
9247 CE && !CE->isInvalidDecl() && !CE->hasDefinition()) {
9248 Diag(Loc, diag::err_recursive_concept) << CE;
9249 Diag(CE->getLocation(), diag::note_declared_at);
9262 D->
dropAttrs<DLLImportAttr, DLLExportAttr>();
9265 FD->setInlineSpecified(
false);
9276 for (
Decl *Prev = D; Prev && !PrevDiagLoc.
isValid();
9277 Prev = Prev->getPreviousDecl()) {
9278 PrevDiagLoc = Prev->getLocation();
9280 assert(PrevDiagLoc.
isValid() &&
9281 "Explicit instantiation without point of instantiation?");
9291 bool &HasNoEffect) {
9292 HasNoEffect =
false;
9299 "previous declaration must be implicit!");
9312 if (PrevPointOfInstantiation.
isInvalid()) {
9316 PrevDecl,
Context.getTargetInfo().getTriple().isOSCygMing());
9325 PrevPointOfInstantiation.
isValid()) &&
9326 "Explicit instantiation without point of instantiation?");
9340 Diag(NewLoc, diag::err_specialization_after_instantiation)
9342 Diag(PrevPointOfInstantiation, diag::note_instantiation_required_here)
9347 llvm_unreachable(
"The switch over PrevTSK must be exhaustive.");
9377 diag::err_explicit_instantiation_declaration_after_definition);
9383 diag::note_explicit_instantiation_definition_here);
9387 llvm_unreachable(
"Unexpected TemplateSpecializationKind!");
9403 Diag(NewLoc, diag::warn_explicit_instantiation_after_specialization)
9406 diag::note_previous_template_specialization);
9437 ? diag::ext_explicit_instantiation_duplicate
9438 : diag::err_explicit_instantiation_duplicate)
9441 diag::note_previous_explicit_instantiation);
9447 llvm_unreachable(
"Missing specialization/instantiation case?");
9457 enum DiscardReason { NotAFunctionTemplate, NotAMemberOfEnclosing };
9463 DiscardedCandidates.push_back(std::make_pair(NotAFunctionTemplate, D));
9470 DiscardedCandidates.push_back(std::make_pair(NotAMemberOfEnclosing, D));
9478 Diag(FD->
getLocation(), diag::err_dependent_function_template_spec_no_match)
9480 for (
auto &P : DiscardedCandidates)
9481 Diag(P.second->getLocation(),
9482 diag::note_dependent_function_template_spec_discard_reason)
9483 << P.first << IsFriend;
9488 ExplicitTemplateArgs);
9501 llvm::SmallDenseMap<FunctionDecl *, TemplateArgumentListInfo, 8>
9502 ConvertedTemplateArgs;
9525 if (
auto *NewMD = dyn_cast<CXXMethodDecl>(FD);
9526 !
getLangOpts().CPlusPlus14 && NewMD && NewMD->isConstexpr() &&
9528 auto *OldMD = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
9529 if (OldMD && OldMD->isConst()) {
9539 if (ExplicitTemplateArgs)
9540 Args = *ExplicitTemplateArgs;
9553 ExplicitTemplateArgs ? &Args :
nullptr, FT,
Specialization, Info);
9558 I.getPair(), FunTmpl->getTemplatedDecl(),
9572 CUDA().IdentifyTarget(FD,
true)) {
9574 I.getPair(), FunTmpl->getTemplatedDecl(),
9581 if (ExplicitTemplateArgs)
9590 if (QualifiedFriend && Candidates.
empty()) {
9596 if (
auto *OldFD = dyn_cast<FunctionDecl>(OldND->getUnderlyingDecl()))
9607 PDiag(diag::err_function_template_spec_ambiguous)
9608 << FD->
getDeclName() << (ExplicitTemplateArgs !=
nullptr),
9609 PDiag(diag::note_function_template_spec_matched));
9618 const auto *DSA = PT->getAttr<NoSpecializationsAttr>()) {
9619 auto Message = DSA->getMessage();
9621 << PT << !Message.empty() << Message;
9622 Diag(DSA->getLoc(), diag::note_marked_here) << DSA;
9650 auto *SpecializationFPT =
9661 assert(SpecInfo &&
"Function template specialization info missing?");
9699 bool HasNoEffect =
false;
9714 !isFriend || (InstFrom && InstFrom->getDependentSpecializationInfo())) {
9728 "This must be the only existing declaration of this specialization");
9743 FD->setFunctionTemplateSpecialization(
9746 ExplicitTemplateArgs ? &ConvertedTemplateArgs[
Specialization] :
nullptr);
9765 assert(!
Member->isTemplateDecl() && !
Member->getDescribedTemplate() &&
9766 "Only for non-template members");
9769 NamedDecl *FoundInstantiation =
nullptr;
9779 auto *
Method = dyn_cast<CXXMethodDecl>(Candidate->getUnderlyingDecl());
9797 Method->getTrailingRequiresClause() &&
9801 !Satisfaction.IsSatisfied))
9804 Candidates.
addDecl(Candidate);
9808 if (Candidates.
empty())
9825 FoundInstantiation = *Best;
9826 Instantiation = BestMethod;
9843 Diag(
Member->getLocation(), diag::err_function_member_spec_ambiguous)
9844 <<
Member << (InstantiatedFrom ? InstantiatedFrom : Instantiation);
9845 for (
NamedDecl *Candidate : Candidates) {
9846 Candidate = Candidate->getUnderlyingDecl();
9847 Diag(Candidate->getLocation(), diag::note_function_member_spec_matched)
9855 (PrevVar = dyn_cast<VarDecl>(
Previous.getFoundDecl())))
9857 FoundInstantiation =
Previous.getRepresentativeDecl();
9858 Instantiation = PrevVar;
9865 (PrevRecord = dyn_cast<CXXRecordDecl>(
Previous.getFoundDecl()))) {
9866 FoundInstantiation =
Previous.getRepresentativeDecl();
9867 Instantiation = PrevRecord;
9874 (PrevEnum = dyn_cast<EnumDecl>(
Previous.getFoundDecl()))) {
9875 FoundInstantiation =
Previous.getRepresentativeDecl();
9876 Instantiation = PrevEnum;
9882 if (!Instantiation) {
9907 Previous.addDecl(FoundInstantiation);
9912 if (!InstantiatedFrom) {
9913 Diag(
Member->getLocation(), diag::err_spec_member_not_instantiated)
9925 assert(MSInfo &&
"Member specialization info missing?");
9927 bool HasNoEffect =
false;
9939 Instantiation,
Member->getLocation(),
9945 if (
auto *MemberFunction = dyn_cast<FunctionDecl>(
Member)) {
9951 if (InstantiationFunction->
isDeleted()) {
9954 InstantiationFunction);
9960 MemberFunction->setInstantiationOfMemberFunction(
9962 }
else if (
auto *MemberVar = dyn_cast<VarDecl>(
Member)) {
9963 MemberVar->setInstantiationOfStaticDataMember(
9965 }
else if (
auto *MemberClass = dyn_cast<CXXRecordDecl>(
Member)) {
9966 MemberClass->setInstantiationOfMemberClass(
9968 }
else if (
auto *MemberEnum = dyn_cast<EnumDecl>(
Member)) {
9969 MemberEnum->setInstantiationOfMemberEnum(
9972 llvm_unreachable(
"unknown member specialization kind");
9978 Previous.addDecl(FoundInstantiation);
9987template<
typename DeclT>
9998 OrigD->setLocation(Loc);
10004 if (Instantiation ==
Member)
10007 if (
auto *
Function = dyn_cast<CXXMethodDecl>(Instantiation))
10009 else if (
auto *Var = dyn_cast<VarDecl>(Instantiation))
10011 else if (
auto *
Record = dyn_cast<CXXRecordDecl>(Instantiation))
10013 else if (
auto *
Enum = dyn_cast<EnumDecl>(Instantiation))
10016 llvm_unreachable(
"unknown member specialization kind");
10024 bool WasQualifiedName) {
10029 S.
Diag(InstLoc, diag::err_explicit_instantiation_in_class)
10042 if (WasQualifiedName) {
10043 if (CurContext->
Encloses(OrigContext))
10050 if (
NamespaceDecl *NS = dyn_cast<NamespaceDecl>(OrigContext)) {
10051 if (WasQualifiedName)
10054 diag::err_explicit_instantiation_out_of_scope :
10055 diag::warn_explicit_instantiation_out_of_scope_0x)
10060 diag::err_explicit_instantiation_unqualified_wrong_namespace :
10061 diag::warn_explicit_instantiation_unqualified_wrong_namespace_0x)
10066 diag::err_explicit_instantiation_must_be_global :
10067 diag::warn_explicit_instantiation_must_be_global_0x)
10076 bool WasQualifiedName,
10083 S.
Diag(InstLoc, diag::err_explicit_instantiation_internal_linkage) << D;
10111 NNS =
T->getPrefix();
10120 auto *A = cast_or_null<InheritableAttr>(
getDLLAttr(Def));
10121 assert(A &&
"dllExportImportClassTemplateSpecialization called "
10122 "on Def without dllexport or dllimport");
10127 "delayed exports present at explicit instantiation");
10131 for (
auto &B : Def->
bases()) {
10132 if (
auto *BT = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
10133 B.getType()->getAsCXXRecordDecl()))
10153 "Invalid enum tag in class template explicit instantiation!");
10159 Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << TD << NTK << Kind;
10165 Kind,
false, KWLoc,
10167 Diag(KWLoc, diag::err_use_with_wrong_tag)
10172 diag::note_previous_use);
10185 !
Context.getTargetInfo().getTriple().isOSCygMing()) {
10189 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10191 diag::warn_attribute_dllexport_explicit_instantiation_decl);
10192 Diag(AL.getLoc(), diag::note_attribute);
10197 if (
auto *A =
ClassTemplate->getTemplatedDecl()->getAttr<DLLExportAttr>()) {
10199 diag::warn_attribute_dllexport_explicit_instantiation_decl);
10200 Diag(A->getLocation(), diag::note_attribute);
10206 bool DLLImportExplicitInstantiationDef =
false;
10208 Context.getTargetInfo().getCXXABI().isMicrosoft()) {
10211 ClassTemplate->getTemplatedDecl()->getAttr<DLLImportAttr>();
10213 if (AL.getKind() == ParsedAttr::AT_DLLImport)
10215 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10223 DLLImportExplicitInstantiationDef =
true;
10242 void *InsertPos =
nullptr;
10250 Context.getTargetInfo().getTriple().isOSCygMing()) {
10254 if (AL.getKind() == ParsedAttr::AT_DLLExport) {
10256 diag::warn_attribute_dllexport_explicit_instantiation_def);
10268 bool HasNoEffect =
false;
10271 PrevDecl, PrevDecl_TSK,
10288 PrevDecl =
nullptr;
10292 DLLImportExplicitInstantiationDef) {
10294 HasNoEffect =
false;
10309 if (
const auto *A = PrevDecl->
getAttr<MSInheritanceAttr>()) {
10311 Clone->setInherited(
true);
10317 if (!HasNoEffect && !PrevDecl) {
10330 bool PreviouslyDLLExported =
Specialization->hasAttr<DLLExportAttr>();
10355 = cast_or_null<ClassTemplateSpecializationDecl>(
10367 Def = cast_or_null<ClassTemplateSpecializationDecl>(
10375 DLLImportExplicitInstantiationDef)) {
10380 Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
10386 A->setInherited(
true);
10394 bool NewlyDLLExported =
10395 !PreviouslyDLLExported &&
Specialization->hasAttr<DLLExportAttr>();
10397 Context.getTargetInfo().shouldDLLImportComdatSymbols()) {
10411 "Def and Specialization should match for implicit instantiation");
10418 Context.getTargetInfo().getTriple().isOSCygMing() &&
10419 PrevDecl->
hasAttr<DLLExportAttr>()) {
10443 bool Owned =
false;
10444 bool IsDependent =
false;
10452 assert(!IsDependent &&
"explicit instantiation of dependent name not yet handled");
10458 assert(!Tag->isEnum() &&
"shouldn't see enumerations here");
10460 if (Tag->isInvalidDecl())
10466 Diag(TemplateLoc, diag::err_explicit_instantiation_nontemplate_type)
10468 Diag(
Record->getLocation(), diag::note_nontemplate_decl_here);
10479 Diag(TemplateLoc, diag::ext_explicit_instantiation_without_qualified_id)
10494 = cast_or_null<CXXRecordDecl>(
Record->getPreviousDecl());
10495 if (!PrevDecl &&
Record->getDefinition())
10499 bool HasNoEffect =
false;
10500 assert(MSInfo &&
"No member specialization information?");
10512 = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
10520 Diag(TemplateLoc, diag::err_explicit_instantiation_undefined_member)
10521 << 0 <<
Record->getDeclName() <<
Record->getDeclContext();
10531 RecordDef = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
10562 diag::err_explicit_instantiation_requires_name)
10601 diag::err_explicit_instantiation_inline :
10602 diag::warn_explicit_instantiation_inline_0x)
10608 diag::err_explicit_instantiation_constexpr);
10644 if (!PrevTemplate) {
10651 Diag((*P)->getLocation(), diag::note_explicit_instantiation_here);
10658 diag::err_explicit_instantiation_data_member_not_instantiated)
10673 Diag(
T->getTypeLoc().getBeginLoc(),
10674 diag::err_auto_not_allowed_var_inst);
10683 diag::err_explicit_instantiation_without_template_id)
10685 Diag(PrevTemplate->getLocation(),
10686 diag::note_explicit_instantiation_here);
10696 TemplateArgs,
true);
10725 diag::ext_explicit_instantiation_without_qualified_id)
10733 bool HasNoEffect =
false;
10735 PrevTSK, POI, HasNoEffect))
10738 if (!HasNoEffect) {
10741 if (
auto *VTSD = dyn_cast<VarTemplatePartialSpecializationDecl>(Prev)) {
10742 VTSD->setExternKeywordLoc(ExternLoc);
10743 VTSD->setTemplateKeywordLoc(TemplateLoc);
10757 Diag(
T->getTypeLoc().getBeginLoc(),
10758 diag::err_invalid_var_template_spec_type)
10759 << 0 << PrevTemplate << R << Prev->
getType();
10760 Diag(PrevTemplate->getLocation(), diag::note_template_declared_here)
10761 << 2 << PrevTemplate->getDeclName();
10766 return (
Decl*)
nullptr;
10771 bool HasExplicitTemplateArgs =
false;
10775 HasExplicitTemplateArgs =
true;
10790 if (!HasExplicitTemplateArgs) {
10794 if (
Context.hasSameUnqualifiedType(
Method->getType(), Adjusted)) {
10795 if (
Method->getPrimaryTemplate()) {
10799 C.FoundDecl = P.getPair();
10803 if (
Method->getTrailingRequiresClause() &&
10822 FunTmpl, (HasExplicitTemplateArgs ? &TemplateArgs :
nullptr), R,
10853 if (!NonTemplateMatches.
empty()) {
10864 Msg = diag::err_explicit_instantiation_ambiguous;
10868 Msg = diag::err_explicit_instantiation_no_candidate;
10884 TemplateMatches.
begin(), TemplateMatches.
end(),
10886 PDiag(diag::err_explicit_instantiation_not_known) << Name,
10887 PDiag(diag::err_explicit_instantiation_ambiguous) << Name,
10888 PDiag(diag::note_explicit_instantiation_candidate));
10904 if (FPT->hasExceptionSpec()) {
10906 diag::err_mismatched_exception_spec_explicit_instantiation;
10908 DiagID = diag::ext_mismatched_exception_spec_explicit_instantiation;
10911 PDiag(diag::note_explicit_instantiation_here),
10922 diag::err_explicit_instantiation_member_function_not_instantiated)
10931 if (!PrevDecl &&
Specialization->isThisDeclarationADefinition())
10935 bool HasNoEffect =
false;
10946 return (
Decl*)
nullptr;
10957 if (
auto *RD = dyn_cast<CXXRecordDecl>(
Specialization->getDeclContext()))
10958 if (RD->getIdentifier() && RD->getIdentifier()->isStr(
"valarray") &&
10959 RD->isInStdNamespace())
10960 return (
Decl*)
nullptr;
10970 Context.getTargetInfo().getCXXABI().isMicrosoft())
10994 diag::ext_explicit_instantiation_without_qualified_id)
11004 return (
Decl*)
nullptr;
11013 assert(Name &&
"Expected a name in a dependent tag");
11022 Diag(NameLoc, diag::err_dependent_tag_decl)
11049 DiagCompat(TypenameLoc, diag_compat::typename_outside_of_template)
11057 TypenameLoc, QualifierLoc, II, IdLoc, &TSI,
11073 ? diag::compat_cxx11_typename_outside_of_template
11074 : diag::compat_pre_cxx11_typename_outside_of_template)
11082 if (LookupRD && LookupRD->getIdentifier() == TemplateII) {
11083 Diag(TemplateIILoc,
11084 diag::ext_out_of_line_qualified_id_type_names_constructor)
11086 << (TemplateKWLoc.
isValid() ? 1 : 0 );
11097 TemplateIn.
get(), TemplateIILoc, TemplateArgs,
11107 TemplateIILoc, TemplateArgs);
11117 if (!II.
isStr(
"type"))
11125 auto EnableIfTSTLoc =
11127 if (!EnableIfTSTLoc || EnableIfTSTLoc.getNumArgs() == 0)
11129 const TemplateSpecializationType *EnableIfTST = EnableIfTSTLoc.
getTypePtr();
11133 EnableIfTST->getTemplateName().getAsTemplateDecl();
11134 if (!EnableIfDecl || EnableIfTST->isIncompleteType())
11140 if (!EnableIfII || !EnableIfII->
isStr(
"enable_if"))
11144 CondRange = EnableIfTSTLoc.getArgLoc(0).getSourceRange();
11148 if (EnableIfTSTLoc.getArgLoc(0).getArgument().getKind()
11152 Cond = EnableIfTSTLoc.getArgLoc(0).getSourceExpression();
11168 bool DeducedTSTContext) {
11170 DeducedTSTContext);
11177 TL.setElaboratedKeywordLoc(KeywordLoc);
11178 TL.setQualifierLoc(QualifierLoc);
11179 TL.setNameLoc(IILoc);
11182 TL.setElaboratedKeywordLoc(KeywordLoc);
11183 TL.setQualifierLoc(QualifierLoc);
11184 TL.setNameLoc(IILoc);
11188 assert(!QualifierLoc);
11192 TL.setElaboratedKeywordLoc(KeywordLoc);
11193 TL.setQualifierLoc(QualifierLoc);
11194 TL.setNameLoc(IILoc);
11215 SS.
Adopt(QualifierLoc);
11218 if (QualifierLoc) {
11245 unsigned DiagID = 0;
11246 Decl *Referenced =
nullptr;
11247 switch (
Result.getResultKind()) {
11258 std::string FailedDescription;
11259 std::tie(FailedCond, FailedDescription) =
11263 diag::err_typename_nested_not_found_requirement)
11264 << FailedDescription
11270 diag::err_typename_nested_not_found_enable_if)
11271 << Ctx << CondRange;
11275 DiagID = Ctx ? diag::err_typename_nested_not_found
11276 : diag::err_unknown_typename;
11285 Diag(IILoc, diag::err_typename_refers_to_using_value_decl)
11286 << Name << Ctx << FullRange;
11288 = dyn_cast<UnresolvedUsingValueDecl>(
Result.getRepresentativeDecl())){
11290 Diag(Loc, diag::note_using_value_decl_missing_typename)
11330 assert(!QualifierLoc);
11333 return Context.getTypeDeclType(
11343 if (!DeducedTSTContext) {
11346 Diag(IILoc, diag::err_dependent_deduced_tst)
11348 <<
QualType(Qualifier.getAsType(), 0);
11350 Diag(IILoc, diag::err_deduced_tst)
11358 return Context.getDeducedTemplateSpecializationType(
11363 DiagID = Ctx ? diag::err_typename_nested_not_type
11364 : diag::err_typename_not_type;
11365 Referenced =
Result.getFoundDecl();
11369 DiagID = Ctx ? diag::err_typename_nested_not_type
11370 : diag::err_typename_not_type;
11371 Referenced = *
Result.begin();
11383 Diag(IILoc, DiagID) << FullRange << Name << Ctx;
11385 Diag(IILoc, DiagID) << FullRange << Name;
11388 Ctx ? diag::note_typename_member_refers_here
11389 : diag::note_typename_refers_here)
11396 class CurrentInstantiationRebuilder
11404 CurrentInstantiationRebuilder(
Sema &SemaRef,
11408 Loc(Loc), Entity(Entity) { }
11416 return T.isNull() || !
T->isInstantiationDependentType();
11421 SourceLocation getBaseLocation() {
return Loc; }
11424 DeclarationName getBaseEntity() {
return Entity; }
11428 void setBase(SourceLocation Loc, DeclarationName Entity) {
11430 this->Entity = Entity;
11443 if (!
T || !
T->getType()->isInstantiationDependentType())
11446 CurrentInstantiationRebuilder Rebuilder(*
this, Loc, Name);
11447 return Rebuilder.TransformType(
T);
11451 CurrentInstantiationRebuilder Rebuilder(*
this, E->
getExprLoc(),
11453 return Rebuilder.TransformExpr(E);
11464 = Rebuilder.TransformNestedNameSpecifierLoc(QualifierLoc);
11474 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
11483 = dyn_cast<TemplateTemplateParmDecl>(Param)) {
11485 TTP->getTemplateParameters()))
11527 unsigned NumArgs) {
11529 llvm::raw_svector_ostream Out(Str);
11531 if (!Params || Params->
size() == 0 || NumArgs == 0)
11532 return std::string();
11534 for (
unsigned I = 0, N = Params->
size(); I != N; ++I) {
11544 Out << Id->getName();
11556 return std::string(Out.str());
11564 auto LPT = std::make_unique<LateParsedTemplate>();
11567 LPT->Toks.swap(Toks);
11614class ExplicitSpecializationVisibilityChecker {
11623 : S(S), Loc(Loc), Kind(Kind) {}
11626 if (
auto *FD = dyn_cast<FunctionDecl>(ND))
11627 return checkImpl(FD);
11628 if (
auto *RD = dyn_cast<CXXRecordDecl>(ND))
11629 return checkImpl(RD);
11630 if (
auto *VD = dyn_cast<VarDecl>(ND))
11631 return checkImpl(VD);
11632 if (
auto *ED = dyn_cast<EnumDecl>(ND))
11633 return checkImpl(ED);
11637 void diagnose(NamedDecl *D,
bool IsPartialSpec) {
11638 auto Kind = IsPartialSpec ? Sema::MissingImportKind::PartialSpecialization
11639 : Sema::MissingImportKind::ExplicitSpecialization;
11640 const bool Recover =
true;
11645 if (Modules.empty())
11651 bool CheckMemberSpecialization(
const NamedDecl *D) {
11652 return Kind == Sema::AcceptableKind::Visible
11657 bool CheckExplicitSpecialization(
const NamedDecl *D) {
11658 return Kind == Sema::AcceptableKind::Visible
11663 bool CheckDeclaration(
const NamedDecl *D) {
11680 template<
typename SpecDecl>
11681 void checkImpl(SpecDecl *Spec) {
11682 bool IsHiddenExplicitSpecialization =
false;
11686 if constexpr (std::is_same_v<SpecDecl, FunctionDecl>)
11687 SpecKind = Spec->getTemplateSpecializationKindForInstantiation();
11689 IsHiddenExplicitSpecialization = Spec->getMemberSpecializationInfo()
11690 ? !CheckMemberSpecialization(Spec)
11691 : !CheckExplicitSpecialization(Spec);
11693 checkInstantiated(Spec);
11696 if (IsHiddenExplicitSpecialization)
11697 diagnose(Spec->getMostRecentDecl(),
false);
11700 void checkInstantiated(FunctionDecl *FD) {
11705 void checkInstantiated(CXXRecordDecl *RD) {
11706 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RD);
11710 auto From = SD->getSpecializedTemplateOrPartial();
11711 if (
auto *TD = From.dyn_cast<ClassTemplateDecl *>())
11713 else if (
auto *TD =
11714 From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
11715 if (!CheckDeclaration(TD))
11716 diagnose(TD,
true);
11721 void checkInstantiated(VarDecl *RD) {
11722 auto *SD = dyn_cast<VarTemplateSpecializationDecl>(RD);
11726 auto From = SD->getSpecializedTemplateOrPartial();
11727 if (
auto *TD = From.dyn_cast<VarTemplateDecl *>())
11729 else if (
auto *TD =
11730 From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
11731 if (!CheckDeclaration(TD))
11732 diagnose(TD,
true);
11737 void checkInstantiated(EnumDecl *FD) {}
11739 template<
typename TemplDecl>
11740 void checkTemplate(TemplDecl *TD) {
11741 if (TD->isMemberSpecialization()) {
11742 if (!CheckMemberSpecialization(TD))
11743 diagnose(TD->getMostRecentDecl(),
false);
11753 ExplicitSpecializationVisibilityChecker(*
this, Loc,
11763 ExplicitSpecializationVisibilityChecker(*
this, Loc,
11771 if (
const auto *FD = dyn_cast<FunctionDecl>(N)) {
11779 if (!CSC.isInstantiationRecord() || CSC.PointOfInstantiation.isInvalid())
11781 return CSC.PointOfInstantiation;
Defines the clang::ASTContext interface.
Defines enum values for all the target-independent builtin functions.
static Decl::Kind getKind(const Decl *D)
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.
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 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, 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.
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
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,...
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
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.
QualType getUnconstrainedType(QualType T) const
Remove any type constraints from a template parameter type, for equivalence comparison of template pa...
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.
ClassTemplateDecl * getInstantiatedFromMemberTemplate() const
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
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.
Expr * getConstraintExpr() const
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...
bool WantExpressionKeywords
bool WantRemainingKeywords
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 ...
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,...
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).
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
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)
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...
Represents a vector type where either the type or size is dependent.
virtual bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc)
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...
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={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
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.
bool wasNotFoundInCurrentInstantiation() const
Determine whether no result was found because we could not search into dependent base classes of the ...
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
void setTemplateNameLookup(bool TemplateName)
Sets whether this is a template-name lookup.
DeclClass * getAsSingle() const
bool empty() const
Return true if no decls were found.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Filter makeFilter()
Create a filter for this result set.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
CXXRecordDecl * getNamingClass() const
Returns the 'naming class' for this lookup, i.e.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
UnresolvedSetImpl::iterator iterator
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
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...
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
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.
QualType getExpansionType(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
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.
bool isVarDeclReference() const
TemplateTemplateParmDecl * getTemplateTemplateDecl() const
bool isConceptReference() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
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)
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.
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId, bool DeferHint=false)
Emit a compatibility diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
void 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.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
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 BuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, const NonTypeTemplateParmDecl *NTTP, SourceLocation loc, TemplateArgument Replacement, UnsignedOrNone PackIndex, bool Final)
ExprResult RebuildExprInCurrentInstantiation(Expr *E)
DeclResult ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, LookupResult &Previous, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization)
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)
TemplateNameKind isTemplateName(Scope *S, CXXScopeSpec &SS, bool hasTemplateKeyword, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Template, bool &MemberOfUnknownSpecialization, bool Disambiguation=false)
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...
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.
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)
unsigned NumSFINAEErrors
The number of SFINAE diagnostics that have been trapped.
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.
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
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)
void AddPushedVisibilityAttribute(Decl *RD)
AddPushedVisibilityAttribute - If '#pragma GCC visibility' was used, add an appropriate visibility at...
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
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,...
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...
bool IsFunctionConversion(QualType FromType, QualType ToType, bool *DiscardingCFIUncheckedCallee=nullptr, bool *AddingCFIUncheckedCallee=nullptr) const
Determine whether the conversion from FromType to ToType is a valid conversion that strips "noexcept"...
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 DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
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 ...
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 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.
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)
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
ExprResult CheckConceptTemplateId(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const TemplateArgumentListInfo *TemplateArgs)
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.
ExprResult CheckVarOrConceptTemplateTemplateId(const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, TemplateTemplateParmDecl *Template, SourceLocation TemplateLoc, const TemplateArgumentListInfo *TemplateArgs)
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...
@ 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.
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
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)
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)
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
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.
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)
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
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)
void setMemberSpecialization()
Note that this member template is a specialization.
VarTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member variable template partial specialization from which this particular variable temp...
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.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
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,...
The JSON file list parser is used to communicate input to InstallAPI.
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.
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
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.
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.