diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index 002e560dc0d207f4ae8bea10f836920aab263f82..e75befe7f4b119f01a8dcb9c900cabb58d03ea80 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -1842,6 +1842,7 @@ ftms = {
   values = {
     v = 202403;
     cxxmin = 26;
+    extra_cond = "__cpp_pack_indexing";
   };
 };
 
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index 70de189b1e0bd1459f72cb1c72269a1475ecd863..cd713ee54ea3f561b4a4ef46aada6d813d8be4de 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -2036,7 +2036,7 @@
 #undef __glibcxx_want_is_virtual_base_of
 
 #if !defined(__cpp_lib_ranges_concat)
-# if (__cplusplus >  202302L)
+# if (__cplusplus >  202302L) && (__cpp_pack_indexing)
 #  define __glibcxx_ranges_concat 202403L
 #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_ranges_concat)
 #   define __cpp_lib_ranges_concat 202403L
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 5c795a90fbc29ddbacbed8c32a753a06e6662c62..22e0c9cae4478298241834d6c4971bd12b3bf7b3 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -9683,12 +9683,8 @@ namespace ranges
 	&& __all_but_last_common<_Const, _Rs...>::value;
 
     template<typename _Range, typename... _Rs>
-      struct __last_is_common
-      { static inline constexpr bool value = __last_is_common<_Rs...>::value; };
-
-    template<typename _Range>
-      struct __last_is_common<_Range>
-      { static inline constexpr bool value = common_range<_Range>; };
+      struct __all_but_first_sized
+      { static inline constexpr bool value = (sized_range<_Rs> && ...); };
   } // namespace __detail
 
   template<input_range... _Vs>
@@ -9726,13 +9722,11 @@ namespace ranges
     constexpr auto
     end() requires (!(__detail::__simple_view<_Vs> && ...))
     {
+      constexpr auto __n = sizeof...(_Vs);
       if constexpr ((semiregular<iterator_t<_Vs>> && ...)
-		    && __detail::__last_is_common<_Vs...>::value)
-	{
-	  constexpr auto __n = sizeof...(_Vs);
-	  return iterator<false>(this, in_place_index<__n - 1>,
-				 ranges::end(std::get<__n - 1>(_M_views)));
-	}
+		    && common_range<_Vs...[__n - 1]>)
+	return iterator<false>(this, in_place_index<__n - 1>,
+			       ranges::end(std::get<__n - 1>(_M_views)));
       else
 	return default_sentinel;
     }
@@ -9740,13 +9734,11 @@ namespace ranges
     constexpr auto
     end() const requires (range<const _Vs> && ...) && __detail::__concatable<const _Vs...>
     {
+      constexpr auto __n = sizeof...(_Vs);
       if constexpr ((semiregular<iterator_t<const _Vs>> && ...)
-		    && __detail::__last_is_common<const _Vs...>::value)
-	{
-	  constexpr auto __n = sizeof...(_Vs);
-	  return iterator<true>(this, in_place_index<__n - 1>,
-				ranges::end(std::get<__n - 1>(_M_views)));
-	}
+		    && common_range<const _Vs...[__n - 1]>)
+	return iterator<true>(this, in_place_index<__n - 1>,
+			      ranges::end(std::get<__n - 1>(_M_views)));
       else
 	return default_sentinel;
     }
@@ -10128,8 +10120,9 @@ namespace ranges
 
     friend constexpr difference_type
     operator-(const iterator& __x, default_sentinel_t)
-      requires __detail::__concat_is_random_access<_Const, _Vs...>
-	&& __detail::__last_is_common<__maybe_const_t<_Const, _Vs>...>::value
+      requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
+				   iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
+	&& __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
     {
       return _S_invoke_with_runtime_index([&]<size_t _Ix>() -> difference_type {
 	auto __dx = ranges::distance(std::get<_Ix>(__x._M_it),
@@ -10148,8 +10141,9 @@ namespace ranges
 
     friend constexpr difference_type
     operator-(default_sentinel_t, const iterator& __x)
-      requires __detail::__concat_is_random_access<_Const, _Vs...>
-	&& __detail::__last_is_common<__maybe_const_t<_Const, _Vs>...>::value
+      requires (sized_sentinel_for<sentinel_t<__maybe_const_t<_Const, _Vs>>,
+				   iterator_t<__maybe_const_t<_Const, _Vs>>> && ...)
+	&& __detail::__all_but_first_sized<__maybe_const_t<_Const, _Vs>...>::value
     { return -(__x - default_sentinel); }
 
     friend constexpr decltype(auto)