[applied] comp-filter: Better detection of harmless/harmful enum changes

Message ID 87a5985e3d.fsf@redhat.com
State New
Headers
Series [applied] comp-filter: Better detection of harmless/harmful enum changes |

Commit Message

Dodji Seketeli March 26, 2025, 9:35 a.m. UTC
  Hello,

Detect and report enumerator name and value changes separately.  Also,
better tell harmless and harmful enum changes apart.  This is useful
for upcoming patches that need to avoid mixing harmless and harmful
enum changes.

The patch adjusts the regression test suite accordingly.

	* include/abg-comp-filter.h (has_harmless_name_change): Take an
	additional diff_context_sptr parameter.
	* include/abg-ir.h (enum_type_decl::find_enumerator_by_{value,
	name}): Declare new member functions.
	* src/abg-comp-filter.cc (has_harmful_enum_change)
	(has_harmless_enum_change)
	(has_enumerator_change): Define new static functions.
	(has_harmless_name_change): Take an
	additional diff_context_sptr parameter.  Use the new
	has_harmless_enum_change instead of getting deep into minutiae
	concerning enums.  The diff_context_sptr argument is passed to
	has_harmless_enum_change.  Adjust the other overload.
	(has_harmful_name_change): Take an additional diff_context_sptr
	parameter and pass it to has_harmless_name_change.  Adjust
	comment.  Adjust the overload for diff node.
	(has_enumerator_removal_or_value_change): Rename
	has_enumerator_removal_or_change into this.  Walk the changed
	enumerators to see if any of their value changed.
	(has_harmful_enum_change): Adjust to use
	has_enumerator_removal_or_value_change.
	(categorize_harmless_diff_node): Adjust the use of
	has_harmless_name_change.  Also, use the new
	has_harmless_enum_change instead of diving into minutiae to handle
	enum changes.
	* src/abg-comparison.cc
	(enum_diff::ensure_lookup_tables_populated): Use the new
	enum_type_decl::find_enumerator_by_{value,name} to populate
	enum_diff::priv::changed_enumerators_ and remove the changed
	enumerators from enum_diff::priv::{deleted,
	inserted}_enumerators_.
	* src/abg-default-reporter.cc (default_reporter::report): In the
	overload for enum_diff, report change of enumerator value or
	change of enumerator name.
	(default_reporter::report_non_type_typedef_changes): Adjust the
	use of filtering::has_harmless_name_change.
	* src/abg-ir.cc (enum_type_decl::find_enumerator_by_{value,
	name}): Define new member functions.
	* src/abg-reporter-priv.cc (represent): In the overload for
	var_diff_sptr, adjust the use of
	filtering::has_harmless_name_change.
	(report_name_size_and_alignment_changes): Likewise.
	* tests/data/test-abidiff/test-enum0-report.txt: Adjust.
	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
	Adjust.
	* tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt:
	Adjust.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	Adjust.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Applied to the mainline.
---
 include/abg-comp-filter.h                     |   4 +-
 include/abg-ir.h                              |   8 +
 src/abg-comp-filter.cc                        | 154 +++++++++++++++---
 src/abg-comparison.cc                         |  60 +++++++
 src/abg-default-reporter.cc                   |  47 +++++-
 src/abg-ir.cc                                 |  48 ++++++
 src/abg-reporter-priv.cc                      |   4 +-
 tests/data/test-abidiff/test-enum0-report.txt |   6 +-
 .../PR25058-liblttng-ctl-report-1.txt         |  24 +--
 .../nss-3.23.0-1.0.fc23.x86_64-report-0.txt   |  15 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-0.txt |  29 +---
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-1.txt |  26 ---
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-2.txt |  31 +---
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-3.txt | 105 +-----------
 14 files changed, 306 insertions(+), 255 deletions(-)
  

Patch

diff --git a/include/abg-comp-filter.h b/include/abg-comp-filter.h
index 48bcab5d..4aed57b8 100644
--- a/include/abg-comp-filter.h
+++ b/include/abg-comp-filter.h
@@ -25,7 +25,9 @@  namespace filtering
 {
 
 bool
-has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s);
+has_harmless_name_change(const decl_base_sptr& f,
+			 const decl_base_sptr& s,
+			 const diff_context_sptr& ctxt);
 
 bool union_diff_has_harmless_changes(const diff *d);
 
diff --git a/include/abg-ir.h b/include/abg-ir.h
index 1a8917a3..899f0231 100644
--- a/include/abg-ir.h
+++ b/include/abg-ir.h
@@ -2836,6 +2836,14 @@  public:
   enumerators&
   get_enumerators();
 
+  bool
+  find_enumerator_by_value(int64_t value,
+			   enum_type_decl::enumerator& result);
+
+  bool
+  find_enumerator_by_name(const string& name,
+			  enum_type_decl::enumerator& result);
+
   virtual string
   get_pretty_representation(bool internal = false,
 			    bool qualified_name = true) const;
