]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/91359 (logical function X returns .TRUE. - Warning: spaghetti code)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 12 Aug 2019 20:09:00 +0000 (20:09 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 12 Aug 2019 20:09:00 +0000 (20:09 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91359_1.f [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr91359_2.f [new file with mode: 0644]

index 4d07f7778cd4bbf87210fa8127f18916786711b7..ef90ba0ce7bd1abab015db47d3117053e7933bef 100644 (file)
@@ -1,3 +1,9 @@
+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
index 9538dee5733ab8b837704b747bbc57326015961e..5d1d1ecb19c831b5a2c1575a8ea94140dac0e307 100644 (file)
@@ -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);
index ee3626bb5a8fc3b7f171e4f746c6007dc5dae62e..8f4b121346ca2bca8c0237b9f668c31c17f8f718 100644 (file)
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/pr91359_1.f b/gcc/testsuite/gfortran.dg/pr91359_1.f
new file mode 100644 (file)
index 0000000..8242314
--- /dev/null
@@ -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 (file)
index 0000000..7b81a30
--- /dev/null
@@ -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