In Bison 3.8.1, there may be a double application of std::move on the semantic value under some circumstances, which may be valid C++, but not intended. A std::move should leave the object in a valid but unspecified state, which probably means that assignments should be still possible.
In the parser, there is a std::move in: /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla)); Then there follows code that gets a new yyla.value: // Read a lookahead token. if (yyla.empty ()) { … } However, if this condition is false, there is a second std::move at: // Shift the lookahead token. yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla)); goto yynewstate;