https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119754

            Bug ID: 119754
           Summary: std::uninitialized_value_construct does not begin
                    lifetime of trivial types
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

#include <algorithm>
#include <memory>

consteval bool f(int n)
{
  int* p = std::allocator<int>().allocate(n);
  std::uninitialized_value_construct(p, p+n);
  std::allocator<int>().deallocate(p, n);
  return true;
}

static_assert(f(10));


With -std=c++26 GCC accepts this, but Clang doesn't:

ef.cc:12:15: error: static assertion expression is not an integral constant
expression
   12 | static_assert(f(10));
      |               ^~~~~
/home/jwakely/gcc/15/lib/gcc/x86_64-pc-linux-gnu/15.0.1/../../../../include/c++/15.0.1/bits/stl_algobase.h:925:11:
note: assignment to object outside its lifetime is not allowed in a constant
expression
  925 |         *__first = __val;
      |         ~~~~~~~~~^~~~~~~

Reply via email to