diff --git a/src/abg-comp-filter.cc b/src/abg-comp-filter.cc
index 688189db..ce04d978 100644
--- a/src/abg-comp-filter.cc
+++ b/src/abg-comp-filter.cc
@@ -40,6 +40,13 @@  static bool
 type_diff_has_cv_qual_change_only(const type_base_sptr& f,
 				  const type_base_sptr& s);
 
+static bool
+has_harmful_enum_change(const diff* diff);
+
+static bool
+has_harmless_enum_change(const type_base_sptr& f,
+			 const type_base_sptr& s,
+			 const diff_context_sptr& ctxt);
 using std::dynamic_pointer_cast;
 
 /// Walk the diff sub-trees of a a @ref corpus_diff and apply a filter
@@ -756,9 +763,14 @@  integral_type_has_harmless_name_change(const decl_base_sptr& f,
 ///
 /// @param s the second decl to consider in the comparison.
 ///
+/// @param ctxt the diff context to use for fine grained comparison of
+/// @p f and @p s.
+///
 /// @return true iff decl @p s represents a harmless change over @p f.
 bool
-has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
+has_harmless_name_change(const decl_base_sptr& f,
+			 const decl_base_sptr& s,
+			 const diff_context_sptr& ctxt)
 {
   // So, a harmless name change is either ...
   return (decl_name_changed(f, s)
@@ -785,23 +797,17 @@  has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
 	      // ... Only qualifers changed on the type without having
 	      // the underlying type changed ...
 	      || type_diff_has_cv_qual_change_only(is_type(f), is_type(s))
+	      || has_harmless_enum_change(is_type(f), is_type(s), ctxt)
 	      // ... or a data member name change, without having its
 	      // type changed ...
 	      || (is_data_member(f)
 		  && is_data_member(s)
 		  && (is_var_decl(f)->get_type()
 		      == is_var_decl(s)->get_type()))
-	      // .. an enum name change without having any other part
-	      // of the enum to change.
-	      || (is_enum_type(f)
-		  && is_enum_type(s)
-		  && !enum_has_non_name_change(*is_enum_type(f),
-					       *is_enum_type(s),
-					       0))
 	      || integral_type_has_harmless_name_change(f, s)));
 }
 
-/// Test if two decls represents a harmful name change.
+/// Test if two decls represent a harmful name change.
 ///
 /// A harmful name change is a name change that is not harmless, so
 /// this function uses the function has_harmless_name_change.
@@ -810,11 +816,15 @@  has_harmless_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
 ///
 /// @param s the second decl to consider in the comparison.
 ///
+/// @param ctxt the diff context to use for comparison.
+///
 /// @return true iff decl @p s represents a harmful name change over
 /// @p f.
 bool
-has_harmful_name_change(const decl_base_sptr& f, const decl_base_sptr& s)
-{return decl_name_changed(f, s) && ! has_harmless_name_change(f, s);}
+has_harmful_name_change(const decl_base_sptr& f,
+			const decl_base_sptr& s,
+			const diff_context_sptr& ctxt)
+{return decl_name_changed(f, s) && ! has_harmless_name_change(f, s, ctxt);}
 
 /// Test if a diff node represents a harmful name change.
 ///
@@ -833,7 +843,7 @@  has_harmful_name_change(const diff* dif)
   decl_base_sptr f = is_decl(dif->first_subject()),
     s = is_decl(dif->second_subject());
 
-  return has_harmful_name_change(f, s);
+  return has_harmful_name_change(f, s, dif->context());
 }
 
 /// Test if a class_diff node has non-static members added or
@@ -1699,22 +1709,52 @@  has_enumerator_insertion(const diff* diff)
   return false;
 }
 
-/// Test if an enum_diff carries an enumerator removal.
+/// Test if an enum_diff carries an enumerator removal or an
+/// enumerator value change.
 ///
 /// @param diff the enum_diff to consider.
 ///
 /// @return true iff @p diff carries an enumerator removal or change.
 static bool
-has_enumerator_removal_or_change(const diff* diff)
+has_enumerator_removal_or_value_change(const diff* diff)
 {
   if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
-    return (!d->deleted_enumerators().empty()
-	    || !d->changed_enumerators().empty());
+    {
+      if (!d->deleted_enumerators().empty())
+	return true;
+
+      for (auto& entry : d->changed_enumerators())
+	{
+	  const changed_enumerator& change = entry.second;
+	  if (change.first.get_value() != change.second.get_value())
+	    return true;
+	}
+    }
+  return false;
+}
+
+/// Test if a diff node carries an enumerator name or value change.
+///
+/// @param diff the diff node to consider.
+///
+/// @return true iff the diff node @p diff carries an enumerator name
+/// or value change.
+static bool
+has_enumerator_change(const diff* diff)
+{
+  if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
+    return !d->changed_enumerators().empty();
   return false;
 }
 
 /// Test if an enum_diff carries a harmful change.
 ///
