diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2014-09-30 17:10:35 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-09-30 17:10:35 +0000 |
commit | 75a0d320063941e878f65177f59d2c0e5515472a (patch) | |
tree | 5132174a9e3a445876514de05089e31579631785 /gcc/cp | |
parent | cc811a8ae6c760955ac2dca51d8359d003c8e4f2 (diff) | |
download | gcc-75a0d320063941e878f65177f59d2c0e5515472a.zip gcc-75a0d320063941e878f65177f59d2c0e5515472a.tar.gz gcc-75a0d320063941e878f65177f59d2c0e5515472a.tar.bz2 |
re PR c++/16564 (g++ seems to go into an infinite loop after errors)
cp/
2014-09-30 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c++/16564
* error.c (print_instantiation_context): Delete.
* typeck2.c (build_x_arrow): Record location when pushing
template instantiation.
* pt.c (push_tinst_level): Make it a wrapper around ...
(push_tinst_level_loc): ... this. New function. Make excessive
template instantiation depth a fatal error. Record location. Use
bool as return type.
(instantiate_pending_templates): Make excessive
template instantiation depth a fatal error.
(problematic_instantiation_changed): Use bool as return type.
* cp-tree.h (print_instantiation_context): Delete.
(push_tinst_level): Update declaration.
(problematic_instantiation_changed): Likewise.
(push_tinst_level_loc): New.
testsuite/
2014-09-30 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c++/16564
* lib/gcc.exp: Accept "fatal error:" as error prefix.
* lib/g++.exp: Likewise.
* lib/obj-c++.exp: Likewise.
* lib/objc.exp: Likewise.
* g++.dg/template/pr16564.C: New test.
2014-09-30 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/16564
* g++.dg/cpp0x/decltype26.C: Adjust.
* g++.dg/cpp0x/decltype28.C: Likewise.
* g++.dg/cpp0x/decltype29.C: Likewise.
* g++.dg/cpp0x/decltype32.C: Likewise.
* g++.dg/cpp0x/enum11.C: Likewise.
* g++.dg/template/arrow1.C: Likewise.
* g++.dg/template/pr23510.C: Likewise.
* g++.dg/template/recurse.C: Likewise.
* g++.dg/template/recurse2.C: Likewise.
* g++.dg/template/vtable2.C: Likewise.
* g++.old-deja/g++.pt/infinite1.C: Likewise.
From-SVN: r215733
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 6 | ||||
-rw-r--r-- | gcc/cp/error.c | 10 | ||||
-rw-r--r-- | gcc/cp/pt.c | 44 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 7 |
5 files changed, 49 insertions, 36 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0beb997..3fe3f8d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,21 @@ +2014-09-30 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c++/16564 + * error.c (print_instantiation_context): Delete. + * typeck2.c (build_x_arrow): Record location when pushing + template instantiation. + * pt.c (push_tinst_level): Make it a wrapper around ... + (push_tinst_level_loc): ... this. New function. Make excessive + template instantiation depth a fatal error. Record location. Use + bool as return type. + (instantiate_pending_templates): Make excessive + template instantiation depth a fatal error. + (problematic_instantiation_changed): Use bool as return type. + * cp-tree.h (print_instantiation_context): Delete. + (push_tinst_level): Update declaration. + (problematic_instantiation_changed): Likewise. + (push_tinst_level_loc): New. + 2014-09-29 Richard Biener <rguenther@suse.de> * typeck.c (enum_cast_to_int): Use CONVERT_EXPR_P to check diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 5d8badc..f0783ab 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5418,7 +5418,6 @@ extern const char *lang_decl_name (tree, int, bool); extern const char *lang_decl_dwarf_name (tree, int, bool); extern const char *language_to_string (enum languages); extern const char *class_key_or_enum_as_string (tree); -extern void print_instantiation_context (void); extern void maybe_warn_variadic_templates (void); extern void maybe_warn_cpp0x (cpp0x_warn_str str); extern bool pedwarn_cxx98 (location_t, int, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4); @@ -5633,7 +5632,7 @@ extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree, bool, bool); extern tree most_general_template (tree); extern tree get_mostly_instantiated_function_type (tree); -extern int problematic_instantiation_changed (void); +extern bool problematic_instantiation_changed (void); extern void record_last_problematic_instantiation (void); extern struct tinst_level *current_instantiation(void); extern tree maybe_get_template_decl_from_type_decl (tree); @@ -5661,7 +5660,8 @@ extern tree fold_non_dependent_expr_sfinae (tree, tsubst_flags_t); extern bool alias_type_or_template_p (tree); extern bool alias_template_specialization_p (const_tree); extern bool explicit_class_specialization_p (tree); -extern int push_tinst_level (tree); +extern bool push_tinst_level (tree); +extern bool push_tinst_level_loc (tree, location_t); extern void pop_tinst_level (void); extern struct tinst_level *outermost_tinst_level(void); extern void init_template_processing (void); diff --git a/gcc/cp/error.c b/gcc/cp/error.c index a03bfe1..57f3c31 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -3360,16 +3360,6 @@ maybe_print_instantiation_context (diagnostic_context *context) record_last_problematic_instantiation (); print_instantiation_full_context (context); } - -/* Report the bare minimum context of a template instantiation. */ -void -print_instantiation_context (void) -{ - print_instantiation_partial_context - (global_dc, current_instantiation (), input_location); - pp_newline (global_dc->printer); - diagnostic_flush_buffer (global_dc); -} /* Report what constexpr call(s) we're trying to expand, if any. */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index da8bd8f..9dd61f3 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8347,37 +8347,37 @@ static GTY(()) struct tinst_level *last_error_tinst_level; /* We're starting to instantiate D; record the template instantiation context for diagnostics and to restore it later. */ -int +bool push_tinst_level (tree d) { + return push_tinst_level_loc (d, input_location); +} + +/* We're starting to instantiate D; record the template instantiation context + at LOC for diagnostics and to restore it later. */ + +bool +push_tinst_level_loc (tree d, location_t loc) +{ struct tinst_level *new_level; if (tinst_depth >= max_tinst_depth) { - last_error_tinst_level = current_tinst_level; - if (TREE_CODE (d) == TREE_LIST) - error ("template instantiation depth exceeds maximum of %d (use " - "-ftemplate-depth= to increase the maximum) substituting %qS", - max_tinst_depth, d); - else - error ("template instantiation depth exceeds maximum of %d (use " - "-ftemplate-depth= to increase the maximum) instantiating %qD", - max_tinst_depth, d); - - print_instantiation_context (); - - return 0; + fatal_error ("template instantiation depth exceeds maximum of %d" + " (use -ftemplate-depth= to increase the maximum)", + max_tinst_depth); + return false; } /* If the current instantiation caused problems, don't let it instantiate anything else. Do allow deduction substitution and decls usable in constant expressions. */ if (limit_bad_template_recursion (d)) - return 0; + return false; new_level = ggc_alloc<tinst_level> (); new_level->decl = d; - new_level->locus = input_location; + new_level->locus = loc; new_level->errors = errorcount+sorrycount; new_level->in_system_header_p = in_system_header_at (input_location); new_level->next = current_tinst_level; @@ -8387,7 +8387,7 @@ push_tinst_level (tree d) if (GATHER_STATISTICS && (tinst_depth > depth_reached)) depth_reached = tinst_depth; - return 1; + return true; } /* We're done instantiating this template; return to the instantiation @@ -20291,10 +20291,10 @@ instantiate_pending_templates (int retries) { tree decl = pending_templates->tinst->decl; - error ("template instantiation depth exceeds maximum of %d" - " instantiating %q+D, possibly from virtual table generation" - " (use -ftemplate-depth= to increase the maximum)", - max_tinst_depth, decl); + fatal_error ("template instantiation depth exceeds maximum of %d" + " instantiating %q+D, possibly from virtual table generation" + " (use -ftemplate-depth= to increase the maximum)", + max_tinst_depth, decl); if (TREE_CODE (decl) == FUNCTION_DECL) /* Pretend that we defined it. */ DECL_INITIAL (decl) = error_mark_node; @@ -20627,7 +20627,7 @@ get_mostly_instantiated_function_type (tree decl) /* Return truthvalue if we're processing a template different from the last one involved in diagnostics. */ -int +bool problematic_instantiation_changed (void) { return current_tinst_level != last_error_tinst_level; diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index c6306b5..0a851f1 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1639,8 +1639,13 @@ build_x_arrow (location_t loc, tree expr, tsubst_flags_t complain) if (expr == error_mark_node) return error_mark_node; + /* This provides a better instantiation backtrace in case of + error. */ if (fn && DECL_USE_TEMPLATE (fn)) - push_tinst_level (fn); + push_tinst_level_loc (fn, + (current_instantiation () != actual_inst) + ? DECL_SOURCE_LOCATION (fn) + : input_location); fn = NULL; if (vec_member (TREE_TYPE (expr), types_memoized)) |