From d760b06868d660bc4b934caf64d2e0a5e69193d1 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 27 Apr 2018 13:09:17 -0400 Subject: [PATCH] cvt.c (cp_fold_convert): Use convert_ptrmem. * cvt.c (cp_fold_convert): Use convert_ptrmem. * typeck.c (convert_ptrmem): Add a NOP even if no adjustment. From-SVN: r259717 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/cvt.c | 14 +++++++++----- gcc/cp/typeck.c | 7 ++++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 552828f..2dbc675 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-04-27 Jason Merrill + + * cvt.c (cp_fold_convert): Use convert_ptrmem. + * typeck.c (convert_ptrmem): Add a NOP even if no adjustment. + 2018-04-27 Paolo Carlini PR c++/84691 diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 0f045e2..d9e3cb5 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -601,16 +601,20 @@ cp_fold_convert (tree type, tree expr) tree conv; if (TREE_TYPE (expr) == type) conv = expr; - else if (TREE_CODE (expr) == PTRMEM_CST) + else if (TREE_CODE (expr) == PTRMEM_CST + && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type), + PTRMEM_CST_CLASS (expr))) { /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */ conv = copy_node (expr); TREE_TYPE (conv) = type; } - else if (TREE_CODE (expr) == CONSTRUCTOR - && TYPE_PTRMEMFUNC_P (type)) - conv = build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr, - true, false, tf_warning_or_error); + else if (TYPE_PTRMEM_P (type)) + { + conv = convert_ptrmem (type, expr, true, false, + tf_warning_or_error); + conv = cp_fully_fold (conv); + } else { conv = fold_convert (type, expr); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 19db315..05ae00e 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6844,15 +6844,16 @@ convert_ptrmem (tree type, tree expr, bool allow_inverse_p, if (TYPE_PTRDATAMEM_P (type)) { + tree obase = TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)); + tree nbase = TYPE_PTRMEM_CLASS_TYPE (type); tree delta = (get_delta_difference - (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)), - TYPE_PTRMEM_CLASS_TYPE (type), + (obase, nbase, allow_inverse_p, c_cast_p, complain)); if (delta == error_mark_node) return error_mark_node; - if (!integer_zerop (delta)) + if (!same_type_p (obase, nbase)) { if (TREE_CODE (expr) == PTRMEM_CST) expr = cplus_expand_constant (expr); -- 2.7.4