+/// For now, a harmful enum change is either a change that:
+///
+///   - changes the size of the enum type
+///
+///   - or removes (or changes) an existing enumerator value.
+///
 /// @param diff the enum_diff to consider.
 ///
 /// @return true iff @p diff carries a harmful change.
@@ -1722,8 +1762,9 @@  static bool
 has_harmful_enum_change(const diff* diff)
 {
   if (const enum_diff* d = dynamic_cast<const enum_diff*>(diff))
-    return (has_enumerator_removal_or_change(d)
-	    || has_type_size_change(d));
+    if (has_type_size_change(d) || has_enumerator_removal_or_value_change(d))
+      return true;
+
   return false;
 }
 
@@ -1773,6 +1814,77 @@  has_harmless_enum_to_int_change(const diff* diff)
   return false;
 }
 
+/// Test if two types represent a harmless (that can be filtered out
+/// by default) enum type change.
+///
+/// A harmless enum type change is either an enumerator insertion or
+/// an enumerator change that doesn't represents a harmful enum change
+/// at the same time.  Note that a harmless enum to int change is a
+/// harmless enum change too.
+///
+/// @param t1 the first version of the type to consider.
+///
+/// @param t2 the second version of the type to consider.
+///
+/// @param ctxt the diff context to use to compare @p t1 and @p t2.
+///
+/// @return true iff {t1, t2} represents a harmless enum change.
+static bool
+has_harmless_enum_change(const type_base_sptr& t1,
+			 const type_base_sptr& t2,
+			 const diff_context_sptr& ctxt)
+{
+  type_base_sptr f = peel_typedef_type(t1);
+  type_base_sptr s = peel_typedef_type(t2);
+  enum_type_decl_sptr e1 = is_enum_type(f);
+  enum_type_decl_sptr e2 = is_enum_type(s);
+
+  if (!e1 || !e2)
+    return false;
+
+  enum_diff_sptr dyf = compute_diff(e1, e2, ctxt);
+  if (((has_enumerator_insertion(dyf.get()) || has_enumerator_change(dyf.get()))
+       && !has_harmful_enum_change(dyf.get()))
+      || has_harmless_enum_to_int_change(dyf.get()))
+    return true;
+
+  return false;
+}
+
+/// Test if two types represent a harmless (that can be filtered out
+/// by default) enum type change.
+///
+/// A harmless enum type change is either an enumerator insertion or
+/// an enumerator change that doesn't represents a harmful enum change
+/// at the same time.  Note that a harmless enum to int change is a
+/// harmless enum change too.
+///
+/// @param t1 the first version of the type to consider.
+///
+/// @param t2 the second version of the type to consider.
+///
+/// @param ctxt the diff context to use to compare @p t1 and @p t2.
+///
+/// @return true iff {t1, t2} represents a harmless enum change.
+static bool
+has_harmless_enum_change(const diff* d)
+{
+  if (!d)
+    return false;
+
+  if (((has_enumerator_insertion(d) || has_enumerator_change(d))
+       && !has_harmful_enum_change(d))
+      || has_harmless_enum_to_int_change(d))
+    return true;
+
+  type_base_sptr f = is_type(d->first_subject());
+  type_base_sptr s = is_type(d->second_subject());
+  if (!f || !s)
+    return false;
+
+  return has_harmless_enum_change(f, s, d->context());
+}
+
 /// Test if an @ref fn_parm_diff node has a top cv qualifier change on
 /// the type of the function parameter.
 ///
@@ -2132,7 +2244,7 @@  categorize_harmless_diff_node(diff *d, bool pre)
       if (is_compatible_change(f, s))
 	category |= COMPATIBLE_TYPE_CHANGE_CATEGORY;
 
-      if (has_harmless_name_change(f, s)
+      if (has_harmless_name_change(f, s, d->context())
 	  || class_diff_has_harmless_odr_violation_change(d))
 	category |= HARMLESS_DECL_NAME_CHANGE_CATEGORY;
 
@@ -2150,9 +2262,7 @@  categorize_harmless_diff_node(diff *d, bool pre)
       if (has_data_member_replaced_by_anon_dm(d))
 	category |= HARMLESS_DATA_MEMBER_CHANGE_CATEGORY;
 
-      if ((has_enumerator_insertion(d)
-	   && !has_harmful_enum_change(d))
-	  || has_harmless_enum_to_int_change(d))
+      if (has_harmless_enum_change(d))
 	category |= HARMLESS_ENUM_CHANGE_CATEGORY;
 
       if (function_name_changed_but_not_symbol(d))
diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index 34a63edf..d0eb4779 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -4666,6 +4666,66 @@  enum_diff::ensure_lookup_tables_populated()
 	      }
 	  }
       }
