Fix redundancy detection in the diff graph

Message ID 87a6wrbggm.fsf@redhat.com
State New
Headers
Series Fix redundancy detection in the diff graph |

Commit Message

Dodji Seketeli Oct. 12, 2020, 3:40 p.m. UTC
  Hello,

A recent change[1] triggered a variation in the ABI changes reported,
depending on the platform.

It turned out the change made the redundancy detector walk more diff
nodes (like inserted/deleted virtual member functions and their
implicit parameter type) and that uncovered several underlying issues
that has been latent for a long time.

First, we were not walking the inserted/deleted virtual member
functions in a deterministic manner at reporting time.  Rather than
walking the unordered maps containing those functions, this patch now
walk them in lexicographic order.  The patch also does something
similar for the changed data members, but this time during the diff
graph analysis.  That order affects how we consider a given type
change to be redundant.

Second, when looking a diff node named N, if another diff node N'
equivalent to N has already been marked redundant (and thus filtered
out already), we were sometimes wrongly failing to detect and mark N
as redundant.  This patch fixes that.

I realized that some code was now unnecessary so I removed it.

A lot of reference output of tests are adjusted by this patch.
Mostly, these were cases we were failing to properly detect (and
filter out) as redundant reports.  So the change reports should
hopefully look more concise and to the point now.

[1] the recent change is this one:
    2f92777d Consider the implicit 'this' parameter when comparing methods

	* src/abg-comparison-priv.h
	(diff_context::priv::last_visited_diff_node_): Remove unnecessary
	data member.
	(class_or_union_diff::priv::sorted_{deleted,inserted}_member_functions_):
	Add new data members.
	(sort_string_member_function_sptr_map): Declare new function.
	* src/abg-comparison.cc (sort_string_member_function_sptr_map):
	Define new function.
	(redundancy_marking_visitor::visit_begin): If the current diff
	node is equivalent to another one that has been already marked
	redundant, then consider the current diff node as redundant as
	well.  Considering the fact an ancestor node has been filtered out
	is now useless because if that's the case then the current
	descendant node wouldn't even be walked at reporting time.  So
	remove the call to diff_has_ancestor_filtered_out.
	(categorize_redundancy): Remove useless call here as well.
	(diff_has_ancestor_filtered_out, diff_has_ancestor_filtered_out)
	(diff_context::{mark_last_diff_visited_per_class_of_equivalence,
	clear_last_diffs_visited_per_class_of_equivalence,
	get_last_visited_diff_of_class_of_equivalence}): Remove
	unnecessary functions.
	(redundancy_marking_visitor::visit_end): Add comment.
	(class_diff::ensure_lookup_tables_populated): Lexicographically
	sort inserted/deleted member functions.
	(class_or_union_diff::chain_into_hierarchy): Chain changed data
	members diff nodes in a sorted manner.
	* src/abg-default-reporter.cc (default_reporter::report): Report
	deleted/inserted member functions in lexicographic order.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt:
	Adjust.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
	Likewise.
	* tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt:
	Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
	Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>

Applied to master.

---
 src/abg-comparison-priv.h                     |  10 +-
 src/abg-comparison.cc                         | 143 +++++-------------
 src/abg-default-reporter.cc                   |  20 +--
 .../test31-pr18535-libstdc++-report-0.txt     |  76 +---------
 .../test31-pr18535-libstdc++-report-1.txt     |  76 +---------
 ...libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt |  48 +-----
 ...bb-4.3-3.20141204.fc23.x86_64-report-0.txt |  31 +---
 ...bb-4.3-3.20141204.fc23.x86_64-report-1.txt |  41 +----
 8 files changed, 79 insertions(+), 366 deletions(-)
  

Patch

diff --git a/src/abg-comparison-priv.h b/src/abg-comparison-priv.h
index b82b5d07..1e595313 100644
--- a/src/abg-comparison-priv.h
+++ b/src/abg-comparison-priv.h
@@ -191,9 +191,6 @@  struct diff_context::priv
   vector<filtering::filter_base_sptr>	filters_;
   suppressions_type			suppressions_;
   pointer_map				visited_diff_nodes_;
-  // This is the last visited diff node, per class of equivalence.
-  // It's set during the redundant diff node marking process.
-  pointer_map				last_visited_diff_node_;
   corpus_diff_sptr			corpus_diff_;
   ostream*				default_output_stream_;
   ostream*				error_output_stream_;
@@ -506,7 +503,9 @@  struct class_or_union_diff::priv
   string_decl_base_sptr_map dms_replaced_by_adms_;
   mutable changed_var_sptrs_type dms_replaced_by_adms_ordered_;
   string_member_function_sptr_map deleted_member_functions_;
+  class_or_union::member_functions sorted_deleted_member_functions_;
   string_member_function_sptr_map inserted_member_functions_;
