diff options
Diffstat (limited to 'gcc/cp/cvt.c')
-rw-r--r-- | gcc/cp/cvt.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index 315b0d6..b04e9a7 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -725,7 +725,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags, /* We need a new temporary; don't take this shortcut. */; else if (same_type_ignoring_top_level_qualifiers_p (type, TREE_TYPE (e))) { - if (same_type_p (type, TREE_TYPE (e))) + tree etype = TREE_TYPE (e); + if (same_type_p (type, etype)) /* The call to fold will not always remove the NOP_EXPR as might be expected, since if one of the types is a typedef; the comparison in fold is just equality of pointers, not a @@ -743,9 +744,16 @@ ocp_convert (tree type, tree expr, int convtype, int flags, { /* Don't build a NOP_EXPR of class type. Instead, change the type of the temporary. */ + gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, etype)); TREE_TYPE (e) = TREE_TYPE (TARGET_EXPR_SLOT (e)) = type; return e; } + else if (TREE_CODE (e) == CONSTRUCTOR) + { + gcc_assert (same_type_ignoring_top_level_qualifiers_p (type, etype)); + TREE_TYPE (e) = type; + return e; + } else { /* We shouldn't be treating objects of ADDRESSABLE type as |