diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 381437c7..2cb74339 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -22251,16 +22251,6 @@ equals(const class_or_union& l, const class_or_union& r, change_kind* k)
       RETURN(val);
     }
 
-  {
-    // First of all, let's see if these two types haven't already been
-    // compared.  If so, and if the result of the comparison has been
-    // cached, let's just re-use it, rather than comparing them all
-    // over again.
-    bool result = false;
-    if (l.get_environment()->priv_->is_type_comparison_cached(l, r, result))
-      return result;
-  }
-
   // No need to go further if the classes have different names or
   // different size / alignment.
   if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
@@ -22382,17 +22372,6 @@ equals(const class_or_union& l, const class_or_union& r, change_kind* k)
 	}
   }
 
-  // We are done comparing these two types and we have a full
-  // understanding of how they might be different, if they are.  Let's
-  // cache the result of this comparison -- in case we are asked in a
-  // very near future to compare them again.
-  //
-  // TODO: If further profiling shows its necessity, maybe we should
-  // perform this caching also on the earlier return points of this
-  // function.  That would basically mean to redefine the RETURN macro
-  // to make it perform this caching for us.
-  l.get_environment()->priv_->cache_type_comparison_result(l, r, result);
-
   RETURN(result);
 #undef RETURN
 }
@@ -23824,8 +23803,6 @@ equals(const class_decl& l, const class_decl& r, change_kind* k)
 		      static_cast<const class_or_union&>(r),
 		      k));
 
-  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r);
-
   bool had_canonical_type = !!r.get_naked_canonical_type();
   bool result = true;
   if (!equals(static_cast<const class_or_union&>(l),
@@ -23837,10 +23814,6 @@ equals(const class_decl& l, const class_decl& r, change_kind* k)
 	ABG_RETURN(result);
     }
 
-  mark_types_as_being_compared(l, r);
-
-#define RETURN(value) return return_comparison_result(l, r, value);
-
   // If comparing the class_or_union 'part' of the type led to
   // canonical type propagation, then cancel that because it's too
   // early to do that at this point.  We still need to compare bases
@@ -23848,6 +23821,12 @@ equals(const class_decl& l, const class_decl& r, change_kind* k)
   if (!had_canonical_type)
     maybe_cancel_propagated_canonical_type(r);
 
+  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r);
+
+  mark_types_as_being_compared(l, r);
+
+#define RETURN(value) return return_comparison_result(l, r, value);
+
   // Compare bases.
     if (l.get_base_specifiers().size() != r.get_base_specifiers().size())
       {
@@ -24961,8 +24940,15 @@ union_decl::~union_decl()
 bool
 equals(const union_decl& l, const union_decl& r, change_kind* k)
 {
-
-  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r);
+  {
+    // First of all, let's see if these two types haven't already been
+    // compared.  If so, and if the result of the comparison has been
+    // cached, let's just re-use it, rather than comparing them all
+    // over again.
+    bool result = false;
+    if (l.get_environment()->priv_->is_type_comparison_cached(l, r, result))
+      return result;
+  }
 
 #define RETURN(value)				\
   return return_comparison_result(l, r, value);
@@ -24973,6 +24959,17 @@ equals(const union_decl& l, const union_decl& r, change_kind* k)
 
   mark_types_as_being_compared(l, r);
 
+  // We are done comparing these two types and we have a full
+  // understanding of how they might be different, if they are.  Let's
+  // cache the result of this comparison -- in case we are asked in a
+  // very near future to compare them again.
+  //
+  // TODO: If further profiling shows its necessity, maybe we should
+  // perform this caching also on the earlier return points of this
+  // function.  That would basically mean to redefine the RETURN macro
+  // to make it perform this caching for us.
+  l.get_environment()->priv_->cache_type_comparison_result(l, r, result);
+
   RETURN(result);
 }
 
diff --git a/tests/data/test-abidiff/test-PR18791-report0.txt b/tests/data/test-abidiff/test-PR18791-report0.txt
index 44df096e..61635682 100644
--- a/tests/data/test-abidiff/test-PR18791-report0.txt
+++ b/tests/data/test-abidiff/test-PR18791-report0.txt
@@ -1,4 +1,4 @@
-Functions changes summary: 1 Removed, 36 Changed, 1 Added functions
+Functions changes summary: 1 Removed, 60 Changed, 1 Added functions
 Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
 1 Removed function:
