[clang] [clang] Fix a "!CodeSynthesisContexts.empty()" assertion failure when constructing aggregate deduction guides. (PR #89227)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 18 06:00:42 PDT 2024
https://github.com/hokein created https://github.com/llvm/llvm-project/pull/89227
We were missing to push an record to the instantiation stack in `DeclareAggregateDeductionGuideForTypeAlias`. This patch fixes that.
>From 04c5dfa09f78fa52b31378295a8d27a20278498a Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Thu, 18 Apr 2024 14:50:51 +0200
Subject: [PATCH] [clang] Fix a "!CodeSynthesisContexts.empty()" assertion
failure when constructing the aggregate deduction guides.
We were missing to push an record to the instantiation stack in
`DeclareAggregateDeductionGuideForTypeAlias`. This patch fixes that.
---
clang/lib/Sema/SemaTemplate.cpp | 5 +++++
clang/test/SemaCXX/cxx20-ctad-type-alias.cpp | 10 ++++++++++
2 files changed, 15 insertions(+)
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 95171359f0ab17..8b039c26f2cef5 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3043,6 +3043,11 @@ FunctionTemplateDecl *DeclareAggregateDeductionGuideForTypeAlias(
return nullptr;
LocalInstantiationScope Scope(SemaRef);
+ Sema::InstantiatingTemplate BuildingDeductionGuides(
+ SemaRef, AliasTemplate->getLocation(), RHSDeductionGuide,
+ Sema::InstantiatingTemplate::BuildingDeductionGuidesTag{});
+ if (BuildingDeductionGuides.isInvalid())
+ return nullptr;
// Build a new template parameter list for the synthesized aggregate deduction
// guide by transforming the one from RHSDeductionGuide.
diff --git a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
index b71cd46f884d63..6f04264a655ad5 100644
--- a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
+++ b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
@@ -279,3 +279,13 @@ Bar t = Foo<K<Container>>();
Bar s = 1; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of}}
} // namespace test20
+
+namespace test21 {
+template <typename T, unsigned N>
+struct Array { const T member[N]; };
+template <unsigned N>
+using String = Array<char, N>;
+
+// Verify no crash on constructing the aggregate deduction guides.
+String s("hello");
+} // namespace test21
More information about the cfe-commits
mailing list