aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2025-05-12 11:53:03 -0400
committerJason Merrill <jason@redhat.com>2025-05-12 15:43:03 -0400
commitb4b4dfbd22e06877052bd4cc4b191d9d138155cf (patch)
treeb6fabab4a6384d1c709e6ae879e7ac1d1bf34523 /gcc
parent17c272598564d7a4f3bfc86b52e4b91b50f98e1d (diff)
downloadgcc-b4b4dfbd22e06877052bd4cc4b191d9d138155cf.zip
gcc-b4b4dfbd22e06877052bd4cc4b191d9d138155cf.tar.gz
gcc-b4b4dfbd22e06877052bd4cc4b191d9d138155cf.tar.bz2
c+: -Wabi false positive [PR120012]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/class.cc6
-rw-r--r--gcc/testsuite/g++.dg/abi/base-defaulted2.C12
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc
index 2764bb5..db39e57 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 0000000..9652ae6
--- /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" }
+};