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/intrinsic.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/intrinsic.c')
-rw-r--r-- | gcc/fortran/intrinsic.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 3751167..9087106 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -330,6 +330,7 @@ add_sym (const char *name, gfc_isym_id id, enum klass cl, int actual_ok, bt type next_arg->ts.type = type; next_arg->ts.kind = kind; next_arg->optional = optional; + next_arg->value = 0; next_arg->intent = intent; } } @@ -1065,6 +1066,30 @@ make_noreturn (void) next_sym[-1].noreturn = 1; } +/* Set the attr.value of the current procedure. */ + +static void +set_attr_value (int n, ...) +{ + gfc_intrinsic_arg *arg; + va_list argp; + int i; + + if (sizing != SZ_NOTHING) + return; + + va_start (argp, n); + arg = next_sym[-1].formal; + + for (i = 0; i < n; i++) + { + gcc_assert (arg != NULL); + arg->value = va_arg (argp, int); + arg = arg->next; + } + va_end (argp); +} + /* Add intrinsic functions. */ @@ -1318,9 +1343,10 @@ add_functions (void) n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED); add_sym_3 ("bessel_jn", GFC_ISYM_JN2, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008, - gfc_check_bessel_n2, gfc_simplify_bessel_jn2, NULL, + gfc_check_bessel_n2, gfc_simplify_bessel_jn2, gfc_resolve_bessel_n2, "n1", BT_INTEGER, di, REQUIRED,"n2", BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED); + set_attr_value (3, true, true, true); make_generic ("bessel_jn", GFC_ISYM_JN, GFC_STD_F2008); @@ -1359,9 +1385,10 @@ add_functions (void) n, BT_INTEGER, di, REQUIRED, x, BT_REAL, dd, REQUIRED); add_sym_3 ("bessel_yn", GFC_ISYM_YN2, CLASS_TRANSFORMATIONAL, ACTUAL_NO, BT_REAL, dr, GFC_STD_F2008, - gfc_check_bessel_n2, gfc_simplify_bessel_yn2, NULL, + gfc_check_bessel_n2, gfc_simplify_bessel_yn2, gfc_resolve_bessel_n2, "n1", BT_INTEGER, di, REQUIRED,"n2", BT_INTEGER, di, REQUIRED, x, BT_REAL, dr, REQUIRED); + set_attr_value (3, true, true, true); make_generic ("bessel_yn", GFC_ISYM_YN, GFC_STD_F2008); |