aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/cvt.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-04-14 12:02:41 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-04-14 12:02:41 -0400
commitfb899e32c16088cad1a19a3e8df615ecfd1332db (patch)
treea57c3613c19a2fab37e9e8792a22f3a1abc3fee6 /gcc/cp/cvt.c
parent0f19e7adef3f2818fd0b363306791c23b0656b62 (diff)
downloadgcc-fb899e32c16088cad1a19a3e8df615ecfd1332db.zip
gcc-fb899e32c16088cad1a19a3e8df615ecfd1332db.tar.gz
gcc-fb899e32c16088cad1a19a3e8df615ecfd1332db.tar.bz2
re PR c++/65695 (NSDMI calling constexpr constructor with pointer-to-member is not a constant expression)
PR c++/65695 * cvt.c (cp_fold_convert): Avoid wrapping PTRMEM_CST in NOP_EXPR. From-SVN: r222097
Diffstat (limited to 'gcc/cp/cvt.c')
-rw-r--r--gcc/cp/cvt.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index d0924f1..9aa9006 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -603,8 +603,20 @@ ignore_overflows (tree expr, tree orig)
tree
cp_fold_convert (tree type, tree expr)
{
- tree conv = fold_convert (type, expr);
- conv = ignore_overflows (conv, expr);
+ tree conv;
+ if (TREE_TYPE (expr) == type)
+ conv = expr;
+ else if (TREE_CODE (expr) == PTRMEM_CST)
+ {
+ /* Avoid wrapping a PTRMEM_CST in NOP_EXPR. */
+ conv = copy_node (expr);
+ TREE_TYPE (conv) = type;
+ }
+ else
+ {
+ conv = fold_convert (type, expr);
+ conv = ignore_overflows (conv, expr);
+ }
return conv;
}