diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ac61e65efb..25a22802c4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2019-03-06 Andrew Burgess + + * f-exp.y (struct f77_boolean_val): Add comments. + (boolean_values): Remove uppercase versions, and end marker. + (yylex): Use ARRAY_SIZE for iterating over boolean_values array, + and use strncasecmp to achieve case insensitivity. Additionally, + perform whitespace cleanup around this code. + 2019-03-06 Tom Tromey * remote-sim.c (gdbsim_target_open): Use result of diff --git a/gdb/f-exp.y b/gdb/f-exp.y index d70c66474c..704585e63a 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -807,19 +807,22 @@ static const struct token dot_ops[] = { NULL, 0, BINOP_END } }; -struct f77_boolean_val +/* Holds the Fortran representation of a boolean, and the integer value we + substitute in when one of the matching strings is parsed. */ +struct f77_boolean_val { + /* The string representing a Fortran boolean. */ const char *name; - int value; -}; -static const struct f77_boolean_val boolean_values[] = + /* The integer value to replace it with. */ + int value; +}; + +/* The set of Fortran booleans. These are matched case insensitively. */ +static const struct f77_boolean_val boolean_values[] = { { ".true.", 1 }, - { ".TRUE.", 1 }, - { ".false.", 0 }, - { ".FALSE.", 0 }, - { NULL, 0 } + { ".false.", 0 } }; static const struct token f77_keywords[] = @@ -931,19 +934,19 @@ yylex (void) prev_lexptr = lexptr; tokstart = lexptr; - - /* First of all, let us make sure we are not dealing with the + + /* First of all, let us make sure we are not dealing with the special tokens .true. and .false. which evaluate to 1 and 0. */ - + if (*lexptr == '.') - { - for (int i = 0; boolean_values[i].name != NULL; i++) + { + for (int i = 0; i < ARRAY_SIZE (boolean_values); i++) { - if (strncmp (tokstart, boolean_values[i].name, - strlen (boolean_values[i].name)) == 0) + if (strncasecmp (tokstart, boolean_values[i].name, + strlen (boolean_values[i].name)) == 0) { - lexptr += strlen (boolean_values[i].name); - yylval.lval = boolean_values[i].value; + lexptr += strlen (boolean_values[i].name); + yylval.lval = boolean_values[i].value; return BOOLEAN_LITERAL; } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1a6b440be3..e2e74a8bff 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-03-06 Andrew Burgess + + * gdb.fortran/types.exp (test_logical_literal_types_accepted): + Check upper and lower case logical literals. + 2019-03-06 Andrew Burgess * gdb.fortran/types.exp (test_float_literal_types_accepted): diff --git a/gdb/testsuite/gdb.fortran/types.exp b/gdb/testsuite/gdb.fortran/types.exp index f786bd30eb..0e28691d90 100644 --- a/gdb/testsuite/gdb.fortran/types.exp +++ b/gdb/testsuite/gdb.fortran/types.exp @@ -45,10 +45,13 @@ proc test_integer_literal_types_rejected {} { proc test_logical_literal_types_accepted {} { global gdb_prompt - # Test the only possible values for a logical, TRUE and FALSE. + # Test the only possible values for a logical, TRUE and FALSE (and + # also true and false). gdb_test "pt .TRUE." "type = logical\\*2" gdb_test "pt .FALSE." "type = logical\\*2" + gdb_test "pt .true." "type = logical\\*2" + gdb_test "pt .false." "type = logical\\*2" } proc test_float_literal_types_accepted {} {