From 9918e7966c0d51e25b14a99adf87e2fbbe97c2e0 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 2 Nov 2017 18:29:26 +0000 Subject: [PATCH] [C++ PATCH] overloaded operator fns [8/N] https://gcc.gnu.org/ml/gcc-patches/2017-11/msg00095.html * cp-tree.h (IDENTIFIER_NEWDEL_OP_P): Restore, adjust. (IDENTIFIER_NEW_OP_P): New. * decl.c (grokdeclarator): Restore IDENTIFIER_NEWDEL_OP_P use. * pt.c (push_template_decl_real): Likewise. * typeck.c (check_return_expr): Use IDENTIFIER_NEW_OP_P. From-SVN: r254350 --- gcc/cp/ChangeLog | 16 +++++++++++----- gcc/cp/cp-tree.h | 11 +++++++++++ gcc/cp/decl.c | 7 ++----- gcc/cp/pt.c | 4 +--- gcc/cp/typeck.c | 4 +--- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7a7a58941e6..f1dec178920 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2017-11-02 Nathan Sidwell + * cp-tree.h (IDENTIFIER_NEWDEL_OP_P): Restore, adjust. + (IDENTIFIER_NEW_OP_P): New. + * decl.c (grokdeclarator): Restore IDENTIFIER_NEWDEL_OP_P use. + * pt.c (push_template_decl_real): Likewise. + * typeck.c (check_return_expr): Use IDENTIFIER_NEW_OP_P. + PR c++/82710 * decl.c (grokdeclarator): Don't warn when parens protect a return type from a qualified name. @@ -8,16 +14,16 @@ * cp-tree.h (enum cp_identifier_kind): Delete cik_newdel_op. Renumber and reserve udlit value. - (IDENTIFIER_NEWDEL_OP): Delete. - (IDENTIFIER_OVL_OP): New. - (IDENTIFIER_ASSIGN_OP): Adjust. - (IDENTIFIER_CONV_OP): Adjust. + (IDENTIFIER_NEWDEL_OP_P): Delete. + (IDENTIFIER_OVL_OP_P): New. + (IDENTIFIER_ASSIGN_OP_P): Adjust. + (IDENTIFIER_CONV_OP_P): Adjust. (IDENTIFIER_OVL_OP_INFO): Adjust. (IDENTIFIER_OVL_OP_FLAGS): New. * decl.c (grokdeclarator): Use IDENTIFIER_OVL_OP_FLAGS. * lex.c (get_identifier_kind_name): Adjust. (init_operators): Don't special case new/delete ops. - * mangle.c (write_unqualified_id): Use IDENTIFIER_OVL_OP. + * mangle.c (write_unqualified_id): Use IDENTIFIER_OVL_OP_P. * pt.c (push_template_decl_real): Use IDENTIFIER_OVL_OP_FLAGS. * typeck.c (check_return_expr): Likewise. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 1de32de1405..65f1fae5c5e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -1070,6 +1070,17 @@ enum cp_identifier_kind { & IDENTIFIER_KIND_BIT_1 (NODE) \ & (!IDENTIFIER_KIND_BIT_0 (NODE))) +/* True if this identifier is a new or delete operator. */ +#define IDENTIFIER_NEWDEL_OP_P(NODE) \ + (IDENTIFIER_OVL_OP_P (NODE) \ + && IDENTIFIER_OVL_OP_FLAGS (NODE) & OVL_OP_FLAG_ALLOC) + +/* True if this identifier is a new operator. */ +#define IDENTIFIER_NEW_OP_P(NODE) \ + (IDENTIFIER_OVL_OP_P (NODE) \ + && (IDENTIFIER_OVL_OP_FLAGS (NODE) \ + & (OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)) == OVL_OP_FLAG_ALLOC) + /* Access a C++-specific index for identifier NODE. Used to optimize operator mappings etc. */ #define IDENTIFIER_CP_INDEX(NODE) \ diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 62bd3daef74..7c6f85724df 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11751,8 +11751,7 @@ grokdeclarator (const cp_declarator *declarator, if (ctype && TREE_CODE (type) == FUNCTION_TYPE && staticp < 2 && !(identifier_p (unqualified_id) - && IDENTIFIER_OVL_OP_P (unqualified_id) - && (IDENTIFIER_OVL_OP_FLAGS (unqualified_id) & OVL_OP_FLAG_ALLOC))) + && IDENTIFIER_NEWDEL_OP_P (unqualified_id))) { cp_cv_quals real_quals = memfn_quals; if (cxx_dialect < cxx14 && constexpr_p @@ -11865,9 +11864,7 @@ grokdeclarator (const cp_declarator *declarator, if (virtualp && identifier_p (unqualified_id) - && IDENTIFIER_OVL_OP_P (unqualified_id) - && (IDENTIFIER_OVL_OP_FLAGS (unqualified_id) - & OVL_OP_FLAG_ALLOC)) + && IDENTIFIER_NEWDEL_OP_P (unqualified_id)) { error ("%qD cannot be declared %, since it " "is always static", unqualified_id); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f807e8c3955..629b2dd50ef 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5329,9 +5329,7 @@ push_template_decl_real (tree decl, bool is_friend) error ("destructor %qD declared as member template", decl); return error_mark_node; } - if (IDENTIFIER_OVL_OP_P (DECL_NAME (decl)) - && (IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (decl)) - & OVL_OP_FLAG_ALLOC) + if (IDENTIFIER_NEWDEL_OP_P (DECL_NAME (decl)) && (!prototype_p (TREE_TYPE (decl)) || TYPE_ARG_TYPES (TREE_TYPE (decl)) == void_list_node || !TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))) diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e2df355921a..9130c10f390 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -9073,9 +9073,7 @@ check_return_expr (tree retval, bool *no_warning) } /* Only operator new(...) throw(), can return NULL [expr.new/13]. */ - if (IDENTIFIER_OVL_OP_P (DECL_NAME (current_function_decl)) - && ((IDENTIFIER_OVL_OP_FLAGS (DECL_NAME (current_function_decl)) - & (OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)) == OVL_OP_FLAG_ALLOC) + if (IDENTIFIER_NEW_OP_P (DECL_NAME (current_function_decl)) && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl)) && ! flag_check_new && retval && null_ptr_cst_p (retval)) -- 2.30.2