From 7c654b719d2c186bd645a560525dd3e9c86d15cd Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Mon, 11 Jan 2021 14:14:02 +0000 Subject: [PATCH] gdb/fortran: add symbol base comparison operators Fortran supports symbol based comparison operators as well as the classic text based comparison operators, so we have: Text | Symbol Operator | Operator ---------|--------- .eq. | == .ne. | /= .le. | <= .ge. | >= .gt. | > .lt. | < This commit adds the symbol based operators as well as some tests. gdb/ChangeLog: * f-exp.y (dot_ops): Rename to... (fortran_operators): ...this. Add a header comment. Add symbol based operators. (yylex): Update to use fortran_operators not dot_ops. Remove special handling for '**', this is now included in fortran_operators. gdb/testsuite/ChangeLog: * gdb.fortran/dot-ops.exp: Add new tests. --- gdb/ChangeLog | 9 +++++++ gdb/f-exp.y | 36 +++++++++++++-------------- gdb/testsuite/ChangeLog | 4 +++ gdb/testsuite/gdb.fortran/dot-ops.exp | 30 ++++++++++++++++++++++ 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c33b1d4563b..720d3b230b2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2021-01-12 Andrew Burgess + + * f-exp.y (dot_ops): Rename to... + (fortran_operators): ...this. Add a header comment. Add symbol + based operators. + (yylex): Update to use fortran_operators not dot_ops. Remove + special handling for '**', this is now included in + fortran_operators. + 2021-01-11 Simon Marchi * arch/aarch64-insn.h (aarch64_debug_printf): New. diff --git a/gdb/f-exp.y b/gdb/f-exp.y index e0f1b1ffe15..3b0f23d5d73 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -979,7 +979,9 @@ struct token bool case_sensitive; }; -static const struct token dot_ops[] = +/* List of Fortran operators. */ + +static const struct token fortran_operators[] = { { ".and.", BOOL_AND, BINOP_END, false }, { ".or.", BOOL_OR, BINOP_END, false }, @@ -987,11 +989,18 @@ static const struct token dot_ops[] = { ".eq.", EQUAL, BINOP_END, false }, { ".eqv.", EQUAL, BINOP_END, false }, { ".neqv.", NOTEQUAL, BINOP_END, false }, + { "==", EQUAL, BINOP_END, false }, { ".ne.", NOTEQUAL, BINOP_END, false }, + { "/=", NOTEQUAL, BINOP_END, false }, { ".le.", LEQ, BINOP_END, false }, + { "<=", LEQ, BINOP_END, false }, { ".ge.", GEQ, BINOP_END, false }, + { ">=", GEQ, BINOP_END, false }, { ".gt.", GREATERTHAN, BINOP_END, false }, + { ">", GREATERTHAN, BINOP_END, false }, { ".lt.", LESSTHAN, BINOP_END, false }, + { "<", LESSTHAN, BINOP_END, false }, + { "**", STARSTAR, BINOP_EXP, false }, }; /* Holds the Fortran representation of a boolean, and the integer value we @@ -1163,26 +1172,17 @@ yylex (void) } } - /* See if it is a special .foo. operator. */ - for (int i = 0; i < ARRAY_SIZE (dot_ops); i++) - if (strncasecmp (tokstart, dot_ops[i].oper, - strlen (dot_ops[i].oper)) == 0) + /* See if it is a Fortran operator. */ + for (int i = 0; i < ARRAY_SIZE (fortran_operators); i++) + if (strncasecmp (tokstart, fortran_operators[i].oper, + strlen (fortran_operators[i].oper)) == 0) { - gdb_assert (!dot_ops[i].case_sensitive); - pstate->lexptr += strlen (dot_ops[i].oper); - yylval.opcode = dot_ops[i].opcode; - return dot_ops[i].token; + gdb_assert (!fortran_operators[i].case_sensitive); + pstate->lexptr += strlen (fortran_operators[i].oper); + yylval.opcode = fortran_operators[i].opcode; + return fortran_operators[i].token; } - /* See if it is an exponentiation operator. */ - - if (strncmp (tokstart, "**", 2) == 0) - { - pstate->lexptr += 2; - yylval.opcode = BINOP_EXP; - return STARSTAR; - } - switch (c = *tokstart) { case 0: diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 65bbebfb598..e31b712f01c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2021-01-12 Andrew Burgess + + * gdb.fortran/dot-ops.exp: Add new tests. + 2021-01-11 Tom de Vries PR testsuite/26968 diff --git a/gdb/testsuite/gdb.fortran/dot-ops.exp b/gdb/testsuite/gdb.fortran/dot-ops.exp index 8454f7e298c..cc9adf37aa4 100644 --- a/gdb/testsuite/gdb.fortran/dot-ops.exp +++ b/gdb/testsuite/gdb.fortran/dot-ops.exp @@ -109,6 +109,36 @@ proc test_dot_operations {} { gdb_test "p 4 $gt 4" " = .FALSE." gdb_test "p 3 $gt 4" " = .FALSE." } + + # Now test the symbol based comparison operators. + + # Arithmetic EQ + gdb_test "p 5 == 4" " = .FALSE." + gdb_test "p 4 == 4" " = .TRUE." + + # Arithmetic NE + gdb_test "p 5 /= 4" " = .TRUE." + gdb_test "p 4 /= 4" " = .FALSE." + + # Arithmetic LE + gdb_test "p 5 <= 4" " = .FALSE." + gdb_test "p 4 <= 4" " = .TRUE." + gdb_test "p 3 <= 4" " = .TRUE." + + # Arithmetic LT + gdb_test "p 5 < 4" " = .FALSE." + gdb_test "p 4 < 4" " = .FALSE." + gdb_test "p 3 < 4" " = .TRUE." + + # Arithmetic GE + gdb_test "p 5 >= 4" " = .TRUE." + gdb_test "p 4 >= 4" " = .TRUE." + gdb_test "p 3 >= 4" " = .FALSE." + + # Arithmetic GT + gdb_test "p 5 > 4" " = .TRUE." + gdb_test "p 4 > 4" " = .FALSE." + gdb_test "p 3 > 4" " = .FALSE." } # Start of test script. -- 2.30.2