Commit d760b068 by Jason Merrill Committed by Jason Merrill

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
parent a6e34898
2018-04-27 Jason Merrill <jason@redhat.com>
* cvt.c (cp_fold_convert): Use convert_ptrmem.
* typeck.c (convert_ptrmem): Add a NOP even if no adjustment.
2018-04-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84691
......
......@@ -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);
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment