diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md --- a/flang/docs/Extensions.md +++ b/flang/docs/Extensions.md @@ -133,6 +133,7 @@ the arguments as if they were operands to an intrinsic `+` operator, and defining the result type accordingly. * DOUBLE COMPLEX intrinsics DREAL, DCMPLX, DCONJG, and DIMAG. +* The DFLOAT intrinsic function. * INT_PTR_KIND intrinsic returns the kind of c_intptr_t. * Restricted specific conversion intrinsics FLOAT, SNGL, IDINT, IFIX, DREAL, and DCMPLX accept arguments of any kind instead of only the default kind or diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -817,7 +817,7 @@ // TODO: Non-standard intrinsic functions // AND, OR, XOR, LSHIFT, RSHIFT, SHIFT, ZEXT, IZEXT, // COMPL, EQV, NEQV, INT8, JINT, JNINT, KNINT, -// QCMPLX, DFLOAT, QEXT, QFLOAT, QREAL, DNUM, +// QCMPLX, QEXT, QFLOAT, QREAL, DNUM, // INUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN, // MCLOCK, SECNDS, COTAN, IBCHNG, ISHA, ISHC, ISHL, IXOR // IARG, IARGC, NARGS, NUMARG, BADDRESS, IADDR, CACHESIZE, @@ -924,6 +924,7 @@ {"y", AnyIntOrReal, Rank::elementalOrBOZ, Optionality::optional}}, DoublePrecisionComplex}, "cmplx", true}, + {{"dfloat", {{"i", AnyInt}}, DoublePrecision}, "real", true}, {{"dreal", {{"a", AnyComplex}}, DoublePrecision}, "real", true}, {{"dconjg", {{"a", DoublePrecisionComplex}}, DoublePrecisionComplex}, "conjg"}, diff --git a/flang/test/Semantics/dfloat.f90 b/flang/test/Semantics/dfloat.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/dfloat.f90 @@ -0,0 +1,15 @@ +! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s +! Checks that a call to the legacy extension intrinsic function +! DFLOAT is transmogrified into a type conversion operation. +module m + !CHECK: d = 1._8 + double precision :: d = dfloat(1) + contains + subroutine sub(n) + integer, intent(in) :: n + !CHECK: 2._8 + print *, dfloat(2) + !CHECK: real(n,kind=8) + print *, dfloat(n) + end subroutine +end module