Compiling this code: #include <iostream> int main() { int x; std::cout << x; std::cin >> x; } with g++ -Wall uninitialized.cc give no warning. But compiling this code: #include <iostream> int main() { int x; std::cout << x; } with g++ -Wall uninitialized.cc gives: uninitialized.cc: In function ‘int main()’: uninitialized.cc:6:17: warning: ‘x’ is used uninitialized in this function [-Wuninitialized Tested also on version 4.6.1 and 4.6.2
The SSA dump is a bit obscure to me: int main() () { int x; int D.21721; int x.0; <bb 2>: [pr52523.cc : 5:17] x.0_1 = x; [pr52523.cc : 5:17] std::basic_ostream<char>::operator<< ([pr52523.cc : 5] &cout, x.0_1); <bb 3>: [pr52523.cc : 6:16] std::basic_istream<char>::operator>> ([pr52523.cc : 6] &cin, &x); <bb 4>: x ={v} {CLOBBER}; [pr52523.cc : 7:1] D.21721_2 = 0; <L0>: [pr52523.cc : 7:1] return D.21721_2; <L1>: x ={v} {CLOBBER}; resx 1 } but I guess that 'std::cin >> x' creates a VOP, and the warning machinery does not work well with VOPs. See PR19430.
GCC 11 (since g:b825a22890740f341eae566af27e18e528cd29a7) diagnoses passing an uninitialized object by const reference by -Wmaybe-uninitialized: $ g++ -S -Wall pr52523.C pr52523.C: In function ‘int main()’: pr52523.C:6:13: warning: ‘x’ is used uninitialized [-Wuninitialized] 6 | std::cout << x; | ~~~~~~~~~~^~~~ pr52523.C:5:7: note: ‘x’ declared here 5 | int x; | ^