re PR middle-end/43045 ([lto] ICE non-trivial conversion at assignment)
2010-02-22 Richard Guenther <rguenther@suse.de> PR lto/43045 * tree-inline.c (declare_return_variable): Use the type of the call stmt lhs if available. * gfortran.dg/lto/20100222-1_0.f03: New testcase. * gfortran.dg/lto/20100222-1_1.c: Likewise. From-SVN: r156966
This commit is contained in:
parent
669887fc19
commit
ea2edf88ee
@ -1,3 +1,9 @@
|
||||
2010-02-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR lto/43045
|
||||
* tree-inline.c (declare_return_variable): Use the type of
|
||||
the call stmt lhs if available.
|
||||
|
||||
2010-02-22 Duncan Sands <baldrick@free.fr>
|
||||
|
||||
* passes.c (register_pass): Always consider all pass lists when
|
||||
|
@ -1,3 +1,9 @@
|
||||
2010-02-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR lto/43045
|
||||
* gfortran.dg/lto/20100222-1_0.f03: New testcase.
|
||||
* gfortran.dg/lto/20100222-1_1.c: Likewise.
|
||||
|
||||
2010-02-22 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/42749
|
||||
|
35
gcc/testsuite/gfortran.dg/lto/20100222-1_0.f03
Normal file
35
gcc/testsuite/gfortran.dg/lto/20100222-1_0.f03
Normal file
@ -0,0 +1,35 @@
|
||||
! { dg-lto-do run }
|
||||
! This testcase tests c_funloc and c_funptr from iso_c_binding. It uses
|
||||
! functions defined in c_funloc_tests_3_funcs.c.
|
||||
module c_funloc_tests_3
|
||||
implicit none
|
||||
contains
|
||||
function ffunc(j) bind(c)
|
||||
use iso_c_binding, only: c_funptr, c_int
|
||||
integer(c_int) :: ffunc
|
||||
integer(c_int), value :: j
|
||||
ffunc = -17*j
|
||||
end function ffunc
|
||||
end module c_funloc_tests_3
|
||||
program main
|
||||
use iso_c_binding, only: c_funptr, c_funloc
|
||||
use c_funloc_tests_3, only: ffunc
|
||||
implicit none
|
||||
interface
|
||||
function returnFunc() bind(c,name="returnFunc")
|
||||
use iso_c_binding, only: c_funptr
|
||||
type(c_funptr) :: returnFunc
|
||||
end function returnFunc
|
||||
subroutine callFunc(func,pass,compare) bind(c,name="callFunc")
|
||||
use iso_c_binding, only: c_funptr, c_int
|
||||
type(c_funptr), value :: func
|
||||
integer(c_int), value :: pass,compare
|
||||
end subroutine callFunc
|
||||
end interface
|
||||
type(c_funptr) :: p
|
||||
p = returnFunc()
|
||||
call callFunc(p, 13,3*13)
|
||||
p = c_funloc(ffunc)
|
||||
call callFunc(p, 21,-17*21)
|
||||
end program main
|
||||
! { dg-final { cleanup-modules "c_funloc_tests_3" } }
|
25
gcc/testsuite/gfortran.dg/lto/20100222-1_1.c
Normal file
25
gcc/testsuite/gfortran.dg/lto/20100222-1_1.c
Normal file
@ -0,0 +1,25 @@
|
||||
/* These functions support the test case c_funloc_tests_3. */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int printIntC(int i)
|
||||
{
|
||||
return 3*i;
|
||||
}
|
||||
|
||||
int (*returnFunc(void))(int)
|
||||
{
|
||||
return &printIntC;
|
||||
}
|
||||
|
||||
void callFunc(int(*func)(int), int pass, int compare)
|
||||
{
|
||||
int result = (*func)(pass);
|
||||
if(result != compare)
|
||||
{
|
||||
printf("FAILED: Got %d, expected %d\n", result, compare);
|
||||
abort();
|
||||
}
|
||||
else
|
||||
printf("SUCCESS: Got %d, expected %d\n", result, compare);
|
||||
}
|
@ -2542,9 +2542,16 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest)
|
||||
tree caller = id->dst_fn;
|
||||
tree result = DECL_RESULT (callee);
|
||||
tree callee_type = TREE_TYPE (result);
|
||||
tree caller_type = TREE_TYPE (TREE_TYPE (callee));
|
||||
tree caller_type;
|
||||
tree var, use;
|
||||
|
||||
/* Handle type-mismatches in the function declaration return type
|
||||
vs. the call expression. */
|
||||
if (modify_dest)
|
||||
caller_type = TREE_TYPE (modify_dest);
|
||||
else
|
||||
caller_type = TREE_TYPE (TREE_TYPE (callee));
|
||||
|
||||
/* We don't need to do anything for functions that don't return
|
||||
anything. */
|
||||
if (!result || VOID_TYPE_P (callee_type))
|
||||
|
Loading…
Reference in New Issue
Block a user