Skip to content

Commit 0652dcc

Browse files
zyn0217cor3ntin
authored andcommitted
Fix more ByteCode tests
Only 5 tests left now: Failed Tests (5): Clang :: CXX/expr/expr.prim/expr.prim.req/nested-requirement.cpp Clang :: Modules/pr62943.cppm Clang :: SemaCXX/cxx2c-fold-exprs.cpp Clang :: SemaTemplate/concepts-recursive-inst.cpp Clang :: SemaTemplate/instantiate-template-argument.cpp
1 parent 2adf94a commit 0652dcc

File tree

7 files changed

+104
-53
lines changed

7 files changed

+104
-53
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11987,6 +11987,13 @@ class Sema final : public SemaBase {
1198711987
bool UpdateArgsWithConversions = true,
1198811988
bool *ConstraintsNotSatisfied = nullptr);
1198911989

11990+
bool CheckTemplateArgumentList(
11991+
TemplateDecl *Template, TemplateParameterList *Params,
11992+
SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
11993+
const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
11994+
CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions = true,
11995+
bool *ConstraintsNotSatisfied = nullptr);
11996+
1199011997
bool CheckTemplateTypeArgument(
1199111998
TemplateTypeParmDecl *Param, TemplateArgumentLoc &Arg,
1199211999
SmallVectorImpl<TemplateArgument> &SugaredConverted,
@@ -13329,7 +13336,7 @@ class Sema final : public SemaBase {
1332913336
TemplateArgumentListInfo &Outputs);
1333013337

1333113338
bool SubstTemplateArgumentsInParameterMapping(
13332-
ArrayRef<TemplateArgumentLoc> Args,
13339+
ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
1333313340
const MultiLevelTemplateArgumentList &TemplateArgs,
1333413341
TemplateArgumentListInfo &Out);
1333513342

clang/include/clang/Sema/SemaConcept.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct NormalizedConstraint {
6969
unsigned PackSubstitutionIndex : 26;
7070
llvm::SmallBitVector Indexes;
7171
TemplateArgumentLoc *Args;
72+
TemplateParameterList *ParamList;
7273
ExprOrConcept ConstraintExpr;
7374
const NamedDecl *ConstraintDecl;
7475
};
@@ -81,6 +82,7 @@ struct NormalizedConstraint {
8182
unsigned Placeholder : 26;
8283
OccurenceList Indexes;
8384
TemplateArgumentLoc *Args;
85+
TemplateParameterList *ParamList;
8486
const Expr *Pattern;
8587
NormalizedConstraint *Constraint;
8688
};
@@ -118,6 +120,7 @@ struct NormalizedConstraint {
118120
PackIndex.toInternalRepresentation(),
119121
/*Indexes=*/{},
120122
/*Args=*/nullptr,
123+
/*ParamList=*/nullptr,
121124
ConstraintExpr,
122125
ConstraintDecl} {}
123126

@@ -128,6 +131,7 @@ struct NormalizedConstraint {
128131
/*Placeholder=*/0,
129132
/*Indexes=*/{},
130133
/*Args=*/nullptr,
134+
/*ParamList=*/nullptr,
131135
Pattern,
132136
Constraint} {}
133137

@@ -138,7 +142,8 @@ struct NormalizedConstraint {
138142
: ConceptId{{llvm::to_underlying(ConstraintKind::ConceptId),
139143
/*Placeholder=*/0, PackIndex.toInternalRepresentation(),
140144
/*Indexes=*/{},
141-
/*Args=*/nullptr, ConceptId, ConstraintDecl},
145+
/*Args=*/nullptr, /*ParamList=*/nullptr, ConceptId,
146+
ConstraintDecl},
142147
SubConstraint} {}
143148

144149
NormalizedConstraint(NormalizedConstraint *LHS, CompoundConstraintKind CCK,
@@ -160,15 +165,18 @@ struct NormalizedConstraint {
160165
return {Atomic.Args, Atomic.Indexes.count()};
161166
}
162167

163-
void InitParameterMapping(TemplateParameterList *TemplateParams, const Expr *,
164-
const ASTTemplateArgumentListInfo *ArgsAsWritten);
168+
TemplateParameterList *getUsedTemplateParamList() const {
169+
return Atomic.ParamList;
170+
}
165171

166172
void updateParameterMapping(OccurenceList Indexes,
167-
llvm::MutableArrayRef<TemplateArgumentLoc> Args) {
173+
llvm::MutableArrayRef<TemplateArgumentLoc> Args,
174+
TemplateParameterList *ParamList) {
168175
assert(getKind() != ConstraintKind::Compound);
169176
assert(Indexes.count() == Args.size());
170177
Atomic.Indexes = Indexes;
171178
Atomic.Args = Args.data();
179+
Atomic.ParamList = ParamList;
172180
}
173181

174182
bool hasMatchingParameterMapping(ASTContext &C,
@@ -283,6 +291,7 @@ class NormalizedConstraintWithParamMapping : public NormalizedConstraint {
283291
using NormalizedConstraint::hasParameterMapping;
284292
using NormalizedConstraint::mappingOccurenceList;
285293
using NormalizedConstraint::updateParameterMapping;
294+
using NormalizedConstraint::getUsedTemplateParamList;
286295

287296
const NamedDecl *getConstraintDecl() const { return Atomic.ConstraintDecl; }
288297

@@ -307,12 +316,6 @@ class AtomicConstraint : public NormalizedConstraintWithParamMapping {
307316
const Expr *getConstraintExpr() const {
308317
return cast<const Expr *>(Atomic.ConstraintExpr);
309318
}
310-
311-
void InitParameterMapping(const ASTTemplateArgumentListInfo *ArgsAsWritten) {
312-
NormalizedConstraint::InitParameterMapping(
313-
cast<TemplateDecl>(Atomic.ConstraintDecl)->getTemplateParameters(),
314-
getConstraintExpr(), ArgsAsWritten);
315-
}
316319
};
317320

318321
class FoldExpandedConstraint : public NormalizedConstraint {

clang/lib/Sema/SemaConcept.cpp

Lines changed: 59 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -377,16 +377,18 @@ SubstitutionInTemplateArguments(
377377
? Constraint.getPackSubstitutionIndex()
378378
: PackSubstitutionIndex);
379379
if (S.SubstTemplateArgumentsInParameterMapping(
380-
Constraint.getParameterMapping(), MLTAL, SubstArgs) ||
380+
Constraint.getParameterMapping(), Constraint.getBeginLoc(), MLTAL,
381+
SubstArgs) ||
381382
Trap.hasErrorOccurred())
382383
return std::nullopt;
383-
// Sema::CheckTemplateArgumentInfo CTAI;
384-
// auto *TD = const_cast<TemplateDecl *>(
385-
// cast<TemplateDecl>(Constraint.getConstraintDecl()));
386-
// if (S.CheckTemplateArgumentList(TD, TD->getLocation(), SubstArgs,
387-
// /*DefaultArguments=*/{},
388-
// /*PartialTemplateArgs=*/true, CTAI))
389-
// return std::nullopt;
384+
Sema::CheckTemplateArgumentInfo CTAI;
385+
auto *TD = const_cast<TemplateDecl *>(
386+
cast<TemplateDecl>(Constraint.getConstraintDecl()));
387+
if (S.CheckTemplateArgumentList(TD, Constraint.getUsedTemplateParamList(),
388+
TD->getLocation(), SubstArgs,
389+
/*DefaultArguments=*/{},
390+
/*PartialTemplateArgs=*/false, CTAI))
391+
return std::nullopt;
390392
NormalizedConstraint::OccurenceList Used =
391393
Constraint.mappingOccurenceList();
392394
SubstitutedOuterMost =
@@ -396,8 +398,10 @@ SubstitutionInTemplateArguments(
396398
if (Used[I])
397399
// SubstitutedOuterMost[I].dump();
398400
// SubstArgs[MappedIndex].getArgument().dump();
401+
// Arg = S.Context.getCanonicalTemplateArgument(
402+
// SubstArgs[MappedIndex++].getArgument());
399403
Arg = S.Context.getCanonicalTemplateArgument(
400-
SubstArgs[MappedIndex++].getArgument());
404+
CTAI.SugaredConverted[MappedIndex++]);
401405
if (I < SubstitutedOuterMost.size())
402406
SubstitutedOuterMost[I] = Arg;
403407
else
@@ -1607,17 +1611,28 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16071611
}
16081612
TemplateArgumentLoc *TempArgs =
16091613
new (S.Context) TemplateArgumentLoc[OccurringIndices.count()];
1614+
llvm::SmallVector<NamedDecl *> UsedParams;
16101615
for (unsigned I = 0, J = 0, C = TemplateParams->size(); I != C; ++I) {
16111616
SourceLocation Loc = ArgsAsWritten->NumTemplateArgs > I
16121617
? ArgsAsWritten->arguments()[I].getLocation()
16131618
: SourceLocation();
1614-
if (OccurringIndices[I])
1615-
new (&(TempArgs)[J++]) TemplateArgumentLoc(
1616-
S.getIdentityTemplateArgumentLoc(TemplateParams->begin()[I], Loc));
1619+
if (OccurringIndices[I]) {
1620+
NamedDecl *Param = TemplateParams->begin()[I];
1621+
new (&(TempArgs)[J])
1622+
TemplateArgumentLoc(S.getIdentityTemplateArgumentLoc(Param, Loc));
1623+
UsedParams.push_back(Param);
1624+
J++;
1625+
}
16171626
}
1627+
auto *UsedList = TemplateParameterList::Create(
1628+
S.Context, TemplateParams->getTemplateLoc(),
1629+
TemplateParams->getLAngleLoc(), UsedParams,
1630+
/*RAngleLoc=*/SourceLocation(),
1631+
/*RequiresClause=*/nullptr);
16181632
N.updateParameterMapping(OccurringIndices,
16191633
MutableArrayRef<TemplateArgumentLoc>{
1620-
TempArgs, OccurringIndices.count()});
1634+
TempArgs, OccurringIndices.count()},
1635+
UsedList);
16211636
}
16221637
SourceLocation InstLocBegin =
16231638
ArgsAsWritten->arguments().empty()
@@ -1634,28 +1649,39 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16341649
{InstLocBegin, InstLocEnd});
16351650
if (Inst.isInvalid())
16361651
return true;
1637-
if (S.SubstTemplateArgumentsInParameterMapping(N.getParameterMapping(), MLTAL,
1638-
SubstArgs))
1652+
// TransformTemplateArguments is unable to preserve the source location of a
1653+
// pack. The SourceLocation is necessary for the instantiation location.
1654+
// FIXME: The BaseLoc will be used as the location of the pack expansion,
1655+
// which is wrong.
1656+
if (S.SubstTemplateArgumentsInParameterMapping(
1657+
N.getParameterMapping(), N.getBeginLoc(), MLTAL, SubstArgs))
1658+
return true;
1659+
Sema::CheckTemplateArgumentInfo CTAI;
1660+
auto *TD =
1661+
const_cast<TemplateDecl *>(cast<TemplateDecl>(N.getConstraintDecl()));
1662+
if (S.CheckTemplateArgumentList(TD, N.getUsedTemplateParamList(),
1663+
TD->getLocation(), SubstArgs,
1664+
/*DefaultArguments=*/{},
1665+
/*PartialTemplateArgs=*/false, CTAI))
16391666
return true;
1640-
// Sema::CheckTemplateArgumentInfo CTAI;
1641-
// auto *TD =
1642-
// const_cast<TemplateDecl *>(cast<TemplateDecl>(N.getConstraintDecl()));
1643-
// if (S.CheckTemplateArgumentList(TD, TD->getLocation(), SubstArgs,
1644-
// /*DefaultArguments=*/{},
1645-
// /*PartialTemplateArgs=*/true, CTAI))
1646-
// return true;
16471667
TemplateArgumentLoc *TempArgs =
1648-
new (S.Context) TemplateArgumentLoc[SubstArgs.size()];
1649-
// for (unsigned I = 0; I < CTAI.SugaredConverted.size(); ++I)
1650-
// TempArgs[I] = S.getTrivialTemplateArgumentLoc(CTAI.SugaredConverted[I],
1651-
// QualType(), SourceLocation());
1652-
llvm::copy(SubstArgs.arguments(), TempArgs);
1653-
N.updateParameterMapping(
1654-
N.mappingOccurenceList(),
1655-
MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));
1656-
// N.updateParameterMapping(N.mappingOccurenceList(),
1657-
// MutableArrayRef<TemplateArgumentLoc>(
1658-
// TempArgs, CTAI.SugaredConverted.size()));
1668+
new (S.Context) TemplateArgumentLoc[CTAI.SugaredConverted.size()];
1669+
for (unsigned I = 0; I < CTAI.SugaredConverted.size(); ++I) {
1670+
SourceLocation Loc;
1671+
// If this is an empty pack, we have no corresponding SubstArgs.
1672+
if (I < SubstArgs.size())
1673+
Loc = SubstArgs.arguments()[I].getLocation();
1674+
TempArgs[I] = S.getTrivialTemplateArgumentLoc(CTAI.SugaredConverted[I],
1675+
QualType(), Loc);
1676+
}
1677+
// llvm::copy(SubstArgs.arguments(), TempArgs);
1678+
// N.updateParameterMapping(
1679+
// N.mappingOccurenceList(),
1680+
// MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));
1681+
N.updateParameterMapping(N.mappingOccurenceList(),
1682+
MutableArrayRef<TemplateArgumentLoc>(
1683+
TempArgs, CTAI.SugaredConverted.size()),
1684+
N.getUsedTemplateParamList());
16591685
return false;
16601686
}
16611687

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5770,6 +5770,20 @@ bool Sema::CheckTemplateArgumentList(
57705770
TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs,
57715771
bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI,
57725772
bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied) {
5773+
return CheckTemplateArgumentList(
5774+
Template, GetTemplateParameterList(Template), TemplateLoc, TemplateArgs,
5775+
DefaultArgs, PartialTemplateArgs, CTAI, UpdateArgsWithConversions,
5776+
ConstraintsNotSatisfied);
5777+
}
5778+
5779+
/// Check that the given template argument list is well-formed
5780+
/// for specializing the given template.
5781+
bool Sema::CheckTemplateArgumentList(
5782+
TemplateDecl *Template, TemplateParameterList *Params,
5783+
SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs,
5784+
const DefaultArguments &DefaultArgs, bool PartialTemplateArgs,
5785+
CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions,
5786+
bool *ConstraintsNotSatisfied) {
57735787

57745788
if (ConstraintsNotSatisfied)
57755789
*ConstraintsNotSatisfied = false;
@@ -5779,8 +5793,6 @@ bool Sema::CheckTemplateArgumentList(
57795793
// template.
57805794
TemplateArgumentListInfo NewArgs = TemplateArgs;
57815795

5782-
TemplateParameterList *Params = GetTemplateParameterList(Template);
5783-
57845796
SourceLocation RAngleLoc = NewArgs.getRAngleLoc();
57855797

57865798
// C++23 [temp.arg.general]p1:

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6718,6 +6718,7 @@ struct MarkUsedTemplateParameterVisitor : DynamicRecursiveASTVisitor {
67186718
if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(E->getDecl()))
67196719
if (NTTP->getDepth() == Depth)
67206720
Used[NTTP->getIndex()] = true;
6721+
DynamicRecursiveASTVisitor::TraverseType(E->getType());
67216722
return true;
67226723
}
67236724

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,8 +1426,9 @@ class TemplateInstantiator : public TreeTransform<TemplateInstantiator> {
14261426
} ForParameterMappingSubstitution;
14271427

14281428
TemplateInstantiator(ForParameterMappingSubstitution_t, Sema &SemaRef,
1429+
SourceLocation Loc,
14291430
const MultiLevelTemplateArgumentList &TemplateArgs)
1430-
: inherited(SemaRef), TemplateArgs(TemplateArgs),
1431+
: inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
14311432
BailOutOnIncomplete(false), PreserveArgumentPacks(true) {}
14321433

14331434
void setEvaluateConstraints(bool B) { EvaluateConstraints = B; }
@@ -2214,11 +2215,11 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
22142215
Arg = getTemplateArgumentPackPatternForRewrite(Arg);
22152216
if (Arg.getKind() != TemplateArgument::Expression) {
22162217
assert(SemaRef.inParameterMappingSubstitution());
2217-
// FIXME: SourceLocation()?
2218-
ExprResult E = SemaRef.BuildExpressionFromNonTypeTemplateArgument(Arg, SourceLocation());
2219-
if (E.isInvalid())
2218+
ExprResult Expr = SemaRef.BuildExpressionFromNonTypeTemplateArgument(
2219+
Arg, E->getLocation());
2220+
if (Expr.isInvalid())
22202221
return E;
2221-
Arg = TemplateArgument(E.get(), /*IsCanonical=*/false);
2222+
Arg = TemplateArgument(Expr.get(), /*IsCanonical=*/false);
22222223
}
22232224
assert(Arg.getKind() == TemplateArgument::Expression &&
22242225
"unexpected nontype template argument kind in template rewrite");
@@ -4486,11 +4487,11 @@ bool Sema::SubstTemplateArguments(
44864487
}
44874488

44884489
bool Sema::SubstTemplateArgumentsInParameterMapping(
4489-
ArrayRef<TemplateArgumentLoc> Args,
4490+
ArrayRef<TemplateArgumentLoc> Args, SourceLocation BaseLoc,
44904491
const MultiLevelTemplateArgumentList &TemplateArgs,
44914492
TemplateArgumentListInfo &Out) {
44924493
TemplateInstantiator Instantiator(
4493-
TemplateInstantiator::ForParameterMappingSubstitution, *this,
4494+
TemplateInstantiator::ForParameterMappingSubstitution, *this, BaseLoc,
44944495
TemplateArgs);
44954496
return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
44964497
}

clang/test/SemaTemplate/instantiate-template-argument.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ template<char X>
1717
constexpr int foo() requires C1<1, X> && true { return 2; }
1818
// sizeof(U) >= 4 [U = X (decltype(1))]
1919

20+
// GCC rejects it: https://godbolt.org/z/MWG756K8c
2021
static_assert(foo<'a'>() == 2);
2122

2223
template<char Z>

0 commit comments

Comments
 (0)