From 7d5f38e49e59a09140473aa592133360428a1d83 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 28 Oct 2020 08:11:35 -0700 Subject: [PATCH] c++: Refactor push_template_decl Sadly I need to wander into push_template_decl again. But here's a piece of RAII goodness first. gcc/cp/ * pt.c (push_template_decl): Refactor for some RAII. --- gcc/cp/pt.c | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3c0f2546489..0d2946fd7c4 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5682,12 +5682,6 @@ template_parm_outer_level (tree t, void *data) tree push_template_decl (tree decl, bool is_friend) { - tree tmpl; - tree args; - tree info; - tree ctx; - bool is_primary; - bool is_partial; int new_template_p = 0; /* True if the template is a member template, in the sense of [temp.mem]. */ @@ -5697,19 +5691,20 @@ push_template_decl (tree decl, bool is_friend) return error_mark_node; /* See if this is a partial specialization. */ - is_partial = ((DECL_IMPLICIT_TYPEDEF_P (decl) - && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE - && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl))) - || (VAR_P (decl) - && DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLATE_SPECIALIZATION (decl) - && TINFO_USED_TEMPLATE_ID (DECL_TEMPLATE_INFO (decl)))); + bool is_partial = ((DECL_IMPLICIT_TYPEDEF_P (decl) + && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE + && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl))) + || (VAR_P (decl) + && DECL_LANG_SPECIFIC (decl) + && DECL_TEMPLATE_SPECIALIZATION (decl) + && TINFO_USED_TEMPLATE_ID (DECL_TEMPLATE_INFO (decl)))); /* No surprising friend functions. */ gcc_checking_assert (is_friend || !(TREE_CODE (decl) == FUNCTION_DECL && DECL_UNIQUE_FRIEND_P (decl))); + tree ctx; if (is_friend) /* For a friend, we want the context of the friend, not the type of which it is a friend. */ @@ -5731,14 +5726,16 @@ push_template_decl (tree decl, bool is_friend) DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace); /* See if this is a primary template. */ + bool is_primary = false; if (is_friend && ctx && uses_template_parms_level (ctx, processing_template_decl)) /* A friend template that specifies a class context, i.e. template friend void A::f(); is not primary. */ - is_primary = false; + ; else if (TREE_CODE (decl) == TYPE_DECL && LAMBDA_TYPE_P (TREE_TYPE (decl))) - is_primary = false; + /* Lambdas are not primary. */ + ; else is_primary = template_parm_scope_p (); @@ -5871,8 +5868,9 @@ push_template_decl (tree decl, bool is_friend) if (is_partial) return process_partial_specialization (decl); - args = current_template_args (); + tree args = current_template_args (); + tree tmpl; if (!ctx || TREE_CODE (ctx) == FUNCTION_DECL || (CLASS_TYPE_P (ctx) && TYPE_BEING_DEFINED (ctx)) @@ -6077,7 +6075,7 @@ push_template_decl (tree decl, bool is_friend) if (DECL_TEMPLATE_INFO (tmpl)) args = add_outermost_template_args (DECL_TI_ARGS (tmpl), args); - info = build_template_info (tmpl, args); + tree info = build_template_info (tmpl, args); if (DECL_IMPLICIT_TYPEDEF_P (decl)) SET_TYPE_TEMPLATE_INFO (TREE_TYPE (tmpl), info); -- 2.30.2