Skip to content

Commit 2adf94a

Browse files
zyn0217cor3ntin
authored andcommitted
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 17b4bbe commit 2adf94a

File tree

5 files changed

+52
-17
lines changed

5 files changed

+52
-17
lines changed

clang/lib/Sema/SemaConcept.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,23 @@ 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());
393401
if (I < SubstitutedOuterMost.size())
394402
SubstitutedOuterMost[I] = Arg;
@@ -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;
@@ -1590,7 +1598,7 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
15901598
/*OnlyDeduced=*/false,
15911599
/*Depth=*/0, OccurringIndices);
15921600
} else if (N.getKind() == NormalizedConstraint::ConstraintKind::ConceptId) {
1593-
auto Args = static_cast<ConceptIdConstraint &>(N)
1601+
auto *Args = static_cast<ConceptIdConstraint &>(N)
15941602
.getConceptId()
15951603
->getTemplateArgsAsWritten();
15961604
if (Args)
@@ -1629,12 +1637,25 @@ substituteParameterMappings(Sema &S, NormalizedConstraintWithParamMapping &N,
16291637
if (S.SubstTemplateArgumentsInParameterMapping(N.getParameterMapping(), MLTAL,
16301638
SubstArgs))
16311639
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;
16321647
TemplateArgumentLoc *TempArgs =
16331648
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());
16341652
llvm::copy(SubstArgs.arguments(), TempArgs);
16351653
N.updateParameterMapping(
16361654
N.mappingOccurenceList(),
16371655
MutableArrayRef<TemplateArgumentLoc>(TempArgs, SubstArgs.size()));
1656+
// N.updateParameterMapping(N.mappingOccurenceList(),
1657+
// MutableArrayRef<TemplateArgumentLoc>(
1658+
// TempArgs, CTAI.SugaredConverted.size()));
16381659
return false;
16391660
}
16401661

@@ -1643,13 +1664,11 @@ substituteParameterMappings(Sema &S, ConceptIdConstraint &N,
16431664
const MultiLevelTemplateArgumentList &MLTAL,
16441665
const ASTTemplateArgumentListInfo *ArgsAsWritten) {
16451666

1646-
{
16471667
if (N.getConstraintDecl()) {
16481668
substituteParameterMappings(
16491669
S, static_cast<NormalizedConstraintWithParamMapping &>(N), MLTAL,
16501670
ArgsAsWritten);
16511671
}
1652-
}
16531672
return substituteParameterMappings(S, N.getNormalizedConstraint(), MLTAL,
16541673
ArgsAsWritten);
16551674
}

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5972,6 +5972,17 @@ bool Sema::CheckTemplateArgumentList(
59725972
return true;
59735973
}
59745974

5975+
// For constraint parameter mapping, we have already built a pack in
5976+
// TransformTemplateArguments
5977+
// if (inParameterMappingSubstitution()) {
5978+
// llvm::copy(SugaredArgumentPack, std::back_inserter(CTAI.SugaredConverted));
5979+
// SugaredArgumentPack.clear();
5980+
// llvm::copy(CanonicalArgumentPack, std::back_inserter(CTAI.CanonicalConverted));
5981+
// CanonicalArgumentPack.clear();
5982+
// ++Param;
5983+
// continue;
5984+
// }
5985+
59755986
CTAI.SugaredConverted.push_back(
59765987
TemplateArgument::CreatePackCopy(Context, SugaredArgumentPack));
59775988
SugaredArgumentPack.clear();

clang/lib/Sema/SemaTemplateDeduction.cpp

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

70797079
case Type::UnaryTransform:
7080-
if (!OnlyDeduced)
7081-
MarkUsedTemplateParameters(Ctx,
7082-
cast<UnaryTransformType>(T)->getUnderlyingType(),
7083-
OnlyDeduced, Depth, Used);
7080+
if (!OnlyDeduced) {
7081+
auto *UTT = cast<UnaryTransformType>(T);
7082+
auto Next = UTT->getUnderlyingType();
7083+
if (Next.isNull())
7084+
Next = UTT->getBaseType();
7085+
MarkUsedTemplateParameters(Ctx, Next, OnlyDeduced, Depth, Used);
7086+
}
70847087
break;
70857088

70867089
case Type::PackExpansion:

clang/lib/Sema/SemaTemplateInstantiate.cpp

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

15281528
bool ShouldPreserveTemplateArgumentsPacks() const {
1529-
return PreserveArgumentPacks;
1529+
// This is disabled temporarily.
1530+
// We need to figure out a way to correctly handle packs outside of
1531+
// CheckTemplateArguments
1532+
return false && PreserveArgumentPacks;
15301533
}
15311534

15321535
TemplateArgument
@@ -2212,8 +2215,7 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
22122215
if (Arg.getKind() != TemplateArgument::Expression) {
22132216
assert(SemaRef.inParameterMappingSubstitution());
22142217
// FIXME: SourceLocation()?
2215-
ExprResult E = SemaRef.BuildExpressionFromNonTypeTemplateArgument(
2216-
Arg, SourceLocation());
2218+
ExprResult E = SemaRef.BuildExpressionFromNonTypeTemplateArgument(Arg, SourceLocation());
22172219
if (E.isInvalid())
22182220
return E;
22192221
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
@@ -7005,11 +7005,11 @@ QualType TreeTransform<Derived>::TransformUnaryTransformType(
70057005
TypeLocBuilder &TLB,
70067006
UnaryTransformTypeLoc TL) {
70077007
QualType Result = TL.getType();
7008+
TypeSourceInfo *NewBaseTSI = TL.getUnderlyingTInfo();
70087009
if (Result->isDependentType()) {
70097010
const UnaryTransformType *T = TL.getTypePtr();
70107011

7011-
TypeSourceInfo *NewBaseTSI =
7012-
getDerived().TransformType(TL.getUnderlyingTInfo());
7012+
NewBaseTSI = getDerived().TransformType(TL.getUnderlyingTInfo());
70137013
if (!NewBaseTSI)
70147014
return QualType();
70157015
QualType NewBase = NewBaseTSI->getType();
@@ -7024,7 +7024,7 @@ QualType TreeTransform<Derived>::TransformUnaryTransformType(
70247024
UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
70257025
NewTL.setKWLoc(TL.getKWLoc());
70267026
NewTL.setParensRange(TL.getParensRange());
7027-
NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
7027+
NewTL.setUnderlyingTInfo(NewBaseTSI);
70287028
return Result;
70297029
}
70307030

0 commit comments

Comments
 (0)