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.
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. */
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 (;;)
{
atom_int = 10 * atom_int + c - '0';
}
+ atom_int *= sign;
}
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':
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':
--- /dev/null
+! { 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