[PATCH] libstdc++: fix allocate_at_least test for small alignments [PR126072]

Jonathan Wakely jwakely@redhat.com
Fri Jul 3 14:40:36 GMT 2026


On Wed, 01 Jul 2026 at 21:08 -0400, Nathan Myers wrote:
>A test for P0401 allocate_at_least fails on target cris-elf,
>which has a default allocator with alignment 4. This patch
>adjusts tests to accommodate alignments down to 1, and removes
>assumptions about the size of short int.
>
>Tested on x86 -m64 and -m32. Need assistance for cris-elf.

OK


>libstdc++-v3/Changelog:
>	PR libstdc++/126072
>	* testsuite/20_util/allocator/allocate_at_least.cc
>---
> .../20_util/allocator/allocate_at_least.cc    | 181 ++++++++++--------
> 1 file changed, 100 insertions(+), 81 deletions(-)
>
>diff --git a/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc b/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
>index 987e2472490..0dcfcefc2c9 100644
>--- a/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
>+++ b/libstdc++-v3/testsuite/20_util/allocator/allocate_at_least.cc
>@@ -73,17 +73,19 @@ void extra()
>     VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>     SatC::deallocate(satc, p, n);
>   }
>-  {
>-    auto [p, n] = SatC::allocate_at_least(satc, 2);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>-    SatC::deallocate(satc, p, n);
>-  }
>-  {
>-    auto [p, n] =
>-      SatC::allocate_at_least(satc, __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>-    SatC::deallocate(satc, p, n);
>-  }
>+  if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ >= 2)
>+    {
>+      auto [p, n] = SatC::allocate_at_least(satc, 2);
>+      VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>+      SatC::deallocate(satc, p, n);
>+    }
>+  if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ > 1)
>+    {
>+      auto [p, n] =
>+	SatC::allocate_at_least(satc, __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
>+      VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>+      SatC::deallocate(satc, p, n);
>+    }
>   {
>     auto [p, n] = SatC::allocate_at_least(
> 	satc, __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>@@ -91,77 +93,94 @@ void extra()
>     SatC::deallocate(satc, p, n);
>   }
>
>-  using SatS = std::allocator_traits<std::allocator<short>>;
>-  std::allocator<short> sats;
>-  {
>-    auto [p, n] = SatS::allocate_at_least(sats, 1);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
>-    SatS::deallocate(sats, p, n);
>-  }
>-  {
>-    auto [p, n] = SatS::allocate_at_least(sats, 2);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
>-    SatS::deallocate(sats, p, n);
>-  }
>-  {
>-    auto [p, n] = SatS::allocate_at_least(sats,
>-	(__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(short));
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
>-    SatS::deallocate(sats, p, n);
>-  }
>-  {
>-    auto [p, n] = SatS::allocate_at_least(sats,
>-	__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(short));
>-    SatS::deallocate(sats, p, n);
>-  }
>-
>-  struct A3 { char s[3]; };
>-  using SatA3 = std::allocator_traits<std::allocator<A3>>;
>-  std::allocator<A3> sata3;
>-  {
>-    auto [p, n] = SatA3::allocate_at_least(sata3, 1);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>-    SatA3::deallocate(sata3, p, n);
>-  }
>-  {
>-    auto [p, n] = SatA3::allocate_at_least(sata3, 2);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>-    SatA3::deallocate(sata3, p, n);
>-  }
>-  {
>-    auto [p, n] = SatA3::allocate_at_least(sata3,
>-	(__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A3));
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>-    SatA3::deallocate(sata3, p, n);
>-  }
>-  {
>-    auto [p, n] = SatA3::allocate_at_least(sata3,
>-	__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>-    SatA3::deallocate(sata3, p, n);
>-  }
>+  if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ > 2)
>+    {
>+      struct A2 { char s[2]; };
>+      using SatA2 = std::allocator_traits<std::allocator<A2>>;
>+      std::allocator<A2> sats;
>+      if (sizeof(A2) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__)
>+      {
>+	auto [p, n] = SatA2::allocate_at_least(sats, 1);
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2));
>+	SatA2::deallocate(sats, p, n);
>+      }
>+      if (2*sizeof(A2) < __STDCPP_DEFAULT_NEW_ALIGNMENT__)
>+      {
>+	auto [p, n] = SatA2::allocate_at_least(sats, 2);
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2));
>+	SatA2::deallocate(sats, p, n);
>+      }
>+      if ((__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A2) > 0)
>+      {
>+	auto [p, n] = SatA2::allocate_at_least(sats,
>+	    (__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A2));
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2));
>+	SatA2::deallocate(sats, p, n);
>+      }
>+      if (__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2) > 0)
>+      {
>+	auto [p, n] = SatA2::allocate_at_least(sats,
>+	    __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2));
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A2));
>+	SatA2::deallocate(sats, p, n);
>+      }
>+    }
>
>-  struct Anm1 { char s[__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1]; };
>-  using SatAnm1 = std::allocator_traits<std::allocator<Anm1>>;
>-  std::allocator<Anm1> satanm1;
>-  {
>-    auto [p, n] = SatAnm1::allocate_at_least(satanm1, 1);
>-    VERIFY(n == 1);
>-    SatAnm1::deallocate(satanm1, p, n);
>-  }
>-  {
>-    auto [p, n] = SatAnm1::allocate_at_least(satanm1,
>-	__STDCPP_DEFAULT_NEW_ALIGNMENT__);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>-    SatAnm1::deallocate(satanm1, p, n);
>-  }
>-  {
>-    auto [p, n] = SatAnm1::allocate_at_least(satanm1,
>-	__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
>-    VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>-    SatAnm1::deallocate(satanm1, p, n);
>-  }
>+  if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ > 2)
>+    {
>+      struct A3 { char s[3]; };
>+      using SatA3 = std::allocator_traits<std::allocator<A3>>;
>+      std::allocator<A3> sata3;
>+      {
>+	auto [p, n] = SatA3::allocate_at_least(sata3, 1);
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>+	SatA3::deallocate(sata3, p, n);
>+      }
>+      if constexpr (2*sizeof(A3) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__)
>+	{
>+	  auto [p, n] = SatA3::allocate_at_least(sata3, 2);
>+	  VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>+	  SatA3::deallocate(sata3, p, n);
>+	}
>+      if constexpr ((__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A3) > 0)
>+	{
>+	  auto [p, n] = SatA3::allocate_at_least(sata3,
>+	      (__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1) / sizeof(A3));
>+	  VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>+	  SatA3::deallocate(sata3, p, n);
>+	}
>+      if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3) > 0)
>+	{
>+	  auto [p, n] = SatA3::allocate_at_least(sata3,
>+	      __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>+	  VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__ / sizeof(A3));
>+	  SatA3::deallocate(sata3, p, n);
>+	}
>+    }
>+
>+  if constexpr (__STDCPP_DEFAULT_NEW_ALIGNMENT__ > 1)
>+    {
>+      struct Anm1 { char s[__STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1]; };
>+      using SatAnm1 = std::allocator_traits<std::allocator<Anm1>>;
>+      std::allocator<Anm1> satanm1;
>+      {
>+	auto [p, n] = SatAnm1::allocate_at_least(satanm1, 1);
>+	VERIFY(n == 1);
>+	SatAnm1::deallocate(satanm1, p, n);
>+      }
>+      {
>+	auto [p, n] = SatAnm1::allocate_at_least(satanm1,
>+	    __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>+	SatAnm1::deallocate(satanm1, p, n);
>+      }
>+      {
>+	auto [p, n] = SatAnm1::allocate_at_least(satanm1,
>+	    __STDCPP_DEFAULT_NEW_ALIGNMENT__ - 1);
>+	VERIFY(n == __STDCPP_DEFAULT_NEW_ALIGNMENT__);
>+	SatAnm1::deallocate(satanm1, p, n);
>+      }
>+    }
> }
>
> int main()
>-- 
>2.54.0
>
>



More information about the Libstdc++ mailing list