Hi,The address [email protected] is not bouncing. Its my email address,
and I'm getting the emails in this discussion just fine.However, I don't think
I have anything to contribute here, so I don't object to being removed from the
discussion. I am not a gcc developer, but as a long term user I occasionally
post on the developer mailing list. I don't remember having posted about a
potential __lengthof__ operator, but it is certainly possible. On behalf of all
gcc users, thank you for your efforts in working to improve gcc, no matter how
this proposal turns out.Mvh.,David [email protected]
-------- Original message --------From: Alejandro Colomar <[email protected]>
Date: 07/08/2024 01:26 (GMT+01:00) To: [email protected] Cc: Martin
Uecker <[email protected]>, Xavier Del Campo Romero <[email protected]>,
Joseph Myers <[email protected]>, Gabriel Ravier <[email protected]>, Jakub
Jelinek <[email protected]>, Kees Cook <[email protected]>, Qing Zhao
<[email protected]>, Jens Gustedt <[email protected]>, David Brown
<[email protected]>, Florian Weimer <[email protected]>, Andreas Schwab
<[email protected]> Subject: Re: [PATCH v5 0/3] c: Add __lengthof__
operator <[email protected]> is bouncing. FYI. I've removed it.On Wed,
Aug 07, 2024 at 01:12:00AM GMT, Alejandro Colomar wrote:> Hi!> > This is ready
for review.> > v5:> > - Add changelog entries.> - Wording fixes in commit
messages.> - s/sizeof/lengthof/ in comment.> - CC += David, Florian, Andreas
[Qing]> - Docs: Remove some details about future directions. [Qing]> - Docs:
Add examples. [Qing]> - Docs: Clarify when __lengthof__ evaluates as a
constant expression> and when it evaluates as a run-time value. [Joseph,
Qing]> - Tests: Use several -Wno-* flags to turn off unwanted warnings.>
[Martin, Joseph]> - Tests: Merge into the same commit that adds the feature.>
- Tests: Fix style (whitespace).> > I won't paste the example program I used
for development, since it's the> same as in v4. Check that cover letter if
necessary.> > When reviewing, mind that some parts of the code have been
blindly> pasted from sizeof, and might not make much sense; I didn't fully>
understand some parts. However, it seems to behave well, and more or> less it
makes sense. Just be careful about it.> > At the bottom of this message is the
range-diff against v4.> > Have a lovely night!> Alex> > > BTW, I've tested that
there are no regressions:> > alx@debian:~/src/gnu/gcc$ find len0 -type f>
len0/host-x86_64-pc-linux-gnu/gcc/testsuite/gcc/gcc.sum>
len0/host-x86_64-pc-linux-gnu/gcc/testsuite/gfortran/gfortran.sum>
len0/host-x86_64-pc-linux-gnu/gcc/testsuite/objc/objc.sum>
len0/host-x86_64-pc-linux-gnu/gcc/testsuite/g++/g++.sum>
len0/x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum>
len0/x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum>
len0/x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum>
len0/x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum>
alx@debian:~/src/gnu/gcc$ find len1 -type f>
len1/host-x86_64-pc-linux-gnu/gcc/testsuite/gcc/gcc.sum>
len1/host-x86_64-pc-linux-gnu/gcc/testsuite/gfortran/gfortran.sum>
len1/host-x86_64-pc-linux-gnu/gcc/testsuite/objc/objc.sum>
len1/host-x86_64-pc-linux-gnu/gcc/testsuite/g++/g++.sum>
len1/x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum>
len1/x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum>
len1/x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum>
len1/x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum>
alx@debian:~/src/gnu/gcc$ cat <(cd len0; find -type f) \>
| while read f; do> diff -u
"len0/$f" "len1/$f";> done;> ---
len0/./host-x86_64-pc-linux-gnu/gcc/testsuite/gcc/gcc.sum 2024-08-06>
+22:22:44.514175252 +0200> +++
len1/./host-x86_64-pc-linux-gnu/gcc/testsuite/gcc/gcc.sum 2024-08-06>
+23:29:53.693730123 +0200> @@ -1,4 +1,4 @@> -Test run by alx on Tue
Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024> Native
configuration is x86_64-pc-linux-gnu> > === gcc tests
===> @@ -86504,6 +86504,15 @@> PASS: gcc.dg/large-size-array.c
(test for errors, line 19)> PASS: gcc.dg/large-size-array.c (test for excess
errors)> UNSUPPORTED: gcc.dg/lazy-ptr-test.c> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 11)> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 15)> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 27)> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 42)> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 45)> +PASS:
gcc.dg/lengthof-compile.c (test for errors, line 48)> +PASS:
gcc.dg/lengthof-compile.c (test for excess errors)> +PASS:
gcc.dg/lengthof.c (test for excess errors)> +PASS: gcc.dg/lengthof.c
execution test> PASS: gcc.dg/limits-width-1.c (test for excess errors)>
PASS: gcc.dg/limits-width-2.c (test for excess errors)> PASS:
gcc.dg/live-patching-1.c (test for excess errors)> @@ -204639,7 +204648,7
@@> > === gcc Summary ===> > -# of expected passes
199780> +# of expected passes 199789> # of
unexpected failures 31> # of unexpected successes 2> # of
expected failures 1463> ---
len0/./host-x86_64-pc-linux-gnu/gcc/testsuite/gfortran/gfortran.sum 2024-08-06>
+22:22:44.546175561 +0200> +++
len1/./host-x86_64-pc-linux-gnu/gcc/testsuite/gfortran/gfortran.sum 2024-08-06>
+23:29:53.877731933 +0200> @@ -1,4 +1,4 @@> -Test run by alx on
Tue Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024>
Native configuration is x86_64-pc-linux-gnu> > ===
gfortran tests ===> ---
len0/./host-x86_64-pc-linux-gnu/gcc/testsuite/objc/objc.sum 2024-08-06>
+22:22:44.462174752 +0200> +++
len1/./host-x86_64-pc-linux-gnu/gcc/testsuite/objc/objc.sum 2024-08-06>
+23:29:53.845731618 +0200> @@ -1,4 +1,4 @@> -Test run by alx on Tue
Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024> Native
configuration is x86_64-pc-linux-gnu> > === objc tests
===> --- len0/./host-x86_64-pc-linux-gnu/gcc/testsuite/g++/g++.sum
2024-08-06> +22:22:44.622176292 +0200> +++
len1/./host-x86_64-pc-linux-gnu/gcc/testsuite/g++/g++.sum 2024-08-06>
+23:29:53.781730989 +0200> @@ -1,4 +1,4 @@> -Test run by alx on Tue
Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024> Native
configuration is x86_64-pc-linux-gnu> > === g++ tests
===> --- len0/./x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum
2024-08-06> +22:22:46.206191541 +0200> +++
len1/./x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum 2024-08-06>
+23:29:55.573748613 +0200> @@ -1,4 +1,4 @@> -Test run by alx on Tue
Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024> Native
configuration is x86_64-pc-linux-gnu> > === libitm
tests ===> --- len0/./x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum
2024-08-06> +22:22:45.694186612 +0200> +++
len1/./x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum 2024-08-06>
+23:29:54.717740194 +0200> @@ -1,4 +1,4 @@> -Test run by alx on Tue
Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024> Native
configuration is x86_64-pc-linux-gnu> > === libgomp
tests ===> --- len0/./x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum
2024-08-06> +22:22:46.110190617 +0200> +++
len1/./x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum 2024-08-06>
+23:29:55.393746843 +0200> @@ -1,4 +1,4 @@> -Test run by alx on
Tue Aug 6 19:28:53 2024> +Test run by alx on Tue Aug 6 22:49:12 2024>
Native configuration is x86_64-pc-linux-gnu> > ===
libatomic tests ===> ---
len0/./x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum 2024-08-06>
+22:22:45.998189539 +0200> +++
len1/./x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum 2024-08-06>
+23:29:55.137744325 +0200> @@ -1,4 +1,4 @@> -Test run by alx on
Tue Aug 6 19:28:54 2024> +Test run by alx on Tue Aug 6 22:49:13 2024>
Native configuration is x86_64-pc-linux-gnu> > ===
libstdc++ tests ===> > > > > > Alejandro Colomar (3):> gcc/: Rename
array_type_nelts() => array_type_nelts_minus_one()> Merge definitions of
array_type_nelts_top()> c: Add __lengthof__ operator> >
gcc/c-family/c-common.cc | 26 +++++> gcc/c-family/c-common.def
| 3 +> gcc/c-family/c-common.h | 2 +>
gcc/c/c-decl.cc | 30 ++++--> gcc/c/c-fold.cc
| 7 +-> gcc/c/c-parser.cc | 61
+++++++++---> gcc/c/c-tree.h | 4 +>
gcc/c/c-typeck.cc | 114 ++++++++++++++++++++->
gcc/config/aarch64/aarch64.cc | 2 +-> gcc/config/i386/i386.cc
| 2 +-> gcc/cp/cp-tree.h | 1 ->
gcc/cp/decl.cc | 2 +-> gcc/cp/init.cc
| 8 +-> gcc/cp/lambda.cc | 3 +->
gcc/cp/operators.def | 1 +> gcc/cp/tree.cc
| 13 ---> gcc/doc/extend.texi | 23 +++++>
gcc/expr.cc | 8 +-> gcc/fortran/trans-array.cc
| 2 +-> gcc/fortran/trans-openmp.cc | 4 +->
gcc/rust/backend/rust-tree.cc | 13 --->
gcc/rust/backend/rust-tree.h | 2 -> gcc/target.h
| 3 +> gcc/testsuite/gcc.dg/lengthof-compile.c | 49 +++++++++>
gcc/testsuite/gcc.dg/lengthof.c | 127 ++++++++++++++++++++++++>
gcc/tree.cc | 17 +++-> gcc/tree.h
| 3 +-> 27 files changed, 451 insertions(+), 79 deletions(-)>
create mode 100644 gcc/testsuite/gcc.dg/lengthof-compile.c> create mode 100644
gcc/testsuite/gcc.dg/lengthof.c> > Range-diff against v4:> 1: 73010cb4af6 = 1:
73010cb4af6 gcc/: Rename array_type_nelts() => array_type_nelts_minus_one()>
2: 2bb966a0a89 ! 2: 9b835478721 Merge definitions of array_type_nelts_top()>
@@ Commit message> Merge definitions of array_type_nelts_top()>
> There were two identical definitions, and none of them are
available> - where they are needed for implementing __lengthof__().
Merge them, and> + where they are needed for implementing __lengthof__.
Merge them, and> provide the single definition in gcc/tree.{h,cc},
where it's available> - for __lengthof__().> + for __lengthof__,
which will be added in the following commit.> +> + gcc/ChangeLog:>
+> + * tree.h (array_type_nelts_top):> + *
tree.cc (array_type_nelts_top): Define function (moved from> +
gcc/cp/).> +> + gcc/cp/ChangeLog:> +> + *
cp-tree.h (array_type_nelts_top):> + * tree.cc
(array_type_nelts_top): Remove function (move> + to gcc/).>
+> + gcc/rust/ChangeLog:> +> + * backend/rust-tree.h
(array_type_nelts_top):> + * backend/rust-tree.cc
(array_type_nelts_top): Remove function.> > Signed-off-by:
Alejandro Colomar <[email protected]>> > 3: e2dbfc43b14 ! 3: af05d01e68d
c: Add __lengthof__() operator (n2529)> @@ Metadata> Author: Alejandro
Colomar <[email protected]>> > ## Commit message ##> - c: Add
__lengthof__() operator (n2529)> + c: Add __lengthof__ operator> >
- This operator is similar to sizeof() but can only be applied to an>
- array, and returns its length (number of elements).> + This
operator is similar to sizeof but can only be applied to an array,> +
and returns its length (number of elements).> > FUTURE
DIRECTIONS:> > - We could make it work with array
parameters to functions, and> - somehow magically return the
length designator of the array,> - regardless of it being really
a pointer.> + We could make it work with array parameters to
functions, and> + somehow magically return the length designator of
the array,> + regardless of it being really a pointer.> > -
Link: <https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2529.pdf>> -
Link: <https://inbox.sourceware.org/gcc/[email protected]/T/>> -
Suggested-by: Xavier Del Campo Romero <[email protected]>> -
Co-developed-by: Martin Uecker <[email protected]>> - Cc: Gabriel Ravier
<[email protected]>> Cc: Joseph Myers <[email protected]>> +
Cc: Gabriel Ravier <[email protected]>> Cc: Jakub Jelinek
<[email protected]>> Cc: Kees Cook <[email protected]>>
Cc: Qing Zhao <[email protected]>> Cc: Jens Gustedt
<[email protected]>> + Cc: David Brown <[email protected]>>
+ Cc: Florian Weimer <[email protected]>> + Cc: Andreas Schwab
<[email protected]>> +> + gcc/ChangeLog:> +> +
* doc/extend.texi: Document __lengthof__ operator.> + *
target.h (enum type_context_kind): Add __lengthof__ operator.> +> +
gcc/c-family/ChangeLog:> +> + * c-common.h:> +
* c-common.def:> + * c-common.cc (c_lengthof_type): Add
__lengthof__ operator.> +> + gcc/c/ChangeLog:> +> +
* c-tree.h> + (c_expr_lengthof_expr, c_expr_lengthof_type):>
+ * c-decl.cc> + (start_struct, finish_struct):>
+ (start_enum, finish_enum):> + * c-parser.cc> +
(c_parser_sizeof_expression):> +
(c_parser_lengthof_expression):> +
(c_parser_sizeof_or_lengthof_expression):> +
(c_parser_unary_expression):> + * c-typeck.cc> +
(build_external_ref):> + (record_maybe_used_decl,
pop_maybe_used):> + (is_top_array_vla):> +
(c_expr_lengthof_expr, c_expr_lengthof_type):> + Add
__lengthof__operator.> +> + gcc/cp/ChangeLog:> +> +
* operators.def: Add __lengthof__ operator.> +> +
gcc/testsuite/ChangeLog:> +> + * gcc.dg/lengthof-compile.c:>
+ * gcc.dg/lengthof.c: Add tests for __lengthof__ operator.>
+> + Link: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2529.pdf>
+ Link: https://inbox.sourceware.org/gcc/[email protected]/T/>
+ Suggested-by: Xavier Del Campo Romero <[email protected]>> +
Co-developed-by: Martin Uecker <[email protected]>> Signed-off-by:
Alejandro Colomar <[email protected]>> > ## gcc/c-family/c-common.cc
##> @@ gcc/c/c-typeck.cc: int in_alignof;> /* The level of nesting
inside "sizeof". */> int in_sizeof;> > -+/* The level of
nesting inside "sizeof". */> ++/* The level of nesting inside "lengthof".
*/> +int in_lengthof;> +> /* The level of nesting inside
"typeof". */> @@ gcc/doc/extend.texi: If the operand of the
@code{__alignof__} expression is a fu> +Its syntax is just like
@code{sizeof}.> +The operand must be a complete array type.> +The
operand is not evaluated> -+if the top-level length designator is an
integer constant expression;> ++if the top-level length designator is an
integer constant expression> ++(in this case, the operator results in a
constant expression);> +and it is evaluated> -+if the top-level length
designator is not an integer constant expression.> ++if the top-level
length designator is not an integer constant expression> ++(in this case,
the operator results in a run-time value).> ++For example:> +>
-+XXX: Do we want to document the following? I think so.> -+XXX: It would
prevent users from relying on __lengthof__> -+XXX: for distinguishing
arrays from pointers.> -+XXX: I don't want users to complain in the future>
-+XXX: if this doesn't report errors on function parameters anymore>
-+XXX: and that breaks their assumptions.> -+In the future,> -+it might
also accept a function parameter with array notation,> -+an incomplete
array whose length is specified by other means,> -+such as attributes,>
-+or other similar cases.> ++@smallexample> ++__lengthof__ (int
[7][n++]); // constexpr> ++__lengthof__ (int [n++][7]); // run-time
value> ++@end smallexample> +> @node Inline> @section An
Inline Function is As Fast As a Macro> @@ gcc/target.h: enum
type_context_kind {> /* Creating objects of type T with static storage
duration. */> TCTX_STATIC_STORAGE,> > +> + ##
gcc/testsuite/gcc.dg/lengthof-compile.c (new) ##> +@@> ++/* { dg-do
compile } */> ++/* { dg-options "-Wno-declaration-after-statement
-Wno-pedantic -Wno-vla" } */> ++> ++extern int x[];> ++>
++void> ++incomplete (int p[])> ++{> ++ unsigned n;> ++>
++ n = __lengthof__ (x); /* { dg-error "incomplete" } */> ++> ++ /*
We want to support the following one in the future,> ++ but for now it
should fail. */> ++ n = __lengthof__ (p); /* { dg-error "invalid" } */>
++}> ++> ++void> ++fam (void)> ++{> ++ struct {> ++
int x;> ++ int fam[];> ++ } s;> ++ unsigned n;> ++>
++ n = __lengthof__ (s.fam); /* { dg-error "incomplete" } */> ++}> ++>
++void fix_fix (int i, char (*a)[3][5], int (*x)[__lengthof__ (*a)]);>
++void fix_var (int i, char (*a)[3][i], int (*x)[__lengthof__ (*a)]);>
++void fix_uns (int i, char (*a)[3][*], int (*x)[__lengthof__ (*a)]);> ++>
++void> ++func (void)> ++{> ++ int i3[3];> ++ int
i5[5];> ++ char c35[3][5];> ++> ++ fix_fix (5, &c35, &i3);>
++ fix_fix (5, &c35, &i5); /* { dg-error "incompatible-pointer-types" } */>
++> ++ fix_var (5, &c35, &i3);> ++ fix_var (5, &c35, &i5); /* {
dg-error "incompatible-pointer-types" } */> ++> ++ fix_uns (5, &c35,
&i3);> ++ fix_uns (5, &c35, &i5); /* { dg-error
"incompatible-pointer-types" } */> ++}> +> + ##
gcc/testsuite/gcc.dg/lengthof.c (new) ##> +@@> ++/* { dg-do run } */>
++/* { dg-options "-Wno-declaration-after-statement -Wno-pedantic -Wno-vla" }
*/> ++> ++#undef NDEBUG> ++#include <assert.h>> ++> ++void>
++array (void)> ++{> ++ short a[7];> ++> ++ assert
(__lengthof__ (a) == 7);> ++ assert (__lengthof__ (long [0]) == 0);>
++ assert (__lengthof__ (unsigned [99]) == 99);> ++}> ++> ++void>
++vla (void)> ++{> ++ unsigned n;> ++> ++ n = 99;> ++
assert (__lengthof__ (short [n - 10]) == 99 - 10);> ++> ++ int v[n /
2];> ++ assert (__lengthof__ (v) == 99 / 2);> ++> ++ n = 0;>
++ int z[n];> ++ assert (__lengthof__ (z) == 0);> ++}> ++>
++void> ++member (void)> ++{> ++ struct {> ++ int a[8];>
++ } s;> ++> ++ assert (__lengthof__ (s.a) == 8);> ++}> ++>
++void> ++vla_eval (void)> ++{> ++ int i;> ++> ++ i =
7;> ++ assert (__lengthof__ (struct {int x;}[i++]) == 7);> ++ assert
(i == 7 + 1);> ++> ++ int v[i];> ++ int (*p)[i];> ++ p =
&v;> ++ assert (__lengthof__ (*p++) == i);> ++ assert (p - 1 == &v);>
++}> ++> ++void> ++inner_vla_noeval (void)> ++{> ++
int i;> ++> ++ i = 3;> ++ assert (__lengthof__ (struct {int
x[i++];}[3]) == 3);> ++ assert (i == 3);> ++}> ++> ++void>
++array_noeval (void)> ++{> ++ long a[5];> ++ long
(*p)[__lengthof__ (a)];> ++> ++ p = &a;> ++ assert (__lengthof__
(*p++) == 5);> ++ assert (p == &a);> ++}> ++> ++void>
++matrix_zero (void)> ++{> ++ int i;> ++> ++ assert
(__lengthof__ (int [0][4]) == 0);> ++ i = 3;> ++ assert (__lengthof__
(int [0][i]) == 0);> ++}> ++> ++void> ++matrix_fixed (void)>
++{> ++ int i;> ++> ++ assert (__lengthof__ (int [7][4]) == 7);>
++ i = 3;> ++ assert (__lengthof__ (int [7][i]) == 7);> ++}>
++> ++void> ++matrix_vla (void)> ++{> ++ int i, j;> ++>
++ i = 7;> ++ assert (__lengthof__ (int [i++][4]) == 7);> ++ assert
(i == 7 + 1);> ++> ++ i = 9;> ++ j = 3;> ++ assert
(__lengthof__ (int [i++][j]) == 9);> ++ assert (i == 9 + 1);> ++}>
++> ++int> ++main (void)> ++{> ++ array ();> ++ vla ();>
++ member ();> ++ vla_eval ();> ++ inner_vla_noeval ();> ++
array_noeval ();> ++ matrix_zero ();> ++ matrix_fixed ();> ++
matrix_vla ();> ++}> 4: 9a691f7f208 < -: ----------- testsuite: Add tests
for __lengthof__> -- > 2.45.2> -- <https://www.alejandro-colomar.es/>