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 <ka...@gcc.gnu.org> PR fortran/66545 * primary.c (match_sym_complex_part): Do not dereference NULL pointer. 2015-07-01 Steven g. Kargl <ka...@gcc.gnu.org> PR fortran/66545 * gfortran.dg/pr66545_1.f90: New test. * gfortran.dg/pr66545_2.f90: New test. -- Steve
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