+  class_or_union::member_functions sorted_inserted_member_functions_;
   string_function_decl_diff_sptr_map changed_member_functions_;
   function_decl_diff_sptrs_type sorted_changed_member_functions_;
   string_decl_base_sptr_map deleted_member_class_tmpls_;
@@ -1390,9 +1389,14 @@  void
 sort_string_function_ptr_map(const string_function_ptr_map& map,
 			     vector<function_decl*>& sorted);
 
+void
+sort_string_member_function_sptr_map(const string_member_function_sptr_map& map,
+				     class_or_union::member_functions& sorted);
+
 void
 sort_string_type_base_sptr_map(string_type_base_sptr_map& map,
 			       vector<type_base_sptr>& sorted);
+
 void
 sort_string_function_decl_diff_sptr_map
 (const string_function_decl_diff_sptr_map& map,
diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index 07bfe98c..bae9c266 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -201,6 +201,27 @@  sort_string_function_ptr_map(const string_function_ptr_map& map,
   std::sort(sorted.begin(), sorted.end(), comp);
 }
 
+/// Sort a map that's an instance of @ref
+/// string_member_function_sptr_map and fill a vector of member
+/// functions with the sorted result.
+///
+/// @param map the map to sort.
+///
+/// @param sorted the resulting sorted vector.
+void
+sort_string_member_function_sptr_map(const string_member_function_sptr_map& map,
+				     class_or_union::member_functions& sorted)
+{
+  sorted.reserve(map.size());
+  for (string_member_function_sptr_map::const_iterator i = map.begin();
+       i != map.end();
+       ++i)
+    sorted.push_back(i->second);
+
+  function_comp comp;
+  std::sort(sorted.begin(), sorted.end(), comp);
+}
+
 /// Sort the values of a @ref string_function_decl_diff_sptr_map map
 /// and store the result in a vector of @ref function_decl_diff_sptr
 /// objects.
@@ -885,55 +906,6 @@  bool
 is_child_node_of_base_diff(const diff* diff)
 {return diff && is_base_diff(diff->parent_node());}
 
-/// Test if the current diff node has an ancestor node that has been
-/// filtered out.
-///
-/// This function detects cycles when walking through the "parent"
-/// path.
-///
-/// @param diff the diff node to take into account.
-///
-/// @param ancestor this is a hash map of the pointers of the parents
-/// that are visited.  It's used to detect cycles while visiting
-/// parents of this diff tree node.
-///
-/// @return true iff the current diff node has an ancestor node that
-/// has been filtered out.
-static bool
-diff_has_ancestor_filtered_out(const diff* d,
-			       unordered_map<size_t, bool>& ancestors)
-{
-  if (!d || !d->parent_node())
-    return false;
-  if (d->parent_node()->is_filtered_out())
-    return true;
-
-  const diff* parent = d->parent_node();
-  unordered_map<size_t, bool>::const_iterator i =
-    ancestors.find(reinterpret_cast<size_t>(parent));
-  if (i != ancestors.end())
-    // We've just detected a cycle in the path made of the parents
-    // that we are visiting.
-    return false;
-  ancestors[reinterpret_cast<size_t>(parent)] = true;
-
-  return diff_has_ancestor_filtered_out(parent, ancestors);
-}
-
-/// Test if the current diff node has an ancestor node that has been
-/// filtered out.
-///
-/// @param diff the diff node to take into account.
-///
-/// @return true iff the current diff node has an ancestor node that
-/// has been filtered out.
-static bool
-diff_has_ancestor_filtered_out(const diff* diff)
-{
-  unordered_map<size_t, bool> ancestors_trace;
-  return diff_has_ancestor_filtered_out(diff, ancestors_trace);
-}
-
 /// The default traverse function.
 ///
 /// @return true.
@@ -1324,45 +1296,6 @@  void
 diff_context::forget_visited_diffs()
 {priv_->visited_diff_nodes_.clear();}
 
-/// Mark a given diff node as being the last one that has been visited
-/// in its class of equivalence.
-///
-/// @param d the diff node to mark.
-void
-diff_context::mark_last_diff_visited_per_class_of_equivalence(const diff* d)
-{
-  if (!d->get_canonical_diff())
-    return;
-
-  size_t v0 = reinterpret_cast<size_t>(d->get_canonical_diff());
-  size_t v1 = reinterpret_cast<size_t>(d);
-  priv_->last_visited_diff_node_[v0]= v1;
-}
-
-/// Clear the marking about the diff diff nodes in a given class of
-/// equivalence.
-void
-diff_context::clear_last_diffs_visited_per_class_of_equivalence()
-{priv_->last_visited_diff_node_.clear();}
-
-/// Return the last diff node visited in the class of equivalence of
-/// a given diff node.
-///
-/// @param d the diff node which class of equivalence to consider.
-///
-/// @return the last diff node visited in the class of equivalence of
-/// the diff node @p d.
-const diff*
-diff_context::get_last_visited_diff_of_class_of_equivalence(const diff* d)
-{
-  size_t v0 = reinterpret_cast<size_t>(d);
-
-  pointer_map::const_iterator it = priv_->last_visited_diff_node_.find(v0);
-  if (it != priv_->last_visited_diff_node_.end())
-    return reinterpret_cast<const diff*>(it->second);
-  return 0;
-}
-
 /// This sets a flag that, if it's true, then during the traversing of
 /// a diff nodes tree each node is visited at most once.
 ///
@@ -5264,11 +5197,11 @@  class_or_union_diff::chain_into_hierarchy()
     if (diff_sptr d = *i)
       append_child_node(d);
 
-  for (unsigned_var_diff_sptr_map::const_iterator i =
-	 get_priv()->changed_dm_.begin();
-       i != get_priv()->changed_dm_.end();
+  for (var_diff_sptrs_type::const_iterator i =
+	 get_priv()->sorted_changed_dm_.begin();
+       i != get_priv()->sorted_changed_dm_.end();
        ++i)
-    if (diff_sptr d = i->second)
+    if (diff_sptr d = *i)
       append_child_node(d);
 
   // member types changes
@@ -5487,6 +5420,12 @@  class_diff::ensure_lookup_tables_populated(void) const
 	 ++i)
       p->inserted_member_functions_.erase(*i);
 
+    sort_string_member_function_sptr_map(p->deleted_member_functions_,
+					 p->sorted_deleted_member_functions_);
+
+    sort_string_member_function_sptr_map(p->inserted_member_functions_,
+					 p->sorted_inserted_member_functions_);
+
     sort_string_virtual_member_function_diff_sptr_map
       (p->changed_member_functions_,
        p->sorted_changed_member_functions_);
@@ -12155,11 +12094,11 @@  struct redundancy_marking_visitor : public diff_node_visitor
 		&& !is_diff_of_variadic_parameter(d)
 		&& !is_diff_of_variadic_parameter_type(d)
 		// If the canonical diff itself has been filtered out,
-		// then this one is not marked redundant, obviously.
-		&& !d->get_canonical_diff()->is_filtered_out()
-		&& !(diff_has_ancestor_filtered_out
-		     (d->context()->
-		      get_last_visited_diff_of_class_of_equivalence(d)))
+		// then this one is not marked redundant, unless the
+		// canonical diff was already redundant.
+		&& (!d->get_canonical_diff()->is_filtered_out()
+		    || (d->get_canonical_diff()->get_category()
+			& REDUNDANT_CATEGORY))
 		// If the *same* diff node (not one that is merely
 		// equivalent to this one) has already been visited
 		// the do not mark it as beind redundant.  It's only
@@ -12197,8 +12136,6 @@  struct redundancy_marking_visitor : public diff_node_visitor
 	set_visiting_kind(get_visiting_kind() | SKIP_CHILDREN_VISITING_KIND);
 	skip_children_nodes_ = true;
       }
-
-    d->context()->mark_last_diff_visited_per_class_of_equivalence(d);
   }
 
   virtual void
@@ -12259,6 +12196,12 @@  struct redundancy_marking_visitor : public diff_node_visitor
 		if ((*i)->has_changes())
 		  {
 		    has_non_empty_child = true;
+		    // Let's see if the current child node '*i' is
+		    // "non-redundant".
+		    //
+		    // A non-redundant node would be a node that
+		    // carries a change to be reported and has not
+		    // been marked as being redundant.
 		    if ((*i)->to_be_reported()
 			&& ((*i)->get_category() & REDUNDANT_CATEGORY) == 0)
 		      has_non_redundant_child = true;
@@ -12322,12 +12265,10 @@  categorize_redundancy(diff* diff_tree)
   if (diff_tree->context()->show_redundant_changes())
     return;
   redundancy_marking_visitor v;
-  diff_tree->context()->clear_last_diffs_visited_per_class_of_equivalence();
   bool s = diff_tree->context()->visiting_a_node_twice_is_forbidden();
   diff_tree->context()->forbid_visiting_a_node_twice(false);
   diff_tree->traverse(v);
   diff_tree->context()->forbid_visiting_a_node_twice(s);
-  diff_tree->context()->clear_last_diffs_visited_per_class_of_equivalence();
 }
 
 /// Walk a given @ref diff sub-tree to categorize each of the nodes
diff --git a/src/abg-default-reporter.cc b/src/abg-default-reporter.cc
index f536be06..dc48f4b8 100644
--- a/src/abg-default-reporter.cc
+++ b/src/abg-default-reporter.cc
@@ -934,17 +934,17 @@  default_reporter::report(const class_or_union_diff& d,
       if (numdels)
 	report_mem_header(out, numdels, num_filtered, del_kind,
 			  "member function", indent);
-      for (string_member_function_sptr_map::const_iterator i =
-	     d.get_priv()->deleted_member_functions_.begin();
-	   i != d.get_priv()->deleted_member_functions_.end();
+      for (class_or_union::member_functions::const_iterator i =
+	     d.get_priv()->sorted_deleted_member_functions_.begin();
+	   i != d.get_priv()->sorted_deleted_member_functions_.end();
 	   ++i)
 	{
 	  if (!(ctxt->get_allowed_category()
 		& NON_VIRT_MEM_FUN_CHANGE_CATEGORY)
-	      && !get_member_function_is_virtual(i->second))
+	      && !get_member_function_is_virtual(*i))
 	    continue;
 
-	  method_decl_sptr mem_fun = i->second;
+	  method_decl_sptr mem_fun = *i;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
 	}
@@ -955,17 +955,17 @@  default_reporter::report(const class_or_union_diff& d,
       if (numins)
 	report_mem_header(out, numins, num_filtered, ins_kind,
 			  "member function", indent);
-      for (string_member_function_sptr_map::const_iterator i =
-	     d.get_priv()->inserted_member_functions_.begin();
-	   i != d.get_priv()->inserted_member_functions_.end();
+      for (class_or_union::member_functions::const_iterator i =
+	     d.get_priv()->sorted_inserted_member_functions_.begin();
+	   i != d.get_priv()->sorted_inserted_member_functions_.end();
 	   ++i)
 	{
 	  if (!(ctxt->get_allowed_category()
 		& NON_VIRT_MEM_FUN_CHANGE_CATEGORY)
-	      && !get_member_function_is_virtual(i->second))
+	      && !get_member_function_is_virtual(*i))
 	    continue;
 
-	  method_decl_sptr mem_fun = i->second;
+	  method_decl_sptr mem_fun = *i;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
 	}
diff --git a/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt b/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt
index 135d1dfd..7e09ed0d 100644
--- a/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt
+++ b/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt
@@ -1,4 +1,4 @@ 
-Functions changes summary: 0 Removed, 10 Changed (174 filtered out), 13 Added functions
+Functions changes summary: 0 Removed, 5 Changed (179 filtered out), 13 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: 0 Removed, 6 Added variable symbols not referenced by debug info
@@ -25,7 +25,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
   [A] 'function std::unexpected_handler std::get_unexpected()'
   [A] 'method std::regex_error::regex_error(std::regex_constants::error_type)'
 
-10 functions with some indirect sub-type change:
+5 functions with some indirect sub-type change:
 
   [C] 'function __cxxabiv1::__cxa_dependent_exception* __cxxabiv1::__cxa_allocate_dependent_exception()' has some indirect sub-type changes:
     return type changed:
@@ -70,16 +70,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
                           1 base class insertion:
                             struct std::_Tuple_impl<0u, std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter>
                       and name of 'std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>::_M_t' changed to 'std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>::_M_t'
-        1 member function changes (3 filtered):
-          'method virtual std::__future_base::_Async_state_common::~_Async_state_common(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::__future_base::_Async_state_common*' has sub-type changes:
-              pointed to type 'class std::__future_base::_Async_state_common' changed, as being reported
-
-  [C] 'method virtual std::__future_base::_State_base::~_State_base(int)' has some indirect sub-type changes:
-    linkage names of method virtual std::__future_base::_State_base::~_State_base(int)
-    changed from '_ZNSt13__future_base11_State_baseD2Ev@@GLIBCXX_3.4.15, _ZNSt13__future_base11_State_baseD1Ev@@GLIBCXX_3.4.15' to '_ZNSt13__future_base11_State_baseD1Ev@@GLIBCXX_3.4.15, _ZNSt13__future_base11_State_baseD2Ev@@GLIBCXX_3.4.15'
-    implicit parameter 0 of type 'std::__future_base::_State_base*' has sub-type changes:
-      pointed to type 'class std::__future_base::_State_base' changed, as reported earlier
+        no member function changes (4 filtered);
 
   [C] 'function void std::__throw_regex_error(std::regex_constants::error_type)' has some indirect sub-type changes:
     parameter 1 of type 'enum std::regex_constants::error_type' has sub-type changes:
@@ -91,10 +82,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
     implicit parameter 0 of type 'std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
       in pointed to type 'class std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >':
         type size hasn't changed
-        1 member function changes (13 filtered):
-          'method virtual std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::~basic_filebuf(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
+        no member function changes (14 filtered);
         1 data member change:
           type of 'const std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::__codecvt_type* std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::_M_codecvt' changed:
             in pointed to type 'const std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::__codecvt_type':
@@ -103,46 +91,10 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
                   type size hasn't changed
                   no base class change (1 filtered);
                   2 member function insertions:
-                    'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_out(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&) const', virtual at voffset 2/8
                     'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_in(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&) const', virtual at voffset 4/8
+                    'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_out(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&) const', virtual at voffset 2/8
                   no member function changes (10 filtered);
 
-  [C] 'method std::basic_fstream<wchar_t, std::char_traits<wchar_t> >* std::basic_fstream<wchar_t, std::char_traits<wchar_t> >::basic_fstream(int, void**, const char*, std::ios_base::openmode)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_fstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_fstream<wchar_t, std::char_traits<wchar_t> >':
-        type size hasn't changed
-        1 member function changes (3 filtered):
-          'method virtual std::basic_fstream<wchar_t, std::char_traits<wchar_t> >::~basic_fstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_fstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
-  [C] 'method std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >* std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::basic_ifstream(int, void**, const char*, std::ios_base::openmode)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >':
-        type size hasn't changed
-        3 member function changes (1 filtered):
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
-  [C] 'method std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >* std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >::basic_ofstream(int, void**, const char*, std::ios_base::openmode)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >':
-        type size hasn't changed
-        1 member function changes (3 filtered):
-          'method virtual std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >::~basic_ofstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
   [C] 'method std::codecvt_byname<wchar_t, char, __mbstate_t>* std::codecvt_byname<wchar_t, char, __mbstate_t>::codecvt_byname(const char*, std::size_t)' has some indirect sub-type changes:
     Please note that the symbol of this function is _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
      and it aliases symbol: _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
@@ -152,23 +104,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
         1 base class change:
           'class std::codecvt<wchar_t, char, __mbstate_t>' changed:
             details were reported earlier
-        2 member function changes (1 filtered):
-          'method virtual std::codecvt_byname<wchar_t, char, __mbstate_t>::~codecvt_byname(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::codecvt_byname<wchar_t, char, __mbstate_t>*' has sub-type changes:
-              pointed to type 'class std::codecvt_byname<wchar_t, char, __mbstate_t>' changed, as being reported
-          'method virtual std::codecvt_byname<wchar_t, char, __mbstate_t>::~codecvt_byname(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::codecvt_byname<wchar_t, char, __mbstate_t>*' has sub-type changes:
-              pointed to type 'class std::codecvt_byname<wchar_t, char, __mbstate_t>' changed, as being reported
-
-  [C] 'method virtual std::regex_error::~regex_error(int)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::regex_error*' has sub-type changes:
-      in pointed to type 'class std::regex_error':
-        type size hasn't changed
-        1 member function changes (2 filtered):
-          'method virtual std::regex_error::~regex_error(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::regex_error*' has sub-type changes:
-              pointed to type 'class std::regex_error' changed, as being reported
-        no data member change (1 filtered);
+        no member function changes (3 filtered);
 
 6 Added variable symbols not referenced by debug info:
 
diff --git a/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt b/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt
index d128d69a..f5bc3001 100644
--- a/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt
+++ b/tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt
@@ -1,4 +1,4 @@ 
-Functions changes summary: 0 Removed, 10 Changed (174 filtered out), 13 Added functions
+Functions changes summary: 0 Removed, 5 Changed (179 filtered out), 13 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: 0 Removed, 6 Added variable symbols not referenced by debug info
@@ -25,7 +25,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
   [A] 'function std::unexpected_handler std::get_unexpected()'
   [A] 'method std::regex_error::regex_error(std::regex_constants::error_type)'
 
-10 functions with some indirect sub-type change:
+5 functions with some indirect sub-type change:
 
   [C] 'function __cxxabiv1::__cxa_dependent_exception* __cxxabiv1::__cxa_allocate_dependent_exception()' at eh_alloc.cc:158:1 has some indirect sub-type changes:
     return type changed:
@@ -70,16 +70,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
                           1 base class insertion:
                             struct std::_Tuple_impl<0u, std::__future_base::_Result_base*, std::__future_base::_Result_base::_Deleter> at tuple:231:1
                       and name of 'std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>::_M_t' changed to 'std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>::_M_t' at unique_ptr.h:147:1
-        1 member function changes (3 filtered):
-          'method virtual std::__future_base::_Async_state_common::~_Async_state_common(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::__future_base::_Async_state_common*' has sub-type changes:
-              pointed to type 'class std::__future_base::_Async_state_common' changed, as being reported
-
-  [C] 'method virtual std::__future_base::_State_base::~_State_base(int)' at compatibility-thread-c++0x.cc:103:1 has some indirect sub-type changes:
-    linkage names of method virtual std::__future_base::_State_base::~_State_base(int)
-    changed from '_ZNSt13__future_base11_State_baseD2Ev@@GLIBCXX_3.4.15, _ZNSt13__future_base11_State_baseD1Ev@@GLIBCXX_3.4.15' to '_ZNSt13__future_base11_State_baseD1Ev@@GLIBCXX_3.4.15, _ZNSt13__future_base11_State_baseD2Ev@@GLIBCXX_3.4.15'
-    implicit parameter 0 of type 'std::__future_base::_State_base*' has sub-type changes:
-      pointed to type 'class std::__future_base::_State_base' changed at future:306:1, as reported earlier
+        no member function changes (4 filtered);
 
   [C] 'function void std::__throw_regex_error(std::regex_constants::error_type)' at functexcept.cc:139:1 has some indirect sub-type changes:
     parameter 1 of type 'enum std::regex_constants::error_type' has sub-type changes:
@@ -91,10 +82,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
     implicit parameter 0 of type 'std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
       in pointed to type 'class std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >' at fstream:72:1:
         type size hasn't changed
-        1 member function changes (13 filtered):
-          'method virtual std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::~basic_filebuf(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
+        no member function changes (14 filtered);
         1 data member change:
           type of 'const std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::__codecvt_type* std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::_M_codecvt' changed:
             in pointed to type 'const std::basic_filebuf<wchar_t, std::char_traits<wchar_t> >::__codecvt_type':
@@ -103,46 +91,10 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
                   type size hasn't changed
                   no base class change (1 filtered);
                   2 member function insertions:
-                    'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_out(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&) const' at codecvt_members.cc:43:1, virtual at voffset 2/8
                     'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_in(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&) const' at codecvt_members.cc:118:1, virtual at voffset 4/8
+                    'method virtual std::codecvt_base::result std::codecvt<wchar_t, char, __mbstate_t>::do_out(std::codecvt<wchar_t, char, __mbstate_t>::state_type&, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*, const std::codecvt<wchar_t, char, __mbstate_t>::intern_type*&, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*, std::codecvt<wchar_t, char, __mbstate_t>::extern_type*&) const' at codecvt_members.cc:43:1, virtual at voffset 2/8
                   no member function changes (10 filtered);
 
-  [C] 'method std::basic_fstream<wchar_t, std::char_traits<wchar_t> >* std::basic_fstream<wchar_t, std::char_traits<wchar_t> >::basic_fstream(int, void**, const char*, std::ios_base::openmode)' at fstream:819:1 has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_fstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' at fstream:779:1:
-        type size hasn't changed
-        1 member function changes (3 filtered):
-          'method virtual std::basic_fstream<wchar_t, std::char_traits<wchar_t> >::~basic_fstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_fstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_fstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
-  [C] 'method std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >* std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::basic_ifstream(int, void**, const char*, std::ios_base::openmode)' at fstream:470:1 has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' at fstream:430:1:
-        type size hasn't changed
-        3 member function changes (1 filtered):
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-          'method virtual std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >::~basic_ifstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
-  [C] 'method std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >* std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >::basic_ofstream(int, void**, const char*, std::ios_base::openmode)' at fstream:643:1 has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-      in pointed to type 'class std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >' at fstream:602:1:
-        type size hasn't changed
-        1 member function changes (3 filtered):
-          'method virtual std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >::~basic_ofstream(int, void**)' has some sub-type changes:
-            implicit parameter 0 of type 'std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >*' has sub-type changes:
-              pointed to type 'class std::basic_ofstream<wchar_t, std::char_traits<wchar_t> >' changed, as being reported
-        no data member change (1 filtered);
-
   [C] 'method std::codecvt_byname<wchar_t, char, __mbstate_t>* std::codecvt_byname<wchar_t, char, __mbstate_t>::codecvt_byname(const char*, std::size_t)' at codecvt.h:462:1 has some indirect sub-type changes:
     Please note that the symbol of this function is _ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
      and it aliases symbol: _ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
@@ -152,23 +104,7 @@  Variable symbols changes summary: 0 Removed, 6 Added variable symbols not refere
         1 base class change:
           'class std::codecvt<wchar_t, char, __mbstate_t>' at codecvt.h:398:1 changed:
             details were reported earlier
-        2 member function changes (1 filtered):
-          'method virtual std::codecvt_byname<wchar_t, char, __mbstate_t>::~codecvt_byname(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::codecvt_byname<wchar_t, char, __mbstate_t>*' has sub-type changes:
-              pointed to type 'class std::codecvt_byname<wchar_t, char, __mbstate_t>' changed, as being reported
-          'method virtual std::codecvt_byname<wchar_t, char, __mbstate_t>::~codecvt_byname(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::codecvt_byname<wchar_t, char, __mbstate_t>*' has sub-type changes:
-              pointed to type 'class std::codecvt_byname<wchar_t, char, __mbstate_t>' changed, as being reported
-
-  [C] 'method virtual std::regex_error::~regex_error(int)' at regex.cc:36:1 has some indirect sub-type changes:
-    implicit parameter 0 of type 'std::regex_error*' has sub-type changes:
-      in pointed to type 'class std::regex_error' at regex_error.h:135:1:
-        type size hasn't changed
-        1 member function changes (2 filtered):
-          'method virtual std::regex_error::~regex_error(int)' has some sub-type changes:
-            implicit parameter 0 of type 'std::regex_error*' has sub-type changes:
-              pointed to type 'class std::regex_error' changed, as being reported
-        no data member change (1 filtered);
+        no member function changes (3 filtered);
 
 6 Added variable symbols not referenced by debug info:
 
diff --git a/tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt b/tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt
index 61b03335..59202ee4 100644
--- a/tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt
+++ b/tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt
@@ -27,53 +27,7 @@ 
                           2 data member insertions:
                             '_XtransConnFd* _XtransConnInfo::recv_fds', at offset 640 (in bits) at Xtransint.h:148:1
                             '_XtransConnFd* _XtransConnInfo::send_fds', at offset 704 (in bits) at Xtransint.h:149:1
-                          1 data member change:
-                            type of '_Xtransport* _XtransConnInfo::transptr' changed:
-                              in pointed to type 'struct _Xtransport' at Xtransint.h:158:1:
-                                type size hasn't changed
-                                3 data member changes (16 filtered):
-                                  type of 'typedef XtransConnInfo (_Xtransport*, char*, char*, char*)* _Xtransport::OpenCOTSClient' changed:
-                                    in pointed to type 'function type typedef XtransConnInfo (_Xtransport*, char*, char*, char*)':
-                                      parameter 2 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 3 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 4 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                  type of 'typedef XtransConnInfo (_Xtransport*, char*, char*, char*)* _Xtransport::OpenCOTSServer' changed:
-                                    in pointed to type 'function type typedef XtransConnInfo (_Xtransport*, char*, char*, char*)':
-                                      parameter 2 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 3 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 4 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                  type of 'typedef XtransConnInfo (_Xtransport*, char*, char*, char*)* _Xtransport::OpenCLTSServer' changed:
-                                    in pointed to type 'function type typedef XtransConnInfo (_Xtransport*, char*, char*, char*)':
-                                      parameter 2 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 3 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
-                                      parameter 4 of type 'char*' changed:
-                                        in pointed to type 'char':
-                                          entity changed from 'char' to 'const char'
-                                          type size hasn't changed
+                          no data member change (1 filtered);
               type of '_IcePingWait* _IceConn::ping_waits' changed:
                 in pointed to type 'struct _IcePingWait' at ICEconn.h:48:1:
                   entity changed from 'struct _IcePingWait' to compatible type 'typedef _IcePingWait' at ICEconn.h:48:1
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 63d1fa5c..1594161c 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, 13 Changed (94 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 10 Changed (97 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}
 
-  13 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:
@@ -105,10 +105,7 @@ 
                           'method virtual tbb::task* tbb::internal::generic_scheduler::receive_or_steal_task(tbb::internal::reference_count&, bool)' at scheduler.h:391:1, virtual at voffset 7/7
                         1 member function insertion:
                           'method virtual tbb::task* tbb::internal::generic_scheduler::receive_or_steal_task(tbb::internal::reference_count&)' at scheduler.h:362:1, virtual at voffset 7/7
-                        1 member function changes (3 filtered):
-                          'method virtual void tbb::internal::generic_scheduler::spawn(tbb::task&, tbb::task*&)' has some sub-type changes:
-                            implicit parameter 0 of type 'tbb::internal::generic_scheduler*' has sub-type changes:
-                              pointed to type 'class tbb::internal::generic_scheduler' changed, as being reported
+                        no member function changes (4 filtered);
                         3 data member deletions:
                           'unsigned int tbb::internal::generic_scheduler::hint_for_push', at offset 896 (in bits) at scheduler.h:171:1
                           'volatile intptr_t* tbb::internal::generic_scheduler::my_ref_top_priority', at offset 2560 (in bits) at scheduler.h:433:1
@@ -118,10 +115,7 @@ 
                           type of 'tbb::internal::market* tbb::internal::generic_scheduler::my_market' changed:
                             in pointed to type 'class tbb::internal::market' at market.h:49:1:
                               type size changed from 1664 to 1728 (in bits)
-                              1 member function changes (7 filtered):
-                                'method virtual rml::job* tbb::internal::market::create_one_job()' has some sub-type changes:
-                                  implicit parameter 0 of type 'tbb::internal::market*' has sub-type changes:
-                                    pointed to type 'class tbb::internal::market' changed, as being reported
+                              no member function changes (8 filtered);
                               1 data member insertion:
                                 'bool tbb::internal::market::join_workers', at offset 384 (in bits) at market.h:88:1
                               7 data member changes:
@@ -182,10 +176,7 @@ 
             'method virtual tbb::internal::concurrent_queue_base::~concurrent_queue_base(int)' at concurrent_queue_v2.cpp:225:1
           1 member function insertion:
             'method virtual tbb::internal::concurrent_queue_base::~concurrent_queue_base(int)' at concurrent_queue_v2.cpp:217:1
-          1 member function changes (3 filtered):
-            'method virtual tbb::internal::concurrent_queue_base::~concurrent_queue_base(int)' has some sub-type changes:
-              implicit parameter 0 of type 'tbb::internal::concurrent_queue_base*' has sub-type changes:
-                pointed to type 'class tbb::internal::concurrent_queue_base' changed, as being reported
+          no member function changes (4 filtered);
           1 data member change:
             type of 'tbb::internal::concurrent_queue_rep* tbb::internal::concurrent_queue_base::my_rep' changed:
               in pointed to type 'class tbb::internal::concurrent_queue_rep' at concurrent_queue_v2.cpp:102:1:
@@ -225,10 +216,6 @@ 
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method bool tbb::mutex::scoped_lock::internal_try_acquire(tbb::mutex&)' at mutex.h:132:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::mutex&' has sub-type changes:
-        referenced type 'class tbb::mutex' changed at mutex.h:48:1, as reported earlier
-
     [C] 'method void tbb::queuing_mutex::internal_construct()' at queuing_mutex.h:106:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::queuing_mutex*' has sub-type changes:
         in pointed to type 'class tbb::queuing_mutex' at queuing_mutex.h:45:1:
@@ -250,14 +237,6 @@ 
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method bool tbb::recursive_mutex::scoped_lock::internal_try_acquire(tbb::recursive_mutex&)' at recursive_mutex.h:142:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::recursive_mutex&' has sub-type changes:
-        referenced type 'class tbb::recursive_mutex' changed at recursive_mutex.h:47:1, as reported earlier
-
-    [C] 'method void tbb::spin_mutex::scoped_lock::internal_acquire(tbb::spin_mutex&)' at spin_mutex.h:66:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::spin_mutex&' has sub-type changes:
-        referenced type 'class tbb::spin_mutex' changed at spin_mutex.h:47:1, as reported earlier
-
     [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:
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 daf0622c..dda2fb76 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, 13 Changed (94 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 8 Changed (99 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,18 +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}
 
-  13 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);
-          no data member changes (5 filtered);
+  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:
@@ -54,20 +43,6 @@ 
                       array type size changed from 640 to 576
                       array type subrange 1 changed length from 80 to 72
 
-    [C] 'method void tbb::internal::concurrent_queue_base_v3::assign(const tbb::internal::concurrent_queue_base&)' at concurrent_queue.cpp:570:1 has some indirect sub-type changes:
-      implicit parameter 0 of type 'tbb::internal::concurrent_queue_base_v3*' has sub-type changes:
-        in pointed to type 'class tbb::internal::concurrent_queue_base_v3' at _concurrent_queue_impl.h:834:1:
-          type size hasn't changed
-          1 member function deletion:
-            'method virtual tbb::internal::concurrent_queue_base_v3::~concurrent_queue_base_v3(int)' at concurrent_queue.cpp:361:1
-          1 member function insertion:
-            'method virtual tbb::internal::concurrent_queue_base_v3::~concurrent_queue_base_v3(int)' at concurrent_queue.cpp:370:1
-          1 member function changes (6 filtered):
-            'method virtual tbb::internal::concurrent_queue_base_v3::~concurrent_queue_base_v3(int)' has some sub-type changes:
-              implicit parameter 0 of type 'tbb::internal::concurrent_queue_base_v3*' has sub-type changes:
-                pointed to type 'class tbb::internal::concurrent_queue_base_v3' changed, as being reported
-          no data member change (1 filtered);
-
     [C] 'function void tbb::internal::throw_exception_v4(tbb::internal::exception_id)' at tbb_misc.cpp:119:1 has some indirect sub-type changes:
       parameter 1 of type 'enum tbb::internal::exception_id' has sub-type changes:
         type size hasn't changed
@@ -83,10 +58,6 @@ 
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method bool tbb::mutex::scoped_lock::internal_try_acquire(tbb::mutex&)' at mutex.h:132:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::mutex&' has sub-type changes:
-        referenced type 'class tbb::mutex' changed at mutex.h:48:1, as reported earlier
-
     [C] 'method void tbb::queuing_mutex::internal_construct()' at queuing_mutex.h:106:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::queuing_mutex*' has sub-type changes:
         in pointed to type 'class tbb::queuing_mutex' at queuing_mutex.h:45:1:
@@ -108,10 +79,6 @@ 
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method bool tbb::recursive_mutex::scoped_lock::internal_try_acquire(tbb::recursive_mutex&)' at recursive_mutex.h:142:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::recursive_mutex&' has sub-type changes:
-        referenced type 'class tbb::recursive_mutex' changed at recursive_mutex.h:47:1, as reported earlier
-
     [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:
@@ -119,10 +86,6 @@ 
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method bool tbb::spin_mutex::scoped_lock::internal_try_acquire(tbb::spin_mutex&)' at spin_mutex.h:69:1 has some indirect sub-type changes:
-      parameter 1 of type 'tbb::spin_mutex&' has sub-type changes:
-        referenced type 'class tbb::spin_mutex' changed at spin_mutex.h:47:1, as reported earlier
-
     [C] 'method void tbb::spin_rw_mutex::internal_acquire_reader()' at spin_rw_mutex_v2.h:44:1 has some indirect sub-type changes:
       parameter 1 of type 'tbb::spin_rw_mutex*' has sub-type changes:
         in pointed to type 'typedef tbb::spin_rw_mutex' at spin_rw_mutex.h:38:1: