suppression: Support the has_size_change property for suppress_type
authorDodji Seketeli <dodji@redhat.com>
Fri, 27 Jan 2023 16:30:35 +0000 (17:30 +0100)
committerDodji Seketeli <dodji@redhat.com>
Thu, 2 Mar 2023 09:29:15 +0000 (10:29 +0100)
The "has_data_member_inserted_between" and
"has_data_members_inserted_between" properties of the [suppress_type]
directive allows the suppression of type changes when a data member is
inserted in a given range.  It turns out that suppressing type changes
that incur a change in the size of the type might not be what the user
wants by default, because the type size in itself might actually be an
incompatible ABI change that would then fly under the radar because of
this suppression specification.

An arguably better default behavior in this case would be to NOT
suppress the type change if the data member insertion does incur a
change in the size of the type.

But then, there would be cases where the user would really want to
suppress the type change due to data member insertion in a given range
even if it incurs a change in the type size.  This is where this patch
enters into play.

The patch introduces the "has_size_change" property of the
[suppress_type] directive.  In the presence of
"has_data_members_inserted_between" or
"has_data_member_inserted_between" properties, if the
"has_size_change" property is set to "yes", then the type change would
be suppressed if data members are inserted in the given range even if
the insertion incurs a type size change.

Otherwise, with this patch, in the absence of the "has_size_change"
property, the "has_data_member_inserted_between" and
"has_data_members_inserted_between" properties won't trigger the type
change suppression if the data member insertion incurs a type size
change.

* doc/manuals/libabigail-concepts.rst: Document the new
has_size_change property.
* include/abg-suppression.h
(type_suppression::{g,s}et_has_size_change): Declare new accessors.
* src/abg-suppression-priv.h
(type_suppression::priv::has_size_change_): Define new data
member.
(type_suppression::priv::priv): Initialize the new data member.
* src/abg-suppression.cc
(type_suppression::{g,s}et_has_size_change): Define new accessors.
(type_suppression::suppresses_diff): Make the
has_data_member_inserted_* clauses have effect only if the class
size hasn't changed, unless the class has as the "has_size_change"
property.  Also, allow members to be deleted in the right
insertion range if the resulting size stays the same or if the
has_size_change property is present.  This allows some custom
behaviours where "padding" data members would be removed while
some new data members would be added, resulting in a type which
size would not change.
(read_type_suppression): Support parsing the "has_size_change"
property.
* tests/data/test-diff-suppr/test11-add-data-member-0.1.suppr: New
test suppression specification.
* tests/data/test-diff-suppr/test11-add-data-member-1.1.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-2.1.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-3.1.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-4.1.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-report-1.1.txt:
Likewise.
* tests/data/test-diff-suppr/test12-add-data-member-0.1.suppr:
Likewise.
* tests/data/test-diff-suppr/test12-add-data-member-report-1.1.txt:
New test reference output.
* tests/data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr:
New test suppression specification.
* tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt:
New test reference output.
* tests/data/test-diff-suppr/test35-leaf-report-0.1.txt: Likewise.
* tests/data/test-diff-suppr/test35-leaf.1.suppr: New test
suppression specification.
* tests/data/Makefile.am: Add the new testing material to source
distribution.
* tests/data/test-diff-suppr/test11-add-data-member-1.suppr: Add
the has_size_change property to explicitly allow suppressing type
changes involving data member insertion even when the type size
changes.
* tests/data/test-diff-suppr/test11-add-data-member-0.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-2.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-3.suppr:
Likewise.
* tests/data/test-diff-suppr/test11-add-data-member-4.suppr:
Likewise.
* tests/data/test-diff-suppr/test12-add-data-member-0.suppr:
Likewise.
* tests/data/test-diff-suppr/test13-suppr-through-pointer-0.suppr:
Likewise.
* tests/data/test-diff-suppr/test35-leaf.suppr: Likewise.
* tests/test-diff-suppr.cc (in_out_specs): Add the new test input
to the test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
26 files changed:
doc/manuals/libabigail-concepts.rst
include/abg-suppression.h
src/abg-suppression-priv.h
src/abg-suppression.cc
tests/data/Makefile.am
tests/data/test-diff-suppr/test11-add-data-member-0.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test11-add-data-member-0.suppr
tests/data/test-diff-suppr/test11-add-data-member-1.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test11-add-data-member-1.suppr
tests/data/test-diff-suppr/test11-add-data-member-2.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test11-add-data-member-2.suppr
tests/data/test-diff-suppr/test11-add-data-member-3.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test11-add-data-member-3.suppr
tests/data/test-diff-suppr/test11-add-data-member-4.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test11-add-data-member-4.suppr
tests/data/test-diff-suppr/test11-add-data-member-report-1.1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test12-add-data-member-0.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test12-add-data-member-0.suppr
tests/data/test-diff-suppr/test12-add-data-member-report-1.1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test13-suppr-through-pointer-0.suppr
tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test35-leaf-report-0.1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test35-leaf.1.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/test35-leaf.suppr
tests/test-diff-suppr.cc

