diff options
author | José Rui Faustino de Sousa <jrfsousa@gmail.com> | 2020-08-30 18:10:15 +0000 |
---|---|---|
committer | José Rui Faustino de Sousa <jrfsousa@gmail.com> | 2020-08-30 18:10:15 +0000 |
commit | a240e83ce9d92786ac9a15ab815b58197b85ada2 (patch) | |
tree | aea783b158816d14c544c1af27d3c19edb0c6fd8 /gcc/fortran/module.c | |
parent | 3a7a95a220c14043da1e1166530e1d76f001dad9 (diff) | |
download | gcc-a240e83ce9d92786ac9a15ab815b58197b85ada2.zip gcc-a240e83ce9d92786ac9a15ab815b58197b85ada2.tar.gz gcc-a240e83ce9d92786ac9a15ab815b58197b85ada2.tar.bz2 |
2020-8-20 José Rui Faustino de Sousa <jrfsousa@gmail.com>
gcc/fortran/ChangeLog:
PR fortran/96728
* module.c (module_peek_char): Peek ahead function.
(parse_integer): Add code for parsing signed integers.
(parse_atom): Add code to handle signed integers.
(peek_atom): Add code to handle signed integers.
gcc/testsuite/ChangeLog:
PR fortran/96728
* gfortran.dg/PR96728.f90: New test.
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r-- | gcc/fortran/module.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 714fbd9..33e7df7 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -1234,6 +1234,13 @@ get_module_locus (module_locus *m) m->pos = module_pos; } +/* Peek at the next character in the module. */ + +static int +module_peek_char (void) +{ + return module_content[module_pos]; +} /* Get the next character in the module, updating our reckoning of where we are. */ @@ -1314,7 +1321,19 @@ parse_string (void) static void parse_integer (int c) { - atom_int = c - '0'; + int sign = 1; + + atom_int = 0; + switch (c) + { + case ('-'): + sign = -1; + case ('+'): + break; + default: + atom_int = c - '0'; + break; + } for (;;) { @@ -1328,6 +1347,7 @@ parse_integer (int c) atom_int = 10 * atom_int + c - '0'; } + atom_int *= sign; } @@ -1401,6 +1421,16 @@ parse_atom (void) parse_integer (c); return ATOM_INTEGER; + case '+': + case '-': + if (ISDIGIT (module_peek_char ())) + { + parse_integer (c); + return ATOM_INTEGER; + } + else + bad_module ("Bad name"); + case 'a': case 'b': case 'c': @@ -1504,6 +1534,16 @@ peek_atom (void) module_unget_char (); return ATOM_INTEGER; + case '+': + case '-': + if (ISDIGIT (module_peek_char ())) + { + module_unget_char (); + return ATOM_INTEGER; + } + else + bad_module ("Bad name"); + case 'a': case 'b': case 'c': |