Skip to content

Commit 1f48a1f

Browse files
yeswalrusErich Keane
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
1 parent bbc204b commit 1f48a1f

File tree

4 files changed

+12
-5
lines changed

4 files changed

+12
-5
lines changed

clang/include/clang/AST/ExprConcepts.h

Lines changed: 2 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,
@@ -81,6 +82,7 @@ class ConceptSpecializationExpr final : public Expr, public ConceptReference {
8182

8283
static ConceptSpecializationExpr *
8384
Create(const ASTContext &C, ConceptDecl *NamedConcept,
85+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
8486
ImplicitConceptSpecializationDecl *SpecDecl,
8587
const ConstraintSatisfaction *Satisfaction, bool Dependent,
8688
bool ContainsUnexpandedParameterPack);

clang/lib/AST/ASTContext.cpp

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

842842
Expr *NewIDC = ConceptSpecializationExpr::Create(
843-
C, CSE->getNamedConcept(), CSD, nullptr, CSE->isInstantiationDependent(),
843+
C, CSE->getNamedConcept(), CSE->getTemplateArgsAsWritten(), CSD,
844+
/*Satisfaction=*/nullptr, CSE->isInstantiationDependent(),
844845
CSE->containsUnexpandedParameterPack());
845846

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

clang/lib/AST/ExprConcepts.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,14 @@ ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
7272

7373
ConceptSpecializationExpr::ConceptSpecializationExpr(
7474
const ASTContext &C, ConceptDecl *NamedConcept,
75+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
7576
ImplicitConceptSpecializationDecl *SpecDecl,
7677
const ConstraintSatisfaction *Satisfaction, bool Dependent,
7778
bool ContainsUnexpandedParameterPack)
7879
: Expr(ConceptSpecializationExprClass, C.BoolTy, VK_PRValue, OK_Ordinary),
7980
ConceptReference(NestedNameSpecifierLoc(), SourceLocation(),
8081
DeclarationNameInfo(), NamedConcept, NamedConcept,
81-
nullptr),
82+
ArgsAsWritten),
8283
SpecDecl(SpecDecl),
8384
Satisfaction(Satisfaction
8485
? ASTConstraintSatisfaction::Create(C, *Satisfaction)
@@ -95,12 +96,13 @@ ConceptSpecializationExpr::ConceptSpecializationExpr(
9596

9697
ConceptSpecializationExpr *ConceptSpecializationExpr::Create(
9798
const ASTContext &C, ConceptDecl *NamedConcept,
99+
const ASTTemplateArgumentListInfo *ArgsAsWritten,
98100
ImplicitConceptSpecializationDecl *SpecDecl,
99101
const ConstraintSatisfaction *Satisfaction, bool Dependent,
100102
bool ContainsUnexpandedParameterPack) {
101-
return new (C)
102-
ConceptSpecializationExpr(C, NamedConcept, SpecDecl, Satisfaction,
103-
Dependent, ContainsUnexpandedParameterPack);
103+
return new (C) ConceptSpecializationExpr(C, NamedConcept, ArgsAsWritten,
104+
SpecDecl, Satisfaction, Dependent,
105+
ContainsUnexpandedParameterPack);
104106
}
105107

106108
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)