index 2824b216cfdeedc9cbcd6f5ef8858237e2d3aabf..dc5a4a5c640bf4b57431781a1ea3a2d7688a2d03 100644 (file)
@@ -481,9 +481,11 @@ names start with the string "private_data_member".
 
  Suppresses change reports involving a type which has at least one
  data member inserted at an offset specified by the property value
- ``offset-in-bit``.  Please note that if a type has a change in which
- at least one of its data members is removed or its size is reduced,
- the type will *NOT* be suppressed by the evaluation of this property.
+ ``offset-in-bit``.  Please note that if the size of the type changed,
+ then the type change will *NOT* be suppressed by the evaluation of
+ this property, unless the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
 
  The value ``offset-in-bit`` is either:
 
@@ -525,9 +527,16 @@ names start with the string "private_data_member".
  the values ``range-begin`` and ``range-end`` can be of the same form
  as the :ref:`has_data_member_inserted_at
  <suppr_has_data_member_inserted_at_label>` property above.  Please
- also note that if a type has a change in which at least one of its
- data members is removed or its size is reduced, the type will *NOT* be
- suppressed by the evaluation of this property.
+ also note that if the size of the type changed, then the type change
+ will *NOT* be suppressed by the evaluation of this property, unless
+ the :ref:`has_size_change<suppr_has_size_change_property_label>`
+ property is present and set to ``yes``.  Note that data member
+ deletions happening in the range between ``range-begin`` and
+ ``range-end`` won't prevent the type change from being suppressed by
+ the evaluation of this property if the size of the type doesn't
+ change or if the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
 
  Usage examples of this properties are: ::
 
@@ -564,9 +573,15 @@ names start with the string "private_data_member".
  the ranges are of the same kind as for the
  :ref:`has_data_member_inserted_at
  <suppr_has_data_member_inserted_at_label>` property above.  Please
- note that if a type has a change in which at least one of its data
- members is removed or its size is reduced, the type will *NOT* be
- suppressed by the evaluation of this property.
+ also note that if the size of the type changed, then the type will
+ *NOT* be suppressed by the evaluation of this property, unless the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.  Note that data member deletions
+ happening in the defined ranges won't prevent the type change from
+ being suppressed by the evaluation of this property if the size of
+ the type doesn't change or if the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
 
  Another usage example of this property is thus: ::
 
@@ -576,6 +591,23 @@ names start with the string "private_data_member".
          {72, end}
      }
 
+
+ .. _suppr_has_size_change_property_label:
+* ``has_size_change``
+
+ Usage:
+
+   ``has_size_change`` ``=`` yes | no
+
+
+This property is to be used in conjunction with the properties
+:ref:`has_data_member_inserted_between<suppr_has_data_member_inserted_between_label>`
+and
+:ref:`has_data_members_inserted_between<suppr_has_data_members_inserted_between_label>`.
+Those properties will not match a type change if the size of the type
+changes, unless the ``has_size_changes`` property is set to ``yes``.
+
+
  .. _suppr_accessed_through_property_label:
 
 * ``accessed_through``
