diff --git a/include/abg-comparison.h b/include/abg-comparison.h
index 15ce1651..9155cc54 100644
--- a/include/abg-comparison.h
+++ b/include/abg-comparison.h
@@ -1711,6 +1711,12 @@ public:
   const string_decl_base_sptr_map&
   deleted_data_members() const;
 
+  const unsigned_var_diff_sptr_map&
+  changed_data_members() const;
+
+  const var_diff_sptrs_type&
+  sorted_changed_data_members() const;
+
   const edit_script&
   member_fns_changes() const;
 
@@ -1726,9 +1732,6 @@ public:
   const string_member_function_sptr_map&
   inserted_member_fns() const;
 
-  const var_diff_sptrs_type&
-  sorted_changed_data_members() const;
-
   size_t
   count_filtered_changed_data_members(bool local_only = false) const;
 
diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index 1207729c..16afd556 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -5359,6 +5359,16 @@ const string_member_function_sptr_map&
 class_or_union_diff::inserted_member_fns() const
 {return get_priv()->inserted_member_functions_;}
 
+/// Getter of the map of data members that got replaced by another
+/// data member.  The key of the map is the offset at which the
+/// element got replaced and the value is a pointer to the @ref
+/// var_diff representing the replacement of the data member.
+///
+/// @return sorted vector of changed data member.
+const unsigned_var_diff_sptr_map&
+class_or_union_diff::changed_data_members() const
+{return get_priv()->changed_dm_;}
+
 /// Getter of the sorted vector of data members that got replaced by
 /// another data member.
 ///
diff --git a/src/abg-suppression.cc b/src/abg-suppression.cc
index 254d6ae4..7053e728 100644
--- a/src/abg-suppression.cc
+++ b/src/abg-suppression.cc
@@ -946,6 +946,13 @@ type_suppression::suppresses_diff(const diff* diff) const
 	      const class_decl_sptr& first_type_decl =
 		klass_diff->first_class_decl();
 
+	      if (klass_diff->inserted_data_members().empty()
+		  && klass_diff->changed_data_members().empty())
+		// So there is a has_data_member_inserted_* clause,
+		// but no data member was inserted.  That means the
+		// clause is falsified.
+		return false;
+
 	      // All inserted data members must be in an allowed
 	      // insertion range.
 	      for (const auto& m : klass_diff->inserted_data_members())
@@ -963,16 +970,15 @@ type_suppression::suppresses_diff(const diff* diff) const
 		    return false;
 		}
 