+
+    // If a new enumerator is added with a value that already existed
+    // in the old enum but with a new name, then populate the
+    // enum_diff::priv_::changed_enumerators_ data member with a
+    // change that represents a change to an enumerator name.  The
+    // enum_diff::priv_::inserted_enumerators_ is adjusted accordingly
+    // an the 'new' enumerator is removed in this case.
+
+    enum_type_decl::enumerators enums_to_erase;
+    for (auto& entry : priv_->inserted_enumerators_)
+      {
+	enum_type_decl::enumerator& final_enumerator = entry.second;
+	enum_type_decl::enumerator initial_enumerator;
+	if (first_enum()->find_enumerator_by_value(entry.second.get_value(),
+						   initial_enumerator))
+	  {
+	    enum_type_decl::enumerator foo;
+	    if (!second_enum()->
+		find_enumerator_by_name(initial_enumerator.get_name(),
+					foo))
+	      {
+		priv_->changed_enumerators_[initial_enumerator.get_name()] =
+		  std::make_pair(initial_enumerator, final_enumerator);
+		enums_to_erase.push_back(final_enumerator);
+	      }
+	  }
+      }
+
+    for (auto& enomerator : enums_to_erase)
+      priv_->inserted_enumerators_.erase(enomerator.get_name());
+
+    // If an enumerator is deleted yet its value (with a new name) is
+    // still present among enumerators of the newer enum then populate
+    // the enum_diff::priv_::changed_enumerators_ data member with a
+    // change that represents a change to an enumerator name.  The
+    // enum_diff::priv_::deleted_enumerators_ is adjusted accordingly
+    // an the 'new' enumerator is removed in this case.
+
+    enums_to_erase.clear();
+    for (auto& entry : priv_->deleted_enumerators_)
+      {
+	enum_type_decl::enumerator& initial_enumerator = entry.second;
+	enum_type_decl::enumerator final_enumerator;
+	if (second_enum()->find_enumerator_by_value(entry.second.get_value(),
+						    final_enumerator))
+	  {
+	    enum_type_decl::enumerator foo;
+	    if (!first_enum()->
+		find_enumerator_by_name(final_enumerator.get_name(),
+					foo))
+	      {
+		priv_->changed_enumerators_[initial_enumerator.get_name()] =
+		  std::make_pair(initial_enumerator, final_enumerator);
+		enums_to_erase.push_back(initial_enumerator);
+	      }
+	  }
+      }
+
+    for (auto& enomerator : enums_to_erase)
+      priv_->deleted_enumerators_.erase(enomerator.get_name());
   }
 }
 
diff --git a/src/abg-default-reporter.cc b/src/abg-default-reporter.cc
index b1c46d33..7ff49c2c 100644
--- a/src/abg-default-reporter.cc
+++ b/src/abg-default-reporter.cc
@@ -203,14 +203,43 @@  default_reporter::report(const enum_diff& d, ostream& out,
 	   i != sorted_changed_enumerators.end();
 	   ++i)
 	{
-	  out << indent
-	      << "  '"
-	      << (first->get_is_anonymous()
-		  ? i->first.get_name()
-		  : i->first.get_qualified_name())
-	      << "' from value '"
-	      << i->first.get_value() << "' to '"
-	      << i->second.get_value() << "'";
+	  out << indent;
+	  if (i->first.get_value() != i->second.get_value())
+	    {
+	     out << "  '"
+		 << (first->get_is_anonymous()
+		     ? i->first.get_name()
+		     : i->first.get_qualified_name())
+		 << "' from value '"
+		 << i->first.get_value() << "' to '"
+		 << i->second.get_value() << "'";
+	    }
+	  else if (i->first.get_name() != i->second.get_name())
+	    {
+	      out << "from '"
+		  << (first->get_is_anonymous()
+		      ? i->first.get_name()
+		      : i->first.get_qualified_name())
+		  << " = " << i->first.get_value()
+		  << "' to '"
+		  << (second->get_is_anonymous()
+		  ? i->second.get_name()
+		  : i->second.get_qualified_name())
+		  << " = " << i->second.get_value()
+		  << "'";
+	    }
+	  else
+	    {
+	      out << "enumerator change from '"
+		  << i->first.get_name()
+		  << " = "
+		  << i->first.get_value()
+		  << "' to '"
+		  << i->second.get_name()
+		  << " = "
+		  << i->second.get_value()
+		  << "' could not be determined - please report as a bug";
+	    }
 	  report_loc_info(second, *ctxt, out);
 	  out << "\n";
 	}
