Skip to content

Commit 3f14172

Browse files
committed
checkpoint
AST/ByteCode/libcxx/deref-to-array.cpp now compiles But there are more tests getting regressed now, as I have disabled ShouldPreserveTemplateArgumentsPacks, which caused bugs for deref-to-array.cpp Failed Tests (13): Clang :: AST/ByteCode/libcxx/minmax.cpp Clang :: AST/ByteCode/libcxx/primitive-temporary.cpp Clang :: CXX/drs/cwg25xx.cpp Clang :: CXX/expr/expr.prim/expr.prim.req/nested-requirement.cpp Clang :: CXX/temp/temp.constr/temp.constr.normal/p1.cpp Clang :: CXX/temp/temp.param/p10-2a.cpp Clang :: CodeGenCXX/mangle-concept.cpp Clang :: Modules/pr62943.cppm Clang :: SemaCXX/cxx2c-fold-exprs.cpp Clang :: SemaTemplate/concepts-recursive-inst.cpp Clang :: SemaTemplate/concepts.cpp Clang :: SemaTemplate/instantiate-template-argument.cpp Clang :: SemaTemplate/temp_arg_nontype_cxx2c.cpp
1 parent 4c738cb commit 3f14172

File tree

5 files changed

+63
-28
lines changed

5 files changed

+63
-28
lines changed

clang/lib/Sema/SemaConcept.cpp

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -380,21 +380,29 @@ SubstitutionInTemplateArguments(
380380
Constraint.getParameterMapping(), MLTAL, SubstArgs) ||
381381
Trap.hasErrorOccurred())
382382
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;
383390
NormalizedConstraint::OccurenceList Used =
384391
Constraint.mappingOccurenceList();
385392
SubstitutedOuterMost =
386393
llvm::to_vector_of<TemplateArgument>(MLTAL.getOutermost());
387-
for (unsigned I = 0, MappedIndex = 0; I < SubstArgs.size(); I++)
388-
if (I < Used.size() && Used[I]) {
394+
for (unsigned I = 0, MappedIndex = 0; I < Used.size(); I++) {
395+
TemplateArgument Arg;
396+
if (Used[I])
389397
// SubstitutedOuterMost[I].dump();
390398
// SubstArgs[MappedIndex].getArgument().dump();
391-
TemplateArgument Arg = S.Context.getCanonicalTemplateArgument(
399+
Arg = S.Context.getCanonicalTemplateArgument(
392400
SubstArgs[MappedIndex++].getArgument());
393-
if (I < SubstitutedOuterMost.size())
394-
SubstitutedOuterMost[I] = Arg;
395-
else
396-
SubstitutedOuterMost.push_back(Arg);
397-
}
401+
if (I < SubstitutedOuterMost.size())
402+
SubstitutedOuterMost[I] = Arg;
403+
else
404+
SubstitutedOuterMost.push_back(Arg);
405+
}
398406
MLTAL.replaceOutermostTemplateArguments(
399407
const_cast<NamedDecl *>(Constraint.getConstraintDecl()),
400408
SubstitutedOuterMost);
@@ -681,7 +689,7 @@ static bool calculateConstraintSatisfaction(
681689
Ok = calculateConstraintSatisfaction(S, Constraint.getRHS(), Template,
682690
TemplateNameLoc, MLTAL, Satisfaction,
683691
PackSubstitutionIndex);
684-
if(Ok && Satisfaction.IsSatisfied && !Satisfaction.ContainsErrors)
692+
if (Ok && Satisfaction.IsSatisfied && !Satisfaction.ContainsErrors)
685693
Satisfaction.Details.erase(Satisfaction.Details.begin() + EffectiveDetailEndIndex,
686694
Satisfaction.Details.end());
687695
return Ok;
@@ -1574,9 +1582,9 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
15741582
/*OnlyDeduced=*/false,
15751583
/*Depth=*/0, OccurringIndices);
15761584
} else if (N.getKind() == NormalizedConstraint::ConstraintKind::ConceptId) {
1577-
auto Args = static_cast<ConceptIdConstraint &>(N)
1578-
.getConceptId()
1579-
->getTemplateArgsAsWritten();
1585+
auto *Args = static_cast<ConceptIdConstraint &>(N)
1586+
.getConceptId()
1587+
->getTemplateArgsAsWritten();
15801588
if (Args)
15811589
S.MarkUsedTemplateParameters(Args->arguments(),
15821590
/*Depth=*/0, OccurringIndices);
@@ -1613,12 +1621,25 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16131621
if (S.SubstTemplateArgumentsInParameterMapping(N.getParameterMapping(), MLTAL,
16141622
SubstArgs))
16151623
return true;
1624+
// Sema::CheckTemplateArgumentInfo CTAI;
1625+
// auto *TD =
1626+
// const_cast<TemplateDecl *>(cast<TemplateDecl>(N.getConstraintDecl()));
1627+
// if (S.CheckTemplateArgumentList(TD, TD->getLocation(), SubstArgs,
1628+
// /*DefaultArguments=*/{},
1629+
// /*PartialTemplateArgs=*/true, CTAI))
1630+
// return true;
16161631
TemplateArgumentLoc *TempArgs =
16171632
new (S.Context) TemplateArgumentLoc[SubstArgs.size()];
1633+
// for (unsigned I = 0; I < CTAI.SugaredConverted.size(); ++I)
1634+
// TempArgs[I] = S.getTrivialTemplateArgumentLoc(CTAI.SugaredConverted[I],
1635+
// QualType(), SourceLocation());
16181636
llvm::copy(SubstArgs.arguments(), TempArgs);
16191637
N.updateParameterMapping(
16201638
N.mappingOccurenceList(),
16211639
MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));
1640+
// N.updateParameterMapping(N.mappingOccurenceList(),
1641+
// MutableArrayRef<TemplateArgumentLoc>(
1642+
// TempArgs, CTAI.SugaredConverted.size()));
16221643
return false;
16231644
}
16241645

