1! { dg-do compile }
2! { dg-options "-O2 -fdump-tree-original" }
3!
4! PR fortran/32600 c_f_pointer w/o shape
5! PR fortran/32580 c_f_procpointer
6!
7! Verify that c_f_prointer [w/o shape] and c_f_procpointer generate
8! the right code - and no library call
9
10program test
11  use iso_c_binding
12  implicit none
13  type(c_ptr)    :: cptr
14  type(c_funptr) :: cfunptr
15  integer(4), pointer :: fptr
16  integer(4), pointer :: fptr_array(:)
17  procedure(integer(4)), pointer :: fprocptr
18
19  call c_f_pointer(cptr, fptr)
20  call c_f_pointer(cptr, fptr_array, [ 1 ])
21  call c_f_procpointer(cfunptr, fprocptr)
22end program test
23
24! Make sure there is no function call:
25! { dg-final { scan-tree-dump-times "c_f" 0 "original" } }
26! { dg-final { scan-tree-dump-times "c_f_pointer" 0 "original" } }
27! { dg-final { scan-tree-dump-times "c_f_pointer_i4" 0 "original" } }
28!
29! Check scalar c_f_pointer
30! { dg-final { scan-tree-dump-times "  fptr = .integer.kind=4. .. cptr" 1 "original" } }
31!
32! Array c_f_pointer:
33!
34! { dg-final { scan-tree-dump-times " fptr_array.data = cptr;" 1 "original" } }
35! { dg-final { scan-tree-dump-times " fptr_array.dim\\\[S..\\\].lbound = 1;" 1 "original" } }
36! { dg-final { scan-tree-dump-times " fptr_array.dim\\\[S..\\\].ubound = " 1 "original" } }
37! { dg-final { scan-tree-dump-times " fptr_array.dim\\\[S..\\\].stride = " 1 "original" } }
38!
39! Check c_f_procpointer
40! { dg-final { scan-tree-dump-times "  fprocptr = .integer.kind=4. .\\*<.*>. ... cfunptr;" 1 "original" } }
41!
42