* [C++ PATCH] identifier flags
@ 2017-06-26 16:41 Nathan Sidwell
0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2017-06-26 16:41 UTC (permalink / raw)
To: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 349 bytes --]
This patch continues my changes to the identifier node flags. It makes
use of the new enumeration to reimplement some of the accessors and checks.
We don't have to go checking for the various special identifiers
explicitly, just test various bits in the identifier node.
One bit in the land_decl_fn struct goes away.
nathan
--
Nathan Sidwell
[-- Attachment #2: op-flags.diff --]
[-- Type: text/x-patch, Size: 11184 bytes --]
2017-06-26 Nathan Sidwell <nathan@acm.org>
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.
Index: gcc/cp/call.c
===================================================================
--- gcc/cp/call.c (revision 249654)
+++ gcc/cp/call.c (working copy)
@@ -8677,20 +8677,22 @@ build_cxx_call (tree fn, int nargs, tree
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
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
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. */
Index: gcc/cp/cp-tree.h
===================================================================
--- gcc/cp/cp-tree.h (revision 249654)
+++ gcc/cp/cp-tree.h (working copy)
@@ -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
Index: gcc/cp/decl.c
===================================================================
--- gcc/cp/decl.c (revision 249654)
+++ gcc/cp/decl.c (working copy)
@@ -12925,14 +12925,15 @@ grok_op_properties (tree decl, bool comp
{
/* 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
Index: gcc/cp/init.c
===================================================================
--- gcc/cp/init.c (revision 249654)
+++ gcc/cp/init.c (working copy)
@@ -1718,7 +1718,6 @@ expand_default_init (tree binfo, tree tr
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 tr
}
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);
}
Index: gcc/cp/method.c
===================================================================
--- gcc/cp/method.c (revision 249654)
+++ gcc/cp/method.c (working copy)
@@ -2060,10 +2060,7 @@ implicitly_declare_fn (special_function_
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);
Index: gcc/cp/search.c
===================================================================
--- gcc/cp/search.c (revision 249654)
+++ gcc/cp/search.c (working copy)
@@ -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);
Index: libcc1/libcp1plugin.cc
===================================================================
--- libcc1/libcp1plugin.cc (revision 249654)
+++ libcc1/libcp1plugin.cc (working copy)
@@ -1428,8 +1428,6 @@ plugin_build_decl (cc1_plugin::connectio
if ((sym_flags & GCC_CP_FLAG_SPECIAL_FUNCTION)
&& opcode != ERROR_MARK)
SET_OVERLOADED_OPERATOR_CODE (decl, opcode);
- if (assop)
- DECL_ASSIGNMENT_OPERATOR_P (decl) = true;
}
}
else if (RECORD_OR_UNION_CODE_P (code))
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-06-26 16:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-26 16:41 [C++ PATCH] identifier flags Nathan Sidwell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).