[gcc/devel/c++-modules] PR fortran/95709 - ICE in gfc_resolve_code, at fortran/resolve.c:11807
Nathan Sidwell
nathan@gcc.gnu.org
Wed Jul 8 18:56:33 GMT 2020
https://gcc.gnu.org/g:824084e72e388f81015e7f67922c75f50741355a
commit 824084e72e388f81015e7f67922c75f50741355a
Author: Harald Anlauf <anlauf@gmx.de>
Date: Mon Jul 6 18:52:39 2020 +0200
PR fortran/95709 - ICE in gfc_resolve_code, at fortran/resolve.c:11807
The legacy "assigned GOTO" accepts only scalar integer variables.
Check for proper arguments.
gcc/fortran/
PR fortran/95709
* resolve.c (gfc_resolve_code): Check for valid arguments to
assigned GOTO.
Diff:
---
gcc/fortran/resolve.c | 16 ++++++++++++----
gcc/testsuite/gfortran.dg/pr95709.f90 | 14 ++++++++++++++
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 9c178d07e53..e8ba48770f7 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11815,10 +11815,18 @@ start:
case EXEC_GOTO:
if (code->expr1 != NULL)
{
- if (code->expr1->ts.type != BT_INTEGER)
- gfc_error ("ASSIGNED GOTO statement at %L requires an "
- "INTEGER variable", &code->expr1->where);
- else if (code->expr1->symtree->n.sym->attr.assign != 1)
+ if (code->expr1->expr_type != EXPR_VARIABLE
+ || code->expr1->ts.type != BT_INTEGER
+ || (code->expr1->ref
+ && code->expr1->ref->type == REF_ARRAY)
+ || code->expr1->symtree == NULL
+ || (code->expr1->symtree->n.sym
+ && (code->expr1->symtree->n.sym->attr.flavor
+ == FL_PARAMETER)))
+ gfc_error ("ASSIGNED GOTO statement at %L requires a "
+ "scalar INTEGER variable", &code->expr1->where);
+ else if (code->expr1->symtree->n.sym
+ && code->expr1->symtree->n.sym->attr.assign != 1)
gfc_error ("Variable %qs has not been assigned a target "
"label at %L", code->expr1->symtree->n.sym->name,
&code->expr1->where);
diff --git a/gcc/testsuite/gfortran.dg/pr95709.f90 b/gcc/testsuite/gfortran.dg/pr95709.f90
new file mode 100644
index 00000000000..e5876067524
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr95709.f90
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! { dg-options "-std=legacy" }
+! PR fortran/95709 - ICE in gfc_resolve_code, at fortran/resolve.c:11807
+
+program p
+ integer, parameter :: i(1) = 1
+ integer, parameter :: j = 1
+ integer :: k(1) = 1
+ goto i(1) ! { dg-error "requires a scalar INTEGER variable" }
+ goto j ! { dg-error "requires a scalar INTEGER variable" }
+ goto k(1) ! { dg-error "requires a scalar INTEGER variable" }
+ goto i%kind, (1) ! { dg-error "requires a scalar INTEGER variable" }
+1 continue
+end
More information about the Gcc-cvs
mailing list