public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types
@ 2022-06-04 16:15 benni at stuerz dot xyz
2022-06-04 17:07 ` [Bug c++/105846] " benni at stuerz dot xyz
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: benni at stuerz dot xyz @ 2022-06-04 16:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
Bug ID: 105846
Summary: constexpr unique_ptr doesn't work with virtual types
Product: gcc
Version: 12.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: benni at stuerz dot xyz
Target Milestone: ---
I stumbled on this bug while creating my own constexpr smart pointers.
This does NOT happen with clang + libstdc++!
A short demonstration/explanation of the problem:
https://godbolt.org/z/va4nYjhbe
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
@ 2022-06-04 17:07 ` benni at stuerz dot xyz
2022-06-04 21:36 ` pinskia at gcc dot gnu.org
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: benni at stuerz dot xyz @ 2022-06-04 17:07 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
--- Comment #1 from Benjamin Stürz <benni at stuerz dot xyz> ---
This bug goes (at least) as far back as GCC 10.1.0. It also happens on
ARM/ARM64 btw.
Improved Example:
https://godbolt.org/z/PPfG9Eqvc
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
2022-06-04 17:07 ` [Bug c++/105846] " benni at stuerz dot xyz
@ 2022-06-04 21:36 ` pinskia at gcc dot gnu.org
2022-06-04 21:39 ` [Bug c++/105846] [C++2b] " pinskia at gcc dot gnu.org
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-06-04 21:36 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Created attachment 53083
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53083&action=edit
test.cc
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] [C++2b] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
2022-06-04 17:07 ` [Bug c++/105846] " benni at stuerz dot xyz
2022-06-04 21:36 ` pinskia at gcc dot gnu.org
@ 2022-06-04 21:39 ` pinskia at gcc dot gnu.org
2022-06-04 21:40 ` pinskia at gcc dot gnu.org
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-06-04 21:39 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Created attachment 53084
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53084&action=edit
Second example -std=c++20
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] [C++2b] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
` (2 preceding siblings ...)
2022-06-04 21:39 ` [Bug c++/105846] [C++2b] " pinskia at gcc dot gnu.org
@ 2022-06-04 21:40 ` pinskia at gcc dot gnu.org
2022-06-06 12:57 ` redi at gcc dot gnu.org
2022-07-13 22:45 ` pinskia at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-06-04 21:40 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Can you please attach (or put the testcases inline) instead of linking to
godbolt next time?
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] [C++2b] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
` (3 preceding siblings ...)
2022-06-04 21:40 ` pinskia at gcc dot gnu.org
@ 2022-06-06 12:57 ` redi at gcc dot gnu.org
2022-07-13 22:45 ` pinskia at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: redi at gcc dot gnu.org @ 2022-06-06 12:57 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Status|UNCONFIRMED |NEW
Last reconfirmed| |2022-06-06
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Reduced to remove the library dependency:
// This is just a simple (incomplete) unique_ptr implementation that should
work with C++20/GCC >= 10.1.
// The details of this class don't matter. It also fails with std::unique_ptr
with GCC=12.1/trunk
template<class T>
class simple_pointer {
private:
T *ptr{};
public:
constexpr simple_pointer() noexcept = default;
constexpr simple_pointer(T *p) noexcept : ptr{p} {}
simple_pointer(const simple_pointer &) = delete;
constexpr simple_pointer(simple_pointer &&p) noexcept : ptr{p.ptr} {}
constexpr ~simple_pointer() noexcept { delete ptr; }
void operator=(const simple_pointer &) = delete;
constexpr simple_pointer &operator=(simple_pointer &&p) noexcept {
delete ptr;
ptr = p.ptr;
p.ptr = nullptr;
return *this;
}
constexpr T &operator*() const noexcept { return *ptr; }
constexpr T *operator->() const noexcept { return ptr; }
};
template<class T>
constexpr simple_pointer<T> make_simple() {
return simple_pointer<T>(new T());
}
// Just some random struct that has a vtable.
struct S {
int x{42};
// Removing this virtual...
constexpr virtual ~S() noexcept = default;
};
// ... or this consteval makes it work again.
consteval int run() {
auto p = make_simple<S>();
return p->x;
}
int main() {
return run();
}
105846.C: In function ‘int main()’:
105846.C:46:15: in ‘constexpr’ expansion of ‘run()’
105846.C:43:1: in ‘constexpr’ expansion of ‘(&
p)->simple_pointer<S>::~simple_pointer()’
105846.C:12:44: error: ‘virtual constexpr S::~S()’ used before its definition
12 | constexpr ~simple_pointer() noexcept { delete ptr; }
| ^~~~~~~~~~
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug c++/105846] [C++2b] constexpr unique_ptr doesn't work with virtual types
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
` (4 preceding siblings ...)
2022-06-06 12:57 ` redi at gcc dot gnu.org
@ 2022-07-13 22:45 ` pinskia at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-07-13 22:45 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105846
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |DUPLICATE
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Dup of bug 93413.
*** This bug has been marked as a duplicate of bug 93413 ***
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-07-13 22:45 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-04 16:15 [Bug c++/105846] New: constexpr unique_ptr doesn't work with virtual types benni at stuerz dot xyz
2022-06-04 17:07 ` [Bug c++/105846] " benni at stuerz dot xyz
2022-06-04 21:36 ` pinskia at gcc dot gnu.org
2022-06-04 21:39 ` [Bug c++/105846] [C++2b] " pinskia at gcc dot gnu.org
2022-06-04 21:40 ` pinskia at gcc dot gnu.org
2022-06-06 12:57 ` redi at gcc dot gnu.org
2022-07-13 22:45 ` pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).