[clang] 5a288b9 - [Clang] Evaluate dependent indexes of pack indexing in a constant context (#106054)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 26 08:50:35 PDT 2024
Author: cor3ntin
Date: 2024-08-26T17:50:32+02:00
New Revision: 5a288b9183ca3b7d2bad2b39670803e0ca195f09
URL: https://github.com/llvm/llvm-project/commit/5a288b9183ca3b7d2bad2b39670803e0ca195f09
DIFF: https://github.com/llvm/llvm-project/commit/5a288b9183ca3b7d2bad2b39670803e0ca195f09.diff
LOG: [Clang] Evaluate dependent indexes of pack indexing in a constant context (#106054)
Fixes #105900
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/TreeTransform.h
clang/test/SemaCXX/cxx2c-pack-indexing.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2c6c7e083b9c91..7a9e7f0b4eba69 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -309,6 +309,8 @@ Bug Fixes to C++ Support
template depth than the friend function template. (#GH98258)
- Clang now rebuilds the template parameters of out-of-line declarations and specializations in the context
of the current instantiation in all cases.
+- Fix evaluation of the index of dependent pack indexing expressions/types specifiers (#GH105900)
+
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 62287c2d26375c..b3854cd8f82220 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -6669,9 +6669,15 @@ QualType
TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
PackIndexingTypeLoc TL) {
// Transform the index
- ExprResult IndexExpr = getDerived().TransformExpr(TL.getIndexExpr());
- if (IndexExpr.isInvalid())
- return QualType();
+ ExprResult IndexExpr;
+ {
+ EnterExpressionEvaluationContext ConstantContext(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
+
+ IndexExpr = getDerived().TransformExpr(TL.getIndexExpr());
+ if (IndexExpr.isInvalid())
+ return QualType();
+ }
QualType Pattern = TL.getPattern();
const PackIndexingType *PIT = TL.getTypePtr();
@@ -15299,9 +15305,14 @@ TreeTransform<Derived>::TransformPackIndexingExpr(PackIndexingExpr *E) {
return E;
// Transform the index
- ExprResult IndexExpr = getDerived().TransformExpr(E->getIndexExpr());
- if (IndexExpr.isInvalid())
- return ExprError();
+ ExprResult IndexExpr;
+ {
+ EnterExpressionEvaluationContext ConstantContext(
+ SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
+ IndexExpr = getDerived().TransformExpr(E->getIndexExpr());
+ if (IndexExpr.isInvalid())
+ return ExprError();
+ }
SmallVector<Expr *, 5> ExpandedExprs;
if (!E->expandsToEmptyPack() && E->getExpressions().empty()) {
diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
index 9ea90a4c3e30fd..7d7e808746217f 100644
--- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
+++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
@@ -231,3 +231,31 @@ struct type_info {
namespace GH93650 {
auto func(auto... inputArgs) { return typeid(inputArgs...[0]); }
} // namespace GH93650
+
+
+namespace GH105900 {
+
+template <typename... opts>
+struct types {
+ template <unsigned idx>
+ static constexpr __SIZE_TYPE__ get_index() { return idx; }
+
+ template <unsigned s>
+ static auto x() -> opts...[get_index<s>()] {}
+};
+
+template <auto... opts>
+struct vars {
+ template <unsigned idx>
+ static constexpr __SIZE_TYPE__ get_index() { return idx; }
+
+ template <unsigned s>
+ static auto x() -> decltype(opts...[get_index<s>()]) {return 0;}
+};
+
+void f() {
+ types<void>::x<0>();
+ vars<0>::x<0>();
+}
+
+}
More information about the cfe-commits
mailing list