X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7ca2266adce5b0619068765b08e8ec5ca4673c1f..31d3e510949227d55ed7e87c793b3ec571dffec3:/tests/actions.at?ds=sidebyside diff --git a/tests/actions.at b/tests/actions.at index afbc94db..841ae392 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1300,3 +1300,111 @@ AT_CLEANUP]) AT_CHECK_ACTION_LOCATIONS([[%initial-action]]) AT_CHECK_ACTION_LOCATIONS([[%destructor]]) AT_CHECK_ACTION_LOCATIONS([[%printer]]) + + +## ----------------------------------------------- ## +## Fix user actions without a trailing semicolon. ## +## ----------------------------------------------- ## + +AT_SETUP([[Fix user actions without a trailing semicolon]]) + +# This feature is undocumented, but we accidentally broke it in 2.3a, +# and there was a complaint at: +# . + +AT_DATA([input.y], +[[%% +start: test2 test1 test0 testc; + +test2 +: 'a' { semi; /* TEST:N:2 */ } +| 'b' { if (0) {no_semi} /* TEST:N:2 */ } +| 'c' { if (0) {semi;} /* TEST:N:2 */ } +| 'd' { semi; no_semi /* TEST:Y:2 */ } +| 'e' { semi(); no_semi() /* TEST:Y:2 */ } +| 'f' { semi[]; no_semi[] /* TEST:Y:2 */ } +| 'g' { semi++; no_semi++ /* TEST:Y:2 */ } +| 'h' { {no_semi} no_semi /* TEST:Y:2 */ } +| 'i' { {semi;} no_semi /* TEST:Y:2 */ } +; +test1 + : 'a' { semi; // TEST:N:1 ; +} | 'b' { if (0) {no_semi} // TEST:N:1 ; +} | 'c' { if (0) {semi;} // TEST:N:1 ; +} | 'd' { semi; no_semi // TEST:Y:1 ; +} | 'e' { semi(); no_semi() // TEST:Y:1 ; +} | 'f' { semi[]; no_semi[] // TEST:Y:1 ; +} | 'g' { semi++; no_semi++ // TEST:Y:1 ; +} | 'h' { {no_semi} no_semi // TEST:Y:1 ; +} | 'i' { {semi;} no_semi // TEST:Y:1 ; +} ; +test0 + : 'a' { semi; // TEST:N:1 {} +} | 'b' { if (0) {no_semi} // TEST:N:1 {} +} | 'c' { if (0) {semi;} // TEST:N:1 {} +} | 'd' { semi; no_semi // TEST:Y:1 {} +} | 'e' { semi(); no_semi() // TEST:Y:1 {} +} | 'f' { semi[]; no_semi[] // TEST:Y:1 {} +} | 'g' { semi++; no_semi++ // TEST:Y:1 {} +} | 'h' { {no_semi} no_semi // TEST:Y:1 {} +} | 'i' { {semi;} no_semi // TEST:Y:1 {} +} ; + +testc +: 'a' { +#define TEST_MACRO_N \ +[]"broken\" $ @ $$ @$ [];\ +string;"} +| 'b' { +no_semi +#define TEST_MACRO_N \ +[]"broken\" $ @ $$ @$ [];\ +string;"} +]]) + +AT_BISON_CHECK([[-o input.c input.y]], [0], [], +[[input.y:8.48: warning: a `;' might be needed at the end of action code +input.y:8.48: warning: future versions of Bison will not add the `;' +input.y:9.48: warning: a `;' might be needed at the end of action code +input.y:9.48: warning: future versions of Bison will not add the `;' +input.y:10.48: warning: a `;' might be needed at the end of action code +input.y:10.48: warning: future versions of Bison will not add the `;' +input.y:11.48: warning: a `;' might be needed at the end of action code +input.y:11.48: warning: future versions of Bison will not add the `;' +input.y:12.48: warning: a `;' might be needed at the end of action code +input.y:12.48: warning: future versions of Bison will not add the `;' +input.y:13.48: warning: a `;' might be needed at the end of action code +input.y:13.48: warning: future versions of Bison will not add the `;' +input.y:20.1: warning: a `;' might be needed at the end of action code +input.y:20.1: warning: future versions of Bison will not add the `;' +input.y:21.1: warning: a `;' might be needed at the end of action code +input.y:21.1: warning: future versions of Bison will not add the `;' +input.y:22.1: warning: a `;' might be needed at the end of action code +input.y:22.1: warning: future versions of Bison will not add the `;' +input.y:23.1: warning: a `;' might be needed at the end of action code +input.y:23.1: warning: future versions of Bison will not add the `;' +input.y:24.1: warning: a `;' might be needed at the end of action code +input.y:24.1: warning: future versions of Bison will not add the `;' +input.y:25.1: warning: a `;' might be needed at the end of action code +input.y:25.1: warning: future versions of Bison will not add the `;' +input.y:31.1: warning: a `;' might be needed at the end of action code +input.y:31.1: warning: future versions of Bison will not add the `;' +input.y:32.1: warning: a `;' might be needed at the end of action code +input.y:32.1: warning: future versions of Bison will not add the `;' +input.y:33.1: warning: a `;' might be needed at the end of action code +input.y:33.1: warning: future versions of Bison will not add the `;' +input.y:34.1: warning: a `;' might be needed at the end of action code +input.y:34.1: warning: future versions of Bison will not add the `;' +input.y:35.1: warning: a `;' might be needed at the end of action code +input.y:35.1: warning: future versions of Bison will not add the `;' +input.y:36.1: warning: a `;' might be needed at the end of action code +input.y:36.1: warning: future versions of Bison will not add the `;' +]]) + +AT_MATCHES_CHECK([input.c], [[/\* TEST:N:2 \*/ \}$]], [[3]]) +AT_MATCHES_CHECK([input.c], [[/\* TEST:Y:2 \*/ ;\}$]], [[6]]) +AT_MATCHES_CHECK([input.c], [[// TEST:N:1 [;{}]*\n\}$]], [[6]]) +AT_MATCHES_CHECK([input.c], [[// TEST:Y:1 [;{}]*\n;\}$]], [[12]]) +AT_MATCHES_CHECK([input.c], [[#define TEST_MACRO_N \\\n\[\]"broken\\" \$ \@ \$\$ \@\$ \[\];\\\nstring;"\}]], [[2]]) + +AT_CLEANUP