aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandra Loosemore <sandra@codesourcery.com>2022-01-04 18:18:13 -0800
committerSandra Loosemore <sandra@codesourcery.com>2022-01-05 09:02:22 -0800
commit85a3442c85aedb00c59e986f16cccbb8ec60d777 (patch)
tree2ad4990645d1b6927b0dc72f749b9fa41b35dc14
parent6aa0859afaf28f4fb13121352225bc5877e02a44 (diff)
downloadgcc-85a3442c85aedb00c59e986f16cccbb8ec60d777.zip
gcc-85a3442c85aedb00c59e986f16cccbb8ec60d777.tar.gz
gcc-85a3442c85aedb00c59e986f16cccbb8ec60d777.tar.bz2
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 <sandra@codesourcery.com> 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.
-rw-r--r--gcc/fortran/decl.c2
-rw-r--r--gcc/fortran/error.c9
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/fortran/symbol.c2
-rw-r--r--gcc/testsuite/gfortran.dg/pr103258.f9014
5 files changed, 27 insertions, 1 deletions
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