Fortran: Avoid running into assert with -fcheck= + UBSAN
authorTobias Burnus <tobias@codesourcery.com>
Fri, 22 Oct 2021 21:23:06 +0000 (23:23 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Fri, 22 Oct 2021 21:48:57 +0000 (23:48 +0200)
PR fortran/92621
gcc/fortran/
* trans-expr.c (gfc_trans_assignment_1): Add STRIP_NOPS.

gcc/testsuite/
* gfortran.dg/bind-c-intent-out-2.f90: New test.

gcc/fortran/trans-expr.c
gcc/testsuite/gfortran.dg/bind-c-intent-out-2.f90 [new file with mode: 0644]

index 29697e6..2d7f9e0 100644 (file)
@@ -11727,6 +11727,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
 
          tmp = INDIRECT_REF_P (lse.expr)
              ? gfc_build_addr_expr (NULL_TREE, lse.expr) : lse.expr;
+         STRIP_NOPS (tmp);
 
          /* We should only get array references here.  */
          gcc_assert (TREE_CODE (tmp) == POINTER_PLUS_EXPR
diff --git a/gcc/testsuite/gfortran.dg/bind-c-intent-out-2.f90 b/gcc/testsuite/gfortran.dg/bind-c-intent-out-2.f90
new file mode 100644 (file)
index 0000000..fe8f606
--- /dev/null
@@ -0,0 +1,39 @@
+! { dg-do run }
+! { dg-additional-options "-fsanitize=undefined -fcheck=all" }
+
+! PR fortran/92621
+
+subroutine hello(val) bind(c)
+  use, intrinsic :: iso_c_binding, only: c_int
+
+  implicit none
+  
+  integer(kind=c_int), allocatable, intent(out) :: val(:)
+
+  allocate(val(1))
+  val = 2
+  return
+end subroutine hello
+
+program alloc_p
+
+  use, intrinsic :: iso_c_binding, only: c_int
+
+  implicit none
+
+  interface
+    subroutine hello(val) bind(c)
+      import :: c_int
+      implicit none
+      integer(kind=c_int), allocatable, intent(out) :: val(:)
+    end subroutine hello
+  end interface
+
+  integer(kind=c_int), allocatable :: a(:)
+
+  allocate(a(1))
+  a = 1
+  call hello(a)
+  stop
+
+end program alloc_p