This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/31211] wrong code generated for pointer returning function as actual argument



------- 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]