index b13bb9fb460e1cf5dd0207c68bed2dca0b59c84b..a51fdc5a4b7db6c0faffcbf3a7c73ea3c4be9cff 100644 (file)
@@ -243,6 +243,12 @@ public:
   void
   set_reach_kind(reach_kind k);
 
+  bool
+  get_has_size_change() const;
+
+  void
+  set_has_size_change(bool flag);
+
   const string_set_type&
   get_potential_data_member_names() const;
 
index 5fc1ec52df1e64bf2a7aa1a23ef6df3792ffc39c..dcc5cc53dc043d1b8f28650364446e3818c987df 100644 (file)
@@ -570,6 +570,7 @@ class type_suppression::priv
   type_suppression::type_kind          type_kind_;
   bool                                 consider_reach_kind_;
   type_suppression::reach_kind         reach_kind_;
+  bool                                 has_size_change_;
   // The data members a class needs to have to match this suppression
   // specification.  These might be selected by a regular expression.
   string_set_type                      potential_data_members_;
@@ -599,7 +600,8 @@ public:
       consider_type_kind_(consider_type_kind),
       type_kind_(type_kind),
       consider_reach_kind_(consider_reach_kind),
-      reach_kind_(reach_kind)
+      reach_kind_(reach_kind),
+      has_size_change_(false)
   {}
 
   /// Get the regular expression object associated to the 'type_name_regex'
index b596e0d566e575fb1c26e0a5b41016256cb78d3e..54d2d917d1c8240af3ad7bb70dc6309151109aad 100644 (file)
@@ -569,6 +569,20 @@ void
 type_suppression::set_reach_kind(reach_kind k)
 {priv_->reach_kind_ = k;}
 
+/// Getter of the "has_size_change" property.
+///
+/// @return the value of the "has_size_change" property.
+bool
+type_suppression::get_has_size_change() const
+{return priv_->has_size_change_;}
+
+/// Setter of the "has_size_change" property.
+///
+/// @param flag the new value of the "has_size_change" property.
+void
+type_suppression::set_has_size_change(bool flag)
+{priv_->has_size_change_ = flag;}
+
 /// Getter of the "potential_data_member_names" property.
 ///
 /// @return the set of potential data member names of this
@@ -855,12 +869,14 @@ type_suppression::suppresses_diff(const diff* diff) const
        {
          // ... and the suppr spec contains a
          // "has_data_member_inserted_*" clause ...
-         if (klass_diff->deleted_data_members().empty()
-             && (klass_diff->first_class_decl()->get_size_in_bits()
-                 <= klass_diff->second_class_decl()->get_size_in_bits()))
+         if ((klass_diff->first_class_decl()->get_size_in_bits()
+              == klass_diff->second_class_decl()->get_size_in_bits())
+             || get_has_size_change())
            {
              // That "has_data_member_inserted_*" clause doesn't hold
-             // if the class has deleted data members or shrunk.
+             // if the class changed size, unless the user specified
+             // that suppression applies to types that have size
+             // change.
 
              const class_decl_sptr& first_type_decl =
                klass_diff->first_class_decl();
@@ -881,6 +897,23 @@ type_suppression::suppresses_diff(const diff* diff) const
                  if (!matched)
                    return false;
                }
+
+             // Similarly, all deleted data members must be in an
+             // allowed insertion range.
+             for (const auto& m : klass_diff->deleted_data_members())
+               {
+                 decl_base_sptr member = m.second;
+                 bool matched = false;
+
+                 for (const auto& range : get_data_member_insertion_ranges())
+                   if (is_data_member_offset_in_range(is_var_decl(member),
+                                                      range,
+                                                      first_type_decl.get()))
+                     matched = true;
+
+                 if (!matched)
+                   return false;
+               }
            }
          else
            return false;
@@ -1649,6 +1682,13 @@ read_type_suppression(const ini::config::section& section)
     ? drop_artifact->get_value()->as_string()
     : "";
 
