CPtrToPointer

Associtates a data pointer with the target of a C pointer and specifies its shape, a stmt node.

Declaration

Syntax

CPtrToPointer(expr cptr, expr ptr, expr? shape)

Arguments

cptr contains the C address of an interoperable data entity, or the result of a reference to function C_LOC with a noninteroperable argument. If the value of cptr is the C address of a Fortran varible, it must have the TARGET attribute.

ptr contains data pointer. If it is an array, shape must be specified.

shape is of type integer and rank one. Its size equals the rank of ptr.

Return values

None.

Description

CPtrToPointer is the statement node for conversion from C pointer to data pointer.

If the ptr is an array, it has the shape specified by shape and each lower bound is 1.

Types

cptr and ptr should be of type pointer holding an address. shape must be of type integer.

Examples

program bindc
use iso_c_binding, only: c_loc, c_ptr, c_f_pointer
type(c_ptr) :: queries
integer :: idx = 1
integer(2), pointer :: x
integer(2), target :: y
call c_f_pointer(queries, x)
print *, c_loc(x), queries
x => y
print *, c_loc(x), c_loc(y)
end program

ASR:

(TranslationUnit
    (SymbolTable
        1
        {
            bindc:
                (Program
                    (SymbolTable
                        2
                        {
                            c_f_pointer:
                                (ExternalSymbol
                                    2
                                    c_f_pointer
                                    4 c_f_pointer
                                    lfortran_intrinsic_iso_c_binding
                                    []
                                    c_f_pointer
                                    Public
                                ),
                            c_loc:
                                (ExternalSymbol
                                    2
                                    c_loc
                                    4 c_loc
                                    lfortran_intrinsic_iso_c_binding
                                    []
                                    c_loc
                                    Public
                                ),
                            c_ptr:
                                (ExternalSymbol
                                    2
                                    c_ptr
                                    4 c_ptr
                                    lfortran_intrinsic_iso_c_binding
                                    []
                                    c_ptr
                                    Public
                                ),
                            idx:
                                (Variable
                                    2
                                    idx
                                    Local
                                    (IntegerConstant 1 (Integer 4 []))
                                    ()
                                    Save
                                    (Integer 4 [])
                                    Source
                                    Public
                                    Required
                                    .false.
                                ),
                            queries:
                                (Variable
                                    2
                                    queries
                                    Local
                                    ()
                                    ()
                                    Default
                                    (CPtr)
                                    Source
                                    Public
                                    Required
                                    .false.
                                ),
                            x:
                                (Variable
                                    2
                                    x
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Pointer
                                        (Integer 2 [])
                                    )
                                    Source
                                    Public
                                    Required
                                    .false.
                                ),
                            y:
                                (Variable
                                    2
                                    y
                                    Local
                                    ()
                                    ()
                                    Default
                                    (Integer 2 [])
                                    Source
                                    Public
                                    Required
                                    .false.
                                )

                        })
                    bindc
                    [iso_c_binding]
                    [(CPtrToPointer
                        (Var 2 queries)
                        (Var 2 x)
                        ()
                    )
                    (Print
                        ()
                        [(PointerToCPtr
                            (Var 2 x)
                            (CPtr)
                            ()
                        )
                        (Var 2 queries)]
                        ()
                        ()
                    )
                    (=>
                        (Var 2 x)
                        (Var 2 y)
                    )
                    (Print
                        ()
                        [(PointerToCPtr
                            (Var 2 x)
                            (CPtr)
                            ()
                        )
                        (PointerToCPtr
                            (GetPointer
                                (Var 2 y)
                                (Pointer
                                    (Integer 2 [])
                                )
                                ()
                            )
                            (CPtr)
                            ()
                        )]
                        ()
                        ()
                    )]
                ),
            iso_c_binding:
                (IntrinsicModule lfortran_intrinsic_iso_c_binding),
            lfortran_intrinsic_builtin:
                (IntrinsicModule lfortran_intrinsic_builtin)

        })
    []
)

See Also