Author: Walter Gray Date: 2023-05-18T19:32:28-07:00 New Revision: 5729e63ac7b47c6ad40f904fedafad3c07cf71ea
URL: https://github.com/llvm/llvm-project/commit/5729e63ac7b47c6ad40f904fedafad3c07cf71ea DIFF: https://github.com/llvm/llvm-project/commit/5729e63ac7b47c6ad40f904fedafad3c07cf71ea.diff LOG: 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: #61486 Differential Revision: https://reviews.llvm.org/D146678 (cherry picked from commit 1f48a1fce23551cc24f5b598af5994f5cfc6b6d0) Add additional overload to prevent API break. Added: Modified: clang/include/clang/AST/ExprConcepts.h clang/lib/AST/ASTContext.cpp clang/lib/AST/ExprConcepts.cpp clang/test/PCH/cxx2a-constraints.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ExprConcepts.h b/clang/include/clang/AST/ExprConcepts.h index f02c140c14c19..746a5b2fbfc6c 100644 --- a/clang/include/clang/AST/ExprConcepts.h +++ b/clang/include/clang/AST/ExprConcepts.h @@ -64,6 +64,7 @@ class ConceptSpecializationExpr final : public Expr, public ConceptReference { const ConstraintSatisfaction *Satisfaction); ConceptSpecializationExpr(const ASTContext &C, ConceptDecl *NamedConcept, + const ASTTemplateArgumentListInfo *ArgsAsWritten, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction, bool Dependent, @@ -85,6 +86,13 @@ class ConceptSpecializationExpr final : public Expr, public ConceptReference { const ConstraintSatisfaction *Satisfaction, bool Dependent, bool ContainsUnexpandedParameterPack); + static ConceptSpecializationExpr * + Create(const ASTContext &C, ConceptDecl *NamedConcept, + const ASTTemplateArgumentListInfo *ArgsAsWritten, + ImplicitConceptSpecializationDecl *SpecDecl, + const ConstraintSatisfaction *Satisfaction, bool Dependent, + bool ContainsUnexpandedParameterPack); + ArrayRef<TemplateArgument> getTemplateArguments() const { return SpecDecl->getTemplateArguments(); } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 2884fe6604228..8054eb2e12d3b 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -765,7 +765,8 @@ canonicalizeImmediatelyDeclaredConstraint(const ASTContext &C, Expr *IDC, CSE->getNamedConcept()->getLocation(), NewConverted); Expr *NewIDC = ConceptSpecializationExpr::Create( - C, CSE->getNamedConcept(), CSD, nullptr, CSE->isInstantiationDependent(), + C, CSE->getNamedConcept(), CSE->getTemplateArgsAsWritten(), CSD, + /*Satisfaction=*/nullptr, CSE->isInstantiationDependent(), CSE->containsUnexpandedParameterPack()); if (auto *OrigFold = dyn_cast<CXXFoldExpr>(IDC)) diff --git a/clang/lib/AST/ExprConcepts.cpp b/clang/lib/AST/ExprConcepts.cpp index fc8f1eb2abf14..cdc13c2d39694 100644 --- a/clang/lib/AST/ExprConcepts.cpp +++ b/clang/lib/AST/ExprConcepts.cpp @@ -58,6 +58,15 @@ ConceptSpecializationExpr::ConceptSpecializationExpr( ConceptSpecializationExpr::ConceptSpecializationExpr(EmptyShell Empty) : Expr(ConceptSpecializationExprClass, Empty) {} +ConceptSpecializationExpr *ConceptSpecializationExpr::Create( + const ASTContext &C, ConceptDecl *NamedConcept, + ImplicitConceptSpecializationDecl *SpecDecl, + const ConstraintSatisfaction *Satisfaction, bool Dependent, + bool ContainsUnexpandedParameterPack) { + return Create(C, NamedConcept, /*ArgsAsWritten*/ nullptr, SpecDecl, Satisfaction, + Dependent, ContainsUnexpandedParameterPack); +} + ConceptSpecializationExpr *ConceptSpecializationExpr::Create( const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, @@ -72,13 +81,14 @@ ConceptSpecializationExpr *ConceptSpecializationExpr::Create( ConceptSpecializationExpr::ConceptSpecializationExpr( const ASTContext &C, ConceptDecl *NamedConcept, + const ASTTemplateArgumentListInfo *ArgsAsWritten, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction, bool Dependent, bool ContainsUnexpandedParameterPack) : Expr(ConceptSpecializationExprClass, C.BoolTy, VK_PRValue, OK_Ordinary), ConceptReference(NestedNameSpecifierLoc(), SourceLocation(), DeclarationNameInfo(), NamedConcept, NamedConcept, - nullptr), + ArgsAsWritten), SpecDecl(SpecDecl), Satisfaction(Satisfaction ? ASTConstraintSatisfaction::Create(C, *Satisfaction) @@ -95,12 +105,13 @@ ConceptSpecializationExpr::ConceptSpecializationExpr( ConceptSpecializationExpr *ConceptSpecializationExpr::Create( const ASTContext &C, ConceptDecl *NamedConcept, + const ASTTemplateArgumentListInfo *ArgsAsWritten, ImplicitConceptSpecializationDecl *SpecDecl, const ConstraintSatisfaction *Satisfaction, bool Dependent, bool ContainsUnexpandedParameterPack) { - return new (C) - ConceptSpecializationExpr(C, NamedConcept, SpecDecl, Satisfaction, - Dependent, ContainsUnexpandedParameterPack); + return new (C) ConceptSpecializationExpr(C, NamedConcept, ArgsAsWritten, + SpecDecl, Satisfaction, Dependent, + ContainsUnexpandedParameterPack); } const TypeConstraint * diff --git a/clang/test/PCH/cxx2a-constraints.cpp b/clang/test/PCH/cxx2a-constraints.cpp index 3f3b5e536cc93..a7fd2a7816372 100644 --- a/clang/test/PCH/cxx2a-constraints.cpp +++ b/clang/test/PCH/cxx2a-constraints.cpp @@ -26,6 +26,8 @@ template <SizedLike T> void i(T) {} void j(SizedLike<int> auto ...ints) {} +template<template<SizedLike> class P> struct S1 { }; + #else /*included pch*/ int main() { _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
