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

Attachment: signature.asc
Description: PGP signature

Reply via email to