aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/intrinsic.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@gcc.gnu.org>2010-08-21 12:12:53 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2010-08-21 12:12:53 +0200
commit47b996944dcb50a831c1332b8ea667ff6f95fa95 (patch)
treef963b78e966a67d516f6105c26a4b775d5c2dcfd /gcc/fortran/intrinsic.c
parent508e475706c3560a86b08446e1bb764773b93ed9 (diff)
downloadgcc-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.c31
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);