From 3ab7b3def2c04c65ec4054bb4e540fb70b1012b0 Mon Sep 17 00:00:00 2001
From: Brooks Moses <brooks.moses@codesourcery.com>
Date: Thu, 4 Jan 2007 17:30:37 +0000
Subject: [PATCH] re PR fortran/30235 ([4.1 only] missing alternate return
 argument with explicit interface causes segfault)

fortran/
	PR 30235
	* interface.c (compare_actual_formal): check for
	alternate returns when iterating over non-present
	arguments.

testsuite/
	PR 30235
	* gfortran.dg/altreturn_2.f90: new test.

From-SVN: r120447
---
 gcc/fortran/ChangeLog                     | 7 +++++++
 gcc/fortran/interface.c                   | 7 +++++++
 gcc/testsuite/ChangeLog                   | 5 +++++
 gcc/testsuite/gfortran.dg/altreturn_2.f90 | 8 ++++++++
 4 files changed, 27 insertions(+)
 create mode 100755 gcc/testsuite/gfortran.dg/altreturn_2.f90

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ced91a87b65d..2333b821c3f4 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-04  Brooks Moses  <brooks.moses@codesourcery.com>
+
+	PR 30235
+	* interface.c (compare_actual_formal): check for
+	alternate returns when iterating over non-present
+	arguments.
+
 2007-01-04  Brooks Moses  <brooks.moses@codesourcery.com>
 
 	* invoke.texi: Update manpage copyright to include 2007.
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index dd1ac694521b..7b0c4231b0e1 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -1455,6 +1455,13 @@ compare_actual_formal (gfc_actual_arglist ** ap,
     {
       if (new[i] != NULL)
 	continue;
+      if (f->sym == NULL)
+	{
+	  if (where)
+	    gfc_error ("Missing alternate return spec in subroutine call at %L",
+		       where);
+	  return 0;
+	}
       if (!f->sym->attr.optional)
 	{
 	  if (where)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0663f79bb8e5..0309fad98f50 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-01-04  Brooks Moses  <brooks.moses@codesourcery.com>
+
+	PR 30235
+	* gfortran.dg/altreturn_2.f90: new test.
+
 2007-01-04  Tom Tromey  <tromey@redhat.com>
 
 	PR preprocessor/28165:
diff --git a/gcc/testsuite/gfortran.dg/altreturn_2.f90 b/gcc/testsuite/gfortran.dg/altreturn_2.f90
new file mode 100755
index 000000000000..d0556d0370d8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/altreturn_2.f90
@@ -0,0 +1,8 @@
+! { dg-do compile }
+       program altreturn_2
+         call foo()  ! { dg-error "Missing alternate return" }
+       contains
+         subroutine foo(*)
+           return
+         end subroutine
+       end program
-- 
GitLab