https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
--- Comment #22 from Jonathan Wakely <redi at gcc dot gnu.org> --- From Bug 92011: cat > t.cc <<EOF #include <optional> struct Bar { int size_; Bar( int size ) : size_( size ) {} }; template<class T> Bar get( T const& val ) { return Bar( __builtin_strlen(val) ); } class Foo { int size2_; public: Foo() {} template<class T> Foo( T const& t ) : size2_( get<T>( t ).size_ ) {} }; enum Enum {}; bool parseImpl2( Foo s, Enum* val ) { *val = Enum(); for(;;) { s = "aa"; if( true ) return false; return true; } } template<class T> std::optional<T> parse2( Foo str ) { T res = T(); if( parseImpl2( str, &res ) ) return res; return std::optional<T>(); } Enum transform() { if( auto r = parse2<Enum>( Foo() ) ) return *r; return {}; } EOF gcc -std=c++17 -c -o t.cc.o t.cc -Wall -O1 #### Gives: t.cc: In function 'Enum transform()': t.cc:50:27: warning: '<anonymous>' may be used uninitialized in this function [-Wmaybe-uninitialized] 50 | return std::optional<T>(); | ^