@@ -9,7 +9,113 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   [A] 'method void std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_clear()'
 
-36 functions with some indirect sub-type change:
+60 functions with some indirect sub-type change:
+
+  [C] 'method bool sigc::connection::block(bool)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      in pointed to type 'struct sigc::connection':
+        type size hasn't changed
+        1 data member change:
+          type of 'sigc::slot_base* slot_' changed:
+            in pointed to type 'class sigc::slot_base':
+              type size hasn't changed
+              1 data member change:
+                type of 'sigc::slot_base::rep_type* rep_' changed:
+                  in pointed to type 'typedef sigc::slot_base::rep_type':
+                    underlying type 'struct sigc::internal::slot_rep' changed:
+                      type size hasn't changed
+                      1 base class change:
+                        'struct sigc::trackable' changed:
+                          type size hasn't changed
+                          1 data member change:
+                            type of 'sigc::internal::trackable_callback_list* callback_list_' changed:
+                              in pointed to type 'struct sigc::internal::trackable_callback_list':
+                                type size changed from 192 to 256 (in bits)
+                                2 data member changes:
+                                  type of 'sigc::internal::trackable_callback_list::callback_list callbacks_' changed:
+                                    underlying type 'class std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
+                                      type name changed from 'std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
+                                      type size changed from 128 to 192 (in bits)
+                                      1 base class change:
+                                        'class std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
+                                          type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
+                                          type size changed from 128 to 192 (in bits)
+                                          1 data member change:
+                                            type of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl _M_impl' changed:
+                                              type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl'
+                                              type size changed from 128 to 192 (in bits)
+                                              1 data member change:
+                                                type of 'std::__detail::_List_node_base _M_node' changed:
+                                                  type name changed from 'std::__detail::_List_node_base' to 'std::_List_node<long unsigned int>'
+                                                  type size changed from 128 to 192 (in bits)
+                                                  1 base class insertion:
+                                                    struct std::__detail::_List_node_base
+                                                  2 data member deletions:
+                                                    'std::__detail::_List_node_base* _M_next', at offset 0 (in bits)
+                                                    'std::__detail::_List_node_base* _M_prev', at offset 64 (in bits)
+                                                  1 data member insertion:
+                                                    'unsigned long int _M_data', at offset 128 (in bits)
+                                                and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node'
+                                            and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl'
+                                  'bool clearing_' offset changed from 128 to 192 (in bits) (by +64 bits)
+
+  [C] 'method bool sigc::connection::blocked()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::connection*' has sub-type changes:
+      in pointed to type 'const sigc::connection':
+        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method sigc::connection::connection(const sigc::connection&)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+    parameter 1 of type 'const sigc::connection&' has sub-type changes:
+      in referenced type 'const sigc::connection':
+        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method sigc::connection::connection()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method sigc::connection::connection(sigc::slot_base&)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+    parameter 1 of type 'sigc::slot_base&' has sub-type changes:
+      referenced type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method void sigc::connection::disconnect()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method bool sigc::connection::empty()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::connection*' has sub-type changes:
+      in pointed to type 'const sigc::connection':
+        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method bool sigc::connection::operator bool()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method sigc::connection& sigc::connection::operator=(const sigc::connection&)' has some indirect sub-type changes:
+    return type changed:
+      referenced type 'struct sigc::connection' changed, as reported earlier
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+    parameter 1 of type 'const sigc::connection&' has sub-type changes:
+      in referenced type 'const sigc::connection':
+        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method void sigc::connection::set_slot(sigc::slot_base*)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+    parameter 1 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method bool sigc::connection::unblock()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
+
+  [C] 'method sigc::connection::~connection(int)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
+      pointed to type 'struct sigc::connection' changed, as reported earlier
 
   [C] 'method void sigc::internal::signal_impl::block(bool)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
@@ -28,16 +134,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
                     type name changed from 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl' to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl'
                     type size changed from 128 to 192 (in bits)
                     1 data member change:
