https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92011

            Bug ID: 92011
           Summary: '<anonymous>' may be used uninitialized in this
                    function with std::optional<T>()
           Product: gcc
           Version: 9.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: joerg.rich...@pdv-fs.de
  Target Milestone: ---

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>();
      |                           ^

Reply via email to