https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100083
Bug ID: 100083
Summary: combining `-O3` and `-fPIC` causes "used
uninitialized" error
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: yichen.yan at inf dot ethz.ch
Target Milestone: ---
g++ reports "used uninitialized" error only with -O3 and -fPIC.
Sorry for the unreadability, This case is reduced by creduce, from some STL
code.
root@amdsuplus1:/test# g++ -Werror=uninitialized -fPIC -o /dev/null -S test.ii
root@amdsuplus1:/test# g++ -Werror=uninitialized -O3 -o /dev/null -S test.ii
root@amdsuplus1:/test# g++ -Werror=uninitialized -O3 -fPIC -o /dev/null -S
test.ii
test.ii: In member function 'void u::v()':
test.ii:24:20: error: '<anonymous>' is used uninitialized in this function
[-Werror=uninitialized]
int t() { return q<int>(*this).r(); }
^~~~~~~~~~~~~
cc1plus: some warnings being treated as errors
root@amdsuplus1:/test# cat test.ii
// g++ -Werror=uninitialized -O3 -fPIC -o /dev/null -S test.ii
template <int a> struct b { static const int aa = a; };
struct c {
static b<0> d();
};
template <bool, bool, class...> struct f;
template <class e, bool g, class... h> struct f<false, g, e, h...> : b<0> {};
struct i : f<decltype(c::d())::aa, b<0>::aa, int> {};
void j(long) {}
class k;
template <class, class = c> class l;
struct n {
typedef b<0> m;
};
template <class> struct q {
int r() { return ah; }
int ah;
q(int) {}
};
class s : q<int>, q<k> {
public:
template <class an, class ao> s(an, ao) : q<int>(0), q<k>(ao()) {}
int t() { return q<int>(*this).r(); }
};
template <class> class ar {
public:
s at;
ar() noexcept(i::aa);
~ar();
};
template <class e> ar<e>::ar() noexcept(i::aa) : at(nullptr, int()) {}
template <class e> ar<e>::~ar() {
long o = at.t();
j(o);
}
template <class, class> class l : ar<int> {
public:
l() {}
l &operator=(l &&) noexcept(b<n::m::aa>::aa);
};
template <class e, class az>
l<e, az> &l<e, az>::operator=(l &&) noexcept(b<n::m::aa>::aa) {
return *this;
}
struct H {
l<int> p;
};
class u {
void v();
H au;
};
void u::v() { au = {}; }