-                      type of 'std::__detail::_List_node_base _M_node' changed:
-                        type name changed from 'std::__detail::_List_node_base' to 'std::_List_node<long unsigned int>'
-                        type size changed from 128 to 192 (in bits)
-                        1 base class insertion:
-                          struct std::__detail::_List_node_base
-                        2 data member deletions:
-                          'std::__detail::_List_node_base* _M_next', at offset 0 (in bits)
-                          'std::__detail::_List_node_base* _M_prev', at offset 64 (in bits)
-                        1 data member insertion:
-                          'unsigned long int _M_data', at offset 128 (in bits)
+                      type of 'std::__detail::_List_node_base _M_node' changed, as reported earlier
                       and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node'
                   and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl'
 
@@ -56,6 +153,9 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
         typedef name changed from std::list<sigc::slot_base, std::allocator<sigc::slot_base> >::iterator to std::__cxx11::list<sigc::slot_base, std::allocator<sigc::slot_base> >::iterator
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
+    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::internal::signal_impl::iterator_type sigc::internal::signal_impl::erase(sigc::internal::signal_impl::iterator_type)' has some indirect sub-type changes:
     return type changed:
@@ -68,6 +168,9 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
       underlying type 'typedef std::list<sigc::slot_base, std::allocator<sigc::slot_base> >::iterator' changed, as reported earlier
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
+    parameter 2 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::internal::signal_impl::signal_impl()' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
@@ -87,31 +190,12 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
 
   [C] 'method void sigc::internal::slot_rep::disconnect()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::internal::slot_rep*' changed:
-      in pointed to type 'struct sigc::internal::slot_rep':
+    implicit parameter 0 of type 'sigc::internal::slot_rep*' has sub-type changes:
+      pointed to type 'struct sigc::internal::slot_rep' changed, as reported earlier
 
   [C] 'method void sigc::internal::trackable_callback_list::add_callback(void*)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::trackable_callback_list*' has sub-type changes:
-      in pointed to type 'struct sigc::internal::trackable_callback_list':
-        type size changed from 192 to 256 (in bits)
-        2 data member changes:
-          type of 'sigc::internal::trackable_callback_list::callback_list callbacks_' changed:
-            underlying type 'class std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
-              type name changed from 'std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
-              type size changed from 128 to 192 (in bits)
-              1 base class change:
-                'class std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
-                  type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
-                  type size changed from 128 to 192 (in bits)
-                  1 data member change:
-                    type of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl _M_impl' changed:
-                      type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl'
-                      type size changed from 128 to 192 (in bits)
-                      1 data member change:
-                        type of 'std::__detail::_List_node_base _M_node' changed, as reported earlier
-                        and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node'
-                    and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl'
-          'bool clearing_' offset changed from 128 to 192 (in bits) (by +64 bits)
+      pointed to type 'struct sigc::internal::trackable_callback_list' changed, as reported earlier
 
   [C] 'method void sigc::internal::trackable_callback_list::clear()' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::trackable_callback_list*' has sub-type changes:
@@ -131,10 +215,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
         type size hasn't changed
         1 base class change:
           'struct sigc::trackable' changed:
-            type size hasn't changed
-            1 data member change:
-              type of 'sigc::internal::trackable_callback_list* callback_list_' changed:
-                pointed to type 'struct sigc::internal::trackable_callback_list' changed, as reported earlier
+            details were reported earlier
         1 data member change:
           type of 'sigc::internal::signal_impl* impl_' changed:
             pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
@@ -153,6 +234,9 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
       underlying type 'typedef sigc::internal::signal_impl::iterator_type' changed, as reported earlier
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
+    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::signal_base::iterator_type sigc::signal_base::erase(sigc::signal_base::iterator_type)' has some indirect sub-type changes:
     return type changed:
@@ -172,6 +256,9 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
       underlying type 'typedef sigc::internal::signal_impl::iterator_type' changed, as reported earlier
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
+    parameter 2 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::signal_base& sigc::signal_base::operator=(const sigc::signal_base&)' has some indirect sub-type changes:
     return type changed:
@@ -206,6 +293,68 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
 