-	      // Similarly, all deleted data members must be in an
-	      // allowed insertion range.
-	      for (const auto& m : klass_diff->deleted_data_members())
+	      // Similarly, each data member that replaced another one
+	      // must be in an allowed insertion range.
+	      for (const auto& m : klass_diff->changed_data_members())
 		{
-		  decl_base_sptr member = m.second;
+		  var_decl_sptr member = m.second->second_var();
 		  bool matched = false;
 
 		  for (const auto& range : get_data_member_insertion_ranges())
-		    if (is_data_member_offset_in_range(is_var_decl(member),
-						       range,
+		    if (is_data_member_offset_in_range(member, range,
 						       first_type_decl.get()))
 		      matched = true;
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 6031b48d..d1c767b3 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -1895,6 +1895,20 @@ test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi \
 test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0-report-0.txt \
 test-diff-suppr/test-has-data-member-inserted-at-1-report-2.txt \
 test-diff-suppr/test-has-data-member-inserted-at-1.2.suppr \
+test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt \
+test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt \
+test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt \
+test-diff-suppr/test-has-data-member-inserted-at-2-report.txt \
+test-diff-suppr/test-has-data-member-inserted-at-2-v0.c \
+test-diff-suppr/test-has-data-member-inserted-at-2-v0.o \
+test-diff-suppr/test-has-data-member-inserted-at-2-v1.c \
+test-diff-suppr/test-has-data-member-inserted-at-2-v1.o \
+test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr \
+test-diff-suppr/test-has-data-member-inserted-at-2.suppr \
+test-diff-suppr/test-has-data-member-inserted-at-3-v0.c \
+test-diff-suppr/test-has-data-member-inserted-at-3-v0.o \
+test-diff-suppr/test-has-data-member-inserted-at-3-v1.c \
+test-diff-suppr/test-has-data-member-inserted-at-3-v1.o \
 \
 test-lookup-syms/test0.cc		\
 test-lookup-syms/test0.o		\
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt
new file mode 100644
index 00000000..41cf8103
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+Unreachable types summary: 0 removed, 1 changed, 0 added type
+
+1 changed type unreachable from any public interface:
+
+  [C] 'struct foo' changed:
+    type size hasn't changed
+    1 data member change:
+      type of 'long int y' changed:
+        type name changed from 'long int' to 'unsigned long int'
+        type size hasn't changed
+
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt
new file mode 100644
index 00000000..f9672be2
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt
@@ -0,0 +1,11 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+Unreachable types summary: 0 removed, 1 changed, 0 added type
+
+1 changed type unreachable from any public interface:
+
+  [C] 'struct foo' changed:
+    type size hasn't changed
+    1 data member insertion:
+      'char z', at offset 72 (in bits) at test-has-data-member-inserted-at-3-v1.c:5:1
+
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt
new file mode 100644
index 00000000..b4ea5bf1
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt
@@ -0,0 +1,4 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+Unreachable types summary: 0 removed, 0 changed (1 filtered out), 0 added type
+
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.txt b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.txt
new file mode 100644
index 00000000..41cf8103
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-report.txt
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+Unreachable types summary: 0 removed, 1 changed, 0 added type
+
+1 changed type unreachable from any public interface:
+
+  [C] 'struct foo' changed:
+    type size hasn't changed
+    1 data member change:
+      type of 'long int y' changed:
+        type name changed from 'long int' to 'unsigned long int'
+        type size hasn't changed
+
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.c
new file mode 100644
index 00000000..352509f4
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.c
@@ -0,0 +1,10 @@
+struct foo
+{
+  long x;
+  long y;
+};
+
+int
+foo()
+{
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..9c264e4b831fe1fe735a8a9f27e42f82d3ce3ea9
GIT binary patch
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.c
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.c
@@ -0,0 +1,10 @@
+struct foo
+{
+  long x;
+  unsigned long y;
+};
+
+int
+foo()
+{
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..5031d6a80991e37cd83625272433d94f4462f6e2
GIT binary patch
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr
@@ -0,0 +1,3 @@
+[suppress_type]
+        type_kind = struct
+        has_data_member_inserted_at = end
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.suppr b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.suppr
new file mode 100644
index 00000000..f789d71f
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-2.suppr
@@ -0,0 +1,3 @@
+[suppress_type]
+        type_kind = struct
+        has_data_member_inserted_at = offset_of(not_present)
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.c
new file mode 100644
index 00000000..b44b70d6
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.c
@@ -0,0 +1,10 @@
+struct foo
+{
+  long x;
+  char y;
+};
+
+int
+foo()
+{
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..d2f4b4f01aa6d68b7d6f75d3e8b221e250d038a4
GIT binary patch
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.c b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.c
--- /dev/null
+++ b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.c
@@ -0,0 +1,11 @@
+struct foo
+{
+  long x;
+  char y;
+  char z;
+};
+
+int
+foo()
+{
+}
diff --git a/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.o b/tests/data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..7f8e9f376f6f89c6f1ccccedfdc0cdad07eb2d2d
GIT binary patch
diff --git a/tests/test-diff-suppr.cc b/tests/test-diff-suppr.cc
--- a/tests/test-diff-suppr.cc
+++ b/tests/test-diff-suppr.cc
@@ -2276,6 +2276,46 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test-has-data-member-inserted-at-1-report-2.txt",
     "output/test-diff-suppr/test-has-data-member-inserted-at-1-report-2.txt"
   },
+  {
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.o",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.o",
+    "",
+    "",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2.suppr",
+    "--drop-private-types --no-default-suppression --non-reachable-types",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-report.txt",
+    "output/test-diff-suppr/test-has-data-member-inserted-at-2-report.txt"
+  },
+  {
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-v0.o",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-v1.o",
+    "",
+    "",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr",
+    "--drop-private-types --no-default-suppression --non-reachable-types",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt",
+    "output/test-diff-suppr/test-has-data-member-inserted-at-2-report.1.txt"
+  },
+  {
+    "data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.o",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.o",
+    "",
+    "",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2.suppr",
+    "--drop-private-types --no-default-suppression --non-reachable-types",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt",
+    "output/test-diff-suppr/test-has-data-member-inserted-at-2-report.2.txt"
+  },
+  {
+    "data/test-diff-suppr/test-has-data-member-inserted-at-3-v0.o",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-3-v1.o",
+    "",
+    "",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2.2.suppr",
+    "--drop-private-types --no-default-suppression --non-reachable-types",
+    "data/test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt",
+    "output/test-diff-suppr/test-has-data-member-inserted-at-2-report.3.txt"
+  },
   // This should be the last entry
   {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
 };
