aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2019-10-15 11:20:06 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2019-10-15 11:20:06 +0000
commit386c40778648fecf4807566d5254dec191d35dab (patch)
tree159f7184ec9acb86a40639f090c6486ffe9ecbb9 /gcc
parent1c2e7cd91aaa0fa022c8f17f4d5db214439ef178 (diff)
downloadgcc-386c40778648fecf4807566d5254dec191d35dab.zip
gcc-386c40778648fecf4807566d5254dec191d35dab.tar.gz
gcc-386c40778648fecf4807566d5254dec191d35dab.tar.bz2
[C++ PATCH] build_clone cleanup
https://gcc.gnu.org/ml/gcc-patches/2019-10/msg01069.html build_clone is recursive when applied to a template, but I found the control flow confusing. this makes it clearer and moves some decls to their initializers. * class.c (build_clone): Refactor to clarify recursiveness. From-SVN: r276992
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/class.c27
2 files changed, 16 insertions, 15 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7245b3e..a2fc072 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,7 @@
+2019-10-15 Nathan Sidwell <nathan@acm.org>
+
+ * class.c (build_clone): Refactor to clarify recursiveness.
+
2019-10-14 Jason Merrill <jason@redhat.com>
PR c++/91930 - ICE with constrained inherited default ctor.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b6afdc4..b9266b3 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -4581,16 +4581,15 @@ check_methods (tree t)
static tree
build_clone (tree fn, tree name)
{
- tree parms;
- tree clone;
-
/* Copy the function. */
- clone = copy_decl (fn);
+ tree clone = copy_decl (fn);
/* Reset the function name. */
DECL_NAME (clone) = name;
/* Remember where this function came from. */
DECL_ABSTRACT_ORIGIN (clone) = fn;
- /* Make it easy to find the CLONE given the FN. */
+
+ /* Make it easy to find the CLONE given the FN. Note the
+ template_result of a template will be chained this way too. */
DECL_CHAIN (clone) = DECL_CHAIN (fn);
DECL_CHAIN (fn) = clone;
@@ -4599,19 +4598,18 @@ build_clone (tree fn, tree name)
{
tree result = build_clone (DECL_TEMPLATE_RESULT (clone), name);
DECL_TEMPLATE_RESULT (clone) = result;
+
DECL_TEMPLATE_INFO (result) = copy_node (DECL_TEMPLATE_INFO (result));
DECL_TI_TEMPLATE (result) = clone;
+
TREE_TYPE (clone) = TREE_TYPE (result);
return clone;
}
- else
- {
- /* Clone constraints. */
- if (flag_concepts)
- if (tree ci = get_constraints (fn))
- set_constraints (clone, copy_node (ci));
- }
+ if (flag_concepts)
+ /* Clone constraints. */
+ if (tree ci = get_constraints (fn))
+ set_constraints (clone, copy_node (ci));
SET_DECL_ASSEMBLER_NAME (clone, NULL_TREE);
DECL_CLONED_FUNCTION (clone) = fn;
@@ -4623,8 +4621,7 @@ build_clone (tree fn, tree name)
if (name == base_dtor_identifier)
{
DECL_VIRTUAL_P (clone) = 0;
- if (TREE_CODE (clone) != TEMPLATE_DECL)
- DECL_VINDEX (clone) = NULL_TREE;
+ DECL_VINDEX (clone) = NULL_TREE;
}
bool ctor_omit_inherited_parms_p = ctor_omit_inherited_parms (clone);
@@ -4689,7 +4686,7 @@ build_clone (tree fn, tree name)
if (ctor_omit_inherited_parms_p)
DECL_CHAIN (DECL_CHAIN (DECL_ARGUMENTS (clone))) = NULL_TREE;
- for (parms = DECL_ARGUMENTS (clone); parms; parms = DECL_CHAIN (parms))
+ for (tree parms = DECL_ARGUMENTS (clone); parms; parms = DECL_CHAIN (parms))
{
DECL_CONTEXT (parms) = clone;
cxx_dup_lang_specific_decl (parms);