diff mbox series

[Committed] PR Fortran/82367 -- Check for NULL pointer.

Message ID 20180110232841.GA75414@troutmask.apl.washington.edu
State New
Headers show
Series [Committed] PR Fortran/82367 -- Check for NULL pointer. | expand

Commit Message

Steve Kargl Jan. 10, 2018, 11:28 p.m. UTC
Thomas Koenig approved the patch in the PR.
Regression tested on x86_64-*-freebsd

2018-01-10  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/82367
	* resolve.c (resolve_allocate_expr): Check for NULL pointer.

2018-01-10  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/82367
	* gfortran.dg/deferred_character_18.f90: New test.
diff mbox series

Patch

Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 256455)
+++ gcc/fortran/resolve.c	(working copy)
@@ -7484,8 +7484,13 @@  resolve_allocate_expr (gfc_expr *e, gfc_code *code, bo
   if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred
       && !UNLIMITED_POLY (e))
     {
-      int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
-				      code->ext.alloc.ts.u.cl->length);
+      int cmp;
+
+      if (!e->ts.u.cl->length)
+	goto failure;
+
+      cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
+				  code->ext.alloc.ts.u.cl->length);
       if (cmp == 1 || cmp == -1 || cmp == -3)
 	{
 	  gfc_error ("Allocating %s at %L with type-spec requires the same "
Index: gcc/testsuite/gfortran.dg/deferred_character_18.f90
===================================================================
--- gcc/testsuite/gfortran.dg/deferred_character_18.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/deferred_character_18.f90	(working copy)
@@ -0,0 +1,29 @@ 
+! { dg-do compile }
+! PR Fortran/82367
+! Contributed by Walter Spector <w6ws at earthlink dot net>
+module cls_allocmod
+  implicit none
+
+contains
+
+ subroutine cls_alloc (n, str)
+    integer,  intent(in) :: n
+    character(*), allocatable, intent(out) :: str
+!  Note: Star ^ should have been a colon (:)
+
+    allocate (character(n)::str)
+
+  end subroutine
+
+end module
+
+program cls
+  use cls_allocmod
+  implicit none
+
+  character(:), allocatable :: s
+
+  call cls_alloc(42, s) ! { dg-error "allocatable or pointer dummy argument" }
+  print *, 'string len =', len(s)
+
+end program