@@ -245,7 +274,7 @@  default_reporter::report_non_type_typedef_changes(const typedef_diff &d,
 
   maybe_report_diff_for_member(f, s, d.context(), out, indent);
 
-  if ((filtering::has_harmless_name_change(f, s)
+  if ((filtering::has_harmless_name_change(f, s, d.context())
        && ((d.context()->get_allowed_category()
 	    & HARMLESS_DECL_NAME_CHANGE_CATEGORY)
 	   || d.context()->show_leaf_changes_only()))
diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 776d1a9f..b189f47e 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -20025,6 +20025,54 @@  enum_type_decl::get_sorted_enumerators() const
   return priv_->sorted_enumerators_;
 }
 
+/// Find an enumerator by its value.
+///
+/// @param value the enumerator value to look for.
+///
+/// @param result output parameter.  This is set to the enumerator
+/// which value is @p value, if found.  This is set iff the function
+/// returns true.
+///
+/// @return true iff an enumerator with value @p value was found and
+/// returned by argument via @p result.
+bool
+enum_type_decl::find_enumerator_by_value(int64_t value,
+					 enum_type_decl:: enumerator& result)
+{
+  for (auto& e : get_enumerators())
+    if (e.get_value() == value)
+      {
+	result = e;
+	return true;
+      }
+
+  return false;
+}
+
+/// Find an enumerator by its name
+///
+/// @param name the enumerator name to look for.
+///
+/// @param result output parameter.  This is set to the enumerator
+/// which name is @p name, if found.  This is set iff the function
+/// returns true.
+///
+/// @return true iff an enumerator with name @p name was found and
+/// returned by argument via @p result.
+bool
+enum_type_decl::find_enumerator_by_name(const string& name,
+					enum_type_decl::enumerator& result)
+{
+  for (auto& e : get_enumerators())
+    if (e.get_name() == name)
+      {
+	result = e;
+	return true;
+      }
+
+  return false;
+}
+
 /// Get the pretty representation of the current instance of @ref
 /// enum_type_decl.
 ///
diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc
index 09a8a599..d8e582ab 100644
--- a/src/abg-reporter-priv.cc
+++ b/src/abg-reporter-priv.cc
@@ -544,7 +544,7 @@  represent(const var_diff_sptr	&diff,
 
   if (!filtering::has_anonymous_data_member_change(diff) && o_name != n_name)
     {
-      if (filtering::has_harmless_name_change(o, n)
+      if (filtering::has_harmless_name_change(o, n, ctxt)
 	  && !(ctxt->get_allowed_category()
 	       & HARMLESS_DECL_NAME_CHANGE_CATEGORY))
 	;
@@ -986,7 +986,7 @@  report_name_size_and_alignment_changes(decl_base_sptr		first,
       && fn != sn)
     {
       if (!(ctxt->get_allowed_category() & HARMLESS_DECL_NAME_CHANGE_CATEGORY)
-	  && filtering::has_harmless_name_change(first, second))
+	  && filtering::has_harmless_name_change(first, second, ctxt))
 	// This is a harmless name change.  but then
 	// HARMLESS_DECL_NAME_CHANGE_CATEGORY doesn't seem allowed.
 	;
diff --git a/tests/data/test-abidiff/test-enum0-report.txt b/tests/data/test-abidiff/test-enum0-report.txt
index e6aad7aa..0f0f5758 100644
--- a/tests/data/test-abidiff/test-enum0-report.txt
+++ b/tests/data/test-abidiff/test-enum0-report.txt
@@ -1,10 +1,8 @@ 
 1 changed type:
   'enum E' changed:
     type size hasn't changed
-    1 enumerator deletion:
-      'E::e2' value '1'
-    1 enumerator insertion:
-      'E::e1' value '1'
+    1 enumerator change:
+    from 'E::e2 = 1' to 'E::e1 = 1'
 1 changed declaration:
   'function void foo(E)' was changed to 'function void foo(E)':
     parameter 1 of type 'enum E' has sub-type changes:
diff --git a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
index 260ea656..3b2b98ba 100644
--- a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
+++ b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
@@ -479,18 +479,12 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
                           3 data member changes:
                             type of 'op_type type' changed:
                               type size hasn't changed
-                              5 enumerator deletions:
-                                'op_type::AST_OP_RSHIFT' value '6'
-                                'op_type::AST_OP_LSHIFT' value '7'
-                                'op_type::AST_OP_BIN_AND' value '10'
-                                'op_type::AST_OP_BIN_OR' value '11'
-                                'op_type::AST_OP_BIN_XOR' value '12'
-                              5 enumerator insertions:
-                                'op_type::AST_OP_BIT_RSHIFT' value '6'
-                                'op_type::AST_OP_BIT_LSHIFT' value '7'
-                                'op_type::AST_OP_BIT_AND' value '10'
-                                'op_type::AST_OP_BIT_OR' value '11'
-                                'op_type::AST_OP_BIT_XOR' value '12'
+                              5 enumerator changes:
+                              from 'op_type::AST_OP_RSHIFT = 6' to 'op_type::AST_OP_BIT_RSHIFT = 6'
+                              from 'op_type::AST_OP_LSHIFT = 7' to 'op_type::AST_OP_BIT_LSHIFT = 7'
+                              from 'op_type::AST_OP_BIN_AND = 10' to 'op_type::AST_OP_BIT_AND = 10'
+                              from 'op_type::AST_OP_BIN_OR = 11' to 'op_type::AST_OP_BIT_OR = 11'
+                              from 'op_type::AST_OP_BIN_XOR = 12' to 'op_type::AST_OP_BIT_XOR = 12'
                             type of 'filter_node* lchild' changed:
                               pointed to type 'struct filter_node' changed, as being reported
                             type of 'filter_node* rchild' changed:
@@ -505,10 +499,8 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
                           2 data member changes:
                             type of 'unary_op_type type' changed:
                               type size hasn't changed
-                              1 enumerator deletion:
-                                'unary_op_type::AST_UNARY_BIN_NOT' value '4'
-                              1 enumerator insertion:
-                                'unary_op_type::AST_UNARY_BIT_NOT' value '4'
+                              1 enumerator change:
+                              from 'unary_op_type::AST_UNARY_BIN_NOT = 4' to 'unary_op_type::AST_UNARY_BIT_NOT = 4'
                             type of 'filter_node* child' changed:
                               pointed to type 'struct filter_node' changed, as being reported
                 'cds_list_head allocated_nodes' offset changed from 576 to 640 (in bits) (by +64 bits)
diff --git a/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt b/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
index 5b8dbf61..d53ea66c 100644
--- a/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
@@ -41,20 +41,7 @@ 
             type size hasn't changed
             1 data member insertion:
               'SSLAuthType authType', at offset 736 (in bits) at sslt.h:250:1
-            1 data member changes (1 filtered):
-              type of 'SSLAuthType authAlgorithm' changed:
-                underlying type 'enum SSLAuthType' at sslt.h:87:1 changed:
-                  type size hasn't changed
-                  1 enumerator deletion:
-                    'SSLAuthType::ssl_auth_rsa' value '1'
-                  7 enumerator insertions:
-                    'SSLAuthType::ssl_auth_rsa_decrypt' value '1'
-                    'SSLAuthType::ssl_auth_ecdh_rsa' value '5'
-                    'SSLAuthType::ssl_auth_ecdh_ecdsa' value '6'
-                    'SSLAuthType::ssl_auth_rsa_sign' value '7'
-                    'SSLAuthType::ssl_auth_rsa_pss' value '8'
-                    'SSLAuthType::ssl_auth_psk' value '9'
-                    'SSLAuthType::ssl_auth_size' value '10'
+            no data member changes (2 filtered);
 
   1 Changed variable:
 
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt
index 5e128ae9..5c8af819 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt
@@ -1,5 +1,5 @@ 
 ================ changes of 'libspice-server.so.1.8.0'===============
-  Functions changes summary: 1 Removed, 1 Changed (78 filtered out), 8 Added functions
+  Functions changes summary: 1 Removed, 0 Changed (79 filtered out), 8 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   1 Removed function:
@@ -17,32 +17,5 @@ 
     [A] 'function void spice_server_set_playback_rate(SpicePlaybackInstance*, uint32_t)'    {spice_server_set_playback_rate@@SPICE_SERVER_0.12.5}
     [A] 'function void spice_server_set_record_rate(SpiceRecordInstance*, uint32_t)'    {spice_server_set_record_rate@@SPICE_SERVER_0.12.5}
 
-  1 function with some indirect sub-type change:
-
-    [C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
-      return type changed:
-        typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
-          type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
-          type size hasn't changed
-          7 enumerator deletions:
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
-          9 enumerator insertions:
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
-
 ================ end of changes of 'libspice-server.so.1.8.0'===============
 
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
index a8f5e5e1..925410b1 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
@@ -20,34 +20,8 @@ 
   2 functions with some indirect sub-type change:
 
     [C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
-      return type changed:
-        typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
-          type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
-          type size hasn't changed
-          7 enumerator deletions:
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
-            'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
-          9 enumerator insertions:
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
 
     [C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:4286:1 has some indirect sub-type changes:
-      parameter 2 of type 'typedef spice_image_compression_t' changed:
-        typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
 
 ================ end of changes of 'libspice-server.so.1.8.0'===============
 
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
index 8ca76592..74b3408b 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
@@ -471,30 +471,7 @@ 
                                                             '_CursorItem* free_cursor_items' offset changed from 15379584 to 14739584 (in bits) (by -640000 bits)
                                                             'RedMemSlotInfo mem_slots' offset changed from 15379648 to 14739648 (in bits) (by -640000 bits)
                                                             'ImageCache image_cache' offset changed from 15380032 to 14739968 (in bits) (by -640064 bits)
-                                                            type of 'spice_image_compression_t image_compression' changed:
-                                                              typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-                                                              underlying type 'enum spice_image_compression_t' at spice.h:471:1 changed:
-                                                                type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
-                                                                type size hasn't changed
-                                                                7 enumerator deletions:
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
-                                                                  'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
-                                                                9 enumerator insertions:
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
-                                                                  'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
-                                                            and offset changed from 15445824 to 14805760 (in bits) (by -640064 bits)
+                                                            'spice_image_compression_t image_compression' offset changed from 15445824 to 14805760 (in bits) (by -640064 bits)
                                                             'spice_wan_compression_t jpeg_state' offset changed from 15445856 to 14805792 (in bits) (by -640064 bits)
                                                             'spice_wan_compression_t zlib_glz_state' offset changed from 15445888 to 14805824 (in bits) (by -640064 bits)
                                                             'uint32_t mouse_mode' offset changed from 15445920 to 14805856 (in bits) (by -640064 bits)
@@ -823,9 +800,6 @@ 
         pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
 
     [C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:4294:1 has some indirect sub-type changes:
-      return type changed:
-        typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
       parameter 1 of type 'SpiceServer*' has sub-type changes:
         pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
 
@@ -1013,9 +987,6 @@ 
     [C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:4286:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
         pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
-      parameter 2 of type 'typedef spice_image_compression_t' changed:
-        typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum spice_image_compression_t' changed at spice.h:471:1, as reported earlier
 
     [C] 'function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)' at reds.c:4300:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
index d56a17aa..2450ed03 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
@@ -1,6 +1,6 @@ 
 ================ changes of 'libspice-server.so.1.8.0'===============
-Leaf changes summary: 10 artifacts changed (14 filtered out)
-  Changed leaf types summary: 1 (14 filtered out) leaf types changed
+Leaf changes summary: 9 artifacts changed (15 filtered out)
+  Changed leaf types summary: 0 (15 filtered out) leaf types changed
   Removed/Changed/Added functions summary: 1 Removed, 0 Changed, 8 Added functions
   Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
 
@@ -19,106 +19,5 @@  Leaf changes summary: 10 artifacts changed (14 filtered out)
     [A] 'function void spice_server_set_playback_rate(SpicePlaybackInstance*, uint32_t)'    {spice_server_set_playback_rate@@SPICE_SERVER_0.12.5}
     [A] 'function void spice_server_set_record_rate(SpiceRecordInstance*, uint32_t)'    {spice_server_set_record_rate@@SPICE_SERVER_0.12.5}
 
-  'enum spice_image_compression_t at spice.h:471:1' changed:
-    type name changed from 'spice_image_compression_t' to 'SpiceImageCompression'
-    type size hasn't changed
-    7 enumerator deletions:
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_INVALID' value '0'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_OFF' value '1'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_QUIC' value '4'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_GLZ' value '5'
-      'spice_image_compression_t::SPICE_IMAGE_COMPRESS_LZ' value '6'
-    9 enumerator insertions:
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
-      'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
-    79 impacted interfaces:
-      function void spice_qxl_add_memslot(QXLInstance*, QXLDevMemSlot*)
-      function void spice_qxl_add_memslot_async(QXLInstance*, QXLDevMemSlot*, uint64_t)
-      function void spice_qxl_create_primary_surface(QXLInstance*, uint32_t, QXLDevSurfaceCreate*)
-      function void spice_qxl_create_primary_surface_async(QXLInstance*, uint32_t, QXLDevSurfaceCreate*, uint64_t)
-      function void spice_qxl_del_memslot(QXLInstance*, uint32_t, uint32_t)
-      function void spice_qxl_destroy_primary_surface(QXLInstance*, uint32_t)
-      function void spice_qxl_destroy_primary_surface_async(QXLInstance*, uint32_t, uint64_t)
-      function void spice_qxl_destroy_surface_async(QXLInstance*, uint32_t, uint64_t)
-      function void spice_qxl_destroy_surface_wait(QXLInstance*, uint32_t)
-      function void spice_qxl_destroy_surfaces(QXLInstance*)
-      function void spice_qxl_destroy_surfaces_async(QXLInstance*, uint64_t)
-      function void spice_qxl_driver_unload(QXLInstance*)
-      function void spice_qxl_flush_surfaces_async(QXLInstance*, uint64_t)
-      function void spice_qxl_loadvm_commands(QXLInstance*, QXLCommandExt*, uint32_t)
-      function void spice_qxl_monitors_config_async(QXLInstance*, QXLPHYSICAL, int, uint64_t)
-      function void spice_qxl_oom(QXLInstance*)
-      function void spice_qxl_reset_cursor(QXLInstance*)
-      function void spice_qxl_reset_image_cache(QXLInstance*)
-      function void spice_qxl_reset_memslots(QXLInstance*)
-      function void spice_qxl_set_max_monitors(QXLInstance*, unsigned int)
-      function void spice_qxl_start(QXLInstance*)
-      function void spice_qxl_stop(QXLInstance*)
-      function void spice_qxl_update_area(QXLInstance*, uint32_t, QXLRect*, QXLRect*, uint32_t, uint32_t)
-      function void spice_qxl_update_area_async(QXLInstance*, uint32_t, QXLRect*, uint32_t, uint64_t)
-      function void spice_qxl_wakeup(QXLInstance*)
-      function int spice_server_add_client(SpiceServer*, int, int)
-      function int spice_server_add_interface(SpiceServer*, SpiceBaseInstance*)
-      function int spice_server_add_renderer(SpiceServer*, const char*)
-      function int spice_server_add_ssl_client(SpiceServer*, int, int)
-      function void spice_server_char_device_wakeup(SpiceCharDeviceInstance*)
-      function void spice_server_destroy(SpiceServer*)
-      function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)
-      function int spice_server_get_num_clients(SpiceServer*)
-      function int spice_server_get_peer_info(SpiceServer*, sockaddr*, socklen_t*)
-      function int spice_server_get_sock_info(SpiceServer*, sockaddr*, socklen_t*)
-      function int spice_server_init(SpiceServer*, SpiceCoreInterface*)
-      function int spice_server_is_server_mouse(SpiceServer*)
-      function int spice_server_migrate_connect(SpiceServer*, const char*, int, int, const char*)
-      function int spice_server_migrate_end(SpiceServer*, int)
-      function int spice_server_migrate_info(SpiceServer*, const char*, int, int, const char*)
-      function int spice_server_migrate_start(SpiceServer*)
-      function int spice_server_migrate_switch(SpiceServer*)
-      function SpiceServer* spice_server_new(void)
-      function void spice_server_playback_get_buffer(SpicePlaybackInstance*, uint32_t**, uint32_t*)
-      function void spice_server_playback_put_samples(SpicePlaybackInstance*, uint32_t*)
-      function void spice_server_playback_set_mute(SpicePlaybackInstance*, uint8_t)
-      function void spice_server_playback_set_volume(SpicePlaybackInstance*, uint8_t, uint16_t*)
-      function void spice_server_playback_start(SpicePlaybackInstance*)
-      function void spice_server_playback_stop(SpicePlaybackInstance*)
-      function void spice_server_port_event(SpiceCharDeviceInstance*, uint8_t)
-      function uint32_t spice_server_record_get_samples(SpiceRecordInstance*, uint32_t*, uint32_t)
-      function void spice_server_record_set_mute(SpiceRecordInstance*, uint8_t)
-      function void spice_server_record_set_volume(SpiceRecordInstance*, uint8_t, uint16_t*)
-      function void spice_server_record_start(SpiceRecordInstance*)
-      function void spice_server_record_stop(SpiceRecordInstance*)
-      function void spice_server_set_addr(SpiceServer*, const char*, int)
-      function int spice_server_set_agent_copypaste(SpiceServer*, int)
-      function int spice_server_set_agent_file_xfer(SpiceServer*, int)
-      function int spice_server_set_agent_mouse(SpiceServer*, int)
-      function int spice_server_set_channel_security(SpiceServer*, const char*, int)
-      function int spice_server_set_compat_version(SpiceServer*, spice_compat_version_t)
-      function int spice_server_set_exit_on_disconnect(SpiceServer*, int)
-      function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)
-      function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)
-      function int spice_server_set_listen_socket_fd(SpiceServer*, int)
-      function void spice_server_set_name(SpiceServer*, const char*)
-      function int spice_server_set_noauth(SpiceServer*)
-      function int spice_server_set_playback_compression(SpiceServer*, int)
-      function int spice_server_set_port(SpiceServer*, int)
-      function int spice_server_set_sasl(SpiceServer*, int)
-      function int spice_server_set_sasl_appname(SpiceServer*, const char*)
-      function void spice_server_set_seamless_migration(SpiceServer*, int)
-      function int spice_server_set_streaming_video(SpiceServer*, int)
-      function int spice_server_set_ticket(SpiceServer*, const char*, int, int, int)
-      function int spice_server_set_tls(SpiceServer*, int, const char*, const char*, const char*, const char*, const char*, const char*)
-      function void spice_server_set_uuid(SpiceServer*, const uint8_t*)
-      function int spice_server_set_zlib_glz_compression(SpiceServer*, spice_wan_compression_t)
-      function void spice_server_vm_start(SpiceServer*)
-      function void spice_server_vm_stop(SpiceServer*)
 ================ end of changes of 'libspice-server.so.1.8.0'===============