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. 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 -- 2.45.2
signature.asc
Description: PGP signature