https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104192
Bug ID: 104192
Summary: Uninitialized object read is not detected in a
constant expression
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: fchelnokov at gmail dot com
Target Milestone: ---
In the following program, in a constant expression, a temporary object of A is
created with all fields initialized, and then function f creates another object
of A at the same address, skipping (re)initialization of the field x, which is
read afterwards:
```
#include <memory>
struct A {
int x;
constexpr A() {}
constexpr A(int xx) : x(xx) {}
};
constexpr int f(A && a) {
a.~A();
std::construct_at<A>(&a);
return a.x;
}
static_assert( f(A{5}) == 5 );
```
This code is accepted by GCC, but other compilers complain about uninitialized
object read. Demo: https://gcc.godbolt.org/z/sPGjj75Md
Related discussion: https://stackoverflow.com/q/70820127/7325599