2017-11-02 Nathan Sidwell <nathan@acm.org>
+ * 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.
* 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.
& 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) \
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
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 %<virtual%>, since it "
"is always static", unqualified_id);
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)))
}
/* 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))