[RFC] Add qualifier / typedef / array / pointer test

Message ID 20201204165524.319806-1-gprocida@google.com
State Rejected, archived
Headers
Series [RFC] Add qualifier / typedef / array / pointer test |

Commit Message

Giuliano Procida Dec. 4, 2020, 4:55 p.m. UTC
  This change adds a test which exercises libabigail's handling of
qualified typedefs of arrays. The base type in the test case is an
array of pointers (chosen so we can also use restrict).

Various typedefs and (indirect) qualifications of this type are
created. In all cases, the resulting type should be an array of
qualified pointers.

However, abidiff reports things like

  'const volatile void* const'

changed to

  'restrict const volatile volatile void* const'

I've not attempted to check whether DWARF and ABI XML faithfully
reflect the source types. There may be trouble there as well.

For the record, these are the expected v0 types:

A = void *[7]
B = void *[7]
C = void *const[7]
D = void *const[7]
E = void *const volatile[7]
F = void *const volatile[7]
G = void *const volatile restrict[7]
H = void *const volatile restrict[7]

The v1 types should be these plus others with extra pointer
qualifiers.

	* tests/data/Makefile.am: Add new test files
	* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c:
	New test file.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o:
	New test file.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c:
	New test file.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o:
	New test file.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt:
	Plain diff report.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt:
	Harmless diff report.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt:
	Leaf changes report.
	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt:
	Harmless leaf changes report.
	* tests/test-abidiff-exit.cc: Run new test.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 tests/data/Makefile.am                        |   8 ++
 .../qualifier-typedef-array-report-0.txt      |   3 +
 .../qualifier-typedef-array-report-1.txt      |  81 ++++++++++++++++++
 .../qualifier-typedef-array-report-2.txt      |   5 ++
 .../qualifier-typedef-array-report-3.txt      |   5 ++
 .../qualifier-typedef-array-v0.c              |  37 ++++++++
 .../qualifier-typedef-array-v0.o              | Bin 0 -> 3352 bytes
 .../qualifier-typedef-array-v1.c              |  37 ++++++++
 .../qualifier-typedef-array-v1.o              | Bin 0 -> 3408 bytes
 tests/test-abidiff-exit.cc                    |  44 ++++++++++
 10 files changed, 220 insertions(+)
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c
 create mode 100644 tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o
  

Comments

Dodji Seketeli Dec. 10, 2020, 9:10 a.m. UTC | #1
Hello Giuliano,

Giuliano Procida <gprocida@google.com> a écrit:

> This change adds a test which exercises libabigail's handling of
> qualified typedefs of arrays. The base type in the test case is an
> array of pointers (chosen so we can also use restrict).
>
> Various typedefs and (indirect) qualifications of this type are
> created. In all cases, the resulting type should be an array of
> qualified pointers.
>
> However, abidiff reports things like
>
>   'const volatile void* const'
>
> changed to
>
>   'restrict const volatile volatile void* const'
>
> I've not attempted to check whether DWARF and ABI XML faithfully
> reflect the source types. There may be trouble there as well.

Yeah, or there might be a bug somewhere.  In any case, it'd be good to
look into this.  I didn't have time until now, but I feel adding these
tests is improvement already.  We can dig into this issue later.  Maybe
we should file a bug for it?

[...]

> diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
> index 84447185..516a7f4d 100644
> --- a/tests/data/Makefile.am
> +++ b/tests/data/Makefile.am
> @@ -184,6 +184,14 @@ test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.c \
>  test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.o \
>  test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.c \
>  test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.o \
> +test-abidiff-exit/qualifier-typedef-array-v0.c \
> +test-abidiff-exit/qualifier-typedef-array-v0.o \
> +test-abidiff-exit/qualifier-typedef-array-v1.c \
> +test-abidiff-exit/qualifier-typedef-array-v1.o \
> +test-abidiff-exit/qualifier-typedef-array-report0.txt \
> +test-abidiff-exit/qualifier-typedef-array-report1.txt \
> +test-abidiff-exit/qualifier-typedef-array-report2.txt \
> +test-abidiff-exit/qualifier-typedef-array-report3.txt \

