From 85a3442c85aedb00c59e986f16cccbb8ec60d777 Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Tue, 4 Jan 2022 18:18:13 -0800 Subject: [PATCH] Fortran: Fix ICE caused by missing error for untyped symbol [PR103258] The bit on a symbol to mark that it had already been diagnosed as lacking a type was getting set even when the error was suppressed or discarded, specifically when doing early resolution on a character length expression to see if it can be constant-folded. Explicitly suppress errors before doing that, then check whether they are suppressed before setting the bit. 2022-01-04 Sandra Loosemore PR fortran/103258 gcc/fortran/ * decl.c (gfc_match_char_spec): Suppress errors around call to gfc_reduce_init_expr. * error.c (gfc_query_suppress_errors): New. * gfortran.h (gfc_query_suppress_errors): Declare. * symbol.c (gfc_set_default_type): Check gfc_query_suppress_errors. gcc/testsuite/ * gfortran.dg/pr103258.f90: New. --- gcc/fortran/decl.c | 2 ++ gcc/fortran/error.c | 9 +++++++++ gcc/fortran/gfortran.h | 1 + gcc/fortran/symbol.c | 2 +- gcc/testsuite/gfortran.dg/pr103258.f90 | 14 ++++++++++++++ 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr103258.f90 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 4e510cc..c846923 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -3609,7 +3609,9 @@ done: gfc_current_ns = gfc_get_namespace (NULL, 0); e = gfc_copy_expr (len); + gfc_push_suppress_errors (); gfc_reduce_init_expr (e); + gfc_pop_suppress_errors (); if (e->expr_type == EXPR_CONSTANT) { gfc_replace_expr (len, e); diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index be2eb93..e95c083 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -83,6 +83,15 @@ gfc_pop_suppress_errors (void) } +/* Query whether errors are suppressed. */ + +bool +gfc_query_suppress_errors (void) +{ + return suppress_errors > 0; +} + + /* Determine terminal width (for trimming source lines in output). */ static int diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index d01a9dc..3b791a4 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1083,6 +1083,7 @@ typedef struct void gfc_push_suppress_errors (void); void gfc_pop_suppress_errors (void); +bool gfc_query_suppress_errors (void); /* Character length structures hold the expression that gives the diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 0385595..1a4b022 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -299,7 +299,7 @@ gfc_set_default_type (gfc_symbol *sym, int error_flag, gfc_namespace *ns) if (ts->type == BT_UNKNOWN) { - if (error_flag && !sym->attr.untyped) + if (error_flag && !sym->attr.untyped && !gfc_query_suppress_errors ()) { const char *guessed = lookup_symbol_fuzzy (sym->name, sym); if (guessed) diff --git a/gcc/testsuite/gfortran.dg/pr103258.f90 b/gcc/testsuite/gfortran.dg/pr103258.f90 new file mode 100644 index 0000000..4521fcd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr103258.f90 @@ -0,0 +1,14 @@ +! { dg-do compile} +! { dg-additional-options "-Wno-pedantic" } +! +! Test from PR103258. This used to ICE due to incorrectly marking the +! no-implicit-type error for n and m in the character length expression +! as already diagnosed during early resolution, when in fact errors are +! ignored in that parsing context. We now expect the errors to be diagnosed +! at the point of the first use of each symbol. + +subroutine s(n) ! { dg-error "Symbol 'n' .*has no IMPLICIT type" } +implicit none +character(n+m) :: c ! { dg-error "Symbol 'm' .*has no IMPLICIT type" } +entry e(m) +end -- 2.7.4