[Bug c++/97664] New: constexpr evaluation incorrectly accepts non-constant destruction
ldalessandro at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Nov 1 15:50:32 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97664
Bug ID: 97664
Summary: constexpr evaluation incorrectly accepts non-constant
destruction
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ldalessandro at gmail dot com
Target Milestone: ---
This one involves some language-lawyering, which is not my forte.
While developing a constexpr, array-based vector that supports non-default
constructible types, I have run into the following inconsistency between clang
and gcc.
https://godbolt.org/z/PYdq5P
```
#include <memory>
struct Foo {
mutable int n = 0;
};
union U {
Foo foo;
constexpr U() {}
};
struct cvector {
U storage[1];
constexpr cvector() {
std::construct_at(&storage[0].foo);
}
constexpr ~cvector() {
std::destroy_at(&storage[0].foo);
}
};
constexpr cvector v;
```
After some slack discussion that I didn't entirely follow, it seems that
http://eel.is/c++draft/expr.const#7.2 combined with
http://eel.is/c++draft/expr.const#6.2 may exclude the constexpr use of
destroy_at of an instance of a class with mutable members. I am not confident
with this analysis, nor am I confident that this is desirable behavior, but am
reporting it for consideration.
More information about the Gcc-bugs
mailing list