diff mbox

[fortran] PR66929 fix iso_varying_string ICE

Message ID 55AE40B2.5070307@sfr.fr
State New
Headers show

Commit Message

Mikael Morin July 21, 2015, 12:53 p.m. UTC
Hello,

The fix for PR61831 committed recently [1] introduced/uncovered a NULLL 
pointer dereference with iso_varying_string, because a generic symbol 
(which has a NULL result) is used as procedure symbol, instead of the 
specific one.
Fixed by using esym if it's available.

Regression-tested on x86_64-linux. OK for trunk?

Mikael

[1]: https://gcc.gnu.org/ml/gcc-patches/2015-06/msg01389.html
2015-07-20  Mikael Morin  <mikael@gcc.gnu.org>

	PR fortran/61831
	PR fortran/66929
	* trans-array.c (gfc_get_proc_ifc_for_expr): Use esym as procedure
	symbol if available.

2015-07-20  Mikael Morin  <mikael@gcc.gnu.org>

	PR fortran/61831
	PR fortran/66929
	* gfortran.dg/generic_30.f90: New.

Comments

Paul Richard Thomas July 21, 2015, 9:10 p.m. UTC | #1
Hi Mikael,

This looks fine to me - OK for trunk.

Thanks for the patch

Paul

On 21 July 2015 at 14:53, Mikael Morin <mikael.morin@sfr.fr> wrote:
> Hello,
>
> The fix for PR61831 committed recently [1] introduced/uncovered a NULLL
> pointer dereference with iso_varying_string, because a generic symbol (which
> has a NULL result) is used as procedure symbol, instead of the specific one.
> Fixed by using esym if it's available.
>
> Regression-tested on x86_64-linux. OK for trunk?
>
> Mikael
>
> [1]: https://gcc.gnu.org/ml/gcc-patches/2015-06/msg01389.html
>
diff mbox

Patch

Index: trans-array.c
===================================================================
--- trans-array.c	(révision 225979)
+++ trans-array.c	(copie de travail)
@@ -9166,7 +9166,11 @@  gfc_get_proc_ifc_for_expr (gfc_expr *procedure_ref
     return NULL;
 
   /* Normal procedure case.  */
-  sym = procedure_ref->symtree->n.sym;
+  if (procedure_ref->expr_type == EXPR_FUNCTION
+      && procedure_ref->value.function.esym)
+    sym = procedure_ref->value.function.esym;
+  else
+    sym = procedure_ref->symtree->n.sym;
 
   /* Typebound procedure case.  */
   for (ref = procedure_ref->ref; ref; ref = ref->next)