I am experiencing problems that appear to be in std::variant. I wonder if this has been reported before, and I just need to upgrade. The problem appears to be in this switch: class number_t { enum type_t { int_e, float_e }; std::variant<ssize_t, double> value; public: ... number_t& operator=( const number_t& that ) { assert( that.value.index() != std::variant_npos ); switch( type_t(that.value.index()) ) { case int_e: value = std::get<ssize_t>(that.value); break; case float_e: value = std::get<double>(that.value); break; } return *this; } That's not how I wrote the code originally. That's a re-write to try to isolate the problem. valgrind reports: ==999106== Conditional jump or move depends on uninitialised value(s) ==999106== at 0x1130B8: number_t::operator=(number_t const&) (expression.h:80) ==999106== by 0x123C23: env_t::numop(number_t& (*)(number_t&, exp_t const&), exp_t const&) (core.cc:429) ==999106== by 0x123FA3: env_t::mul(exp_t const&, env_t&) (core.cc:457) ==999106== by 0x12286F: env_t::eval(exp_t const&, env_t&) (core.cc:148) ==999106== by 0x122767: env_t::eval(exp_t const&, env_t&) (core.cc:136) ==999106== by 0x1104EB: yyparse() (parse.y:319) ==999106== by 0x12DF3F: repl() (main.cc:30) ==999106== by 0x12E20F: main (main.cc:79) It seems to me that if the assert doesn't trip, then the object must be initialized, in which case the switch cannot depend on an uninitialized value. Many thanks. --jkl