diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-10-14 09:59:45 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-10-14 10:04:18 -0700 |
commit | 068644a14976ce670c2b32c37e18f0aafeb05569 (patch) | |
tree | b349fda340e8e82bbbf0e80205086754dcf2e5bf /gcc/cp/cp-tree.h | |
parent | 06bec55e80d98419121f3998d98d969990a75b0b (diff) | |
download | gcc-068644a14976ce670c2b32c37e18f0aafeb05569.zip gcc-068644a14976ce670c2b32c37e18f0aafeb05569.tar.gz gcc-068644a14976ce670c2b32c37e18f0aafeb05569.tar.bz2 |
c++: DECL_FRIEND_P cleanup
DECL_FRIEND_P's meaning has changed over time. It now (almost) means
the the friend function decl has not been met via an explicit decl.
This completes that transition, renaming it to DECL_UNIQUE_FRIEND_P,
so one doesn't think it is the sole indicator of friendliness (plenty
of friends do not have the flag set). This allows reduction in the
complexity of managing the field -- all in duplicate_decls now.
gcc/cp/
* cp-tree.h (struct lang_decl_fn): Adjust context comment.
(DECL_FRIEND_P): Replace with ...
(DECL_UNIQUE_FRIEND_P): ... this. Only for FUNCTION_DECLs.
(DECL_FRIEND_CONTEXT): Adjust.
* class.c (add_implicitly_declared_members): Detect friendly
spaceship from context.
* constraint.cc (remove_constraints): Use a checking assert.
(maybe_substitute_reqs_for): Use DECL_UNIQUE_FRIEND_P.
* decl.c (check_no_redeclaration_friend_default_args):
DECL_UNIQUE_FRIEND_P is signficant, not hiddenness.
(duplicate_decls): Adjust DECL_UNIQUE_FRIEND_P clearing.
(redeclaration_error_message): Use DECL_UNIQUE_FRIEND_P.
(start_preparsed_function): Correct in-class friend processing.
Refactor some initializers.
(grokmethod): Directly check friend decl-spec.
* decl2.c (grokfield): Check DECL_UNIQUE_FRIEND_P.
* friend.c (do_friend): Set DECL_UNIQUE_FRIEND_P first, remove
extraneous conditions. Don't re set it afterwards.
* name-lookup.c (lookup_elaborated_type_1): Simplify revealing
code.
(do_pushtag): Likewise.
* pt.c (optimize_specialization_lookup_p): Check
DECL_UNIQUE_FRIEND_P.
(push_template_decl): Likewise. Drop unneeded friend setting.
(type_dependent_expression_p): Check DECL_UNIQUE_FRIEND_P.
libcc1/
* libcp1plugin.cc (plugin_add_friend): Set DECL_UNIQUE_FRIEND_P.
Diffstat (limited to 'gcc/cp/cp-tree.h')
-rw-r--r-- | gcc/cp/cp-tree.h | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 4672561..5c06ac3 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2736,12 +2736,14 @@ struct GTY(()) lang_decl_fn { thunked to function decl. */ tree befriending_classes; - /* For a non-virtual FUNCTION_DECL, this is - DECL_FRIEND_CONTEXT. For a virtual FUNCTION_DECL for which + /* For a virtual FUNCTION_DECL for which DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both this pointer and result pointer adjusting thunks are chained here. This pointer thunks to return pointer thunks - will be chained on the return pointer thunk. */ + will be chained on the return pointer thunk. + For a DECL_CONSTUCTOR_P FUNCTION_DECL, this is the base from + whence we inherit. Otherwise, it is the class in which a + (namespace-scope) friend is defined (if any). */ tree context; union lang_decl_u5 @@ -3088,10 +3090,14 @@ struct GTY(()) lang_decl { (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \ ->u.base.odr_used) -/* Nonzero for DECL means that this decl is just a friend declaration, - and should not be added to the list of members for this class. */ -#define DECL_FRIEND_P(NODE) \ - (DECL_LANG_SPECIFIC (TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK (NODE)) \ +/* Nonzero for FUNCTION_DECL means that this is a friend that is + either not pushed into a namespace/looked up in a class (because it + is a dependent type, in an uninstantiated template), or it has + /only/ been subject to hidden friend injection from one or more + befriending classes. Once another decl matches, the flag is + cleared. There are requirements on its default parms. */ +#define DECL_UNIQUE_FRIEND_P(NODE) \ + (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE)) \ ->u.base.friend_or_tls) /* Nonzero if the thread-local variable was declared with __thread as @@ -3290,8 +3296,8 @@ struct GTY(()) lang_decl { the DECL_FRIEND_CONTEXT for `f' will be `S'. */ #define DECL_FRIEND_CONTEXT(NODE) \ - ((DECL_DECLARES_FUNCTION_P (NODE) \ - && DECL_FRIEND_P (NODE) && !DECL_FUNCTION_MEMBER_P (NODE)) \ + ((DECL_DECLARES_FUNCTION_P (NODE) && !DECL_VIRTUAL_P (NODE) \ + && !DECL_CONSTRUCTOR_P (NODE)) \ ? LANG_DECL_FN_CHECK (NODE)->context \ : NULL_TREE) |