diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2011-11-09 09:41:17 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2011-11-09 09:41:17 +0000 |
commit | 02c74373cf0a29074e52b42827622c8bbb0b716a (patch) | |
tree | b9ffe796c165296254c21775bc6f2300920b44ef | |
parent | c5bdb340d6458e3df097f58d611e75f999e07653 (diff) | |
download | gcc-02c74373cf0a29074e52b42827622c8bbb0b716a.zip gcc-02c74373cf0a29074e52b42827622c8bbb0b716a.tar.gz gcc-02c74373cf0a29074e52b42827622c8bbb0b716a.tar.bz2 |
re PR fortran/38718 (some simplifiers for elemental intrinsics missing; required for init expressions)
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
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.c | 4 | ||||
-rw-r--r-- | gcc/fortran/intrinsic.h | 1 | ||||
-rw-r--r-- | gcc/fortran/simplify.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/initialization_29.f90 | 15 |
6 files changed, 45 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 96944e2..1fffbc60 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 8f437cc..38bcb27 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -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); diff --git a/gcc/fortran/intrinsic.h b/gcc/fortran/intrinsic.h index e64325b..bfc2455 100644 --- a/gcc/fortran/intrinsic.h +++ b/gcc/fortran/intrinsic.h @@ -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 *); diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 01071cf..4431826 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -939,6 +939,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) { gfc_expr *result; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7b59aeb..e6e9049 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..e3f2992 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/initialization_29.f90 @@ -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 |