There actual name of the reference report files that are added by the
patch is qualifier-typedef-array-report-{0-3}.txt.  Note the '-'
character before the {0-3}.  I fixed that when applying the patch.

[...]

> 	* tests/data/Makefile.am: Add new test files
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c:
> 	New test file.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o:
> 	New test file.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c:
> 	New test file.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o:
> 	New test file.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt:
> 	Plain diff report.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt:
> 	Harmless diff report.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt:
> 	Leaf changes report.
> 	* tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt:
> 	Harmless leaf changes report.
> 	* tests/test-abidiff-exit.cc: Run new test.
>
> Signed-off-by: Giuliano Procida <gprocida@google.com>

Applied to master.

Thanks!

[...]

Cheers,
  

Patch

diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 84447185..516a7f4d 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -184,6 +184,14 @@  test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.c \
 test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.o \
 test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.c \
 test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.o \
+test-abidiff-exit/qualifier-typedef-array-v0.c \
+test-abidiff-exit/qualifier-typedef-array-v0.o \
+test-abidiff-exit/qualifier-typedef-array-v1.c \
+test-abidiff-exit/qualifier-typedef-array-v1.o \
+test-abidiff-exit/qualifier-typedef-array-report0.txt \
+test-abidiff-exit/qualifier-typedef-array-report1.txt \
+test-abidiff-exit/qualifier-typedef-array-report2.txt \
+test-abidiff-exit/qualifier-typedef-array-report3.txt \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt
new file mode 100644
index 00000000..9666a8fd
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt
@@ -0,0 +1,3 @@ 
+Functions changes summary: 0 Removed, 0 Changed (1 filtered out), 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt
new file mode 100644
index 00000000..0d73ae03
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt
@@ -0,0 +1,81 @@ 
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C] 'function void fun(S*)' at qualifier-typedef-array-v1.c:37:1 has some indirect sub-type changes:
+    parameter 1 of type 'S*' has sub-type changes:
+      in pointed to type 'struct S' at qualifier-typedef-array-v1.c:10:1:
+        type size hasn't changed
+        12 data member changes:
+          type of 'A S::c_a' changed:
+            entity changed from 'typedef A' to compatible type 'void* const[7]'
+              array element type 'void*' changed:
+                entity changed from 'void*' to 'void* const'
+                type size hasn't changed
+              type size hasn't changed
+          type of 'A S::v_a' changed:
+            entity changed from 'typedef A' to compatible type 'void* volatile[7]'
+              array element type 'void*' changed:
+                entity changed from 'void*' to 'void* volatile'
+                type size hasn't changed
+              type size hasn't changed
+          type of 'A S::r_a' changed:
+            entity changed from 'typedef A' to compatible type 'void*[7]'
+          type of 'B S::c_b' changed:
+            typedef name changed from B to A at qualifier-typedef-array-v1.c:1:1
+            underlying type 'typedef A' at qualifier-typedef-array-v0.c:1:1 changed:
+              entity changed from 'typedef A' to compatible type 'void* const[7]'
+                array element type 'void*' changed:
+                  entity changed from 'void*' to 'void* const'
+                  type size hasn't changed
+                type size hasn't changed
+          type of 'B S::v_b' changed:
+            typedef name changed from B to A at qualifier-typedef-array-v1.c:1:1
+            underlying type 'typedef A' at qualifier-typedef-array-v0.c:1:1 changed:
+              entity changed from 'typedef A' to compatible type 'void* volatile[7]'
+                array element type 'void*' changed:
+                  entity changed from 'void*' to 'void* volatile'
+                  type size hasn't changed
+                type size hasn't changed
+          type of 'B S::r_b' changed:
+            typedef name changed from B to A at qualifier-typedef-array-v1.c:1:1
+            underlying type 'typedef A' at qualifier-typedef-array-v0.c:1:1 changed:
+              entity changed from 'typedef A' to compatible type 'void*[7]'
+          type of 'C S::v_c' changed:
+            entity changed from 'typedef C' to compatible type 'const volatile void* const[7]'
+              array element type 'void* const' changed:
+                'void* const' changed to 'const volatile void* const'
+              type name changed from 'void*[7]' to 'volatile void* const[7]'
+              type size hasn't changed
+          type of 'C S::r_c' changed:
+            entity changed from 'typedef C' to compatible type 'restrict void* const[7]'
+              array element type 'void* const' changed:
+                'void* const' changed to 'restrict const void* const'
+              type name changed from 'void*[7]' to 'restrict void* const[7]'
+              type size hasn't changed
+          type of 'D S::v_d' changed:
+            entity changed from 'typedef D' to compatible type 'const volatile void* const[7]'
+              array element type 'void* const' changed:
+                'void* const' changed to 'const volatile void* const'
+              type name changed from 'void*[7]' to 'volatile void* const[7]'
+              type size hasn't changed
+          type of 'D S::r_d' changed:
+            entity changed from 'typedef D' to compatible type 'restrict void* const[7]'
+              array element type 'void* const' changed:
+                'void* const' changed to 'restrict const void* const'
+              type name changed from 'void*[7]' to 'restrict void* const[7]'
+              type size hasn't changed
+          type of 'E S::r_e' changed:
+            entity changed from 'typedef E' to compatible type 'restrict const volatile void* const[7]'
+              array element type 'const volatile void* const' changed:
+                'const volatile void* const' changed to 'restrict const volatile volatile void* const'
+              type name changed from 'volatile void* const[7]' to 'restrict volatile void* const[7]'
+              type size hasn't changed
+          type of 'F S::r_f' changed:
+            entity changed from 'typedef F' to compatible type 'restrict const volatile void* const[7]'
+              array element type 'const volatile void* const' changed:
+                'const volatile void* const' changed to 'restrict const volatile volatile void* const'
+              type name changed from 'volatile void* const[7]' to 'restrict volatile void* const[7]'
+              type size hasn't changed
+
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt
new file mode 100644
index 00000000..b5b84c71
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt
@@ -0,0 +1,5 @@ 
+Leaf changes summary: 0 artifact changed
+Changed leaf types summary: 0 leaf type 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
+
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt
new file mode 100644
index 00000000..b5b84c71
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt
@@ -0,0 +1,5 @@ 
+Leaf changes summary: 0 artifact changed
+Changed leaf types summary: 0 leaf type 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
+
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c b/tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c
new file mode 100644
index 00000000..939a968e
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c
@@ -0,0 +1,37 @@ 
+typedef void * A[7];
+typedef A B;
+typedef const B C;
+typedef C D;
+typedef volatile D E;
+typedef E F;
+typedef restrict F G;
+typedef G H;
+
+struct S {
+  A c_a;
+  A v_a;
+  A r_a;
+  B c_b;
+  B v_b;
+  B r_b;
+  C c_c;
+  C v_c;
+  C r_c;
+  D c_d;
+  D v_d;
+  D r_d;
+  E c_e;
+  E v_e;
+  E r_e;
+  F c_f;
+  F v_f;
+  F r_f;
+  G c_g;
+  G v_g;
+  G r_g;
+  H c_h;
+  H v_h;
+  H r_h;
+};
+
+void fun(struct S * s) { (void) s; }
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o b/tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..9be7f99d5c271a5db02b6df590bac41031804916
GIT binary patch
literal 3352
zcmbtWU1%It6h3!mZ+4Q|-E6W+n>4lEme#i5Zc~5Sw9<Clv`wm|M5Q2t#@XH3A5123
zb~jBFX(^)itp(9aeJB(~eDXyQUs_Nfd=bGHUz8$<AU@a!q2PmlXZGG?cCuB_19R{B
z&iT$c_nx_Tb}yVfbIK5cv<NyvYe-v(p0(EWLZB8XLxXf~`tr}ymtVVg<@ql@G>Bq>
z%L+0i)*{-P9WoflNQm?SSj@8+rtrjg=pkvvF;kBfXNNU|q4yjH<2VV!&apO0!W>{N
zUT1iMM9gL_zRd6>2|4ru!#6QlS33riQ+<j@RWnYJ=&_j?XRCFqV=$&j#E0&(_d9m{
z&@q_L0dntju4xjM&BQocExTjrdxi>9^jYW8Cc8B2kgz51f$Sv)i2zL4K7(Wc7C|eL
zNXc2SJ^~G(KLB?UK7(`sMns}CTOu(a8{o}|#1f;y0KFx^1j+>HHZ#j4hU6tM?=cf-
zI6&hDm_Qo>R5QSINo<twfO*3J6KF(U2l}3wK%?>oP}&5uLSmEr5@^~46KG6+4Rp~2
z6KJ#i2Iw<pR!KY{e**fQnLu0QFF?CvU;=HGzX81%1G7dVE7NG<wHTN{+vG6Nx6B0E
zE;n&|B_%5@kHpR%#08>HnRx#uI-P33H_V!GwMPBcRs^9{VrMF2o2jwXfEbLYH^RGt
zOzV*SxP8z*ox!0L;&etpiEX3PnZ3v<caUu#K@5&&KUBQr2jRjJ9t)=41Hsgn5vFC!
zb|y|>Cqs!R5SHjLNTOt3939ogca8Fj3M20xALZzj3`H9wMEzWw%hE%5uq{aFY69u~
z2d>cY6m*jw!6?L^sU*hW+M^$WUT!&a^-A6KbIp}Sx9nDOj_*4wxux-ZDM%qlsJC5=
zv+NLZ$0fr=im9{bvXlD`WcQ8dAI^_wbMwuX=N_)Qp6l03fR10P9bTT;pWFXvHdoE&
zDo$g?E7kl3Z=u!5wY>9nubgW-#W}Y@a|>QI+wvOqs^^xob+1W#oAZnRvbL$o$wS%Q
zC){G)@zg4E2lprqYaI%fk3GKfG>PT37)!*hE7<d9*!f`zI(96Te#4kd_M8HtZSFeq
z@rlvhzq&cmkZxvleYJHReiNQ<Vye$*)Mw)B*iB3dzL@J=CiSkfvBA9088In&A3hF!
z7cptwC!V%|HyG-}>S_GPBgR*_EqaH2fLdpduEh56t_Ii%(f0OnB^qv<SM4t-JgR1X
zQ{lI=C&UlG|0hCru6st|3o1C8N3WUJgS)*dX{AN^$M0j$Dm#}6uaokPm3dqk%uT;N
z*R<Ajmz$I?J57i3#YThjzB}jS%Wkn%ovnM71^5EpDHeTqsl)B~j#tGU42R6sJy(aI
z1m#N$^YbpQW!_t8x_MmvT%+lfUQ$7BZMNb&^R8O>|D47U&%M(9)aeRJSv^+@GdC>T
z0N572VNZrhAw3$u3qC#v|22LeVxu{^oUZ?I$4gz$<*z&cnJVB3%N5m-+ser2ih26X
z;wK`I!x+2O|3lUNO7Zj*<?`RIsExUwtA>p0Ks86Xyw7gypHZJG9nb4$Q*`}h*rGXM
zqF+^g{u>vTD3|{-b*q0-)z^LE`h2gW^%r5|oO+#513Ah`As2&jZP4}g{3=}C;%}+=
zt!tryrsMSdx{8m`=tmVFwd*)-e^13njv3ui@e`V;X1#xHej5r?3)-OOYhC)szYaQH
z_m$TZt<5P$)JJhfEttRG{Hqg<=XVmldoWQ=o&W6&LK59S=j|5%iCX{7P%Nv__`d;!
CO%PN7

literal 0
HcmV?d00001

diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c b/tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c
new file mode 100644
index 00000000..67e3e83c
--- /dev/null
+++ b/tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c
@@ -0,0 +1,37 @@ 
+typedef void * A[7];
+typedef A B;
+typedef const B C;
+typedef C D;
+typedef volatile D E;
+typedef E F;
+typedef restrict F G;
+typedef G H;
+
+struct S {
+  const A c_a;     // +const
+  volatile A v_a;  // +volatile
+  restrict A r_a;  // +restrict
+  const B c_b;     // +const
+  volatile B v_b;  // +volatile
+  restrict B r_b;  // +restrict
+  const C c_c;     // same
+  volatile C v_c;  // +volatile
+  restrict C r_c;  // +restrict
+  const D c_d;     // same
+  volatile D v_d;  // +volatile
+  restrict D r_d;  // +restrict
+  const E c_e;     // same
+  volatile E v_e;  // same
+  restrict E r_e;  // +restrict
+  const F c_f;     // same
+  volatile F v_f;  // same
+  restrict F r_f;  // +restrict
+  const G c_g;     // same
+  volatile G v_g;  // same
+  restrict G r_g;  // same
+  const H c_h;     // same
+  volatile H v_h;  // same
+  restrict H r_h;  // same
+};
+
+void fun(struct S * s) { (void) s; }
diff --git a/tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o b/tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..f9e2188c346a65dbe2e8315d20f987970735987f
GIT binary patch
literal 3408
zcmbtWU2GIp6h3!;+NHCdZvUXA2n#6!i8HjKP|#va`6-c@s=*hdb#{05C$`f%yIWd~
zkr1Qs28r=6K9Cp_!;6pdCW)Hpi{X*PXbg$bNAW>Pc+l_6-dm>ADGz#+Irn_$eCM2d
z&)m7YZ=E=EQWJvI5OkF8BV{GJoVl-0MCt_fQV*S-zVz$#r8n<he(CF<H6kN&Wugq(
z`w=b8iW#&?5+XMVi|#-eEX)GLvv}HGWI;N+4HoU0c1X%(bfy?3h)p#XtZ7pu^lna|
zFEcz&!mwD=-(`4$gxU86!}lSKt4f%h;43_;8gmRbL_#}BqRrwE{Rg()QbIdLqP@=)
zaQw!$J8Og)0QSSFvNF+NLnO3m5*dr*^kKHSYedKMG+~O4%*W`YRh;!mSQht#tR)6n
z`vvG@R>+{!o&;C~tw6%I4gq`)8bFu*B)~7(kU`Go#tevTakfaJ+qwWWBeF}3dhBn2
zE($P#dhKf{dxM!J5`ESc`0g?jsNen`XhZ`OXmiA@YGC>#wpgFRcU1!uXu!S(bc>ll
zgZ5TzFsFlACb8A}3BG9^OrRnAHqdz;OrUM{4lu7XvqIt_>o55JU?$LZ`yS9<15BVD
zHXqPe3^1!C^40;M4-GJZcG_b=H<<~v%N_^Hm}J%w&%0AEg&W*iZU!WFx4{(+bvnf-
zKf-I*;p=BjyHcgD%rRs_|HN*)*V64FyIb_M=eEGRne@yN>j~?yb-EXC^<m=4cs!a+
zAx`%S;I^H>`%$5Nm@MlkGGJX@P;rD0MbwU7p=T_!m5D>F&RF6x5VLCxCN|)Trv_E=
zJ%hZWiGdG}4RW+?#-g<WqAsq+OQT2dU|SfmPZ~(=KXSzcA3&WBKniis?u3l43-m+K
zYfW#iR<8M>(^y&bOMcn$!q8iBmPXxTl)@aKO|4>_WmuTQ7c?CyPCaurKQ($NKRV(*
z>W<`{`9?GF$18r|hqWT07Z$7I%VP(fgOBB%O5Q1Z^_8Gl4HtriX5DE9=W0R8X?TS>
zzfN-tK_%Y|>a|MXm-4ls@!)0cZ_F<eotm0DlHYsWFVwt1uEIIIPik0eU$lJe@%86O
zEa${fwmowhd)@{+KRlw2P1?D4w5iUvlOVLrsgjS6L3jR1bD|+>W^{eEb!+@OJZVFh
z*Kg9N<1S4bIz_kYI+sqH*4fygZ*WF*>fC^jW1cc}TKCgH+rjIJ^<niiKJbX~C)^rp
zhaG@QXOF7H_V}*4*@>a-FSj7|%URjqka$qe{HEe>WnYXRfB!0<%5z5YzLdeqJZjC%
z$G5#Ya#Bn3k8NPjOFNf|uan&R$~-<8%#E-$SC!WAmmB1kyoN_^p<X99^yfUc<QJNi
z*;-IufG^U$LLu~**0{aU3o7^q;~{gkz*iwCL2hwje%{At=>`i8-^Hiz)Ei#$RT<=0
zXUm~C@5_b%&uIwp+$+^jm2N^RtLI8$=ElcP0JbH+u&3jsn4XN^10SD*{~AAv*kn#F
zr|REc^HSGy`F7_&VH0@b<2%`q8`8+<ih1hH;wK^+<B)0f9l4=zB~MLB?#u@9f6Dj~
z6)5LqJnu7Y{TJm`rQ&)0Y)Y=b1Y0sEOtg!WVw`PFt1`)*g(t24by;8aiR<%ylB~Z7
z8|PH(gc^-=vi^CA)uigHneUsl_`hZR4izY86{qI6Wqg80o8y;C%&Fp(=_47RIA$~;
z<Hr<H&T9Y4{2r9F{@qOJAOAY2c-2>4PqH@Wo{{xu<bwJB=3kv;Jin9Vw+9nlmFIsK
WgV;#!pYx{0|1Q`6X)Ko2Wc<Hh@E0`z

literal 0
HcmV?d00001

diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index bb0262bb..021d2707 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -337,6 +337,50 @@  InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt",
     "output/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt"
   },
+  {
+    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
+    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
+    "",
+    "",
+    "",
+    "",
+    abigail::tools_utils::ABIDIFF_OK,
+    "data/test-abidiff-exit/qualifier-typedef-array-report-0.txt",
+    "output/test-abidiff-exit/qualifier-typedef-array-report-0.txt"
+  },
+  {
+    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
+    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
+    "",
+    "",
+    "",
+    "--harmless",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/qualifier-typedef-array-report-1.txt",
+    "output/test-abidiff-exit/qualifier-typedef-array-report-1.txt"
+  },
+  {
+    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
+    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
+    "",
+    "",
+    "",
+    "--leaf-changes-only",
+    abigail::tools_utils::ABIDIFF_OK,
+    "data/test-abidiff-exit/qualifier-typedef-array-report-2.txt",
+    "output/test-abidiff-exit/qualifier-typedef-array-report-2.txt"
+  },
+  {
+    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
+    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
+    "",
+    "",
+    "",
+    "--harmless --leaf-changes-only",
+    abigail::tools_utils::ABIDIFF_OK,
+    "data/test-abidiff-exit/qualifier-typedef-array-report-3.txt",
+    "output/test-abidiff-exit/qualifier-typedef-array-report-3.txt"
+  },
   {0, 0, 0 ,0, 0, 0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };