Skip to content

Commit 5729e63

Browse files
yeswalruststellar
authored andcommitted
Fix ArgsAsWritten being null for ConceptSpecializationExpr in certain
circumstances when parsing ASTs Fix ArgsAsWritten being null for ConceptSpecializationExpr in certain circumstances when parsing ASTs ASTStmtWriter::VisitConceptSpecializationExpr specifically expects getTemplateArgsAsWritten() to return true, which it wasn't when parsed by ASTContext.cpp in certain edge cases. Fixes: llvm#61486 Differential Revision: https://reviews.llvm.org/D146678 (cherry picked from commit 1f48a1f) Add additional overload to prevent API break.
1 parent 2eb26b6 commit 5729e63

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

clang/include/clang/AST/ExprConcepts.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class ConceptSpecializationExpr final : public Expr, public ConceptReference {
6464
const ConstraintSatisfaction *Satisfaction);
6565

6666
ConceptSpecializationExpr(const ASTContext &C, ConceptDecl *NamedConcept,
67+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
6768
ImplicitConceptSpecializationDecl *SpecDecl,
6869
const ConstraintSatisfaction *Satisfaction,
6970
bool Dependent,
@@ -85,6 +86,13 @@ class ConceptSpecializationExpr final : public Expr, public ConceptReference {
8586
const ConstraintSatisfaction *Satisfaction, bool Dependent,
8687
bool ContainsUnexpandedParameterPack);
8788

89+
static ConceptSpecializationExpr *
90+
Create(const ASTContext &C, ConceptDecl *NamedConcept,
91+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
92+
ImplicitConceptSpecializationDecl *SpecDecl,
93+
const ConstraintSatisfaction *Satisfaction, bool Dependent,
94+
bool ContainsUnexpandedParameterPack);
95+
8896
ArrayRef<TemplateArgument> getTemplateArguments() const {
8997
return SpecDecl->getTemplateArguments();
9098
}

clang/lib/AST/ASTContext.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,8 @@ canonicalizeImmediatelyDeclaredConstraint(const ASTContext &C, Expr *IDC,
765765
CSE->getNamedConcept()->getLocation(), NewConverted);
766766

767767
Expr *NewIDC = ConceptSpecializationExpr::Create(
768-
C, CSE->getNamedConcept(), CSD, nullptr, CSE->isInstantiationDependent(),
768+
C, CSE->getNamedConcept(), CSE->getTemplateArgsAsWritten(), CSD,
769+
/*Satisfaction=*/nullptr, CSE->isInstantiationDependent(),
769770
CSE->containsUnexpandedParameterPack());
770771

771772
if (auto *OrigFold = dyn_cast<CXXFoldExpr>(IDC))

clang/lib/AST/ExprConcepts.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ ConceptSpecializationExpr::ConceptSpecializationExpr(
5858
ConceptSpecializationExpr::ConceptSpecializationExpr(EmptyShell Empty)
5959
: Expr(ConceptSpecializationExprClass, Empty) {}
6060

61+
ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
62+
const ASTContext &C, ConceptDecl *NamedConcept,
63+
ImplicitConceptSpecializationDecl *SpecDecl,
64+
const ConstraintSatisfaction *Satisfaction, bool Dependent,
65+
bool ContainsUnexpandedParameterPack) {
66+
return Create(C, NamedConcept, /*ArgsAsWritten*/ nullptr, SpecDecl, Satisfaction,
67+
Dependent, ContainsUnexpandedParameterPack);
68+
}
69+
6170
ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
6271
const ASTContext &C, NestedNameSpecifierLoc NNS,
6372
SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
@@ -72,13 +81,14 @@ ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
7281

7382
ConceptSpecializationExpr::ConceptSpecializationExpr(
7483
const ASTContext &C, ConceptDecl *NamedConcept,
84+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
7585
ImplicitConceptSpecializationDecl *SpecDecl,
7686
const ConstraintSatisfaction *Satisfaction, bool Dependent,
7787
bool ContainsUnexpandedParameterPack)
7888
: Expr(ConceptSpecializationExprClass, C.BoolTy, VK_PRValue, OK_Ordinary),
7989
ConceptReference(NestedNameSpecifierLoc(), SourceLocation(),
8090
DeclarationNameInfo(), NamedConcept, NamedConcept,
81-
nullptr),
91+
ArgsAsWritten),
8292
SpecDecl(SpecDecl),
8393
Satisfaction(Satisfaction
8494
? ASTConstraintSatisfaction::Create(C, *Satisfaction)
@@ -95,12 +105,13 @@ ConceptSpecializationExpr::ConceptSpecializationExpr(
95105

96106
ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
97107
const ASTContext &C, ConceptDecl *NamedConcept,
108+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
98109
ImplicitConceptSpecializationDecl *SpecDecl,
99110
const ConstraintSatisfaction *Satisfaction, bool Dependent,
100111
bool ContainsUnexpandedParameterPack) {
101-
return new (C)
102-
ConceptSpecializationExpr(C, NamedConcept, SpecDecl, Satisfaction,
103-
Dependent, ContainsUnexpandedParameterPack);
112+
return new (C) ConceptSpecializationExpr(C, NamedConcept, ArgsAsWritten,
113+
SpecDecl, Satisfaction, Dependent,
114+
ContainsUnexpandedParameterPack);
104115
}
105116

106117
const TypeConstraint *

clang/test/PCH/cxx2a-constraints.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ template <SizedLike T> void i(T) {}
2626

2727
void j(SizedLike<int> auto ...ints) {}
2828

29+
template<template<SizedLike> class P> struct S1 { };
30+
2931
#else /*included pch*/
3032

3133
int main() {

0 commit comments

Comments
 (0)