aboutsummaryrefslogtreecommitdiff
path: root/gdb/f-exp.y
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-12-11 09:59:15 -0700
committerTom Tromey <tom@tromey.com>2020-12-11 10:10:53 -0700
commit02c727013cc3ae08b86ad360429f9a0dbdc0ec92 (patch)
treea2ab1ef9c1f3d7c441e615f01fd671c135742827 /gdb/f-exp.y
parent14a772212b8e8e19b45a23e2dacb61ceff0d4979 (diff)
downloadgdb-02c727013cc3ae08b86ad360429f9a0dbdc0ec92.zip
gdb-02c727013cc3ae08b86ad360429f9a0dbdc0ec92.tar.gz
gdb-02c727013cc3ae08b86ad360429f9a0dbdc0ec92.tar.bz2
Avoid side effects in expression lexers
I noticed that some of the lexers were calling write_dollar_variable from the lexer. This seems like a bad practice, so this patch moves the side effects into the parsers. I tested this by re-running gdb.fortran and gdb.modula2; the Pascal compiler on my machine seems not to work, so I couldn't test gdb.pascal. I note that the type-tracking in the Pascal is also incorrect, in that a convenience variable's type may change between parsing and evaluation (or even during the course of evaluation). gdb/ChangeLog 2020-12-11 Tom Tromey <tom@tromey.com> * p-exp.y (intvar): Remove global. (DOLLAR_VARIABLE): Change type. (start): Update. (exp): Call write_dollar_variable here... (yylex): ... not here. * m2-exp.y (DOLLAR_VARIABLE): Change type. (variable): Call write_dollar_variable here... (yylex): ... not here. * f-exp.y (DOLLAR_VARIABLE): Change type. (exp): Call write_dollar_variable here... (yylex): ... not here.
Diffstat (limited to 'gdb/f-exp.y')
-rw-r--r--gdb/f-exp.y10
1 files changed, 4 insertions, 6 deletions
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index edfbe0c..ea32056 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -174,7 +174,7 @@ static int parse_number (struct parser_state *, const char *, int,
%token SINGLE DOUBLE PRECISION
%token <lval> CHARACTER
-%token <voidval> DOLLAR_VARIABLE
+%token <sval> DOLLAR_VARIABLE
%token <opcode> ASSIGN_MODIFY
%token <opcode> UNOP_INTRINSIC BINOP_INTRINSIC
@@ -509,6 +509,7 @@ exp : variable
;
exp : DOLLAR_VARIABLE
+ { write_dollar_variable (pstate, $1); }
;
exp : SIZEOF '(' type ')' %prec UNARY
@@ -1357,11 +1358,8 @@ yylex (void)
yylval.sval.length = namelen;
if (*tokstart == '$')
- {
- write_dollar_variable (pstate, yylval.sval);
- return DOLLAR_VARIABLE;
- }
-
+ return DOLLAR_VARIABLE;
+
/* Use token-type TYPENAME for symbols that happen to be defined
currently as names of types; NAME for other symbols.
The caller is not constrained to care about the distinction. */