diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc
index 323de503..72181367 100644
--- a/src/abg-reporter-priv.cc
+++ b/src/abg-reporter-priv.cc
@@ -411,16 +411,26 @@ represent(const var_diff_sptr	&diff,
 
   var_decl_sptr o = diff->first_var();
   var_decl_sptr n = diff->second_var();
+  string name1 = o->get_qualified_name();
+  string name2 = n->get_qualified_name();
+  uint64_t size1 = get_var_size_in_bits(o);
+  uint64_t size2 = get_var_size_in_bits(n);
+  uint64_t offset1 = get_data_member_offset(o);
+  uint64_t offset2 = get_data_member_offset(n);
 
   // Has the main diff text been output?
   bool emitted = false;
   // Are we continuing on a new line? (implies emitted)
   bool begin_with_and = false;
-  string name1 = o->get_qualified_name();
-  string name2 = n->get_qualified_name();
-  string pretty_representation = o->get_pretty_representation();
+  // Have we reported a size change already?
+  bool size_reported = false;
+  // Are we reporting a change to an anonymous member?
   bool is_strict_anonymous_data_member_change = false;
 
+  string pretty_representation = o->get_pretty_representation();
+  bool show_size_offset_changes = ctxt->get_allowed_category()
+				  & SIZE_OR_OFFSET_CHANGE_CATEGORY;
+
   if (is_anonymous_data_member(o) && is_anonymous_data_member(n))
     {
       is_strict_anonymous_data_member_change = true;
@@ -430,8 +440,7 @@ represent(const var_diff_sptr	&diff,
       if (tr1 != tr2)
 	{
 	  show_offset_or_size(indent + "anonymous data member at offset",
-			      get_data_member_offset(o),
-			      *ctxt, out);
+			      offset1, *ctxt, out);
 
 	  out << " changed from:\n"
 	      << indent << "  " << tr1 << "\n"
@@ -460,7 +469,6 @@ represent(const var_diff_sptr	&diff,
 	  begin_with_and = true;
 	  emitted = true;
 	}
-      // TODO: else ...?
     }
   else if (filtering::has_anonymous_data_member_change(diff))
     {
@@ -472,9 +480,7 @@ represent(const var_diff_sptr	&diff,
 	    + o->get_pretty_representation()
 	    + " at offset";
 
-	  show_offset_or_size(indent + repr,
-			      get_data_member_offset(o),
-			      *ctxt, out);
+	  show_offset_or_size(indent + repr, offset1, *ctxt, out);
 	  out << " became data member '"
 	      << n->get_pretty_representation()
 	      << "'\n";
@@ -486,9 +492,7 @@ represent(const var_diff_sptr	&diff,
 	    + o->get_pretty_representation()
 	    + " at offset";
 
-	  show_offset_or_size(indent + repr,
-			      get_data_member_offset(o),
-			      *ctxt, out);
+	  show_offset_or_size(indent + repr, offset1, *ctxt, out);
 	  out << " became anonymous data member '"
 	      << n->get_pretty_representation()
 	      << "'\n";
@@ -499,11 +503,15 @@ represent(const var_diff_sptr	&diff,
     }
   else if (diff_sptr d = diff->type_diff())
     {
-      if (local_only && d->has_local_changes())
+      if (ctxt->get_reporter()->diff_to_be_reported(d.get()))
 	{
-	  out << indent << "type '" << get_pretty_representation(o->get_type())
-	      << "' of '" << o->get_qualified_name()
-	      << "' changed";
+	  if (local_only)
+	    out << indent << "type '" << get_pretty_representation(o->get_type())
+		<< "' of '" << o->get_qualified_name()
+		<< "' changed";
+	  else
+	    out << indent
+		<< "type of '" << pretty_representation << "' changed";
 
 	  if (d->currently_reporting())
 	    {
@@ -521,30 +529,7 @@ represent(const var_diff_sptr	&diff,
 
 	  begin_with_and = true;
 	  emitted = true;
-	}
-      else
-	{
-	  if (ctxt->get_reporter()->diff_to_be_reported(d.get()))
-	    {
-	      out << indent
-		  << "type of '" << pretty_representation << "' changed";
-	      if (d->currently_reporting())
-		{
-		  out << ", as being reported\n";
-		}
-	      else if (d->reported_once())
-		{
-		  out << ", as reported earlier\n";
-		}
-	      else
-		{
-		  out << ":\n";
-		  d->report(out, indent + "  ");
-		}
-
-	      begin_with_and = true;
-	      emitted = true;
-	    }
+	  size_reported = true;
 	}
     }
 
@@ -589,9 +574,9 @@ represent(const var_diff_sptr	&diff,
 	out << "now becomes laid out";
       emitted = true;
     }
-  if ((ctxt->get_allowed_category() & SIZE_OR_OFFSET_CHANGE_CATEGORY))
+  if (show_size_offset_changes)
     {
-      if (get_data_member_offset(o) != get_data_member_offset(n))
+      if (offset1 != offset2)
 	{
 	  if (begin_with_and)
 	    {
@@ -600,26 +585,20 @@ represent(const var_diff_sptr	&diff,
 	    }
 	  else if (!emitted)
 	    {
+	      out << indent;
 	      if (is_strict_anonymous_data_member_change)
-		out << indent;
-	      else
-		out << indent << "'" << pretty_representation << "' ";
+		out << "anonymous data member ";
+	      out << "'" << pretty_representation << "' ";
 	    }
 	  else
 	    out << ", ";
 
-	  show_numerical_change("offset",
-				get_data_member_offset(o),
-				get_data_member_offset(n),
-				*ctxt, out);
+	  show_numerical_change("offset", offset1, offset2, *ctxt, out);
 	  maybe_show_relative_offset_change(diff, *ctxt, out);
-
 	  emitted = true;
 	}
-      if (// If we are not displaying only local changes, we must
-	  // have indicated the type size change already.
-	  local_only
-	  && (get_var_size_in_bits(o) != get_var_size_in_bits(n)))
+
+      if (!size_reported && size1 != size2)
 	{
 	  if (begin_with_and)
 	    {
@@ -628,18 +607,15 @@ represent(const var_diff_sptr	&diff,
 	    }
 	  else if (!emitted)
 	    {
+	      out << indent;
 	      if (is_strict_anonymous_data_member_change)
-		out << indent;
-	      else
-		out << indent << "'" << pretty_representation << "' ";
+		out << "anonymous data member ";
+	      out << "'" << pretty_representation << "' ";
 	    }
 	  else
 	    out << ", ";
 
-	  show_numerical_change("size",
-				get_var_size_in_bits(o),
-				get_var_size_in_bits(n),
-				*ctxt, out);
+	  show_numerical_change("size", size1, size2, *ctxt, out);
 	  maybe_show_relative_size_change(diff, *ctxt, out);
 	  emitted = true;
 	}
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index bb0fd83b..64e36b1a 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -140,6 +140,12 @@ test-abidiff-exit/test-leaf-cxx-members-v0.o \
 test-abidiff-exit/test-leaf-cxx-members-v1.cc \
 test-abidiff-exit/test-leaf-cxx-members-v1.o \
 test-abidiff-exit/test-leaf-cxx-members-report.txt \
+test-abidiff-exit/test-member-size-v0.cc \
+test-abidiff-exit/test-member-size-v0.o \
+test-abidiff-exit/test-member-size-v1.cc \
+test-abidiff-exit/test-member-size-v1.o \
+test-abidiff-exit/test-member-size-report0.txt \
+test-abidiff-exit/test-member-size-report1.txt \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
index 082db83e..eae74a3b 100644
--- a/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
+++ b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
@@ -35,8 +35,8 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
     type 'int' of 'ops::deleted_var' changed:
       type name changed from 'int' to 'long int'
       type size changed from 32 to 64 (in bits)
-    and name of 'ops::deleted_var' changed to 'ops::added_var' at test-leaf-cxx-members-v1.cc:2:1, size changed from 32 to 64 (in bits) (by +32 bits)
+    and name of 'ops::deleted_var' changed to 'ops::added_var' at test-leaf-cxx-members-v1.cc:2:1
     type 'int' of 'ops::changed_var' changed:
       type name changed from 'int' to 'long int'
       type size changed from 32 to 64 (in bits)
-    and offset changed from 96 to 128 (in bits) (by +32 bits), size changed from 32 to 64 (in bits) (by +32 bits)
+    and offset changed from 96 to 128 (in bits) (by +32 bits)
diff --git a/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt b/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
index bd5f36f8..7ab4dd6e 100644
--- a/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
+++ b/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
@@ -9,7 +9,6 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
     type 'int' of 'foo::z' changed:
       type name changed from 'int' to 'long int'
       type size changed from 32 to 64 (in bits)
-    and size changed from 32 to 64 (in bits) (by +32 bits)
 
 'struct ops1 at test-leaf-peeling-v0.cc:5:1' changed:
   type size hasn't changed
diff --git a/tests/data/test-abidiff-exit/test-leaf1-report.txt b/tests/data/test-abidiff-exit/test-leaf1-report.txt
index 9af6ccaa..aea08b81 100644
--- a/tests/data/test-abidiff-exit/test-leaf1-report.txt
+++ b/tests/data/test-abidiff-exit/test-leaf1-report.txt
@@ -40,4 +40,3 @@ Removed/Changed/Added variables summary: 1 Removed, 1 Changed, 1 Added variable
     type 'int' of 'changed::foo' changed:
       type name changed from 'int' to 'long int'
       type size changed from 32 to 64 (in bits)
-    and size changed from 32 to 64 (in bits) (by +32 bits)
diff --git a/tests/data/test-abidiff-exit/test-member-size-report0.txt b/tests/data/test-abidiff-exit/test-member-size-report0.txt
new file mode 100644
index 00000000..ff93dd50
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-member-size-report0.txt
@@ -0,0 +1,27 @@
+Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some indirect sub-type change:
+
+  [C] 'function void reg1(S*, T*, T*)' at test-member-size-v1.cc:26:1 has some indirect sub-type changes:
+    parameter 1 of type 'S*' has sub-type changes:
+      in pointed to type 'struct S' at test-member-size-v1.cc:3:1:
+        type size changed from 128 to 192 (in bits)
+        1 data member insertion:
+          'int S::y', at offset 128 (in bits) at test-member-size-v1.cc:6:1
+        no data member change (1 filtered);
+    parameter 2 of type 'T*' has sub-type changes:
+      in pointed to type 'struct T' at test-member-size-v1.cc:14:1:
+        type size changed from 192 to 256 (in bits)
+        2 data member changes:
+          'S T::s' size changed from 128 to 192 (in bits) (by +64 bits)
+          'int T::a' offset changed from 128 to 192 (in bits) (by +64 bits)
+
+  [C] 'function void reg2(U*)' at test-member-size-v1.cc:27:1 has some indirect sub-type changes:
+    parameter 1 of type 'U*' has sub-type changes:
+      in pointed to type 'struct U' at test-member-size-v1.cc:19:1:
+        type size changed from 192 to 256 (in bits)
+        2 data member changes:
+          anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits)
+          'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits)
+
diff --git a/tests/data/test-abidiff-exit/test-member-size-report1.txt b/tests/data/test-abidiff-exit/test-member-size-report1.txt
new file mode 100644
index 00000000..dbad76be
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-member-size-report1.txt
@@ -0,0 +1,21 @@
+Leaf changes summary: 3 artifacts changed
+Changed leaf types summary: 3 leaf types changed
+Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+'struct S at test-member-size-v0.cc:3:1' changed:
+  type size changed from 128 to 192 (in bits)
+  1 data member insertion:
+    'int S::y', at offset 128 (in bits) at test-member-size-v1.cc:6:1
+
+'struct T at test-member-size-v0.cc:13:1' changed:
+  type size changed from 192 to 256 (in bits)
+  there are data member changes:
+    type 'struct S' of 'T::s' changed, as reported earlier
+    'int T::a' offset changed from 128 to 192 (in bits) (by +64 bits)
+
+'struct U at test-member-size-v0.cc:18:1' changed:
+  type size changed from 192 to 256 (in bits)
+  there are data member changes:
+    anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits)
+    'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits)
diff --git a/tests/data/test-abidiff-exit/test-member-size-v0.cc b/tests/data/test-abidiff-exit/test-member-size-v0.cc
new file mode 100644
index 00000000..f974a37f
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-member-size-v0.cc
@@ -0,0 +1,26 @@
+struct M;
+
+struct S {
+  int x;
+  M * m;
+};
+
+struct M {
+  int a;
+  S * s;
+};
+
+struct T {
+  S s;
+  int a;
+};
+
+struct U {
+  struct {
+    S s;
+  };
+  int r;
+};
+
+void reg1(S*, T*, T*) { }
+void reg2(U*) { }
diff --git a/tests/data/test-abidiff-exit/test-member-size-v0.o b/tests/data/test-abidiff-exit/test-member-size-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..e020bef77d57d601420f969061707bbf1486ac99
GIT binary patch
diff --git a/tests/data/test-abidiff-exit/test-member-size-v1.cc b/tests/data/test-abidiff-exit/test-member-size-v1.cc
new file mode 100644
index 00000000..b3bd5988
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-member-size-v1.cc
@@ -0,0 +1,27 @@
+struct M;
+
+struct S {
+  int x;
+  M * m;
+  int y;
+};
+
+struct M {
+  int a;
+  S * s;
+};
+
+struct T {
+  S s;
+  int a;
+};
+
+struct U {
+  struct {
+    S s;
+  };
+  int r;
+};
+
+void reg1(S*, T*, T*) { }
+void reg2(U*) { }
diff --git a/tests/data/test-abidiff-exit/test-member-size-v1.o b/tests/data/test-abidiff-exit/test-member-size-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..eaec9ebead662bc23c00130c537133a5be5c2019
GIT binary patch
diff --git a/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt b/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
index 1583a40b..52c48b3d 100644
--- a/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
+++ b/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
@@ -10,4 +10,3 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
       type name changed from 'int[1]' to 'int[2]'
       array type size changed from 32 to 64
       array type subrange 1 changed length from 1 to 2
-    and size changed from 32 to 64 (in bits) (by +32 bits)
diff --git a/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt b/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
index 12af287b..2f8f31d0 100644
--- a/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
+++ b/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
@@ -13,6 +13,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
           'char S1::m1' offset changed from 64 to 40 (in bits) (by -24 bits)
         1 data member change:
           anonymous data member struct {int m0; char m01;} at offset 0 (in bits) became data member 'int S1::m0'
+          and size changed from 64 to 32 (in bits) (by -32 bits)
 
   [C] 'function void foo(S0&)' has some indirect sub-type changes:
     parameter 1 of type 'S0&' has sub-type changes:
diff --git a/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt b/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
index b8bb951c..ed68b550 100644
--- a/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
+++ b/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
@@ -12,5 +12,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
             struct {int b; float c;}
           to:
             struct {int b; float c; char e;}
+          and size changed from 64 to 96 (in bits) (by +32 bits)
           'int S2::d' offset changed from 96 to 128 (in bits) (by +32 bits)
 
diff --git a/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt b/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
index b1611303..2a679d60 100644
--- a/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
+++ b/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
@@ -78,7 +78,7 @@
                       type name changed from 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl' to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl'
                       type size changed from 128 to 192 (in bits)
                       1 data member change:
-                        name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node'
+                        name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node', size changed from 128 to 192 (in bits) (by +64 bits)
                     and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl'
 
 ================ end of changes of 'libsigc-2.0.so.0.0.0'===============
diff --git a/tests/data/test-diff-suppr/test36-leaf-report-0.txt b/tests/data/test-diff-suppr/test36-leaf-report-0.txt
index 9caa9428..fcbb9232 100644
--- a/tests/data/test-diff-suppr/test36-leaf-report-0.txt
+++ b/tests/data/test-diff-suppr/test36-leaf-report-0.txt
@@ -16,7 +16,6 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
   type size changed from 64 to 96 (in bits)
   there are data member changes:
     type 'struct leaf1' of 'leaf2::member0' changed, as reported earlier
-    and size changed from 32 to 64 (in bits) (by +32 bits)
     'char leaf2::member1' offset changed from 32 to 64 (in bits) (by +32 bits)
   3 impacted interfaces:
     function void interface1(struct_type*)
diff --git a/tests/data/test-diff-suppr/test46-PR25128-report-1.txt b/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
index 36439ce7..acff860c 100644
--- a/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
+++ b/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
@@ -13,5 +13,4 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
     type 'unsigned long int' of 'root_domain::max_cpu_capacity' changed:
       entity changed from 'unsigned long int' to 'struct max_cpu_capacity' at sched.h:722:1
       type size changed from 64 to 192 (in bits)
-    and size changed from 64 to 192 (in bits) (by +128 bits)
     'perf_domain* root_domain::pd' offset changed from 14528 to 14656 (in bits) (by +128 bits)
diff --git a/tests/data/test-diff-suppr/test46-PR25128-report-2.txt b/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
index 67dbf58f..79827103 100644
--- a/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
+++ b/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
@@ -9,5 +9,4 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
     type 'unsigned long int' of 'root_domain::max_cpu_capacity' changed:
       entity changed from 'unsigned long int' to 'struct max_cpu_capacity' at sched.h:722:1
       type size changed from 64 to 192 (in bits)
-    and size changed from 64 to 192 (in bits) (by +128 bits)
     'perf_domain* root_domain::pd' offset changed from 14528 to 14656 (in bits) (by +128 bits)
diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index 17523afa..97981a69 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -177,6 +177,24 @@ InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-leaf-cxx-members-report.txt",
     "output/test-abidiff-exit/test-leaf-cxx-members-report.txt"
   },
+  {
+    "data/test-abidiff-exit/test-member-size-v0.o",
+    "data/test-abidiff-exit/test-member-size-v1.o",
+    "",
+    "",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-member-size-report0.txt",
+    "output/test-abidiff-exit/test-member-size-report0.txt"
+  },
+  {
+    "data/test-abidiff-exit/test-member-size-v0.o",
+    "data/test-abidiff-exit/test-member-size-v1.o",
+    "",
+    "--leaf-changes-only",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-member-size-report1.txt",
+    "output/test-abidiff-exit/test-member-size-report1.txt"
+  },
   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };
 
