diff mbox

PR fortran/66545 -- Fix NULL pointer dereference

Message ID 20150701205247.GA20486@troutmask.apl.washington.edu
State New
Headers show

Commit Message

Steve Kargl July 1, 2015, 8:52 p.m. UTC
The attached patch avoid the dereference of a NULL pointer,
and thereby avoids an ICE.  Regression tested on trunk.
OK to commit?

2015-07-01  Steven g. Kargl   <kargl@gcc.gnu.org>

	PR fortran/66545
	* primary.c (match_sym_complex_part): Do not dereference NULL pointer.

2015-07-01  Steven g. Kargl   <kargl@gcc.gnu.org>

	PR fortran/66545
	* gfortran.dg/pr66545_1.f90: New test.
	* gfortran.dg/pr66545_2.f90: New test.

Comments

Thomas Koenig July 1, 2015, 9:11 p.m. UTC | #1
Hi Steve,

> The attached patch avoid the dereference of a NULL pointer,
> and thereby avoids an ICE.  Regression tested on trunk.
> OK to commit?

OK.

Thanks for the patch!

	Thomas
diff mbox

Patch

Index: gcc/fortran/primary.c
===================================================================
--- gcc/fortran/primary.c	(revision 225272)
+++ gcc/fortran/primary.c	(working copy)
@@ -1254,6 +1254,9 @@  match_sym_complex_part (gfc_expr **resul
       return MATCH_ERROR;
     }
 
+  if (!sym->value)
+    goto error;
+
   if (!gfc_numeric_ts (&sym->value->ts))
     {
       gfc_error ("Numeric PARAMETER required in complex constant at %C");
Index: gcc/testsuite/gfortran.dg/pr66545_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr66545_1.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/pr66545_1.f90	(working copy)
@@ -0,0 +1,17 @@ 
+! { dg-do compile }
+! { dg-options "-Wall" }
+! PR fortran/66545
+!
+subroutine p
+   complex, parameter :: c1 = (c1) ! { dg-error "before its definition" }
+   complex, parameter :: c2 = c2   ! { dg-error "before its definition" }
+   complex :: c3 = (c3)            ! { dg-error "has not been declared or is a variable" }
+   complex :: c4 = c4              ! { dg-error "has not been declared or is a variable" }
+end subroutine p
+
+subroutine q
+   real, parameter :: r1 = (r1)  ! { dg-error "before its definition" }
+   real, parameter :: r2 = r2    ! { dg-error "before its definition" }
+   real :: r3 = (r3)             ! { dg-error "has not been declared or is a variable" }
+   real :: r4 = r4               ! { dg-error "has not been declared or is a variable" }
+end subroutine q
Index: gcc/testsuite/gfortran.dg/pr66545_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr66545_2.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/pr66545_2.f90	(working copy)
@@ -0,0 +1,23 @@ 
+! { dg-do compile }
+! { dg-options "-Wuninitialized" }
+! PR fortran/66545
+!
+program foo
+   implicit none
+   call p1
+   call q1
+end program foo
+
+subroutine p1
+   complex :: c5
+   complex :: c6
+   c5 = (c5)      ! { dg-warning "used uninitialized in this" }
+   c6 = c6        ! { dg-warning "used uninitialized in this" }
+end subroutine p1
+
+subroutine q1
+   real :: r5
+   real :: r6
+   r5 = (r5)   ! { dg-warning "used uninitialized in this" }
+   r6 = r6     ! { dg-warning "used uninitialized in this" }
+end subroutine q1