Tested x86_64-pc-linux-gnu, applying to trunk.
-- 8< --
The warning compares the position of a field depending on whether or not the
previous base/field is considered a POD for layout, but failed to consider
whether the previous base/field is empty; layout of an empty base doesn't
consider PODness.
PR c++/120012
gcc/cp/ChangeLog:
* class.cc (check_non_pod_aggregate): Check is_empty_class.
gcc/testsuite/ChangeLog:
* g++.dg/abi/base-defaulted2.C: New test.
---
gcc/cp/class.cc | 6 ++++--
gcc/testsuite/g++.dg/abi/base-defaulted2.C | 12 ++++++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/abi/base-defaulted2.C
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc
index 2764bb52ddd..db39e579870 100644
--- a/gcc/cp/class.cc
+++ b/gcc/cp/class.cc
@@ -6879,8 +6879,10 @@ check_non_pod_aggregate (tree field)
tree type = TREE_TYPE (field);
if (TYPE_IDENTIFIER (type) == as_base_identifier)
type = TYPE_CONTEXT (type);
- if (!CLASS_TYPE_P (type) || (!CLASSTYPE_NON_POD_AGGREGATE (type)
- && !CLASSTYPE_NON_AGGREGATE_POD (type)))
+ if (!CLASS_TYPE_P (type)
+ || is_empty_class (type)
+ || (!CLASSTYPE_NON_POD_AGGREGATE (type)
+ && !CLASSTYPE_NON_AGGREGATE_POD (type)))
return;
tree size = end_of_class (type, (DECL_FIELD_IS_BASE (field)
? eoc_nvsize : eoc_nv_or_dsize));
diff --git a/gcc/testsuite/g++.dg/abi/base-defaulted2.C
b/gcc/testsuite/g++.dg/abi/base-defaulted2.C
new file mode 100644
index 00000000000..9652ae60c03
--- /dev/null
+++ b/gcc/testsuite/g++.dg/abi/base-defaulted2.C
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++11 } }
+// { dg-additional-options "-fabi-version=20 -Wabi" }
+
+struct Base {
+protected:
+ Base() = default;
+ ~Base() = default;
+};
+
+struct Derived : Base {
+ void* ptr; // { dg-bogus "offset" }
+};
base-commit: 17c272598564d7a4f3bfc86b52e4b91b50f98e1d
--
2.49.0