]> git.saurik.com Git - bison.git/blobdiff - tests/actions.at
Merge remote-tracking branch 'origin/maint'
[bison.git] / tests / actions.at
index 120c40126da422d9e00a65519a28541345ad91ac..4b0019b84f112ad4ea4b763df29bf429d973cc41 100644 (file)
@@ -1255,6 +1255,127 @@ AT_CHECK_ACTION_LOCATIONS([[%destructor]])
 AT_CHECK_ACTION_LOCATIONS([[%printer]])
 
 
+## ------------------------- ##
+## Qualified $$ in actions.  ##
+## ------------------------- ##
+
+# Check that we can use qualified $$ (v.g., $<type>$) not only in rule
+# actions, but also where $$ is valid: %destructor/%printer and
+# %initial-action.
+#
+# FIXME: Not actually checking %destructor, but it's the same code as
+# %printer...
+#
+# To do that, use a semantic value that has two fields (sem_type),
+# declare symbols to have only one of these types (INT, float), and
+# use $<type>$ to get the other one.  Including for symbols that are
+# not typed (UNTYPED).
+
+m4_pushdef([AT_TEST],
+[AT_SETUP([[Qualified $$ in actions: $1]])
+
+AT_BISON_OPTION_PUSHDEFS([%skeleton "$1"])
+
+AT_DATA_GRAMMAR([[input.y]],
+[[%skeleton "$1"
+%debug
+%code requires
+{
+  typedef struct sem_type
+  {
+    int ival;
+    float fval;
+  } sem_type;
+
+# define YYSTYPE sem_type
+
+]AT_SKEL_CC_IF([[
+# include <iostream>
+  static void
+  report (std::ostream& yyo, int ival, float fval)
+  {
+    yyo << "ival: " << ival << ", fval: " <<  fval;
+  }
+]], [[
+# include <stdio.h>
+  static void
+  report (FILE* yyo, int ival, float fval)
+  {
+    fprintf (yyo, "ival: %d, fval: %1.1f", ival, fval);
+  }
+]])[
+}
+
+%code
+{
+  ]AT_YYERROR_DECLARE[
+  ]AT_YYLEX_DECLARE[
+}
+
+%token UNTYPED
+%token <ival> INT
+%type <fval> float
+%printer { report (yyo, $$,       $<fval>$); } <ival>;
+%printer { report (yyo, $<ival>$, $$      ); } <fval>;
+%printer { report (yyo, $<ival>$, $<fval>$); } <>;
+
+%initial-action
+{
+  $<ival>$ = 42;
+  $<fval>$ = 4.2;
+}
+
+%%
+float: UNTYPED INT
+{
+  $$       = $<fval>1 + $<fval>2;
+  $<ival>$ = $<ival>1 + $][2;
+};
+%%
+]AT_YYERROR_DEFINE[
+]AT_YYLEX_DEFINE(AT_SKEL_CC_IF([[{yy::parser::token::UNTYPED,
+                                 yy::parser::token::INT,
+                                  EOF}]],
+                               [[{UNTYPED, INT, EOF}]]),
+                 [AT_VAL.ival = toknum * 10; AT_VAL.fval = toknum / 10.0;])[
+int
+main (void)
+{]AT_SKEL_CC_IF([[
+  yy::parser p;
+  p.set_debug_level(1);
+  return p.parse ();]], [[
+  yydebug = 1;
+  return yyparse ();]])[
+}
+]])
+
+AT_FULL_COMPILE([[input]])
+AT_PARSER_CHECK([./input], 0, [], [stderr])
+# Don't be too picky on the traces, GLR is not exactly the same.  Keep
+# only the lines from the printer.
+AT_CHECK([[sed -ne '/ival:/p' stderr]], 0,
+[[Reading a token: Next token is token UNTYPED (ival: 10, fval: 0.1)
+Shifting token UNTYPED (ival: 10, fval: 0.1)
+Reading a token: Next token is token INT (ival: 20, fval: 0.2)
+Shifting token INT (ival: 20, fval: 0.2)
+   $][1 = token UNTYPED (ival: 10, fval: 0.1)
+   $][2 = token INT (ival: 20, fval: 0.2)
+-> $$ = nterm float (ival: 30, fval: 0.3)
+Cleanup: popping nterm float (ival: 30, fval: 0.3)
+]])
+
+AT_BISON_OPTION_POPDEFS
+
+AT_CLEANUP
+])
+
+AT_TEST([yacc.c])
+AT_TEST([glr.c])
+AT_TEST([lalr1.cc])
+AT_TEST([glr.cc])
+
+m4_popdef([AT_TEST])
+
 ## ----------------------------------------------- ##
 ## Fix user actions without a trailing semicolon.  ##
 ## ----------------------------------------------- ##
@@ -1317,42 +1438,42 @@ string;"}
 AT_BISON_OPTION_POPDEFS
 
 AT_BISON_CHECK([[-o input.c input.y]], [0], [],
-[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:8.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:9.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:9.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:10.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:10.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:11.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:11.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:12.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:12.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:13.48: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:13.48: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:20.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:20.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:21.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:21.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:22.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:22.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:23.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:23.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:24.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:24.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:25.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:25.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:31.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:31.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:32.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:32.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:33.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:33.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:34.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:34.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:35.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:35.1: warning: future versions of Bison will not add the ';' [-Wother]
-input.y:36.1: warning: a ';' might be needed at the end of action code [-Wother]
-input.y:36.1: warning: future versions of Bison will not add the ';' [-Wother]
+[[input.y:8.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:8.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:9.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:9.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:10.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:10.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:11.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:11.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:12.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:12.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:13.48: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:13.48: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:20.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:20.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:21.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:21.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:22.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:22.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:23.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:23.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:24.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:24.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:25.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:25.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:31.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:31.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:32.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:32.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:33.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:33.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:34.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:34.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:35.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:35.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
+input.y:36.1: warning: a ';' might be needed at the end of action code [-Wdeprecated]
+input.y:36.1: warning: future versions of Bison will not add the ';' [-Wdeprecated]
 ]])
 
 AT_MATCHES_CHECK([input.c], [[/\* TEST:N:2 \*/ \}$]],       [[3]])