[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
This commit is contained in:
peter klausler 2021-07-28 16:14:17 -07:00
parent bb15861e14
commit 617be2756f
3 changed files with 18 additions and 1 deletions

View File

@ -133,6 +133,7 @@ end
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

View File

@ -817,7 +817,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
// 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 @@ static const SpecificIntrinsicInterface specificIntrinsicFunction[]{
{"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"},

View File

@ -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