[gcc/devel/omp/gcc-9] re PR fortran/91359 (logical function X returns .TRUE. - Warning: spaghetti code)

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 13:52:00 GMT 2020


https://gcc.gnu.org/g:a77715d9406f6d4e5681f9407d7d0b1dcce3b8ed

commit a77715d9406f6d4e5681f9407d7d0b1dcce3b8ed
Author: Steven G. Kargl <kargl@gcc.gnu.org>
Date:   Mon Aug 12 20:09:00 2019 +0000

    re PR fortran/91359 (logical function X returns .TRUE. - Warning:  spaghetti code)
    
    2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
    
    	PR fortran/91359
    	* trans-decl.c (gfc_generate_return): Ensure something is returned
    	from a function.
    
    2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
    
    	PR fortran/91359
    	* gfortran.dg/pr91359_1.f: New test.
    	* gfortran.dg/pr91359_2.f: Ditto.
    
    From-SVN: r274319

Diff:
---
 gcc/fortran/ChangeLog                 |  6 ++++++
 gcc/fortran/trans-decl.c              | 14 ++++++++++++++
 gcc/testsuite/ChangeLog               |  6 ++++++
 gcc/testsuite/gfortran.dg/pr91359_1.f | 17 +++++++++++++++++
 gcc/testsuite/gfortran.dg/pr91359_2.f | 17 +++++++++++++++++
 5 files changed, 60 insertions(+)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 4d07f77..ef90ba0 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
 2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
 
+	PR fortran/91359
+	* trans-decl.c (gfc_generate_return): Ensure something is returned
+	from a function.
+
+2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
+
 	PR fortran/42546
 	* check.c(gfc_check_allocated): Add comment pointing to ...
  	* intrinsic.c(sort_actual): ... the checking done here.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 9538dee..5d1d1ec 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -6440,6 +6440,20 @@ gfc_generate_return (void)
 				    TREE_TYPE (result), DECL_RESULT (fndecl),
 				    result);
 	}
+      else
+	{
+	  /* If the function does not have a result variable, result is
+	     NULL_TREE, and a 'return' is generated without a variable.
+	     The following generates a 'return __result_XXX' where XXX is
+	     the function name.  */
+	  if (sym == sym->result && sym->attr.function)
+	    {
+	      result = gfc_get_fake_result_decl (sym, 0);
+	      result = fold_build2_loc (input_location, MODIFY_EXPR,
+					TREE_TYPE (result),
+					DECL_RESULT (fndecl), result);
+	    }
+	}
     }
 
   return build1_v (RETURN_EXPR, result);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ee3626b..8f4b121 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
 2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
 
+	PR fortran/91359
+	* gfortran.dg/pr91359_1.f: New test.
+	* gfortran.dg/pr91359_2.f: Ditto.
+
+2019-08-12  Steven G. Kargl  <kargl@gcc.gnu.org>
+
 	PR fortran/42546
 	* gfortran.dg/allocated_1.f90: New test.
 	* gfortran.dg/allocated_2.f90: Ditto.
diff --git a/gcc/testsuite/gfortran.dg/pr91359_1.f b/gcc/testsuite/gfortran.dg/pr91359_1.f
new file mode 100644
index 0000000..8242314
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91359_1.f
@@ -0,0 +1,17 @@
+! { dg-do run }
+! PR fortran/91359
+! Orginal code contributed by Brian T. Carcich <briantcarcich at gmail dot com>
+!
+      logical function zero()
+         goto 2
+1        return
+2        zero = .false.
+         if (.not.zero) goto 1
+         return
+      end
+
+      program test_zero
+         logical zero
+         if (zero()) stop 'FAIL:  zero() returned .TRUE.'
+         stop 'OKAY:  zero() returned .FALSE.'
+      end
diff --git a/gcc/testsuite/gfortran.dg/pr91359_2.f b/gcc/testsuite/gfortran.dg/pr91359_2.f
new file mode 100644
index 0000000..7b81a30
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91359_2.f
@@ -0,0 +1,17 @@
+! { dg-do run }
+! PR fortran/91359
+! Orginal code contributed by Brian T. Carcich <briantcarcich at gmail dot com>
+!
+      logical function zero() result(a)
+         goto 2
+1        return
+2        a = .false.
+         if (.not.a) goto 1
+         return
+      end
+
+      program test_zero
+         logical zero
+         if (zero()) stop 'FAIL:  zero() returned .TRUE.'
+         stop 'OKAY:  zero() returned .FALSE.'
+      end



More information about the Gcc-cvs mailing list