@@ -8791,6 +8791,7 @@ native_interpret_expr (tree type, const unsigned char *ptr, int len)
case BOOLEAN_TYPE:
case POINTER_TYPE:
case REFERENCE_TYPE:
+ case OFFSET_TYPE:
return native_interpret_int (type, ptr, len);
case REAL_TYPE:
@@ -8827,6 +8828,7 @@ can_native_interpret_type_p (tree type)
case REAL_TYPE:
case COMPLEX_TYPE:
case VECTOR_TYPE:
+ case OFFSET_TYPE:
return true;
default:
return false;
@@ -3090,8 +3090,12 @@ expand_DEFERRED_INIT (internal_fn, gcall *stmt)
(total_bytes * BITS_PER_UNIT, 1);
wide_int w = wi::from_buffer (buf, total_bytes);
init = wide_int_to_tree (itype, w);
- /* Pun the LHS to make sure its type has constant size. */
- lhs = build1 (VIEW_CONVERT_EXPR, itype, lhs);
+ /* Pun the LHS to make sure its type has constant size
+ unless it is an SSA name where that's already known. */
+ if (TREE_CODE (lhs) != SSA_NAME)
+ lhs = build1 (VIEW_CONVERT_EXPR, itype, lhs);
+ else
+ init = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), init);
}
}
else
new file mode 100644
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-ftrivial-auto-var-init=pattern" } */
+
+struct S;
+void test() { int(S::*PtrMem); }