+  ini::simple_property_sptr has_size_change =
+    is_simple_property(section.find_property("has_size_change"));
+
+  string has_size_change_str = has_size_change
+    ? has_size_change->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr label =
     is_simple_property(section.find_property("label"));
   string label_str = label ? label->get_value()->as_string() : "";
@@ -2030,6 +2070,9 @@ read_type_suppression(const ini::config::section& section)
           || !srcloc_not_in.empty())))
     result->set_drops_artifact_from_ir(true);
 
+  if (has_size_change_str == "yes" || has_size_change_str == "true")
+    result->set_has_size_change(true);
+
   if (result->get_type_kind() == type_suppression::ENUM_TYPE_KIND
       && !changed_enumerator_names.empty())
     result->set_changed_enumerator_names(changed_enumerator_names);
index 57abf7a976168dc69cc0263e45b7fd77571da7b9..a37a364bd293c5bf5811d0f98fed85ffc87028c5 100644 (file)
@@ -1294,28 +1294,38 @@ test-diff-suppr/test10-changed-parm-c-v1.c \
 test-diff-suppr/libtest11-add-data-member-v0.so \
 test-diff-suppr/libtest11-add-data-member-v1.so \
 test-diff-suppr/test11-add-data-member-0.suppr \
+test-diff-suppr/test11-add-data-member-0.1.suppr \
 test-diff-suppr/test11-add-data-member-1.suppr \
+test-diff-suppr/test11-add-data-member-1.1.suppr \
 test-diff-suppr/test11-add-data-member-2.suppr \
+test-diff-suppr/test11-add-data-member-2.1.suppr \
 test-diff-suppr/test11-add-data-member-3.suppr \
+test-diff-suppr/test11-add-data-member-3.1.suppr \
 test-diff-suppr/test11-add-data-member-4.suppr \
+test-diff-suppr/test11-add-data-member-4.1.suppr \
 test-diff-suppr/test11-add-data-member-report-0.txt \
 test-diff-suppr/test11-add-data-member-report-1.txt \
+test-diff-suppr/test11-add-data-member-report-1.1.txt \
 test-diff-suppr/test11-add-data-member-v0.cc \
 test-diff-suppr/test11-add-data-member-v1.cc \
 test-diff-suppr/libtest12-add-data-member-v0.so \
 test-diff-suppr/libtest12-add-data-member-v1.so \
 test-diff-suppr/test12-add-data-member-0.suppr \
+test-diff-suppr/test12-add-data-member-0.1.suppr \
 test-diff-suppr/test12-add-data-member-1.suppr \
 test-diff-suppr/test12-add-data-member-report-0.txt \
 test-diff-suppr/test12-add-data-member-report-1.txt \
+test-diff-suppr/test12-add-data-member-report-1.1.txt \
 test-diff-suppr/test12-add-data-member-report-2.txt \
 test-diff-suppr/test12-add-data-member-v0.cc \
 test-diff-suppr/test12-add-data-member-v1.cc \
 test-diff-suppr/libtest13-suppr-through-pointer-v0.so \
 test-diff-suppr/libtest13-suppr-through-pointer-v1.so \
 test-diff-suppr/test13-suppr-through-pointer-0.suppr \
+test-diff-suppr/test13-suppr-through-pointer-0.1.suppr \
 test-diff-suppr/test13-suppr-through-pointer-report-0.txt \
 test-diff-suppr/test13-suppr-through-pointer-report-1.txt \
+test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt \
 test-diff-suppr/test13-suppr-through-pointer-v0.cc \
 test-diff-suppr/test13-suppr-through-pointer-v1.cc \
 test-diff-suppr/test14-suppr-non-redundant-v0.o \
@@ -1618,9 +1628,11 @@ test-diff-suppr/test34-v1.c \
 test-diff-suppr/libtest35-leaf-v0.so \
 test-diff-suppr/libtest35-leaf-v1.so \
 test-diff-suppr/test35-leaf-report-0.txt \
