tree index = tsubst_expr (PACK_INDEX_INDEX (t), args, complain, in_decl);
const bool parenthesized_p = (TREE_CODE (t) == PACK_INDEX_EXPR
&& PACK_INDEX_PARENTHESIZED_P (t));
+ tree r;
if (!value_dependent_expression_p (index) && TREE_CODE (pack) == TREE_VEC)
- return pack_index_element (index, pack, parenthesized_p, complain);
+ r = pack_index_element (index, pack, parenthesized_p, complain);
else
- return make_pack_index (pack, index);
+ r = make_pack_index (pack, index);
+ if (TREE_CODE (t) == PACK_INDEX_TYPE)
+ r = cp_build_qualified_type (r, cp_type_quals (t) | cp_type_quals (r),
+ complain | tf_ignore_bad_quals);
+ return r;
}
/* Make an argument pack out of the TREE_VEC VEC. */
--- /dev/null
+// PR c++/122169
+// { dg-do compile { target c++26 } }
+
+template<class T, class U>
+concept same_as = __is_same(T, U);
+
+template<class... Ts>
+void f() {
+ using T = Ts...[0];
+ static_assert(same_as<const T, const int>);
+
+ []<int I>() {
+ using U = Ts...[I];
+ static_assert(same_as<const U, const int>);
+ }.template operator()<0>();
+}
+
+template void f<int>();
+
+
+template<class... Ts>
+void g() {
+ using T = Ts...[0];
+ static_assert(same_as<const T, const volatile int>);
+
+ []<int I>() {
+ using U = Ts...[I];
+ static_assert(same_as<const U, const volatile int>);
+ }.template operator()<0>();
+}
+
+template void g<volatile int>();