]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: always reject alternate return specifier as argument of intrinsics
authorHarald Anlauf <anlauf@gmx.de>
Fri, 14 Jan 2022 20:48:15 +0000 (21:48 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Fri, 14 Jan 2022 20:48:15 +0000 (21:48 +0100)
The intrinsics MOVE_ALLOC, C_F_POINTER, and C_F_PROCPOINTER require
deferred checks of part of their actual argument types which may be of
"any" type.  This however excludes alternate return specifiers which
therefore must be unconditionally rejected for all standard intrinsics.

gcc/fortran/ChangeLog:

PR fortran/99256
* intrinsic.c: Do not check formal argument type when checking
arguments of intrinsics for alternate return specifiers.

gcc/testsuite/ChangeLog:

PR fortran/99256
* gfortran.dg/altreturn_11.f90: New test.

gcc/fortran/intrinsic.c
gcc/testsuite/gfortran.dg/altreturn_11.f90 [new file with mode: 0644]

index a7ecdb401ef903d1605e2b95cc4c2369bf4f37d3..9746cd5ddb6d1053c64866747d17786571c8178c 100644 (file)
@@ -4420,7 +4420,7 @@ do_sort:
   FOR_EACH_VEC_ELT (dummy_args, idx, f)
     {
       a = ordered_actual_args[idx];
-      if (a && a->label != NULL && f->ts.type)
+      if (a && a->label != NULL)
        {
          gfc_error ("ALTERNATE RETURN not permitted at %L", where);
          return false;
diff --git a/gcc/testsuite/gfortran.dg/altreturn_11.f90 b/gcc/testsuite/gfortran.dg/altreturn_11.f90
new file mode 100644 (file)
index 0000000..be42971
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-prune-output "Obsolescent feature: Alternate-return argument" }
+! PR fortran/99256 - ICE in variable_check
+! Contributed by G.Steimetz
+
+program test
+  use iso_c_binding
+  type(c_ptr)    :: i
+  type(c_funptr) :: p
+  call move_alloc     (*1, *2) ! { dg-error "ALTERNATE RETURN" }
+  call c_f_pointer     (i, *1) ! { dg-error "ALTERNATE RETURN" }
+  call c_f_procpointer (p, *2) ! { dg-error "ALTERNATE RETURN" }
+1 continue
+2 stop
+end