diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp index 54e8e09cbf7e4..d7d2f0fa322cb 100644 --- a/flang/lib/Semantics/check-io.cpp +++ b/flang/lib/Semantics/check-io.cpp @@ -1171,6 +1171,11 @@ parser::Message *IoChecker::CheckForBadIoType(const evaluate::DynamicType &type, "Derived type '%s' in I/O may not be polymorphic unless using defined I/O"_err_en_US, derived.name()); } + if (IsBuiltinDerivedType(&derived, "c_ptr") || + IsBuiltinDerivedType(&derived, "c_devptr")) { + // Bypass the check below for c_ptr and c_devptr. + return nullptr; + } if (const Symbol * bad{FindInaccessibleComponent(which, derived, scope)}) { return &context_.Say(where, diff --git a/flang/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90 index 44b0f17339cd9..a9d3ac897eb58 100644 --- a/flang/module/__fortran_builtins.f90 +++ b/flang/module/__fortran_builtins.f90 @@ -102,6 +102,10 @@ __builtin_threadIdx, __builtin_blockDim, __builtin_blockIdx, & __builtin_gridDim integer, parameter, public :: __builtin_warpsize = 32 + + type, public, bind(c) :: __builtin_c_devptr + type(__builtin_c_ptr) :: cptr + end type intrinsic :: __builtin_fma intrinsic :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, & diff --git a/flang/test/Lower/CUDA/cuda-devptr.cuf b/flang/test/Lower/CUDA/cuda-devptr.cuf new file mode 100644 index 0000000000000..4e11e3c0fc8f8 --- /dev/null +++ b/flang/test/Lower/CUDA/cuda-devptr.cuf @@ -0,0 +1,16 @@ +! RUN: bbc -emit-hlfir -fcuda %s -o - | FileCheck %s + +! Test CUDA Fortran specific type + +subroutine sub1() + use iso_c_binding + use __fortran_builtins, only : c_devptr => __builtin_c_devptr + + type(c_ptr) :: ptr + type(c_devptr) :: dptr + print*,ptr + print*,dptr +end + +! CHECK-LABEL: func.func @_QPsub1() +! CHECK-COUNT-2: %{{.*}} = fir.call @_FortranAioOutputDerivedType