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
