@@ -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 \
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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; }
new file mode 100644
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
new file mode 100644
@@ -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; }
new file mode 100644
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
@@ -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}
};
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