Am Sonntag, dem 10.11.2024 um 11:32 +0100 schrieb Alejandro Colomar: > Hi! > > Your favourite operator with the most controversial name comes back with > support for [0], thanks to Martin Uecker. In movie theaters, and > probably in GCC 16. > > For those who fight in a side in the name wars, here's a reminder of a > fair survey (by JeanHeyd) which might end the war with a peace treaty: > <https://thephd.dev/the-big-array-size-survey-for-c>. > > > Changes since v17: > > - Rebase after the recent patches added by Martin, which made [0][n] > and [*][n] have distinct representation, and thus allowed making > __countof__(int [0][n]) be a constant expression. > > - Make __countof__(int [0][n]) a constant expression. Thanks, Martin! > Update the testsuite to reflect this too, of course. > > - Rename small function in the testsuite (automatic => completed). > > See the range-diff below for the exact differences since v17. > > > Martin, this worked out of the box. I'll reply to this email with the > regression-test session results; they all passed. [0] works like a > charm.
Yes, it is nice how everything starts to fall into place once you remove enough complexity and special cases ... Martin > > > Have a lovely day! > Alex > > > Alejandro Colomar (2): > contrib/: Add support for Cc: and Link: tags > c: Add __countof__ operator > > contrib/gcc-changelog/git_commit.py | 5 +- > 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 | 22 +++- > gcc/c/c-parser.cc | 62 +++++++--- > gcc/c/c-tree.h | 4 + > gcc/c/c-typeck.cc | 115 ++++++++++++++++++- > gcc/doc/extend.texi | 30 +++++ > gcc/testsuite/gcc.dg/countof-compile.c | 125 +++++++++++++++++++++ > gcc/testsuite/gcc.dg/countof-vla.c | 45 ++++++++ > gcc/testsuite/gcc.dg/countof.c | 150 +++++++++++++++++++++++++ > 12 files changed, 564 insertions(+), 25 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/countof-compile.c > create mode 100644 gcc/testsuite/gcc.dg/countof-vla.c > create mode 100644 gcc/testsuite/gcc.dg/countof.c > > Range-diff against v17: > 1: d847dc4a795 = 1: 82100c813c3 contrib/: Add support for Cc: and Link: tags > 2: 936f7945fae ! 2: f8336e4646a c: Add __countof__ operator > @@ Commit message > and somehow magically return the number of elements of the array, > regardless of it being really a pointer. > > - - Fix support for [0]. > - > gcc/ChangeLog: > > * doc/extend.texi: Document __countof__ operator. > @@ gcc/c/c-decl.cc: finish_enum (tree enumtype, tree values, tree > attributes) > > ## gcc/c/c-parser.cc ## > @@ gcc/c/c-parser.cc: along with GCC; see the file COPYING3. If not see > - #include "bitmap.h" > - #include "analyzer/analyzer-language.h" > #include "toplev.h" > + #include "asan.h" > + #include "c-family/c-ubsan.h" > + > +#define c_parser_sizeof_expression(parser) > \ > +( > \ > @@ gcc/c/c-typeck.cc: c_expr_sizeof_type (location_t loc, struct > c_type_name *t) > +static bool > +is_top_array_vla (tree type) > +{ > -+ bool zero, star, var; > ++ bool zero, var; > + tree d; > + > + if (TREE_CODE (type) != ARRAY_TYPE) > @@ gcc/c/c-typeck.cc: c_expr_sizeof_type (location_t loc, struct > c_type_name *t) > + > + d = TYPE_DOMAIN (type); > + zero = !TYPE_MAX_VALUE (d); > -+ star = (zero && C_TYPE_VARIABLE_SIZE (type)); > -+ if (star) > -+ return true; > + if (zero) > + return false; > + > @@ gcc/testsuite/gcc.dg/countof-compile.c (new) > + _Static_assert (__countof__ (int [n][3]) == 7); /* { dg-error "not > constant" } */ > + _Static_assert (__countof__ (int [0][3]) == 0); > + _Static_assert (__countof__ (int [0]) == 0); > -+ > -+ /* FIXME: countof(int [0][n]) should result in a constant expression. > */ > -+ _Static_assert (__countof__ (int [0][n]) == 0); /* { dg-error "not > constant" } */ > ++ _Static_assert (__countof__ (int [0][n]) == 0); > +} > > ## gcc/testsuite/gcc.dg/countof-vla.c (new) ## > @@ gcc/testsuite/gcc.dg/countof-vla.c (new) > + char (*a)[*][*], > + int (*x)[__countof__ (*a)]); > + > -+// Can't test due to bug: > <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116284> > -+//static int z2[0]; > -+//static int y2[__countof__(z2)]; > ++static int z2[0]; > ++static int y2[__countof__(z2)]; > > ## gcc/testsuite/gcc.dg/countof.c (new) ## > @@ > @@ gcc/testsuite/gcc.dg/countof.c (new) > +} > + > +void > -+automatic(void) > ++completed (void) > +{ > + int a[] = {1, 2, 3}; > + int z[] = {}; > @@ gcc/testsuite/gcc.dg/countof.c (new) > +main (void) > +{ > + array (); > -+ automatic (); > ++ completed (); > + vla (); > + member (); > + vla_eval (); > > base-commit: 9cbcf8d1de159e6113fafb5dc2feb4a7e467a302