@@ -123,9 +123,6 @@ struct Subscript<T, std::index_sequence<Idx...>> : SubscriptElement<T, Idx>... {
123123 }
124124};
125125#endif
126-
127- template <typename... Ts>
128- struct type_list {};
129126} // namespace _tuple_impl
130127
131128template <class... Types>
@@ -137,12 +134,20 @@ class tuple
137134private:
138135 template <typename... Us>
139136 constexpr static bool enable_utypes_ctor =
140- !std::same_as<tuple, Us...[0]> && (std::is_constructible_v<Types, Us> && ...);
137+ not(sizeof...(Us) == 1 && (std::same_as<tuple, Us> && ...)) &&
138+ (std::is_constructible_v<Types, Us> && ...);
141139
142140 template <typename... Us>
143141 constexpr static bool enable_utypes_tuple_ctor = true; // TODO
144142
143+ #if $compiler_is(CLANG)
144+ // workaround for use as template argument
145+ template <typename... Ts>
146+ struct Storage;
147+ using storage_type = Storage<Types...>;
148+ #else
145149 struct storage_type;
150+ #endif
146151 consteval {
147152 std::size_t idx = 0;
148153 define_aggregate(^^storage_type,
@@ -153,7 +158,7 @@ private:
153158 constexpr void _impl_copy_assign(this Self& self, T const& other) {
154159 template for (constexpr auto Idx :
155160 $define_static_array(std::views::iota(0ZU, sizeof...(Types)))) {
156- self._impl_storage.[:self._impl_accessor.members[Idx]:] = other.template get<Idx>();
161+ self._impl_storage.[:self._impl_accessor.members[Idx]:] = other.template get<Idx>();
157162 }
158163 }
159164
0 commit comments