diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2010-08-21 12:12:53 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-08-21 12:12:53 +0200 |
commit | 47b996944dcb50a831c1332b8ea667ff6f95fa95 (patch) | |
tree | f963b78e966a67d516f6105c26a4b775d5c2dcfd /gcc/fortran/simplify.c | |
parent | 508e475706c3560a86b08446e1bb764773b93ed9 (diff) | |
download | gcc-47b996944dcb50a831c1332b8ea667ff6f95fa95.zip gcc-47b996944dcb50a831c1332b8ea667ff6f95fa95.tar.gz gcc-47b996944dcb50a831c1332b8ea667ff6f95fa95.tar.bz2 |
re PR fortran/36158 (Transformational function BESSEL_YN(n1,n2,x) and BESSEL_JN missing)
2010-08-21 Tobias Burnus <burnus@net-b.de>
PR fortran/36158
PR fortran/33197
* intrinsic.c (add_sym): Init value attribute.
(set_attr_value): New function.
(add_functions) Use it and add JN/YN resolvers.
* symbol.c (gfc_copy_formal_args_intr): Copy value attr.
* intrinsic.h (gfc_resolve_bessel_n2): New prototype.
* gfortran.h (gfc_intrinsic_arg): Add value attribute.
* iresolve.c (gfc_resolve_bessel_n2): New function.
* trans-intrinsic.c (gfc_get_symbol_for_expr): Create
formal arg list.
(gfc_conv_intrinsic_function,gfc_is_intrinsic_libcall):
Add GFC_ISYM_JN2/GFC_ISYM_YN2 as case value.
* simplify.c (): For YN set to -INF if previous values
was -INF.
* trans-expr.c (gfc_conv_procedure_call): Don't crash
if sym->as is NULL.
* iresolve.c (gfc_resolve_extends_type_of): Set the
type of the dummy argument to the one of the actual.
2010-08-21 Tobias Burnus <burnus@net-b.de>
PR fortran/36158
PR fortran/33197
* m4/bessel.m4: Implement bessel_jn and bessel_yn.
* gfortran.map: Add the generated bessel_jn_r{4,8,10,16}
and bessel_yn_r{4,8,10,16}.
* Makefile.am: Add bessel.m4.
* Makefile.in: Regenerated.
* generated/bessel_r4.c: Generated.
* generated/bessel_r16.c: Generated.
* generated/bessel_r8.c: Generated.
* generated/bessel_r10.c: Generated.
2010-08-21 Tobias Burnus <burnus@net-b.de>
PR fortran/36158
PR fortran/33197
* gfortran.dg/bessel_6.f90: New.
* gfortran.dg/bessel_7.f90: New.
From-SVN: r163440
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r-- | gcc/fortran/simplify.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 6c30707..4cb29fb 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1210,11 +1210,7 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT || order2->expr_type != EXPR_CONSTANT) - { - gfc_error ("Sorry, non-constant transformational Bessel function at %L" - " not yet supported", &order2->where); - return &gfc_bad_expr; - } + return NULL; n1 = mpz_get_si (order1->value.integer); n2 = mpz_get_si (order2->value.integer); @@ -1253,7 +1249,7 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, if (jn) mpfr_set_ui (e->value.real, 0.0, GFC_RND_MODE); else - mpfr_set_inf (e->value.real, -1); + mpfr_set_inf (e->value.real, -1); gfc_constructor_append_expr (&result->value.constructor, e, &x->where); } @@ -1334,6 +1330,17 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, for (i = 2; i <= n2-n1; i++) { e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); + + /* Special case: For YN, if the previous N gave -INF, set + also N+1 to -INF. */ + if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2)) + { + mpfr_set_inf (e->value.real, -1); + gfc_constructor_append_expr (&result->value.constructor, e, + &x->where); + continue; + } + mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1), GFC_RND_MODE); mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE); |