+test-diff-suppr/test35-leaf-report-0.1.txt \
 test-diff-suppr/test35-leaf-v0.cc \
 test-diff-suppr/test35-leaf-v1.cc \
 test-diff-suppr/test35-leaf.suppr \
+test-diff-suppr/test35-leaf.1.suppr \
 test-diff-suppr/libtest36-leaf-v0.so \
 test-diff-suppr/libtest36-leaf-v1.so \
 test-diff-suppr/test36-leaf-report-0.txt \
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-0.1.suppr b/tests/data/test-diff-suppr/test11-add-data-member-0.1.suppr
new file mode 100644 (file)
index 0000000..eb5d971
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_member_inserted_between = {8, end}
\ No newline at end of file
index 9dd993d06a85e7a6f6f15bb4cf9ccd80e8e29d7f..bf9973474398222113bbd4d75c8688e236228aff 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_member_inserted_between = {8, end}
+       has_size_change = true
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-1.1.suppr b/tests/data/test-diff-suppr/test11-add-data-member-1.1.suppr
new file mode 100644 (file)
index 0000000..966c3f3
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_member_inserted_between = {offset_after(m0), end}
index 966c3f3aaf6e581d8982ded701e861cc809256f9..8ff1063dceb14a8183151b0f9d9835b2ad2fc1a6 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_member_inserted_between = {offset_after(m0), end}
+       has_size_change = true
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-2.1.suppr b/tests/data/test-diff-suppr/test11-add-data-member-2.1.suppr
new file mode 100644 (file)
index 0000000..241d21d
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_member_inserted_at = 8
\ No newline at end of file
index c8ea26ea9b9c71ded7a4d86802cc1dae270bd116..017fb88d5ad11cda272c31705809728da464e73f 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_member_inserted_at = 8
+       has_size_change = true
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-3.1.suppr b/tests/data/test-diff-suppr/test11-add-data-member-3.1.suppr
new file mode 100644 (file)
index 0000000..28b0e7c
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_member_inserted_at = end
index 28b0e7cf45be9ba3ccb6f265e221cb3c55584b82..66a5a7c135fedfbbea9cf19ec053597a8011dd1e 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_member_inserted_at = end
+       has_size_change = true
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-4.1.suppr b/tests/data/test-diff-suppr/test11-add-data-member-4.1.suppr
new file mode 100644 (file)
index 0000000..d824450
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_member_inserted_at = offset_after(m0)
\ No newline at end of file
index a99f6f49e64264ba57e604dc8f0275e08892db1b..82c533125351e8b6aff68d8343bfaa557225a041 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_member_inserted_at = offset_after(m0)
+       has_size_change = true
diff --git a/tests/data/test-diff-suppr/test11-add-data-member-report-1.1.txt b/tests/data/test-diff-suppr/test11-add-data-member-report-1.1.txt
new file mode 100644 (file)
index 0000000..8e5cd6a
--- /dev/null
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C] 'function int foo(S*)' has some indirect sub-type changes:
+    parameter 1 of type 'S*' has sub-type changes:
+      in pointed to type 'struct S':
+        type size changed from 8 to 64 (in bits)
+        2 data member insertions:
+          'char m1', at offset 8 (in bits)
+          'int m2', at offset 32 (in bits)
+
diff --git a/tests/data/test-diff-suppr/test12-add-data-member-0.1.suppr b/tests/data/test-diff-suppr/test12-add-data-member-0.1.suppr
new file mode 100644 (file)
index 0000000..795bf09
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_type]
+       name = S
+       has_data_members_inserted_between = {{8, 31}, {64, end}}
\ No newline at end of file
index b45d5d497405ceda3fdc627693061e7340e75ba8..fb558caf7b108588eb98230392bbc28f617e32be 100644 (file)
@@ -1,3 +1,4 @@
 [suppress_type]
        name = S
        has_data_members_inserted_between = {{8, 31}, {64, end}}
