Hi Martin, On Tue, Aug 06, 2024 at 03:37:13PM GMT, Martin Uecker wrote: > Am Dienstag, dem 06.08.2024 um 14:22 +0200 schrieb Alejandro Colomar: > > Hi! > > > > - The tests seem to work as expected if I compile them manually, and > > run (the one that should be run) as a normal program. The one that > > should not be run also gives the expected diagnostics. > > Can anyone give advice of why it's not running well under the test > > suite? > > What is the output? You get an additional warning / error.
$ /opt/local/gnu/gcc/lengthof/bin/gcc gcc/testsuite/gcc.dg/lengthof-compile.c gcc/testsuite/gcc.dg/lengthof-compile.c: In function ‘incomplete’: gcc/testsuite/gcc.dg/lengthof-compile.c:10:19: error: invalid application of ‘lengthof’ to incomplete type ‘int[]’ 10 | n = __lengthof__(x); /* { dg-error "incomplete" } */ | ^ gcc/testsuite/gcc.dg/lengthof-compile.c:14:19: error: invalid application of ‘lengthof’ to type ‘int *’ 14 | n = __lengthof__(p); /* { dg-error "invalid" } */ | ^ gcc/testsuite/gcc.dg/lengthof-compile.c: In function ‘fam’: gcc/testsuite/gcc.dg/lengthof-compile.c:26:19: error: invalid application of ‘lengthof’ to incomplete type ‘int[]’ 26 | n = __lengthof__(s.fam); /* { dg-error "incomplete" } */ | ^ gcc/testsuite/gcc.dg/lengthof-compile.c: In function ‘func’: gcc/testsuite/gcc.dg/lengthof-compile.c:41:20: error: passing argument 3 of ‘fix_fix’ from incompatible pointer type [-Wincompatible-pointer-types] 41 | fix_fix(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ | ^~~ | | | int (*)[5] gcc/testsuite/gcc.dg/lengthof-compile.c:29:44: note: expected ‘int (*)[3]’ but argument is of type ‘int (*)[5]’ 29 | void fix_fix(int i, char (*a)[3][5], int (*x)[__lengthof__(*a)]); | ~~~~~~^~~~~~~~~~~~~~~~~~~~ gcc/testsuite/gcc.dg/lengthof-compile.c:44:20: error: passing argument 3 of ‘fix_var’ from incompatible pointer type [-Wincompatible-pointer-types] 44 | fix_var(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ | ^~~ | | | int (*)[5] gcc/testsuite/gcc.dg/lengthof-compile.c:30:44: note: expected ‘int (*)[3]’ but argument is of type ‘int (*)[5]’ 30 | void fix_var(int i, char (*a)[3][i], int (*x)[__lengthof__(*a)]); | ~~~~~~^~~~~~~~~~~~~~~~~~~~ gcc/testsuite/gcc.dg/lengthof-compile.c:47:20: error: passing argument 3 of ‘fix_uns’ from incompatible pointer type [-Wincompatible-pointer-types] 47 | fix_uns(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ | ^~~ | | | int (*)[5] gcc/testsuite/gcc.dg/lengthof-compile.c:31:44: note: expected ‘int (*)[3]’ but argument is of type ‘int (*)[5]’ 31 | void fix_uns(int i, char (*a)[3][*], int (*x)[__lengthof__(*a)]); | ~~~~~~^~~~~~~~~~~~~~~~~~~~ $ /opt/local/gnu/gcc/lengthof/bin/gcc gcc/testsuite/gcc.dg/lengthof-compile.c |& grep ' error: ' gcc/testsuite/gcc.dg/lengthof-compile.c:10:19: error: invalid application of ‘lengthof’ to incomplete type ‘int[]’ gcc/testsuite/gcc.dg/lengthof-compile.c:14:19: error: invalid application of ‘lengthof’ to type ‘int *’ gcc/testsuite/gcc.dg/lengthof-compile.c:26:19: error: invalid application of ‘lengthof’ to incomplete type ‘int[]’ gcc/testsuite/gcc.dg/lengthof-compile.c:41:20: error: passing argument 3 of ‘fix_fix’ from incompatible pointer type [-Wincompatible-pointer-types] gcc/testsuite/gcc.dg/lengthof-compile.c:44:20: error: passing argument 3 of ‘fix_var’ from incompatible pointer type [-Wincompatible-pointer-types] gcc/testsuite/gcc.dg/lengthof-compile.c:47:20: error: passing argument 3 of ‘fix_uns’ from incompatible pointer type [-Wincompatible-pointer-types] $ /opt/local/gnu/gcc/lengthof/bin/gcc gcc/testsuite/gcc.dg/lengthof-compile.c |& grep ' error: ' | wc -l 6 I count 6, which is what I expect: $ grep dg-error gcc/testsuite/gcc.dg/lengthof-compile.c n = __lengthof__(x); /* { dg-error "incomplete" } */ n = __lengthof__(p); /* { dg-error "invalid" } */ n = __lengthof__(s.fam); /* { dg-error "incomplete" } */ fix_fix(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ fix_var(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ fix_uns(5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */ $ grep dg-error gcc/testsuite/gcc.dg/lengthof-compile.c | wc -l 6 When running `make check -j24 -Orecurse |& tee log`, this is what I see: FAIL: gcc.dg/lengthof-compile.c (test for excess errors) Is there any way to see more details? > > - I don't like the fact that [*][n] is internally implemented exactly > > like [0][n], which makes them indistinguishable. All other cases of > > [0] return a constent expression of value 0, but [0][n] must return a > > variable 0, to keep support for [*][n]. > > Could you please change the way [*][n] (and thus [*]) is represented > > internally so that it can be differentiated from [0]? > > Do you have in mind any other way that would be a viable > > implementation of [*] that would allow distinguishing [0][n] and > > [*][n]? Maybe making it to have one node instead of zero and mark > > that node specially? > > The C++ frontend encodes zero-sized arrays using a range of [0,-1]. > I have a half-finished patch which implements this for the C FE. Thanks! I guess your patch will be merged before mine, so please ping me when that happens so I update mine for it. BTW, do you allow me to use Co-developed-by: you? Have a lovely day! Alex -- <https://www.alejandro-colomar.es/>
signature.asc
Description: PGP signature