# Ccall and cconvert for Ptr{T}

#1

Just a quick question about `ccall` and `cconvert`. From the manual I know that

``````ccall((:foo, "libfoo"), Void, (A, ), x)
``````

will result in a call to

``````ccall((:foo, "libfoo"), Void, (A, ), unsafe_convert(A, cconvert(A, x)))
``````

``````ccall((:foo, "libfoo"), Void, (Ptr{A}, ), x)
``````

Will this result in a call to

``````ccall((:foo, "libfoo"), Void, (Ptr{A}, ), unsafe_convert(Ptr{A}, cconvert(A,x)))
``````

or is there something else going on?

Here is how this came up. I have types `A` and `B` for which I define `convert(Type{A}, ::B)`. Because of a typo I wrote

``````x::B
ccall((:foo, "libfoo"), Void, (Ptr{A}, ), x)
``````

and it did not throw an error.

#2

No, it’ll be

``````ccall((:foo, "libfoo"), Void, (Ptr{A}, ), unsafe_convert(Ptr{A}, cconvert(Ptr{A},x)))
``````

There’s nothing special about `Ptr`.

#4

Sorry, I think I wrote something wrong. I defined `convert(Type{A}, ::B)` and then the following worked

``````x::B
ccall((:foo, "libfoo"), Void, (Ptr{A}, ), &x)
``````

It does not throw a method error. This is what surprised me.

#5

That lowers to a different set of functions that are not documented since it’ll be deprecated. You can figure out all these by looking at `code_lowered` of the `ccall` and use `code_typed` to see which methods are called.

#6

Thanks a lot and sorry for the confusion. Is there a roadmap for deprecating `&` in `ccall`? This has been called “deprecated” since 0.4, but I have not seen a deprecation warning so far. It is also used extensively in `Base.MPFR` and `Base.GMP`.

#7

The function is fully covered by the `Ref` equivalent but we need better optimizations in type inference to make them perform the same. There isn’t currently a timeline for that. (It’s high, though not highest, on my todo list and I can’t say for others).