diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-04-22 05:44:12 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-04-22 05:44:12 +0000 |
commit | b2dd096b0c7e5c48380b99b3d2b1ff4763b7f525 (patch) | |
tree | 0b42d76e5fdf7dbe6a765ae20af65b5a2ed24e6d /gcc/cp/decl2.c | |
parent | f71c12554b607c5980b932a4dff5cba4c7decb89 (diff) | |
download | gcc-b2dd096b0c7e5c48380b99b3d2b1ff4763b7f525.zip gcc-b2dd096b0c7e5c48380b99b3d2b1ff4763b7f525.tar.gz gcc-b2dd096b0c7e5c48380b99b3d2b1ff4763b7f525.tar.bz2 |
Makefile.in (calls.o): Depend on except.h.
* Makefile.in (calls.o): Depend on except.h.
* calls.c: Include except.h.
(emit_call_1): Call note_eh_region_may_contain_throw if
appropriate.
* except.c (eh_region): Add may_contain_throw.
(expand_eh_region_end_cleanup): Do not include handler code when
it cannot be reached.
(note_eh_region_may_contain_throw): New function.
* except.h (note_eh_region_may_contain_throw): New function.
* call.c (build_over_call): Use build_cxx_call.
(build_cxx_call): New method, split out of build_over_call.
* cp-tree.h (language_function): Add can_throw.
(build_cxx_call): Declare it.
* decl.c (finish_function): If a function does not contain any
calls to functions that can throw an exception, indicate that
fact.
* decl2.c (mark_used): Do not defer the instantiation of
functions, if the current function does not throw.
* optimize.c (maybe_clone_body): Copy TREE_NOTHROW to the clones.
* pt.c (instantiate_decl): Make sure import_export_decl is called
before emitting things.
* rtti.c (throw_bad_cast): Use build_cxx_call.
(build_dynamic_cast_1): Likewise.
* typeck.c (build_function_call): Likewise.
* g++.dg/template/recurse.C: Adjust location of error messages.
From-SVN: r65929
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r-- | gcc/cp/decl2.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 7b7dd47..3f9c66f 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -4581,7 +4581,33 @@ mark_used (tree decl) && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) && (!DECL_EXPLICIT_INSTANTIATION (decl) || (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl)))) - instantiate_decl (decl, /*defer_ok=*/1); + { + bool defer; + + /* Normally, we put off instantiating functions in order to + improve compile times. Maintaining a stack of active + functions is expensive, and the inliner knows to + instantiate any functions it might need. + + However, if instantiating this function might help us mark + the current function TREE_NOTHROW, we go ahead and + instantiate it now. */ + defer = (!flag_exceptions + || TREE_CODE (decl) != FUNCTION_DECL + /* If the called function can't throw, we don't need to + generate its body to find that out. */ + || TREE_NOTHROW (decl) + || !cfun + /* If we already know the current function can't throw, + then we don't need to work hard to prove it. */ + || TREE_NOTHROW (current_function_decl) + /* If we already know that the current function *can* + throw, there's no point in gathering more + information. */ + || cp_function_chain->can_throw); + + instantiate_decl (decl, defer); + } } /* Called when a class-head is encountered. TAG_KIND is the class-key |