Hi,The address david.br...@hesbynett.no 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 browndavid.br...@hesbynett.no
-------- Original message --------From: Alejandro Colomar <a...@kernel.org>
Date: 07/08/2024 01:26 (GMT+01:00) To: gcc-patches@gcc.gnu.org Cc: Martin
Uecker <uec...@tugraz.at>, Xavier Del Campo Romero <xavi....@tutanota.com>,
Joseph Myers <josmy...@redhat.com>, Gabriel Ravier <gabrav...@gmail.com>, Jakub
Jelinek <ja...@redhat.com>, Kees Cook <keesc...@chromium.org>, Qing Zhao
<qing.z...@oracle.com>, Jens Gustedt <jens.gust...@inria.fr>, David Brown
<david.br...@hesbynett.no>, Florian Weimer <fwei...@redhat.com>, Andreas Schwab
<sch...@linux-m68k.org> Subject: Re: [PATCH v5 0/3] c: Add __lengthof__
operator <david.br...@hesbynett.no> 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 <a...@kernel.org>> > 3: e2dbfc43b14 ! 3: af05d01e68d
c: Add __lengthof__() operator (n2529)> @@ Metadata> Author: Alejandro
Colomar <a...@kernel.org>> > ## 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/m8s4oqy--...@tutanota.com/T/>> -
Suggested-by: Xavier Del Campo Romero <xavi....@tutanota.com>> -
Co-developed-by: Martin Uecker <uec...@tugraz.at>> - Cc: Gabriel Ravier
<gabrav...@gmail.com>> Cc: Joseph Myers <josmy...@redhat.com>> +
Cc: Gabriel Ravier <gabrav...@gmail.com>> Cc: Jakub Jelinek
<ja...@redhat.com>> Cc: Kees Cook <keesc...@chromium.org>>
Cc: Qing Zhao <qing.z...@oracle.com>> Cc: Jens Gustedt
<jens.gust...@inria.fr>> + Cc: David Brown <david.br...@hesbynett.no>>
+ Cc: Florian Weimer <fwei...@redhat.com>> + Cc: Andreas Schwab
<sch...@linux-m68k.org>> +> + 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/m8s4oqy--...@tutanota.com/T/>
+ Suggested-by: Xavier Del Campo Romero <xavi....@tutanota.com>> +
Co-developed-by: Martin Uecker <uec...@tugraz.at>> Signed-off-by:
Alejandro Colomar <a...@kernel.org>> > ## 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/>