+2015-07-01 Jason Merrill <jason@redhat.com>
+
+ PR c++/65945
+ * decl.c (cxx_init_decl_processing): Set TYPE_ALIGN of nullptr_t.
+ * class.c (layout_nonempty_base_or_field): Warn if that affects
+ the offset of a field.
+
2015-07-01 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60365
: TYPE_ALIGN (type)));
normalize_rli (rli);
}
+ else if (TREE_CODE (type) == NULLPTR_TYPE
+ && warn_abi && abi_version_crosses (9))
+ {
+ /* Before ABI v9, we were giving nullptr_t alignment of 1; if
+ the offset wasn't aligned like a pointer when we started to
+ layout this field, that affects its position. */
+ tree pos = rli_size_unit_so_far (&old_rli);
+ if (int_cst_value (pos) % TYPE_ALIGN_UNIT (ptr_type_node) != 0)
+ {
+ if (abi_version_at_least (9))
+ warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wabi,
+ "alignment of %qD increased in -fabi-version=9 "
+ "(GCC 5.2)", decl);
+ else
+ warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wabi, "alignment "
+ "of %qD will increase in -fabi-version=9", decl);
+ }
+ break;
+ }
else
/* There was no conflict. We're done laying out this field. */
break;
TYPE_SIZE_UNIT (nullptr_type_node) = size_int (GET_MODE_SIZE (ptr_mode));
TYPE_UNSIGNED (nullptr_type_node) = 1;
TYPE_PRECISION (nullptr_type_node) = GET_MODE_BITSIZE (ptr_mode);
+ if (abi_version_at_least (9))
+ TYPE_ALIGN (nullptr_type_node) = GET_MODE_ALIGNMENT (ptr_mode);
SET_TYPE_MODE (nullptr_type_node, ptr_mode);
record_builtin_type (RID_MAX, "decltype(nullptr)", nullptr_type_node);
nullptr_node = build_int_cst (nullptr_type_node, 0);
--- /dev/null
+// PR c++/65945
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=9" }
+
+static_assert(alignof (decltype (nullptr)) == alignof (void *), "");
--- /dev/null
+// { dg-do compile { target c++11 } }
+// { dg-options "-fabi-version=0 -Wabi=8" }
+
+struct A
+{
+ decltype(nullptr) n;
+ decltype(nullptr) n2;
+};
+
+struct B
+{
+ void *p;
+ decltype(nullptr) n;
+};
+
+struct C
+{
+ char c;
+ decltype(nullptr) n; // { dg-warning "alignment" }
+};