ipa/97673 - fix input_location leak
This fixes input_location leaking with an invalid BLOCK from expand_call_inline to tree_function_versioning via clone materialization. 2021-01-19 Richard Biener <rguenther@suse.de> PR ipa/97673 * tree-inline.c (tree_function_versioning): Set input_location to UNKNOWN_LOCATION throughout the function. * gfortran.dg/pr97673.f90: New testcase.
This commit is contained in:
parent
049bfd186f
commit
7d6f7e92c3
14
gcc/testsuite/gfortran.dg/pr97673.f90
Normal file
14
gcc/testsuite/gfortran.dg/pr97673.f90
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
! { dg-do compile }
|
||||||
|
! { dg-options "-O3 -fno-early-inlining --param large-stack-frame=4000" }
|
||||||
|
|
||||||
|
subroutine sub3noiso(a, b)
|
||||||
|
use iso_c_binding
|
||||||
|
implicit none
|
||||||
|
character(len=1,kind=c_char) :: a(*), b
|
||||||
|
character(len=1,kind=c_char):: x,z
|
||||||
|
integer(c_int) :: y
|
||||||
|
value :: b
|
||||||
|
print *, a(1:2), b
|
||||||
|
entry sub3noisoEntry(x,y,z)
|
||||||
|
x = 'd'
|
||||||
|
end subroutine sub3noiso
|
@ -6215,6 +6215,12 @@ tree_function_versioning (tree old_decl, tree new_decl,
|
|||||||
auto_vec<gimple *, 10> init_stmts;
|
auto_vec<gimple *, 10> init_stmts;
|
||||||
tree vars = NULL_TREE;
|
tree vars = NULL_TREE;
|
||||||
|
|
||||||
|
/* We can get called recursively from expand_call_inline via clone
|
||||||
|
materialization. While expand_call_inline maintains input_location
|
||||||
|
we cannot tolerate it to leak into the materialized clone. */
|
||||||
|
location_t saved_location = input_location;
|
||||||
|
input_location = UNKNOWN_LOCATION;
|
||||||
|
|
||||||
gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
|
gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
|
||||||
&& TREE_CODE (new_decl) == FUNCTION_DECL);
|
&& TREE_CODE (new_decl) == FUNCTION_DECL);
|
||||||
DECL_POSSIBLY_INLINED (old_decl) = 1;
|
DECL_POSSIBLY_INLINED (old_decl) = 1;
|
||||||
@ -6516,6 +6522,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
|
|||||||
|
|
||||||
gcc_assert (!id.debug_stmts.exists ());
|
gcc_assert (!id.debug_stmts.exists ());
|
||||||
pop_cfun ();
|
pop_cfun ();
|
||||||
|
input_location = saved_location;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user