+       has_size_change = true;
diff --git a/tests/data/test-diff-suppr/test12-add-data-member-report-1.1.txt b/tests/data/test-diff-suppr/test12-add-data-member-report-1.1.txt
new file mode 100644 (file)
index 0000000..d7456d7
--- /dev/null
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C] 'function int foo(S*)' has some indirect sub-type changes:
+    parameter 1 of type 'S*' has sub-type changes:
+      in pointed to type 'struct S':
+        type size changed from 64 to 96 (in bits)
+        2 data member insertions:
+          'char m_inserted1', at offset 8 (in bits)
+          'char m_inserted2', at offset 64 (in bits)
+
diff --git a/tests/data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr b/tests/data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr
new file mode 100644 (file)
index 0000000..b8f5ae9
--- /dev/null
@@ -0,0 +1,4 @@
+[suppress_type]
+  name = S
+  accessed_through = pointer
+  has_data_member_inserted_at = end
\ No newline at end of file
index f88c46df121c89dbb80e12290900806af9f3de4e..aadaaf77fd58e241be553360f9557ca31e51ec56 100644 (file)
@@ -2,3 +2,4 @@
   name = S
   accessed_through = pointer
   has_data_member_inserted_at = end
+  has_size_change = true
diff --git a/tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt b/tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt
new file mode 100644 (file)
index 0000000..f408f2d
--- /dev/null
@@ -0,0 +1,16 @@
+Functions changes summary: 0 Removed, 2 Changed (1 filtered out), 0 Added functions
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some indirect sub-type change:
+
+  [C] 'function void bar(S*)' has some indirect sub-type changes:
+    parameter 1 of type 'S*' has sub-type changes:
+      in pointed to type 'struct S':
+        type size changed from 32 to 64 (in bits)
+        1 data member insertion:
+          'char m1', at offset 32 (in bits)
+
+  [C] 'function void foo(S)' has some indirect sub-type changes:
+    parameter 1 of type 'struct S' has sub-type changes:
+      details were reported earlier
+
diff --git a/tests/data/test-diff-suppr/test35-leaf-report-0.1.txt b/tests/data/test-diff-suppr/test35-leaf-report-0.1.txt
new file mode 100644 (file)
index 0000000..17361c5
--- /dev/null
@@ -0,0 +1,18 @@
+Leaf changes summary: 2 artifacts changed
+Changed leaf types summary: 2 leaf types changed
+Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+'struct leaf at test35-leaf-v0.cc:5:1' changed:
+  type size changed from 32 to 64 (in bits)
+  1 data member insertion:
+    'char m1', at offset 32 (in bits) at test35-leaf-v1.cc:8:1
+  one impacted interface:
+    function void fn(C&)
+
+'struct leaf_to_filter at test35-leaf-v0.cc:10:1' changed:
+  type size changed from 32 to 64 (in bits)
+  1 data member insertion:
+    'int added', at offset 32 (in bits) at test35-leaf-v1.cc:14:1
+  one impacted interface:
+    function void fn(C&)
diff --git a/tests/data/test-diff-suppr/test35-leaf.1.suppr b/tests/data/test-diff-suppr/test35-leaf.1.suppr
new file mode 100644 (file)
index 0000000..b49293e
--- /dev/null
@@ -0,0 +1,8 @@
+[suppress_type]
+
+  # Suppress the type that had a data member inserted after the data
+  # member named 'member0'.  That would be the type named
+  # leaf_to_filter.
+
+  name_regexp = .*
+  has_data_member_inserted_between = {offset_after(member0), end}
index b49293ec62c95cf73c79fb98f423aa0428cc086f..830529bfe49c97ca833525f5a72700a591bd8538 100644 (file)
@@ -6,3 +6,4 @@
 
   name_regexp = .*
   has_data_member_inserted_between = {offset_after(member0), end}
+  has_size_change = true
index 645afe53d995d1ba459b062709c6fb729a2ddf2a..a463b34158c078ca868eb379c4061422adfd6cba 100644 (file)
@@ -514,7 +514,17 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test11-add-data-member-0.suppr",
     "--no-default-suppression --no-show-locs --no-redundant",
     "data/test-diff-suppr/test11-add-data-member-report-1.txt",
