diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 9 | ||||
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr57987.f90 | 24 |
6 files changed, 57 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6274c8b..a28af11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2013-08-06 Martin Jambor <mjambor@suse.cz> + PR fortran/57987 + * cgraphunit.c (cgraph_finalize_function): Assert that nested function + is not re-finalized. Rename second parameter to no_collect. + +2013-08-06 Martin Jambor <mjambor@suse.cz> + PR middle-end/58041 * gimple-ssa-strength-reduction.c (replace_ref): Make sure built MEM_REF has proper alignment information. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index ad91117..cf92b1d 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -404,17 +404,20 @@ referred_to_p (symtab_node node) } /* DECL has been parsed. Take it, queue it, compile it at the whim of the - logic in effect. If NESTED is true, then our caller cannot stand to have + logic in effect. If NO_COLLECT is true, then our caller cannot stand to have the garbage collector run at the moment. We would need to either create a new GC context, or just not compile right now. */ void -cgraph_finalize_function (tree decl, bool nested) +cgraph_finalize_function (tree decl, bool no_collect) { struct cgraph_node *node = cgraph_get_create_node (decl); if (node->symbol.definition) { + /* Nested functions should only be defined once. */ + gcc_assert (!DECL_CONTEXT (decl) + || TREE_CODE (DECL_CONTEXT (decl)) != FUNCTION_DECL); cgraph_reset_node (node); node->local.redefined_extern_inline = true; } @@ -453,7 +456,7 @@ cgraph_finalize_function (tree decl, bool nested) if (warn_unused_parameter) do_warn_unused_parameter (decl); - if (!nested) + if (!no_collect) ggc_collect (); if (cgraph_state == CGRAPH_STATE_CONSTRUCTION diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7a9fe6e..bcd91a9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2013-08-06 Martin Jambor <mjambor@suse.cz> + + PR fortran/57987 + * trans-decl.c (gfc_generate_function_code): Never call + cgraph_finalize_function on nested functions. + 2013-08-06 Janus Weil <janus@gcc.gnu.org> PR fortran/57306 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 43f401d..1708931 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -5643,14 +5643,16 @@ gfc_generate_function_code (gfc_namespace * ns) } current_function_decl = old_context; - if (decl_function_context (fndecl) && gfc_option.coarray != GFC_FCOARRAY_LIB - && has_coarray_vars) - /* Register this function with cgraph just far enough to get it - added to our parent's nested function list. - If there are static coarrays in this function, the nested _caf_init - function has already called cgraph_create_node, which also created - the cgraph node for this function. */ - (void) cgraph_create_node (fndecl); + if (decl_function_context (fndecl)) + { + /* Register this function with cgraph just far enough to get it + added to our parent's nested function list. + If there are static coarrays in this function, the nested _caf_init + function has already called cgraph_create_node, which also created + the cgraph node for this function. */ + if (!has_coarray_vars || gfc_option.coarray != GFC_FCOARRAY_LIB) + (void) cgraph_create_node (fndecl); + } else cgraph_finalize_function (fndecl, true); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 790c556..c81ec3f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2013-08-06 Martin Jambor <mjambor@suse.cz> + PR fortran/57987 + * gfortran.dg/pr57987.f90: New test. + +2013-08-06 Martin Jambor <mjambor@suse.cz> + PR middle-end/58041 * gcc.dg/torture/pr58041.c: New test. * gcc.target/arm/pr58041.c: Likewise. diff --git a/gcc/testsuite/gfortran.dg/pr57987.f90 b/gcc/testsuite/gfortran.dg/pr57987.f90 new file mode 100644 index 0000000..c881e6d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr57987.f90 @@ -0,0 +1,24 @@ +! { dg-do compile } +! { dg-options "-O3 -fno-ipa-cp -fdump-ipa-inline" } + +program test + call test2 () +contains + subroutine test2 () + type t + integer, allocatable :: x + end type t + + type t2 + class(t), allocatable :: a + end type t2 + + type(t2) :: one, two + + allocate (two%a) + one = two + end subroutine test2 +end program test + +! { dg-final { scan-ipa-dump-not "redefined extern inline functions are not considered for inlining" "inline" } } +! { dg-final { cleanup-ipa-dump "inline" } } |