public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-9220] Fortran: improve checking of character length specification [PR96025]
@ 2023-03-04 19:51 Harald Anlauf
  0 siblings, 0 replies; only message in thread
From: Harald Anlauf @ 2023-03-04 19:51 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:abd1571d2340b5c86ba4d51ef9affc743e764ba8

commit r12-9220-gabd1571d2340b5c86ba4d51ef9affc743e764ba8
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Mon Feb 20 21:28:09 2023 +0100

    Fortran: improve checking of character length specification [PR96025]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/96025
            * parse.cc (check_function_result_typed): Improve type check of
            specification expression for character length and return status.
            (parse_spec): Use status from above.
            * resolve.cc (resolve_fntype): Prevent use of invalid specification
            expression for character length.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/96025
            * gfortran.dg/pr96025.f90: New test.
    
    (cherry picked from commit 6c1b825b3d6499dfeacf7c79dcf4b56a393ac204)

Diff:
---
 gcc/fortran/parse.cc                  | 25 ++++++++++++++-----------
 gcc/fortran/resolve.cc                |  4 +++-
 gcc/testsuite/gfortran.dg/pr96025.f90 | 11 +++++++++++
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc
index d1c72ef92e7..c220913e72c 100644
--- a/gcc/fortran/parse.cc
+++ b/gcc/fortran/parse.cc
@@ -3948,21 +3948,30 @@ match_deferred_characteristics (gfc_typespec * ts)
    For return types specified in a FUNCTION prefix, the IMPLICIT rules of the
    scope are not yet parsed so this has to be delayed up to parse_spec.  */
 
-static void
+static bool
 check_function_result_typed (void)
 {
   gfc_typespec ts;
 
   gcc_assert (gfc_current_state () == COMP_FUNCTION);
 
-  if (!gfc_current_ns->proc_name->result) return;
+  if (!gfc_current_ns->proc_name->result)
+    return true;
 
   ts = gfc_current_ns->proc_name->result->ts;
 
   /* Check type-parameters, at the moment only CHARACTER lengths possible.  */
   /* TODO:  Extend when KIND type parameters are implemented.  */
   if (ts.type == BT_CHARACTER && ts.u.cl && ts.u.cl->length)
-    gfc_expr_check_typed (ts.u.cl->length, gfc_current_ns, true);
+    {
+      /* Reject invalid type of specification expression for length.  */
+      if (ts.u.cl->length->ts.type != BT_INTEGER)
+	  return false;
+
+      gfc_expr_check_typed (ts.u.cl->length, gfc_current_ns, true);
+    }
+
+  return true;
 }
 
 
@@ -4070,10 +4079,7 @@ loop:
 	}
 
       if (verify_now)
-	{
-	  check_function_result_typed ();
-	  function_result_typed = true;
-	}
+	function_result_typed = check_function_result_typed ();
     }
 
   switch (st)
@@ -4084,10 +4090,7 @@ loop:
     case ST_IMPLICIT_NONE:
     case ST_IMPLICIT:
       if (!function_result_typed)
-	{
-	  check_function_result_typed ();
-	  function_result_typed = true;
-	}
+	function_result_typed = check_function_result_typed ();
       goto declSt;
 
     case ST_FORMAT:
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 532ca05b69c..5c66bfb15d9 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -17350,7 +17350,9 @@ resolve_fntype (gfc_namespace *ns)
 	  }
       }
 
-  if (sym->ts.type == BT_CHARACTER)
+  if (sym->ts.type == BT_CHARACTER
+      && sym->ts.u.cl->length
+      && sym->ts.u.cl->length->ts.type == BT_INTEGER)
     gfc_traverse_expr (sym->ts.u.cl->length, sym, flag_fn_result_spec, 0);
 }
 
diff --git a/gcc/testsuite/gfortran.dg/pr96025.f90 b/gcc/testsuite/gfortran.dg/pr96025.f90
new file mode 100644
index 00000000000..ce292bd9664
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr96025.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/96025 - ICE in expr_check_typed_help
+! Contributed by G.Steinmetz
+
+program p
+  print *, f()
+contains
+  character(char(1)) function f() ! { dg-error "must be of INTEGER type" }
+    f = 'f'
+  end
+end

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-04 19:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-04 19:51 [gcc r12-9220] Fortran: improve checking of character length specification [PR96025] Harald Anlauf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).