@@ -1627,12 +1648,10 @@ substituteParameterMappings(Sema &S, ConceptIdConstraint &N,
16271648
const MultiLevelTemplateArgumentList &MLTAL,
16281649
const ASTTemplateArgumentListInfo *ArgsAsWritten) {
16291650

1630-
{
1631-
if (N.getConstraintDecl()) {
1632-
substituteParameterMappings(
1633-
S, static_cast<NormalizedConstraintWithParamMapping &>(N), MLTAL,
1634-
ArgsAsWritten);
1635-
}
1651+
if (N.getConstraintDecl()) {
1652+
substituteParameterMappings(
1653+
S, static_cast<NormalizedConstraintWithParamMapping &>(N), MLTAL,
1654+
ArgsAsWritten);
16361655
}
16371656
return substituteParameterMappings(S, N.getNormalizedConstraint(), MLTAL,
16381657
ArgsAsWritten);

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5884,6 +5884,17 @@ bool Sema::CheckTemplateArgumentList(
58845884
return true;
58855885
}
58865886

5887+
// For constraint parameter mapping, we have already built a pack in
5888+
// TransformTemplateArguments
5889+
// if (inParameterMappingSubstitution()) {
5890+
// llvm::copy(SugaredArgumentPack, std::back_inserter(CTAI.SugaredConverted));
5891+
// SugaredArgumentPack.clear();
5892+
// llvm::copy(CanonicalArgumentPack, std::back_inserter(CTAI.CanonicalConverted));
5893+
// CanonicalArgumentPack.clear();
5894+
// ++Param;
5895+
// continue;
5896+
// }
5897+
58875898
CTAI.SugaredConverted.push_back(
58885899
TemplateArgument::CreatePackCopy(Context, SugaredArgumentPack));
58895900
SugaredArgumentPack.clear();

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6974,10 +6974,13 @@ MarkUsedTemplateParameters(ASTContext &Ctx, QualType T,
69746974
break;
69756975

69766976
case Type::UnaryTransform:
6977-
if (!OnlyDeduced)
6978-
MarkUsedTemplateParameters(Ctx,
6979-
cast<UnaryTransformType>(T)->getUnderlyingType(),
6980-
OnlyDeduced, Depth, Used);
6977+
if (!OnlyDeduced) {
6978+
auto *UTT = cast<UnaryTransformType>(T);
6979+
auto Next = UTT->getUnderlyingType();
6980+
if (Next.isNull())
6981+
Next = UTT->getBaseType();
6982+
MarkUsedTemplateParameters(Ctx, Next, OnlyDeduced, Depth, Used);
6983+
}
69816984
break;
69826985

69836986
case Type::PackExpansion:

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,7 +1521,10 @@ class TemplateInstantiator : public TreeTransform<TemplateInstantiator> {
15211521
}
15221522

15231523
bool ShouldPreserveTemplateArgumentsPacks() const {
1524-
return PreserveArgumentPacks;
1524+
// This is disabled temporarily.
1525+
// We need to figure out a way to correctly handle packs outside of
1526+
// CheckTemplateArguments
1527+
return false && PreserveArgumentPacks;
15251528
}
15261529

15271530
TemplateArgument
@@ -2233,8 +2236,7 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
22332236
if (Arg.getKind() != TemplateArgument::Expression) {
22342237
assert(SemaRef.inParameterMappingSubstitution());
22352238
// FIXME: SourceLocation()?
2236-
ExprResult E = SemaRef.BuildExpressionFromNonTypeTemplateArgument(
2237-
Arg, SourceLocation());
2239+
ExprResult E = SemaRef.BuildExpressionFromNonTypeTemplateArgument(Arg, SourceLocation());
22382240
if (E.isInvalid())
22392241
return E;
22402242
Arg = TemplateArgument(E.get(), /*IsCanonical=*/false);

clang/lib/Sema/TreeTransform.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6987,11 +6987,11 @@ QualType TreeTransform<Derived>::TransformUnaryTransformType(
69876987
TypeLocBuilder &TLB,
69886988
UnaryTransformTypeLoc TL) {
69896989
QualType Result = TL.getType();
6990+
TypeSourceInfo *NewBaseTSI = TL.getUnderlyingTInfo();
69906991
if (Result->isDependentType()) {
69916992
const UnaryTransformType *T = TL.getTypePtr();
69926993

6993-
TypeSourceInfo *NewBaseTSI =
6994-
getDerived().TransformType(TL.getUnderlyingTInfo());
6994+
NewBaseTSI = getDerived().TransformType(TL.getUnderlyingTInfo());
69956995
if (!NewBaseTSI)
69966996
return QualType();
69976997
QualType NewBase = NewBaseTSI->getType();
@@ -7006,7 +7006,7 @@ QualType TreeTransform<Derived>::TransformUnaryTransformType(
70067006
UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
70077007
NewTL.setKWLoc(TL.getKWLoc());
70087008
NewTL.setParensRange(TL.getParensRange());
7009-
NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
7009+
NewTL.setUnderlyingTInfo(NewBaseTSI);
70107010
return Result;
70117011
}
70127012

0 commit comments

Comments
 (0)