Use C++ RAII with make_temp_override in the C++ FE to automatically clear currently_expanding_gimple_stmt.
gcc/ PR middle-end/104721 * cfgexpand.cc (expand_gimple_basic_block): Use make_temp_override to clear currently_expanding_gimple_stmt automatically. * tree.h (temp_override): Moved from cp/cp-tree.h. (type_identity_t): Likewise. make_temp_override(): Likewise. gcc/cp/ PR middle-end/104721 * cp-tree.h (temp_override): Moved to ../tree.h. (type_identity_t): Likewise. make_temp_override(): Likewise. --- gcc/cfgexpand.cc | 15 +++++--------- gcc/cp/cp-tree.h | 51 ------------------------------------------------ gcc/tree.h | 51 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 61 deletions(-) diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index 87536ec7ccd..3d656113df5 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -5817,6 +5817,9 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) if (note) NOTE_BASIC_BLOCK (note) = bb; + auto cleanup = make_temp_override (currently_expanding_gimple_stmt, + nullptr); + for (; !gsi_end_p (gsi); gsi_next (&gsi)) { basic_block new_bb; @@ -5927,10 +5930,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) { new_bb = expand_gimple_cond (bb, as_a <gcond *> (stmt)); if (new_bb) - { - currently_expanding_gimple_stmt = NULL; - return new_bb; - } + return new_bb; } else if (is_gimple_debug (stmt)) { @@ -6052,10 +6052,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) if (can_fallthru) bb = new_bb; else - { - currently_expanding_gimple_stmt = NULL; - return new_bb; - } + return new_bb; } } else @@ -6078,8 +6075,6 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) } } - currently_expanding_gimple_stmt = NULL; - /* Expand implicit goto and convert goto_locus. */ FOR_EACH_EDGE (e, ei, bb->succs) { diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 80994e94793..0a55588dc5d 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1961,57 +1961,6 @@ public: } }; -/* RAII sentinel that saves the value of a variable, optionally - overrides it right away, and restores its value when the sentinel - id destructed. */ - -template <typename T> -class temp_override -{ - T& overridden_variable; - T saved_value; -public: - temp_override(T& var) : overridden_variable (var), saved_value (var) {} - temp_override(T& var, T overrider) - : overridden_variable (var), saved_value (var) - { - overridden_variable = overrider; - } - ~temp_override() { overridden_variable = saved_value; } -}; - -/* Wrapping a template parameter in type_identity_t hides it from template - argument deduction. */ -#if __cpp_lib_type_identity -using std::type_identity_t; -#else -template <typename T> -struct type_identity { typedef T type; }; -template <typename T> -using type_identity_t = typename type_identity<T>::type; -#endif - -/* Object generator function for temp_override, so you don't need to write the - type of the object as a template argument. - - Use as auto x = make_temp_override (flag); */ - -template <typename T> -inline temp_override<T> -make_temp_override (T& var) -{ - return { var }; -} - -/* Likewise, but use as auto x = make_temp_override (flag, value); */ - -template <typename T> -inline temp_override<T> -make_temp_override (T& var, type_identity_t<T> overrider) -{ - return { var, overrider }; -} - /* The cached class binding level, from the most recently exited class, or NULL if none. */ diff --git a/gcc/tree.h b/gcc/tree.h index 36ceed57064..32d610474d2 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -6581,4 +6581,55 @@ extern tree get_attr_nonstring_decl (tree, tree * = NULL); extern int get_target_clone_attr_len (tree); +/* RAII sentinel that saves the value of a variable, optionally + overrides it right away, and restores its value when the sentinel + id destructed. */ + +template <typename T> +class temp_override +{ + T& overridden_variable; + T saved_value; +public: + temp_override(T& var) : overridden_variable (var), saved_value (var) {} + temp_override(T& var, T overrider) + : overridden_variable (var), saved_value (var) + { + overridden_variable = overrider; + } + ~temp_override() { overridden_variable = saved_value; } +}; + +/* Wrapping a template parameter in type_identity_t hides it from template + argument deduction. */ +#if __cpp_lib_type_identity +using std::type_identity_t; +#else +template <typename T> +struct type_identity { typedef T type; }; +template <typename T> +using type_identity_t = typename type_identity<T>::type; +#endif + +/* Object generator function for temp_override, so you don't need to write the + type of the object as a template argument. + + Use as auto x = make_temp_override (flag); */ + +template <typename T> +inline temp_override<T> +make_temp_override (T& var) +{ + return { var }; +} + +/* Likewise, but use as auto x = make_temp_override (flag, value); */ + +template <typename T> +inline temp_override<T> +make_temp_override (T& var, type_identity_t<T> overrider) +{ + return { var, overrider }; +} + #endif /* GCC_TREE_H */ -- 2.35.1