]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/38718 (some simplifiers for elemental intrinsics missing; required...
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Wed, 9 Nov 2011 09:41:17 +0000 (09:41 +0000)
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>
Wed, 9 Nov 2011 09:41:17 +0000 (09:41 +0000)
PR fortran/38718

* intrinsic.c (add_functions): Add gfc_simplify_dreal.
* intrinsic.h (gfc_simplify_dreal): New proto.
* simplify.c (gfc_simplify_dreal): New function.

* gfortran.dg/initialization_29.f90: Expand test.

From-SVN: r181198

gcc/fortran/ChangeLog
gcc/fortran/intrinsic.c
gcc/fortran/intrinsic.h
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/initialization_29.f90 [new file with mode: 0644]

index 96944e26ab2c2dbef3e8698532661b4b2ee6d387..1fffbc609b6a30b5b470d760a4feac2c60f1be20 100644 (file)
@@ -1,3 +1,10 @@
+2011-11-08  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/38718
+       * intrinsic.c (add_functions): Allow dreal simplification.
+       * intrinsic.h (gfc_simplify_dreal): New prototype.
+       * simplify.c (gfc_simplify_dreal): New function.
+
 2011-11-09  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/21881
index 8f437cc05fe4000a66bf2591e16df09c7e407903..38bcb273fdd146b31ab42ca9739fe98d47921c3e 100644 (file)
@@ -1557,8 +1557,8 @@ add_functions (void)
 
   make_generic ("dprod", GFC_ISYM_DPROD, GFC_STD_F77);
 
-  add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO, BT_REAL, dd, GFC_STD_GNU,
-            NULL, NULL, NULL,
+  add_sym_1 ("dreal", GFC_ISYM_REAL, CLASS_ELEMENTAL, ACTUAL_NO,
+            BT_REAL, dd, GFC_STD_GNU, NULL, gfc_simplify_dreal, NULL,
             a, BT_COMPLEX, dd, REQUIRED);
 
   make_generic ("dreal", GFC_ISYM_REAL, GFC_STD_GNU);
index e64325b99e7ff6e17252d8daaac061b1a6baf2ee..bfc2455cfd2351b5b9d63813b00aac4bd6394d17 100644 (file)
@@ -262,6 +262,7 @@ gfc_expr *gfc_simplify_digits (gfc_expr *);
 gfc_expr *gfc_simplify_dim (gfc_expr *, gfc_expr *);
 gfc_expr *gfc_simplify_dprod (gfc_expr *, gfc_expr *);
 gfc_expr *gfc_simplify_dot_product (gfc_expr *, gfc_expr *);
+gfc_expr *gfc_simplify_dreal (gfc_expr *);
 gfc_expr *gfc_simplify_dshiftl (gfc_expr *, gfc_expr *, gfc_expr *);
 gfc_expr *gfc_simplify_dshiftr (gfc_expr *, gfc_expr *, gfc_expr *);
 gfc_expr *gfc_simplify_epsilon (gfc_expr *);
index 01071cfe13882c672ea818c09330620df727b35a..443182613880ac7815cc662b7384d454efd76270 100644 (file)
@@ -938,6 +938,21 @@ gfc_simplify_dint (gfc_expr *e)
 }
 
 
+gfc_expr *
+gfc_simplify_dreal (gfc_expr *e)
+{
+  gfc_expr *result = NULL;
+
+  if (e->expr_type != EXPR_CONSTANT)
+    return NULL;
+
+  result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
+  mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
+
+  return range_check (result, "DREAL");
+}
+
+
 gfc_expr *
 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
 {
index 7b59aeba35939e887777f5795171916cf826af6b..e6e9049cd97434e38abfb26a185fdbcce8e1b6a4 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-09  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/38718
+       * gfortran.dg/initialization_29.f90: Expand test.
+
 2011-11-09  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/51027
diff --git a/gcc/testsuite/gfortran.dg/initialization_29.f90 b/gcc/testsuite/gfortran.dg/initialization_29.f90
new file mode 100644 (file)
index 0000000..e3f2992
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! PR fortran/38718
+!
+  implicit none
+  real(kind=8), parameter :: r = kind(0) + 0.2
+  complex(kind=8), parameter :: c = (r, -9.3)
+  integer, parameter :: k = nint(dreal(c))
+  integer, parameter :: l = nint(realpart(c))
+  integer(kind=k) :: i
+  integer(kind=l) :: j
+  i = 42
+  j = 42
+  print *, k, i, j, r
+  end