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
This commit is contained in:
parent
a6e34898d1
commit
d760b06868
3 changed files with 18 additions and 8 deletions
|
@ -1,3 +1,8 @@
|
|||
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
|
||||
|
|
14
gcc/cp/cvt.c
14
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue