aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJosé Rui Faustino de Sousa <jrfsousa@gmail.com>2020-08-30 18:10:15 +0000
committerJosé Rui Faustino de Sousa <jrfsousa@gmail.com>2020-08-30 18:10:15 +0000
commita240e83ce9d92786ac9a15ab815b58197b85ada2 (patch)
treeaea783b158816d14c544c1af27d3c19edb0c6fd8 /gcc
parent3a7a95a220c14043da1e1166530e1d76f001dad9 (diff)
downloadgcc-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')
-rw-r--r--gcc/fortran/module.c42
-rw-r--r--gcc/testsuite/gfortran.dg/PR96728.f9049
2 files changed, 90 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':
diff --git a/gcc/testsuite/gfortran.dg/PR96728.f90 b/gcc/testsuite/gfortran.dg/PR96728.f90
new file mode 100644
index 0000000..4caa3a5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/PR96728.f90
@@ -0,0 +1,49 @@
+! { dg-do run }
+!
+! Test the fix for PR96728
+!
+
+module cref_m
+
+ implicit none
+
+ private
+
+ public :: &
+ isub_a_m
+
+contains
+
+ subroutine isub_a_m(a, b)
+ integer, intent(in) :: a(..)
+ integer, intent(out) :: b(size(a))
+
+ integer :: i
+
+ b = [(i, i=1,size(b))]
+ return
+ end subroutine isub_a_m
+
+end module cref_m
+
+program cref_p
+
+ use cref_m, only: &
+ isub_a_m
+
+ implicit none
+
+ integer :: i
+
+ integer, parameter :: n = 3
+ integer, parameter :: p(*) = [(i, i=1,n*n)]
+
+ integer :: a(n,n)
+ integer :: b(n*n)
+
+ a = reshape(p, shape=[n,n])
+ call isub_a_m(a, b)
+ if (any(b/=p)) stop 1
+ stop
+
+end program cref_p