https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101777
Bug ID: 101777
Summary: Copying array of non-trivial type during constant
evaluation is incorrect
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: davidfromonline at gmail dot com
Target Milestone: ---
The following well-formed translation unit
```
struct value {
constexpr value():
m_value(new int())
{
}
constexpr value(value const &):
m_value(new int())
{
}
value(value &&) = delete;
void operator=(value const &) = delete;
void operator=(value &&) = delete;
constexpr ~value() {
delete m_value;
}
private:
int * m_value;
};
struct array {
value m[1];
};
constexpr bool test() {
auto a = array();
auto b = a;
return true;
}
static_assert(test());
```
Fails with the message
```
<source>:34:19: error: non-constant condition for static assertion
34 | static_assert(test());
| ~~~~^~
<source>:34:19: in 'constexpr' expansion of 'test()'
<source>:32:1: in 'constexpr' expansion of '(& b)->array::~array()'
<source>:24:8: in 'constexpr' expansion of '<anonymous>->value::~value()'
<source>:17:24: error: deallocation of already deallocated storage
17 | delete m_value;
| ^~~~~~~
Compiler returned: 1
```
Compiler explorer: https://godbolt.org/z/bcWf3sr4f
I suspect this is another case where some part of the constant evaluation
assumes an operation is trivial even though it is not (assuming copying array
members is trivial would cause this issue).