The api.value.automove directive doesn't honor an explicit false setting. -------------------------------------------// test_automove.y%skeleton "lalr1.cc"%require "3.8"%language "c++"%define api.value.automove false %token <int> VAL%nterm <int> x%%x: VAL------------------------------------------- bison -o test_automove.cpp test_automove.y grep -B2 "yylhs.value.int" test_automove.bison.cpp case 2: // x: VAL#line 11 "test_automove.bison.y" { (yylhs.value.int) = YY_MOVE ((yystack_[0].value.int)); } bison --versionbison (GNU Bison) 3.8.2 ------------------------------------------- The problem is in skeletons/lalr1.cc where b4_percent_define_ifdef applies YY_MOVE as long as api.value.automove is defined without considering its value The default value of api.value.automove is false - omitting the directive does prevent YY_MOVE from being applied m4_define([b4_rhs_value],[b4_percent_define_ifdef([api.value.automove], [YY_MOVE (_b4_rhs_value($@))], [_b4_rhs_value($@)])]) ------------------------------------------- b4_percent_define_ifdef is defined in skeletons/bison.m4 # _b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])# ------------------------------------------------------# If the %define variable VARIABLE is defined, expand IF-TRUE, else expand# IF-FALSE. Don't record usage of VARIABLE. ------------------------------------------- I'll send a fix for lalr1.cc shortly to bison-patches that looks like this 111a112,114> # api.value.automove boolean default value false> b4_percent_define_default([[api.value.automove]], [[false]])>113,115c116,118< [b4_percent_define_ifdef([api.value.automove],< [YY_MOVE (_b4_rhs_value($@))],< [_b4_rhs_value($@)])])---> [b4_percent_define_flag_if([api.value.automove],> [YY_MOVE /* ztm true */ (_b4_rhs_value($@))],> [/* ztm false */_b4_rhs_value($@)])])
Zartaj