https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88840
Bug ID: 88840
Summary: [9 Regression] std::allocator::construct signature
might be ill-formed now
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
Target Milestone: ---
#include <memory>
struct X {
X(int);
};
constexpr bool nothrow =
noexcept(std::allocator<X>().construct(std::declval<X*>()));
That construct() call would ill-formed, because the type isn't default
constructible, but until recently it was possible to query whether it could
throw or not. With current trunk the declaration includes an
exception-specification, which makes it ill-formed:
In file included from
/home/jwakely/gcc/9/include/c++/9.0.0/x86_64-pc-linux-gnu/bits/c++allocator.h:33,
from
/home/jwakely/gcc/9/include/c++/9.0.0/bits/allocator.h:46,
from /home/jwakely/gcc/9/include/c++/9.0.0/memory:63,
from construct.cc:1:
/home/jwakely/gcc/9/include/c++/9.0.0/ext/new_allocator.h: In instantiation of
'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up =
X; _Args = {}; _Tp = X]':
construct.cc:7:83: required from here
/home/jwakely/gcc/9/include/c++/9.0.0/ext/new_allocator.h:145:20: error: no
matching function for call to 'X::X()'
145 | noexcept(noexcept(::new((void *)__p)
| ^~~~~~~~~~~~~~~~~~
146 | _Up(std::forward<_Args>(__args)...)))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
construct.cc:4:3: note: candidate: 'X::X(int)'
4 | X(int);
| ^
construct.cc:4:3: note: candidate expects 1 argument, 0 provided
construct.cc:3:8: note: candidate: 'constexpr X::X(const X&)'
3 | struct X {
| ^
construct.cc:3:8: note: candidate expects 1 argument, 0 provided
construct.cc:3:8: note: candidate: 'constexpr X::X(X&&)'
construct.cc:3:8: note: candidate expects 1 argument, 0 provided
We could constrain the declaration with SFINAE, but the program would still be
ill-formed (you still can't ask if the construct() call would throw, because
the declaration would be SFINAE'd out).