diff --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp --- a/flang/lib/Lower/IntrinsicCall.cpp +++ b/flang/lib/Lower/IntrinsicCall.cpp @@ -648,6 +648,7 @@ /// should be provided for all the intrinsic arguments for completeness. static constexpr IntrinsicHandler handlers[]{ {"abs", &I::genAbs}, + {"achar", &I::genChar}, {"adjustl", &I::genAdjustRtCall, {{{"string", asAddr}}}, diff --git a/flang/test/Lower/Intrinsics/achar.f90 b/flang/test/Lower/Intrinsics/achar.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/Intrinsics/achar.f90 @@ -0,0 +1,23 @@ +! RUN: bbc -emit-fir %s -o - | fir-opt --canonicalize | FileCheck %s +! RUN: %flang_fc1 -emit-fir %s -o - | fir-opt --canonicalize | FileCheck %s + +! CHECK-LABEL: test1 +! CHECK-SAME: (%[[XREF:.*]]: !fir.ref {{.*}}, %[[CBOX:.*]]: !fir.boxchar<1> {{.*}}) +! CHECK: %[[C1:.*]] = arith.constant 1 : index +! CHECK: %[[FALSE:.*]] = arith.constant false +! CHECK: %[[TEMP:.*]] = fir.alloca !fir.char<1> {adapt.valuebyref} +! CHECK: %[[C:.*]]:2 = fir.unboxchar %[[CBOX]] : (!fir.boxchar<1>) -> (!fir.ref>, index) +! CHECK: %[[X:.*]] = fir.load %[[XREF]] : !fir.ref +! CHECK: %[[X_I8:.*]] = fir.convert %[[X]] : (i32) -> i8 +! CHECK: %[[UNDEF:.*]] = fir.undefined !fir.char<1> +! CHECK: %[[XCHAR:.*]] = fir.insert_value %[[UNDEF]], %[[X_I8]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> +! CHECK: fir.store %[[XCHAR]] to %[[TEMP]] : !fir.ref> +! CHECK: %[[C1_I64:.*]] = fir.convert %[[C1]] : (index) -> i64 +! CHECK: %[[C_CVT:.*]] = fir.convert %[[C]]#0 : (!fir.ref>) -> !fir.ref +! CHECK: %[[TEMP_WITH_XCHAR:.*]] = fir.convert %[[TEMP]] : (!fir.ref>) -> !fir.ref +! CHECK: fir.call @llvm.memmove.p0i8.p0i8.i64(%[[C_CVT]], %[[TEMP_WITH_XCHAR]], %[[C1_I64]], %[[FALSE]]) : (!fir.ref, !fir.ref, i64, i1) -> () +subroutine test1(x, c) + integer :: x + character :: c + c = achar(x) +end subroutine