diff options
author | Jason Merrill <jason@redhat.com> | 2025-05-12 11:53:03 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2025-05-12 15:43:03 -0400 |
commit | b4b4dfbd22e06877052bd4cc4b191d9d138155cf (patch) | |
tree | b6fabab4a6384d1c709e6ae879e7ac1d1bf34523 /gcc | |
parent | 17c272598564d7a4f3bfc86b52e4b91b50f98e1d (diff) | |
download | gcc-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.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/abi/base-defaulted2.C | 12 |
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" } +}; |