diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2019-12-04 12:19:55 +0000 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2019-12-04 13:19:55 +0100 |
commit | 394acee4f98219ad0165794573c44967b12ca05c (patch) | |
tree | 26796e5067a8a200cb09034a70da4c50fc6e69b6 /gcc/fortran/intrinsic.c | |
parent | 8c3785c43d490d4f234e21c9dee6bb1bb8d1dbdf (diff) | |
download | gcc-394acee4f98219ad0165794573c44967b12ca05c.zip gcc-394acee4f98219ad0165794573c44967b12ca05c.tar.gz gcc-394acee4f98219ad0165794573c44967b12ca05c.tar.bz2 |
Fortran] PR92754 - fix an issue with resolving intrinsic functions
gcc/fortran/
PR fortran/92754
* intrinsic.c (gfc_intrinsic_func_interface): Set
sym's flavor, intrinsic and function attribute if
unset.
gcc/testsuite/
PR fortran/92754
gfortran.dg/intrinsic_9.f90: New.
From-SVN: r278961
Diffstat (limited to 'gcc/fortran/intrinsic.c')
-rw-r--r-- | gcc/fortran/intrinsic.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index 572967f..76b53bb 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -4839,9 +4839,9 @@ gfc_check_intrinsic_standard (const gfc_intrinsic_sym* isym, match gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) { + gfc_symbol *sym; gfc_intrinsic_sym *isym, *specific; gfc_actual_arglist *actual; - const char *name; int flag; if (expr->value.function.isym != NULL) @@ -4857,15 +4857,15 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) flag |= (actual->expr->ts.type != BT_INTEGER && actual->expr->ts.type != BT_CHARACTER); - name = expr->symtree->n.sym->name; + sym = expr->symtree->n.sym; - if (expr->symtree->n.sym->intmod_sym_id) + if (sym->intmod_sym_id) { - gfc_isym_id id = gfc_isym_id_by_intmod_sym (expr->symtree->n.sym); + gfc_isym_id id = gfc_isym_id_by_intmod_sym (sym); isym = specific = gfc_intrinsic_function_by_id (id); } else - isym = specific = gfc_find_function (name); + isym = specific = gfc_find_function (sym->name); if (isym == NULL) { @@ -4879,7 +4879,7 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) || isym->id == GFC_ISYM_SNGL || isym->id == GFC_ISYM_DFLOAT) && gfc_init_expr_flag && !gfc_notify_std (GFC_STD_F2003, "Function %qs as initialization " - "expression at %L", name, &expr->where)) + "expression at %L", sym->name, &expr->where)) { if (!error_flag) gfc_pop_suppress_errors (); @@ -4898,7 +4898,7 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) && id != GFC_ISYM_TRANSFER && id != GFC_ISYM_TRIM && !gfc_notify_std (GFC_STD_F2003, "Transformational function %qs " "at %L is invalid in an initialization " - "expression", name, &expr->where)) + "expression", sym->name, &expr->where)) { if (!error_flag) gfc_pop_suppress_errors (); @@ -4956,9 +4956,6 @@ gfc_intrinsic_func_interface (gfc_expr *expr, int error_flag) got_specific: expr->value.function.isym = specific; - if (!expr->symtree->n.sym->module) - gfc_intrinsic_symbol (expr->symtree->n.sym); - if (!error_flag) gfc_pop_suppress_errors (); @@ -4980,6 +4977,16 @@ got_specific: "character arguments at %L", &expr->where)) return MATCH_ERROR; + if (sym->attr.flavor == FL_UNKNOWN) + { + sym->attr.function = 1; + sym->attr.intrinsic = 1; + sym->attr.flavor = FL_PROCEDURE; + } + + if (!sym->module) + gfc_intrinsic_symbol (sym); + return MATCH_YES; } |