From 05aca4e73c2b4b18dcf617a8548e754161a28eea Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Wed, 23 Mar 2016 18:36:25 +0000 Subject: [PATCH] re PR c++/69315 (ICE in finish_function with constexpr and templates) PR c++/69315 * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): Remove. * decl.c (defer_mark_used_calls, deferred_mark_used_calls): Remove. (finish_function): Don't set or test them. * decl2.c (mark_used): Don't handle defer_mark_used_calls. * g++.dg/cpp0x/constexpr-69315.C: New test. * g++.dg/cpp0x/variadic122.C: Change one dg-warning into dg-bogus. Co-Authored-By: Jakub Jelinek Co-Authored-By: Jason Merrill From-SVN: r234436 --- gcc/cp/ChangeLog | 10 ++++++ gcc/cp/cp-tree.h | 2 -- gcc/cp/decl.c | 19 ----------- gcc/cp/decl2.c | 8 ----- gcc/testsuite/ChangeLog | 8 +++++ gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C | 35 ++++++++++++++++++++ gcc/testsuite/g++.dg/cpp0x/variadic122.C | 2 +- 7 files changed, 54 insertions(+), 30 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 01fc2bd7657..499b4568f14 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2016-03-23 Alexandre Oliva + Jason Merrill + Jakub Jelinek + + PR c++/69315 + * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): Remove. + * decl.c (defer_mark_used_calls, deferred_mark_used_calls): Remove. + (finish_function): Don't set or test them. + * decl2.c (mark_used): Don't handle defer_mark_used_calls. + 2016-03-23 Jason Merrill PR c++/70344 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 6462d8a35db..b7b770f9200 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5846,8 +5846,6 @@ extern tree fndecl_declared_return_type (tree); extern bool undeduced_auto_decl (tree); extern void require_deduced_type (tree); -extern bool defer_mark_used_calls; -extern GTY(()) vec *deferred_mark_used_calls; extern tree finish_case_label (location_t, tree, tree); extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 47a53cb9f2d..cd5db3f06dc 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -227,11 +227,6 @@ struct GTY((for_user)) named_label_entry { function, two inside the body of a function in a local class, etc.) */ int function_depth; -/* To avoid unwanted recursion, finish_function defers all mark_used calls - encountered during its execution until it finishes. */ -bool defer_mark_used_calls; -vec *deferred_mark_used_calls; - /* States indicating how grokdeclarator() should handle declspecs marked with __attribute__((deprecated)). An object declared as __attribute__((deprecated)) suppresses warnings of uses of other @@ -14594,9 +14589,6 @@ finish_function (int flags) if (c_dialect_objc ()) objc_finish_function (); - gcc_assert (!defer_mark_used_calls); - defer_mark_used_calls = true; - record_key_method_defined (fndecl); fntype = TREE_TYPE (fndecl); @@ -14846,17 +14838,6 @@ finish_function (int flags) /* Clean up. */ current_function_decl = NULL_TREE; - defer_mark_used_calls = false; - if (deferred_mark_used_calls) - { - unsigned int i; - tree decl; - - FOR_EACH_VEC_SAFE_ELT (deferred_mark_used_calls, i, decl) - mark_used (decl); - vec_free (deferred_mark_used_calls); - } - invoke_plugin_callbacks (PLUGIN_FINISH_PARSE_FUNCTION, fndecl); return fndecl; } diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 73b0d280c43..b3cc99a7dc1 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5140,14 +5140,6 @@ mark_used (tree decl, tsubst_flags_t complain) if (DECL_ODR_USED (decl)) return true; - /* If within finish_function, defer the rest until that function - finishes, otherwise it might recurse. */ - if (defer_mark_used_calls) - { - vec_safe_push (deferred_mark_used_calls, decl); - return true; - } - /* Normally, we can wait until instantiation-time to synthesize DECL. However, if DECL is a static data member initialized with a constant or a constexpr function, we need it right now because a reference to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93b731266ab..4d620748c1b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-03-23 Alexandre Oliva + Jason Merrill + Jakub Jelinek + + PR c++/69315 + * g++.dg/cpp0x/constexpr-69315.C: New test. + * g++.dg/cpp0x/variadic122.C: Change one dg-warning into dg-bogus. + 2016-03-23 Marek Polacek PR c++/69884 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C new file mode 100644 index 00000000000..cf32938ecc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C @@ -0,0 +1,35 @@ +// PR c++/69315 +// { dg-do compile { target c++11 } } +// { dg-options "-O2" } + +// Template instantiation and evaluation for folding within +// finish_function may call finish_function recursively. +// Make sure we don't reject or delay that sort of recursion. + +template struct Iter; + +struct Arg { + Iter begin(); + Iter end(); +}; + +template struct Iter { + int operator*(); + Iter operator++(); + template friend constexpr bool operator==(Iter, Iter); + template friend constexpr bool operator!=(Iter, Iter); +}; + +void func(Arg a) { + for (auto ch : a) { + a.begin() == a.end(); + } +} + +template constexpr bool operator==(Iter, Iter) { + return true; +} + +template constexpr bool operator!=(Iter a, Iter b) { + return a == b; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic122.C b/gcc/testsuite/g++.dg/cpp0x/variadic122.C index aa21ddddd18..12dc9012c37 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic122.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic122.C @@ -9,7 +9,7 @@ template < class T > struct Container template < class T > T deref (T) -{} // { dg-warning "no return" } +{} // { dg-bogus "no return" } template < class T, class ... Args > auto deref (T u, int, Args ... args)->decltype (deref (u.f (), args ...)) -- 2.30.2