------- Comment #4 from pault at gcc dot gnu dot org 2007-07-25 15:30 ------- This fixes the PR but is not regtested:
Index: gcc/fortran/trans-expr.c =================================================================== *** gcc/fortran/trans-expr.c (révision 126835) --- gcc/fortran/trans-expr.c (copie de travail) *************** gfc_conv_expr_reference (gfc_se * se, gf *** 3355,3360 **** --- 3344,3359 ---- gfc_add_block_to_block (&se->pre, &se->post); se->expr = var; } + return; + } + + if (expr->expr_type == EXPR_FUNCTION && expr->symtree->n.sym->attr.pointer) + { + se->want_pointer = 1; + gfc_conv_expr (se, expr); + var = gfc_create_var (TREE_TYPE (se->expr), NULL); + gfc_add_modify_expr (&se->pre, var, se->expr); + se->expr = var; return; } I am rather sure that it will be OK, since the following tests correctly: MODULE T INTERFACE cp_log MODULE PROCEDURE cp_logger_log END INTERFACE TYPE cp_logger_type INTEGER :: a END TYPE cp_logger_type PUBLIC :: cp_log, cp_logger_type CONTAINS SUBROUTINE cp_logger_log(logger) TYPE(cp_logger_type), POINTER ::logger if (associated (logger)) print *, logger%a END SUBROUTINE FUNCTION cp_get_default_logger() RESULT(res) TYPE(cp_logger_type), POINTER ::res NULLIFY(RES) END FUNCTION cp_get_default_logger FUNCTION cp_get_unity_logger() RESULT(res) TYPE(cp_logger_type), POINTER ::res allocate(RES) res%a = 1 END FUNCTION cp_get_unity_logger END MODULE T USE T CALL cp_log(cp_get_default_logger()) CALL cp_log(cp_get_unity_logger()) END -- pault at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot gnu |pault at gcc dot gnu dot org |dot org | Status|NEW |ASSIGNED Last reconfirmed|2007-05-30 17:00:49 |2007-07-25 15:30:55 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31211