[clang] [Sema] Avoid an undesired pack expansion while transforming PackIndexingType (PR #90195)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 26 04:22:33 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Younan Zhang (zyn0217)
<details>
<summary>Changes</summary>
Fixes https://github.com/llvm/llvm-project/issues/88925
---
Full diff: https://github.com/llvm/llvm-project/pull/90195.diff
2 Files Affected:
- (modified) clang/lib/Sema/TreeTransform.h (+3)
- (modified) clang/test/SemaCXX/cxx2c-pack-indexing.cpp (+19)
``````````diff
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 9404be5a46f3f7..abc4a16c004a9f 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -6649,6 +6649,9 @@ TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
}
}
+ // We may be doing this in the context of expanding the Pattern. Forget that
+ // because it has been handled above.
+ Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
QualType Result = getDerived().TransformType(TLB, TL.getPatternLoc());
QualType Out = getDerived().RebuildPackIndexingType(
diff --git a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
index 606715e6aacffd..2fd0dbfed294a5 100644
--- a/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
+++ b/clang/test/SemaCXX/cxx2c-pack-indexing.cpp
@@ -160,3 +160,22 @@ namespace GH88929 {
using E = P...[0]; // expected-error {{unknown type name 'P'}} \
// expected-error {{expected ';' after alias declaration}}
}
+
+namespace GH88925 {
+template <typename...> struct S {};
+
+template <int...> struct sequence {};
+
+template <typename... Args, int... indices> auto f(sequence<indices...>) {
+ return S<Args...[indices]...>(); // #use
+}
+
+void g() {
+ static_assert(__is_same(decltype(f<int>(sequence<0, 0>())), S<int, int>));
+ static_assert(__is_same(decltype(f<int, long>(sequence<0, 0>())), S<int, int>));
+ static_assert(__is_same(decltype(f<int, long>(sequence<0, 1>())), S<int, long>));
+ f<int, long>(sequence<3>());
+ // expected-error@#use {{invalid index 3 for pack 'Args' of size 2}}}
+ // expected-note-re at -2 {{function template specialization '{{.*}}' requested here}}
+}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/90195
More information about the cfe-commits
mailing list