+  [C] 'method void sigc::slot_base::add_destroy_notify_callback(void*)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
+      in pointed to type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method bool sigc::slot_base::block(bool)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method void sigc::slot_base::disconnect()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method bool sigc::slot_base::operator bool()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
+      in pointed to type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method sigc::slot_base& sigc::slot_base::operator=(const sigc::slot_base&)' has some indirect sub-type changes:
+    return type changed:
+      referenced type 'class sigc::slot_base' changed, as reported earlier
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method void sigc::slot_base::remove_destroy_notify_callback(void*)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
+      in pointed to type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method void sigc::slot_base::set_parent(void*)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
+      in pointed to type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method sigc::slot_base::slot_base(sigc::slot_base::rep_type*)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+    parameter 1 of type 'sigc::slot_base::rep_type*' has sub-type changes:
+      pointed to type 'typedef sigc::slot_base::rep_type' changed, as reported earlier
+
+  [C] 'method sigc::slot_base::slot_base()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method sigc::slot_base::slot_base(const sigc::slot_base&)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
+      in referenced type 'const sigc::slot_base':
+        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method bool sigc::slot_base::unblock()' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
+  [C] 'method sigc::slot_base::~slot_base(int)' has some indirect sub-type changes:
+    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
+      pointed to type 'class sigc::slot_base' changed, as reported earlier
+
   [C] 'method void sigc::trackable::add_destroy_notify_callback(void*)' has some indirect sub-type changes:
     implicit parameter 0 of type 'const sigc::trackable*' has sub-type changes:
       in pointed to type 'const sigc::trackable':
diff --git a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
index afe77511..89e9c5ce 100644
--- a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
@@ -1,5 +1,5 @@
 ================ changes of 'libtbb.so.2'===============
