diff options
author | Nathan Sidwell <nathan@acm.org> | 2017-06-26 16:38:40 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2017-06-26 16:38:40 +0000 |
commit | d6ef53f2413b5fde30a6d9516c4ebf087e6a4363 (patch) | |
tree | f5118cecea9bdf4e8f1e7e2cf9925022e8215fa4 /gcc | |
parent | 0ffdc300784ca80b28639f6d276b48a3dc6138b1 (diff) | |
download | gcc-d6ef53f2413b5fde30a6d9516c4ebf087e6a4363.zip gcc-d6ef53f2413b5fde30a6d9516c4ebf087e6a4363.tar.gz gcc-d6ef53f2413b5fde30a6d9516c4ebf087e6a4363.tar.bz2 |
cp-tree.h (lang_decl_fn): Remove assignment_operator_p field.
gcc/cp/
* cp-tree.h (lang_decl_fn): Remove assignment_operator_p field.
(DECL_COMPLETE_CONSTRUCTOR_P): Directly compare
identifier.
(DECL_BASE_CONSTRUCTOR_P, DECL_COMPLETE_DESTRUCTOR_P)
DECL_BASE_DESTRUCTOR_P, DECL_DELETING_DESTRUCTOR_P): Likewise.
(DECL_ASSIGNMENT_OPERATOR_P): Use IDENTIFIER_ASSIGN_OP_P.
* decl.c (grok_op_properties): Adjust identifier checking.
* init.c (expand_default_init): Adjust identifier descision.
* method.c (implicitly_declare_fn): Don't use
DECL_ASSIGNMENT_OPERATOR_P.
* search.c (lookup_fnfields_1): Use IDENTIFIER_CTOR_P,
IDENTIFIER_DTOR_P.
* call.c (in_charge_arg_for_name): Reimplement.
(build_special_member_call): Use IDENTIFIER_CDTOR_P,
IDENTIFIER_DTOR_P.
libcc1/
* libcp1plugin.cc (plugin_build_decl): Don't set
DECL_ASSIGNMENT_OPERATOR_P.
(--This line, and those below, will be ignored--
M gcc/cp/init.c
M gcc/cp/decl.c
M gcc/cp/method.c
M gcc/cp/cp-tree.h
M gcc/cp/call.c
M gcc/cp/search.c
M gcc/cp/ChangeLog
M libcc1/ChangeLog
M libcc1/libcp1plugin.cc
From-SVN: r249657
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/cp/call.c | 40 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 32 | ||||
-rw-r--r-- | gcc/cp/decl.c | 9 | ||||
-rw-r--r-- | gcc/cp/init.c | 8 | ||||
-rw-r--r-- | gcc/cp/method.c | 5 | ||||
-rw-r--r-- | gcc/cp/search.c | 15 |
7 files changed, 65 insertions, 62 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d04c58..040f7b7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,21 @@ +2017-06-26 Nathan Sidwell <nathan@acm.org> + + * cp-tree.h (lang_decl_fn): Remove assignment_operator_p field. + (DECL_COMPLETE_CONSTRUCTOR_P): Directly compare + identifier. + (DECL_BASE_CONSTRUCTOR_P, DECL_COMPLETE_DESTRUCTOR_P, + DECL_BASE_DESTRUCTOR_P, DECL_DELETING_DESTRUCTOR_P): Likewise. + (DECL_ASSIGNMENT_OPERATOR_P): Use IDENTIFIER_ASSIGN_OP_P. + * decl.c (grok_op_properties): Adjust identifier checking. + * init.c (expand_default_init): Adjust identifier descision. + * method.c (implicitly_declare_fn): Don't use + DECL_ASSIGNMENT_OPERATOR_P. + * search.c (lookup_fnfields_1): Use IDENTIFIER_CTOR_P, + IDENTIFIER_DTOR_P. + * call.c (in_charge_arg_for_name): Reimplement. + (build_special_member_call): Use IDENTIFIER_CDTOR_P, + IDENTIFIER_DTOR_P. + 2017-06-26 Marek Polacek <polacek@redhat.com> PR c/80116 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2fc29da..f480611 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8677,20 +8677,22 @@ build_cxx_call (tree fn, int nargs, tree *argarray, tree in_charge_arg_for_name (tree name) { - if (name == base_ctor_identifier - || name == base_dtor_identifier) - return integer_zero_node; - else if (name == complete_ctor_identifier) - return integer_one_node; - else if (name == complete_dtor_identifier) - return integer_two_node; - else if (name == deleting_dtor_identifier) - return integer_three_node; - - /* This function should only be called with one of the names listed - above. */ - gcc_unreachable (); - return NULL_TREE; + if (IDENTIFIER_CTOR_P (name)) + { + if (name == complete_ctor_identifier) + return integer_one_node; + gcc_checking_assert (name == base_ctor_identifier); + } + else + { + if (name == complete_dtor_identifier) + return integer_two_node; + else if (name == deleting_dtor_identifier) + return integer_three_node; + gcc_checking_assert (name == base_dtor_identifier); + } + + return integer_zero_node; } /* We've built up a constructor call RET. Complain if it delegates to the @@ -8729,11 +8731,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args, vec<tree, va_gc> *allocated = NULL; tree ret; - gcc_assert (name == complete_ctor_identifier - || name == base_ctor_identifier - || name == complete_dtor_identifier - || name == base_dtor_identifier - || name == deleting_dtor_identifier + gcc_assert (IDENTIFIER_CDTOR_P (name) || name == cp_assignment_operator_id (NOP_EXPR)); if (TYPE_P (binfo)) { @@ -8753,9 +8751,7 @@ build_special_member_call (tree instance, tree name, vec<tree, va_gc> **args, instance = build_dummy_object (class_type); else { - if (name == complete_dtor_identifier - || name == base_dtor_identifier - || name == deleting_dtor_identifier) + if (IDENTIFIER_DTOR_P (name)) gcc_assert (args == NULL || vec_safe_is_empty (*args)); /* Convert to the base class, if necessary. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 33dde15..48e0732 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1776,6 +1776,7 @@ struct GTY(()) language_function { (operator_name_info[(int) (CODE)].identifier) #define cp_assignment_operator_id(CODE) \ (assignment_operator_name_info[(int) (CODE)].identifier) + /* In parser.c. */ extern tree cp_literal_operator_id (const char *); @@ -2495,25 +2496,27 @@ struct GTY(()) lang_decl_fn { struct lang_decl_min min; /* In an overloaded operator, this is the value of - DECL_OVERLOADED_OPERATOR_P. */ + DECL_OVERLOADED_OPERATOR_P. + FIXME: We should really do better in compressing this. */ ENUM_BITFIELD (tree_code) operator_code : 16; unsigned global_ctor_p : 1; unsigned global_dtor_p : 1; - unsigned assignment_operator_p : 1; unsigned static_function : 1; unsigned pure_virtual : 1; unsigned defaulted_p : 1; unsigned has_in_charge_parm_p : 1; unsigned has_vtt_parm_p : 1; - unsigned pending_inline_p : 1; + unsigned nonconverting : 1; unsigned thunk_p : 1; unsigned this_thunk_p : 1; unsigned hidden_friend_p : 1; unsigned omp_declare_reduction_p : 1; - /* 2 spare bits on 32-bit hosts, 34 on 64-bit hosts. */ + /* 3 spare bits. */ + + /* 32-bits padding on 64-bit host. */ /* For a non-thunk function decl, this is a tree list of friendly classes. For a thunk function decl, it is the @@ -2694,14 +2697,12 @@ struct GTY(()) lang_decl { /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete object. */ #define DECL_COMPLETE_CONSTRUCTOR_P(NODE) \ - (DECL_CONSTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == complete_ctor_identifier) + (DECL_NAME (NODE) == complete_ctor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base object. */ #define DECL_BASE_CONSTRUCTOR_P(NODE) \ - (DECL_CONSTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == base_ctor_identifier) + (DECL_NAME (NODE) == base_ctor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the specialized in-charge constructor or the specialized not-in-charge @@ -2733,20 +2734,17 @@ struct GTY(()) lang_decl { /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete object. */ #define DECL_COMPLETE_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == complete_dtor_identifier) + (DECL_NAME (NODE) == complete_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base object. */ #define DECL_BASE_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == base_dtor_identifier) + (DECL_NAME (NODE) == base_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete object that deletes the object after it has been destroyed. */ #define DECL_DELETING_DESTRUCTOR_P(NODE) \ - (DECL_DESTRUCTOR_P (NODE) \ - && DECL_NAME (NODE) == deleting_dtor_identifier) + (DECL_NAME (NODE) == deleting_dtor_identifier) /* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or destructor. */ @@ -2836,9 +2834,7 @@ struct GTY(()) lang_decl { (LANG_DECL_FN_CHECK (NODE)->operator_code = (CODE)) /* If NODE is an overloaded operator, then this returns the TREE_CODE - associated with the overloaded operator. - DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine - whether or not NODE is an assignment operator. If NODE is not an + associated with the overloaded operator. If NODE is not an overloaded operator, ERROR_MARK is returned. Since the numerical value of ERROR_MARK is zero, this macro can be used as a predicate to test whether or not NODE is an overloaded operator. */ @@ -2848,7 +2844,7 @@ struct GTY(()) lang_decl { /* Nonzero if NODE is an assignment operator (including += and such). */ #define DECL_ASSIGNMENT_OPERATOR_P(NODE) \ - (LANG_DECL_FN_CHECK (NODE)->assignment_operator_p) + IDENTIFIER_ASSIGN_OP_P (DECL_NAME (NODE)) /* For FUNCTION_DECLs: nonzero means that this function is a constructor or a destructor with an extra in-charge parameter to diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 0361357..93e24fc 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -12925,14 +12925,15 @@ grok_op_properties (tree decl, bool complain) { /* It'd be nice to hang something else of the identifier to find CODE more directly. */ + bool assign_op = IDENTIFIER_ASSIGN_OP_P (name); const operator_name_info_t *oni - = (IDENTIFIER_ASSIGN_OP_P (name) - ? assignment_operator_name_info : operator_name_info); - DECL_ASSIGNMENT_OPERATOR_P (decl) = IDENTIFIER_ASSIGN_OP_P (name); + = (assign_op ? assignment_operator_name_info : operator_name_info); + if (false) ; #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, KIND) \ - else if (oni[int (CODE)].identifier == name) \ + else if (assign_op == (KIND == cik_assign_op) \ + && oni[int (CODE)].identifier == name) \ operator_code = (CODE); #include "operators.def" #undef DEF_OPERATOR diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 90abd23..b6f6b4f 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1718,7 +1718,6 @@ expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags, tsubst_flags_t complain) { tree type = TREE_TYPE (exp); - tree ctor_name; /* It fails because there may not be a constructor which takes its own type as the first (or only parameter), but which does @@ -1846,10 +1845,9 @@ expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags, } else { - if (true_exp == exp) - ctor_name = complete_ctor_identifier; - else - ctor_name = base_ctor_identifier; + tree ctor_name = (true_exp == exp + ? complete_ctor_identifier : base_ctor_identifier); + rval = build_special_member_call (exp, ctor_name, &parms, binfo, flags, complain); } diff --git a/gcc/cp/method.c b/gcc/cp/method.c index fe4b2af..4cb52f2 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -2060,10 +2060,7 @@ implicitly_declare_fn (special_function_kind kind, tree type, else if (kind == sfk_destructor) DECL_DESTRUCTOR_P (fn) = 1; else - { - DECL_ASSIGNMENT_OPERATOR_P (fn) = 1; - SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR); - } + SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR); SET_DECL_ALIGN (fn, MINIMUM_METHOD_BOUNDARY); diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 00f895c..2630150 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1653,9 +1653,7 @@ lookup_fnfields_1 (tree type, tree name) if (COMPLETE_TYPE_P (type)) { - if ((name == ctor_identifier - || name == base_ctor_identifier - || name == complete_ctor_identifier)) + if (IDENTIFIER_CTOR_P (name)) { if (CLASSTYPE_LAZY_DEFAULT_CTOR (type)) lazily_declare_fn (sfk_constructor, type); @@ -1671,12 +1669,11 @@ lookup_fnfields_1 (tree type, tree name) if (CLASSTYPE_LAZY_MOVE_ASSIGN (type)) lazily_declare_fn (sfk_move_assignment, type); } - else if ((name == dtor_identifier - || name == base_dtor_identifier - || name == complete_dtor_identifier - || name == deleting_dtor_identifier) - && CLASSTYPE_LAZY_DESTRUCTOR (type)) - lazily_declare_fn (sfk_destructor, type); + else if (IDENTIFIER_DTOR_P (name)) + { + if (CLASSTYPE_LAZY_DESTRUCTOR (type)) + lazily_declare_fn (sfk_destructor, type); + } } return lookup_fnfields_idx_nolazy (type, name); |