X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a9739e7c4c782e06bd482d45646a9d984524ff33..1b9c21fb18c6d82f9b7512bc0f2f9d980a32c398:/tests/glr-regression.at diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 1971649d..ad8f6d86 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -120,7 +120,7 @@ AT_DATA_GRAMMAR([glr-regr2a.y], /* Reported by S. Eken */ %{ - #define YYSTYPE char const * + #define YYSTYPE char * #include #include @@ -138,9 +138,11 @@ command: 's' var 't' { printf ("Variable: '%s'\n", $2); } 'v' 'x' 'q' + { free ($2); } | 's' var_list 't' 'e' - { printf ("Varlist: '%s'\n", $2); } + { printf ("Varlist: '%s'\n", $2); free ($2); } | 's' var 't' var_printer 'x' + { free ($2); } ; var: @@ -153,10 +155,10 @@ var_list: { $$ = $1; } | var ',' var_list { - char *s = (char *) malloc (strlen ($1) + 1 + strlen ($3) + 1); - strcpy (s, $1); + char *s = (char *) realloc ($1, strlen ($1) + 1 + strlen ($3) + 1); strcat (s, ","); strcat (s, $3); + free ($3); $$ = s; } ; @@ -633,6 +635,183 @@ AT_CHECK([[./glr-regr7]], 2, [], [memory exhausted ]) -AT_XFAIL_IF(:) +AT_CLEANUP + + +## ------------------------------------------------------------------------- ## +## Incorrect default location for empty right-hand sides. Adapted from bug ## +## report by Claudia Hermann. ## +## See http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00069.html and ## +## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html ## +## ------------------------------------------------------------------------- ## + +AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR]) + +AT_DATA_GRAMMAR([glr-regr8.y], +[[ +%{ + #include + #include + static void yyerror (char const *); + static int yylex (void); + static void yyerror(const char *msg); +%} + +%token T_CONSTANT +%token T_PORT +%token T_SIGNAL + +%glr-parser + +%% + + +PortClause : T_PORT InterfaceDeclaration T_PORT + { printf("%d/%d - %d/%d - %d/%d\n", + @1.first_column, @1.last_column, + @2.first_column, @2.last_column, + @3.first_column, @3.last_column); } + ; + +InterfaceDeclaration : OptConstantWord %dprec 1 + | OptSignalWord %dprec 2 + ; + +OptConstantWord : /* empty */ + | T_CONSTANT + ; + +OptSignalWord : /* empty */ + { printf("empty: %d/%d\n", @$.first_column, @$.last_column); } + | T_SIGNAL + ; + +%% + +void yyerror(const char *msg) +{ + fprintf (stderr, "error\n"); +} + +static int lexIndex; + +int yylex (void) +{ + lexIndex += 1; + switch (lexIndex) + { + case 1: + yylloc.first_column = 1; + yylloc.last_column = 9; + return T_PORT; + case 2: + yylloc.first_column = 13; + yylloc.last_column = 17; + return T_PORT; + default: + return 0; + } +} + +int +main (void) +{ + yyparse(); + return 0; +} +]]) + +AT_CHECK([[bison -o glr-regr8.c glr-regr8.y]], 0, [], +[glr-regr8.y: conflicts: 1 reduce/reduce +]) +AT_COMPILE([glr-regr8]) + +AT_CHECK([[./glr-regr8]], 0, +[empty: 9/9 +1/9 - 9/9 - 13/17 +], +[]) + +AT_CLEANUP + + +## ------------------------------------------------------------------------- ## +## No users destructors if stack 0 deleted ## +## Thanks to Joel E. Denny for this test; see ## +## . ## +## ------------------------------------------------------------------------- ## + +AT_SETUP([No users destructors if stack 0 deleted]) + +AT_DATA_GRAMMAR([glr-regr9.y], +[[ +%{ +# include +# include + static void yyerror (char const *); + static int yylex (void); +# define YYSTACKEXPANDABLE 0 + static int tokens = 0; + static int destructors = 0; +# define USE(Var) +%} + +%glr-parser +%union { int dummy; } +%type 'a' + +%destructor { + destructors += 1; +} 'a' + +%% + +start: + ambig0 'a' { destructors += 2; USE ($2); } + | ambig1 start { destructors += 1; } + | ambig2 start { destructors += 1; } + ; + +ambig0: 'a' ; +ambig1: 'a' ; +ambig2: 'a' ; + +%% + +static int +yylex (void) +{ + tokens += 1; + return 'a'; +} + +static void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + int exit_status; + exit_status = yyparse (); + if (tokens != destructors) + { + fprintf (stderr, "Tokens = %d, Destructors = %d\n", tokens, destructors); + return 1; + } + return !exit_status; +} +]]) + +AT_CHECK([[bison -o glr-regr9.c glr-regr9.y]], 0, [], +[glr-regr9.y: conflicts: 1 reduce/reduce +]) +AT_COMPILE([glr-regr9]) + +AT_CHECK([[./glr-regr9]], 0, [], +[memory exhausted +]) AT_CLEANUP