This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/31211] wrong code generated for pointer returning function as actual argument
- From: "pault at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 25 Jul 2007 15:30:55 -0000
- Subject: [Bug fortran/31211] wrong code generated for pointer returning function as actual argument
- References: <bug-31211-6642@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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