-    "output/test-diff-suppr/test11-add-data-member-report-1_0.txt"
+    "output/test-diff-suppr/test11-add-data-member-report-0_0.txt"
+  },
+    {
+    "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test11-add-data-member-0.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test11-add-data-member-report-0.1_0.txt"
   },
   {
     "data/test-diff-suppr/libtest11-add-data-member-v0.so",
@@ -526,6 +536,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test11-add-data-member-report-1.txt",
     "output/test-diff-suppr/test11-add-data-member-report-1_1.txt"
   },
+  {
+    "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test11-add-data-member-1.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test11-add-data-member-report-1.1_1.txt"
+  },
   {
     "data/test-diff-suppr/libtest11-add-data-member-v0.so",
     "data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -536,6 +556,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test11-add-data-member-report-1.txt",
     "output/test-diff-suppr/test11-add-data-member-report-1_2.txt"
   },
+  {
+    "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test11-add-data-member-2.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test11-add-data-member-report-1.1_2.txt"
+  },
   {
     "data/test-diff-suppr/libtest11-add-data-member-v0.so",
     "data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -546,6 +576,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test11-add-data-member-report-1.txt",
     "output/test-diff-suppr/test11-add-data-member-report-1_3.txt"
   },
+  {
+    "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test11-add-data-member-3.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test11-add-data-member-report-1.1_3.txt"
+  },
   {
     "data/test-diff-suppr/libtest11-add-data-member-v0.so",
     "data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -556,6 +596,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test11-add-data-member-report-1.txt",
     "output/test-diff-suppr/test11-add-data-member-report-1_4.txt"
   },
+  {
+    "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test11-add-data-member-4.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test11-add-data-member-report-1.1_4.txt"
+  },
   {
     "data/test-diff-suppr/libtest12-add-data-member-v0.so",
     "data/test-diff-suppr/libtest12-add-data-member-v1.so",
@@ -576,6 +626,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test12-add-data-member-report-1.txt",
     "output/test-diff-suppr/test12-add-data-member-report-1.txt"
   },
+  {
+    "data/test-diff-suppr/libtest12-add-data-member-v0.so",
+    "data/test-diff-suppr/libtest12-add-data-member-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test12-add-data-member-0.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test12-add-data-member-report-1.1.txt",
+    "output/test-diff-suppr/test12-add-data-member-report-1.1.txt"
+  },
   {
     "data/test-diff-suppr/libtest12-add-data-member-v0.so",
     "data/test-diff-suppr/libtest12-add-data-member-v1.so",
@@ -605,6 +665,16 @@ InOutSpec in_out_specs[] =
     "--no-default-suppression --no-show-locs --no-redundant",
     "data/test-diff-suppr/test13-suppr-through-pointer-report-1.txt",
     "output/test-diff-suppr/test13-suppr-through-pointer-report-1.txt"
+  },
+    {
+    "data/test-diff-suppr/libtest13-suppr-through-pointer-v0.so",
+    "data/test-diff-suppr/libtest13-suppr-through-pointer-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt",
+    "output/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt"
   },
   {
     "data/test-diff-suppr/test14-suppr-non-redundant-v0.o",
@@ -1706,6 +1776,16 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test35-leaf-report-0.txt",
     "output/test-diff-suppr/test35-leaf-report-0.txt"
   },
+  {
+    "data/test-diff-suppr/libtest35-leaf-v0.so",
+    "data/test-diff-suppr/libtest35-leaf-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/test35-leaf.1.suppr",
+    "--no-default-suppression --leaf-changes-only --impacted-interfaces",
+    "data/test-diff-suppr/test35-leaf-report-0.1.txt",
+    "output/test-diff-suppr/test35-leaf-report-0.1.txt"
+  },
   {
     "data/test-diff-suppr/libtest36-leaf-v0.so",
     "data/test-diff-suppr/libtest36-leaf-v1.so",