-  Functions changes summary: 0 Removed, 8 Changed (67 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 10 Changed (89 filtered out), 17 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   Function symbols changes summary: 0 Removed, 0 Added function symbol not referenced by debug info
   Variable symbols changes summary: 3 Removed, 0 Added variable symbols not referenced by debug info
@@ -24,7 +24,26 @@
     [A] 'method void tbb::internal::concurrent_queue_base_v8::move_content(tbb::internal::concurrent_queue_base_v8&)'    {_ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_}
     [A] 'method void tbb::task_group_context::capture_fp_settings()'    {_ZN3tbb18task_group_context19capture_fp_settingsEv}
 
-  8 functions with some indirect sub-type change:
+  10 functions with some indirect sub-type change:
+
+    [C] 'method void tbb::filter::set_end_of_input()' at pipeline.cpp:700:1 has some indirect sub-type changes:
+      implicit parameter 0 of type 'tbb::filter*' has sub-type changes:
+        in pointed to type 'class tbb::filter' at pipeline.h:65:1:
+          type size hasn't changed
+          1 member function deletion:
+            'method virtual tbb::filter::~filter(int)' at pipeline.cpp:698:1
+          1 member function insertion:
+            'method virtual tbb::filter::~filter(int)' at pipeline.cpp:688:1
+          no member function changes (4 filtered);
+          1 data member changes (4 filtered):
+            type of 'tbb::internal::input_buffer* my_input_buffer' changed:
+              in pointed to type 'class tbb::internal::input_buffer' at pipeline.cpp:52:1:
+                type size hasn't changed
+                1 data member change:
+                  type of 'tbb::spin_mutex array_mutex' changed:
+                    type size hasn't changed
+                    1 base class insertion:
+                      class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
     [C] 'method tbb::task& tbb::internal::allocate_root_with_context_proxy::allocate(std::size_t) const' at task.h:135:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'const tbb::internal::allocate_root_with_context_proxy*' has sub-type changes:
@@ -51,7 +70,16 @@
                             2 data member insertions:
                               'volatile intptr_t* my_ref_top_priority', at offset 576 (in bits) at scheduler.h:96:1
                               'volatile uintptr_t* my_ref_reload_epoch', at offset 640 (in bits) at scheduler.h:99:1
-                            2 data member changes (2 filtered):
+                            3 data member changes (2 filtered):
+                              type of 'tbb::internal::arena_slot* my_arena_slot' changed:
+                                in pointed to type 'struct tbb::internal::arena_slot' at scheduler_common.h:316:1:
+                                  type size hasn't changed
+                                  2 base class deletions:
+                                    struct tbb::internal::padded<tbb::internal::arena_slot_line1> at tbb_stddef.h:261:1
+                                    struct tbb::internal::padded<tbb::internal::arena_slot_line2> at tbb_stddef.h:261:1
+                                  2 base class insertions:
+                                    struct tbb::internal::padded<tbb::internal::arena_slot_line1, 128ul> at tbb_stddef.h:251:1
+                                    struct tbb::internal::padded<tbb::internal::arena_slot_line2, 128ul> at tbb_stddef.h:251:1
                               type of 'tbb::internal::arena* my_arena' changed:
                                 in pointed to type 'class tbb::internal::arena' at arena.h:160:1:
                                   type size hasn't changed
@@ -59,6 +87,7 @@
                                     struct tbb::internal::padded<tbb::internal::arena_base> at tbb_stddef.h:261:1
                                   1 base class insertion:
                                     struct tbb::internal::padded<tbb::internal::arena_base, 128ul> at tbb_stddef.h:251:1
+                                  no data member change (1 filtered);
                               type of 'tbb::internal::mail_inbox my_inbox' changed:
                                 type size hasn't changed
                                 1 data member change:
@@ -151,7 +180,7 @@
             type of 'tbb::internal::concurrent_queue_rep* my_rep' changed:
               in pointed to type 'class tbb::internal::concurrent_queue_rep' at concurrent_queue.cpp:129:1:
                 type size hasn't changed
-                1 data member changes (1 filtered):
+                1 data member changes (2 filtered):
                   type of 'tbb::internal::concurrent_monitor items_avail' changed:
                     type size hasn't changed
                     1 data member change:
@@ -207,6 +236,14 @@
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
+    [C] 'method tbb::thread_bound_filter::result_type tbb::thread_bound_filter::process_item()' at pipeline.cpp:712:1 has some indirect sub-type changes:
+      implicit parameter 0 of type 'tbb::thread_bound_filter*' has sub-type changes:
+        in pointed to type 'class tbb::thread_bound_filter' at pipeline.h:197:1:
+          type size hasn't changed
+          1 base class change:
+            'class tbb::filter' at pipeline.h:74:1 changed:
+              details were reported earlier
+
   3 Removed variable symbols not referenced by debug info:
 
     [D] _ZTVN3rml16versioned_objectE
diff --git a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
index a8611476..203fd4c0 100644
--- a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
+++ b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
@@ -1,5 +1,5 @@
 ================ changes of 'libtbb.so.2'===============
-  Functions changes summary: 0 Removed, 7 Changed (68 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 8 Changed (91 filtered out), 17 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   Function symbols changes summary: 0 Removed, 0 Added function symbol not referenced by debug info
   Variable symbols changes summary: 3 Removed, 0 Added variable symbols not referenced by debug info
@@ -24,7 +24,7 @@
     [A] 'method void tbb::internal::concurrent_queue_base_v8::move_content(tbb::internal::concurrent_queue_base_v8&)'    {_ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_}
     [A] 'method void tbb::task_group_context::capture_fp_settings()'    {_ZN3tbb18task_group_context19capture_fp_settingsEv}
 
-  7 functions with some indirect sub-type change:
+  8 functions with some indirect sub-type change:
 
     [C] 'method tbb::task& tbb::internal::allocate_root_with_context_proxy::allocate(std::size_t) const' at task.h:135:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'const tbb::internal::allocate_root_with_context_proxy*' has sub-type changes:
@@ -79,6 +79,13 @@
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
+    [C] 'method void tbb::spin_mutex::internal_construct()' at spin_mutex.h:138:1 has some indirect sub-type changes:
+      implicit parameter 0 of type 'tbb::spin_mutex*' has sub-type changes:
+        in pointed to type 'class tbb::spin_mutex' at spin_mutex.h:40:1:
+          type size hasn't changed
+          1 base class insertion:
+            class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
+
     [C] 'method void tbb::spin_rw_mutex_v3::internal_acquire_reader()' at spin_rw_mutex.h:53:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::spin_rw_mutex_v3*' has sub-type changes:
         in pointed to type 'class tbb::spin_rw_mutex_v3' at spin_rw_mutex.h:42:1:
