[flang] Support DFLOAT legacy extension intrinsic function
Like the similar legacy extension FLOAT(), DFLOAT() represents a
conversion from default integer to DOUBLE PRECISION. Rewrite
into a conversion operation.
Differential Revision: https://reviews.llvm.org/D107489
GitOrigin-RevId: 617be2756fd0e0d943d082e8f86309c4133ce64b
diff --git a/docs/Extensions.md b/docs/Extensions.md
index 49295ae..34767f0 100644
--- a/docs/Extensions.md
+++ b/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/lib/Evaluate/intrinsics.cpp b/lib/Evaluate/intrinsics.cpp
index 8340e80..ae9e7c4 100644
--- a/lib/Evaluate/intrinsics.cpp
+++ b/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/test/Semantics/dfloat.f90 b/test/Semantics/dfloat.f90
new file mode 100644
index 0000000..c04360d
--- /dev/null
+++ b/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