diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2009-02-13 21:12:34 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2009-02-13 21:12:34 +0000 |
commit | 686c82b505d95d57302821df084c751b9528cea7 (patch) | |
tree | b79c353c31da81b90682656be869db0f4b431def /gcc/fortran/trans-expr.c | |
parent | da964feac45702899e5e8cfffb0d78bdb5759b80 (diff) | |
download | gcc-686c82b505d95d57302821df084c751b9528cea7.zip gcc-686c82b505d95d57302821df084c751b9528cea7.tar.gz gcc-686c82b505d95d57302821df084c751b9528cea7.tar.bz2 |
re PR fortran/36703 (ICE (segfault) in reduce_binary0 (arith.c:1778))
2009-02-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36703
PR fortran/36528
* trans-expr.c (gfc_conv_function_val): Stabilize Cray-pointer
function references to ensure that a valid expression is used.
(gfc_conv_function_call): Pass Cray pointers to procedures.
2009-02-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36528
* gfortran.dg/cray_pointers_8.f90: New test.
PR fortran/36703
* gfortran.dg/cray_pointers_9.f90: New test.
From-SVN: r144164
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 5d41145..f0434b2 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1505,9 +1505,17 @@ gfc_conv_function_val (gfc_se * se, gfc_symbol * sym) sym->backend_decl = gfc_get_extern_function_decl (sym); tmp = sym->backend_decl; + if (sym->attr.cray_pointee) - tmp = convert (build_pointer_type (TREE_TYPE (tmp)), - gfc_get_symbol_decl (sym->cp_pointer)); + { + /* TODO - make the cray pointee a pointer to a procedure, + assign the pointer to it and use it for the call. This + will do for now! */ + tmp = convert (build_pointer_type (TREE_TYPE (tmp)), + gfc_get_symbol_decl (sym->cp_pointer)); + tmp = gfc_evaluate_now (tmp, &se->pre); + } + if (!POINTER_TYPE_P (TREE_TYPE (tmp))) { gcc_assert (TREE_CODE (tmp) == FUNCTION_DECL); @@ -2623,7 +2631,18 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, if (argss == gfc_ss_terminator) { - if (fsym && fsym->attr.value) + if (e->expr_type == EXPR_VARIABLE + && e->symtree->n.sym->attr.cray_pointee + && fsym && fsym->attr.flavor == FL_PROCEDURE) + { + /* The Cray pointer needs to be converted to a pointer to + a type given by the expression. */ + gfc_conv_expr (&parmse, e); + type = build_pointer_type (TREE_TYPE (parmse.expr)); + tmp = gfc_get_symbol_decl (e->symtree->n.sym->cp_pointer); + parmse.expr = convert (type, tmp); + } + else if (fsym && fsym->attr.value) { if (fsym->ts.type == BT_CHARACTER && fsym->ts.is_c_interop |