Hi Joseph,

I've thought about it, and I'm okay adding support for _Bool, as long as
there's some diagnostic.  I've added -Wmaxof-bool for that.

I've also updated the diagnostics to merge this as a GNU extension.

For now, I've kept all patches separate, which allows me to work more
easily with them.  I also expect it would make it easier to review.  If
you want me to squash some or all of them before merging, let me know.

This is already in a state to be merged.  I've passed regression and
new tests:

        alx@devuan:~/src/gnu/gcc/maxof$ git log --oneline gnu/master^..maxof3
        104197b2b14a (HEAD -> maxof, tag: maxof3) c: Allow _Maxof(bool) & 
_Minof(bool), and add -Wmaxof-bool
        56794ade90a9 c: _Maxof and _Minof have not been accepted yet by the C 
Committee
        c2a0e2455784 c: Reduce excess errors of _Maxof and _Minof
        960d6cd608f3 c: Add _Maxof and _Minof operators
        577c0f4a402b (gnu/trunk, gnu/master, gnu/HEAD) gcc: Make 
aarch64-mingw32 target install wrap stdint.h
        alx@devuan:~/src/gnu/gcc/maxof$ git reset gnu/master --h
        HEAD is now at 577c0f4a402b gcc: Make aarch64-mingw32 target install 
wrap stdint.h
        alx@devuan:~/src/gnu/gcc/maxof$ mkdir ../maxof3
        alx@devuan:~/src/gnu/gcc/maxof$ cd ../maxof3/
        alx@devuan:~/src/gnu/gcc/maxof3$ set -o pipefail
        alx@devuan:~/src/gnu/gcc/maxof3$ ../maxof/configure --disable-multilib 
--prefix=/opt/local/gnu/gcc/maxof3 |& ts -s | tail -n1; echo $?; make -j24 
bootstrap |& ts -s | tail -n1; echo $?; make -j24 check |& ts -s | tail -n1; 
echo $?;
        00:00:01 config.status: creating Makefile
        0
        00:22:14 make[1]: Leaving directory '/srv/alx/src/gnu/gcc/maxof3'
        0
        00:34:26 make[1]: Leaving directory '/srv/alx/src/gnu/gcc/maxof3'
        0
        alx@devuan:~/src/gnu/gcc/maxof3$ cd ../maxof
        alx@devuan:~/src/gnu/gcc/maxof$ git merge --ff-only maxof3
        Updating 577c0f4a402b..104197b2b14a
        Fast-forward
         gcc/c-family/c-common.cc                     |  36 ++++
         gcc/c-family/c-common.def                    |   6 +
         gcc/c-family/c-common.h                      |   4 +-
         gcc/c-family/c.opt                           |   5 +
         gcc/c/c-parser.cc                            |  65 +++++++-
         gcc/c/c-tree.h                               |   2 +
         gcc/c/c-typeck.cc                            |  54 ++++++
         gcc/doc/extend.texi                          |  19 +++
         gcc/doc/invoke.texi                          |  10 ++
         gcc/testsuite/gcc.dg/Wmaxof-bool.c           |   8 +
         gcc/testsuite/gcc.dg/maxof-compat.c          |   5 +
         gcc/testsuite/gcc.dg/maxof-compile.c         | 163 +++++++++++++++++++
         gcc/testsuite/gcc.dg/maxof-no-compat.c       |   5 +
         gcc/testsuite/gcc.dg/maxof-pedantic-errors.c |   5 +
         gcc/testsuite/gcc.dg/maxof-pedantic.c        |   5 +
         15 files changed, 390 insertions(+), 2 deletions(-)
         create mode 100644 gcc/testsuite/gcc.dg/Wmaxof-bool.c
         create mode 100644 gcc/testsuite/gcc.dg/maxof-compat.c
         create mode 100644 gcc/testsuite/gcc.dg/maxof-compile.c
         create mode 100644 gcc/testsuite/gcc.dg/maxof-no-compat.c
         create mode 100644 gcc/testsuite/gcc.dg/maxof-pedantic-errors.c
         create mode 100644 gcc/testsuite/gcc.dg/maxof-pedantic.c
        alx@devuan:~/src/gnu/gcc/maxof$ cd ../
        alx@devuan:~/src/gnu/gcc$ mv maxof3/ maxof3_b4
        alx@devuan:~/src/gnu/gcc$ mkdir maxof3
        alx@devuan:~/src/gnu/gcc$ cd maxof3
        alx@devuan:~/src/gnu/gcc/maxof3$ ../maxof/configure --disable-multilib 
--prefix=/opt/local/gnu/gcc/maxof3 |& ts -s | tail -n1; echo $?; make -j24 
bootstrap |& ts -s | tail -n1; echo $?; make -j24 check |& ts -s | tail -n1; 
echo $?;
        00:00:01 config.status: creating Makefile
        0
        00:22:26 make[1]: Leaving directory '/srv/alx/src/gnu/gcc/maxof3'
        0
        00:36:53 make[1]: Leaving directory '/srv/alx/src/gnu/gcc/maxof3'
        0
        alx@devuan:~/src/gnu/gcc/maxof3$ find -type f | grep '\.sum$' | while 
read f; do diff -u "../maxof3_b4/$f" "$f"; done;
        --- ../maxof3_b4/./x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum      
2025-11-16 07:57:52.729400794 +0100
        +++ ./x86_64-pc-linux-gnu/libitm/testsuite/libitm.sum   2025-11-16 
15:58:37.592955201 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:49 2025
        +Test run by alx on Sun Nov 16 15:58:34 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === libitm tests ===
        --- 
../maxof3_b4/./x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum2025-11-16 
07:57:51.633179267 +0100
        +++ ./x86_64-pc-linux-gnu/libatomic/testsuite/libatomic.sum     
2025-11-16 15:58:36.620980317 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:49 2025
        +Test run by alx on Sun Nov 16 15:58:34 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === libatomic tests ===
        --- ../maxof3_b4/./x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum    
2025-11-16 08:00:15.172583134 +0100
        +++ ./x86_64-pc-linux-gnu/libgomp/testsuite/libgomp.sum 2025-11-16 
16:01:22.779640730 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:50 2025
        +Test run by alx on Sun Nov 16 15:58:35 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === libgomp tests ===
        --- 
../maxof3_b4/./x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum     
2025-11-16 08:32:15.578461863 +0100
        +++ ./x86_64-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum  
2025-11-16 16:35:27.575659868 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:51 2025
        +Test run by alx on Sun Nov 16 15:58:36 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === libstdc++ tests ===
        --- ../maxof3_b4/./gcc/testsuite/objc/objc.sum  2025-11-16 
07:59:04.399519102 +0100
        +++ ./gcc/testsuite/objc/objc.sum       2025-11-16 15:59:29.817555624 
+0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:50 2025
        +Test run by alx on Sun Nov 16 15:58:35 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === objc tests ===
        --- ../maxof3_b4/./gcc/testsuite/g++/g++.sum    2025-11-16 
08:09:28.370823218 +0100
        +++ ./gcc/testsuite/g++/g++.sum 2025-11-16 16:22:10.400900812 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:50 2025
        +Test run by alx on Sun Nov 16 15:58:35 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === g++ tests ===
        --- ../maxof3_b4/./gcc/testsuite/gcc/gcc.sum    2025-11-16 
08:21:32.325055206 +0100
        +++ ./gcc/testsuite/gcc/gcc.sum 2025-11-16 16:18:25.579006194 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:50 2025
        +Test run by alx on Sun Nov 16 15:58:35 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === gcc tests ===
        @@ -75687,6 +75687,9 @@
         PASS: gcc.dg/Wlogical-op-1.c  (test for warnings, line 55)
         PASS: gcc.dg/Wlogical-op-1.c  (test for warnings, line 58)
         PASS: gcc.dg/Wlogical-op-1.c (test for excess errors)
        +PASS: gcc.dg/Wmaxof-bool.c  (test for warnings, line 6)
        +PASS: gcc.dg/Wmaxof-bool.c  (test for warnings, line 7)
        +PASS: gcc.dg/Wmaxof-bool.c (test for excess errors)
         PASS: gcc.dg/Wmismatched-dealloc-2.c  (test for warnings, line 139)
         PASS: gcc.dg/Wmismatched-dealloc-2.c  (test for warnings, line 140)
         PASS: gcc.dg/Wmismatched-dealloc-2.c  (test for warnings, line 48)
        @@ -94161,6 +94164,45 @@
         PASS: gcc.dg/max-1.c execution test
         PASS: gcc.dg/max.c (test for excess errors)
         PASS: gcc.dg/max.c scan-tree-dump-not optimized "MAX_EXPR"
        +PASS: gcc.dg/maxof-compat.c  (test for errors, line 4)
        +PASS: gcc.dg/maxof-compat.c  (test for errors, line 5)
        +PASS: gcc.dg/maxof-compat.c (test for excess errors)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 100)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 101)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 102)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 103)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 104)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 105)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 111)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 113)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 115)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 116)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 122)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 123)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 80)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 82)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 84)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 86)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 88)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 89)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 90)
        +PASS: gcc.dg/maxof-compile.c  (test for errors, line 91)
        +PASS: gcc.dg/maxof-compile.c (test for excess errors)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 112 (test for 
errors, line 111)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 114 (test for 
errors, line 113)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 81 (test for errors, 
line 80)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 83 (test for errors, 
line 82)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 85 (test for errors, 
line 84)
        +PASS: gcc.dg/maxof-compile.c syntax error at line 87 (test for errors, 
line 86)
        +PASS: gcc.dg/maxof-no-compat.c  (test for errors, line 4)
        +PASS: gcc.dg/maxof-no-compat.c  (test for errors, line 5)
        +PASS: gcc.dg/maxof-no-compat.c (test for excess errors)
        +PASS: gcc.dg/maxof-pedantic-errors.c  (test for errors, line 4)
        +PASS: gcc.dg/maxof-pedantic-errors.c  (test for errors, line 5)
        +PASS: gcc.dg/maxof-pedantic-errors.c (test for excess errors)
        +PASS: gcc.dg/maxof-pedantic.c  (test for warnings, line 4)
        +PASS: gcc.dg/maxof-pedantic.c  (test for warnings, line 5)
        +PASS: gcc.dg/maxof-pedantic.c (test for excess errors)
         PASS: gcc.dg/memchr-2.c (test for excess errors)
         PASS: gcc.dg/memchr-2.c scan-tree-dump-not optimized "abort"
         PASS: gcc.dg/memchr-2.c scan-tree-dump-not optimized "memcmp \\("
        @@ -221111,7 +221153,7 @@
         
                        === gcc Summary ===
         
        -# of expected passes           215038
        +# of expected passes           215080
         # of unexpected failures       529
         # of unexpected successes      6
         # of expected failures         1486
        --- ../maxof3_b4/./gcc/testsuite/gfortran/gfortran.sum  2025-11-16 
08:04:20.059472682 +0100
        +++ ./gcc/testsuite/gfortran/gfortran.sum       2025-11-16 
16:10:22.381261361 +0100
        @@ -1,4 +1,4 @@
        -Test run by alx on Sun Nov 16 07:57:50 2025
        +Test run by alx on Sun Nov 16 15:58:35 2025
         Native configuration is x86_64-pc-linux-gnu
         
                        === gfortran tests ===
        alx@devuan:~/src/gnu/gcc/maxof3$ make html |& ts -s | tail -n1; echo $?
        00:00:12 make[1]: Leaving directory '/srv/alx/src/gnu/gcc/maxof3'
        0
        alx@devuan:~/src/gnu/gcc/maxof3$ cd gcc/
        alx@devuan:~/src/gnu/gcc/maxof3/gcc$ make regenerate-opt-urls |& ts -s 
| tail -n1; echo $?
        00:00:01 ../../maxof/gcc/regenerate-opt-urls.py 
/srv/alx/src/gnu/gcc/maxof3/gcc/HTML/gcc-16.0.0 ../../maxof
        0
        alx@devuan:~/src/gnu/gcc/maxof3/gcc$ cd ../../maxof
        alx@devuan:~/src/gnu/gcc/maxof$ git diff
        diff --git i/gcc/c-family/c.opt.urls w/gcc/c-family/c.opt.urls
        index 1f9e6ba95d9f..c750ca5450b5 100644
        --- i/gcc/c-family/c.opt.urls
        +++ w/gcc/c-family/c.opt.urls
        @@ -544,6 +544,9 @@ UrlSuffix(gcc/Warning-Options.html#index-Wmain)
         Wmain
         UrlSuffix(gcc/Warning-Options.html#index-Wmain)
         
        +Wmaxof-bool
        +UrlSuffix(gcc/Warning-Options.html#index-Wmaxof-bool)
        +
         Wmaybe-uninitialized
         UrlSuffix(gcc/Warning-Options.html#index-Wmaybe-uninitialized)
         
        alx@devuan:~/src/gnu/gcc/maxof$ git add gcc/c-family/c.opt.urls 
        alx@devuan:~/src/gnu/gcc/maxof$ git commit --amend 
        Please enter the passphrase to unlock the OpenPGP secret key:
        "Alejandro Colomar <[email protected]>"
        4096-bit RSA key, ID EB89995CC290C2A9,
        created 2025-02-14 (main key ID D57633D441E25BB5).

        Passphrase: 
        [maxof 6a185dd806c5] c: Allow _Maxof(bool) & _Minof(bool), and add 
-Wmaxof-bool
         Date: Sat Nov 15 23:15:58 2025 +0100
         6 files changed, 38 insertions(+), 4 deletions(-)
         create mode 100644 gcc/testsuite/gcc.dg/Wmaxof-bool.c


Have a lovely day!
Alex



Alejandro Colomar (4):
  c: Add _Maxof and _Minof operators
  c: Reduce excess errors of _Maxof and _Minof
  c: _Maxof and _Minof have not been accepted yet by the C Committee
  c: Allow _Maxof(bool) & _Minof(bool), and add -Wmaxof-bool

 gcc/c-family/c-common.cc                     |  36 ++++
 gcc/c-family/c-common.def                    |   6 +
 gcc/c-family/c-common.h                      |   4 +-
 gcc/c-family/c.opt                           |   5 +
 gcc/c/c-parser.cc                            |  65 +++++++-
 gcc/c/c-tree.h                               |   2 +
 gcc/c/c-typeck.cc                            |  54 ++++++
 gcc/doc/extend.texi                          |  19 +++
 gcc/doc/invoke.texi                          |  10 ++
 gcc/testsuite/gcc.dg/Wmaxof-bool.c           |   8 +
 gcc/testsuite/gcc.dg/maxof-compat.c          |   5 +
 gcc/testsuite/gcc.dg/maxof-compile.c         | 163 +++++++++++++++++++
 gcc/testsuite/gcc.dg/maxof-no-compat.c       |   5 +
 gcc/testsuite/gcc.dg/maxof-pedantic-errors.c |   5 +
 gcc/testsuite/gcc.dg/maxof-pedantic.c        |   5 +
 15 files changed, 390 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/Wmaxof-bool.c
 create mode 100644 gcc/testsuite/gcc.dg/maxof-compat.c
 create mode 100644 gcc/testsuite/gcc.dg/maxof-compile.c
 create mode 100644 gcc/testsuite/gcc.dg/maxof-no-compat.c
 create mode 100644 gcc/testsuite/gcc.dg/maxof-pedantic-errors.c
 create mode 100644 gcc/testsuite/gcc.dg/maxof-pedantic.c

Range-diff against v2:
1:  29ee24eabe18 ! 1:  960d6cd608f3 c: Add _Maxof and _Minof operators
    @@ gcc/testsuite/gcc.dg/maxof-compile.c (new)
     +  _Minof (1);  /* { dg-error "to something not a type" } */
     +  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     +  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  _Maxof 1;  /* { dg-error "expected '('" } */
    -+  _Minof 1;  /* { dg-error "expected '('" } */
    ++  _Maxof 1;  /* { dg-error "expected '\\('" } */
    ++  _Minof 1;  /* { dg-error "expected '\\('" } */
     +  _Maxof (int) {1};  /* { dg-error "expected ';'" } */
     +  _Minof (int) {1};  /* { dg-error "expected ';'" } */
     +}
    @@ gcc/testsuite/gcc.dg/maxof-compile.c (new)
     +void
     +bogus (void)
     +{
    -+  _Maxof (int x);  /* { dg-error "expected ')'" } */
    -+  _Minof (int x);  /* { dg-error "expected ')'" } */
    ++  _Maxof (int x);  /* { dg-error "expected '\\)'" } */
    ++  _Minof (int x);  /* { dg-error "expected '\\)'" } */
     +}
     +
     +void
2:  4b6f1d46fb2d ! 2:  c2a0e2455784 c: Reduce excess errors of _Maxof and _Minof
    @@ gcc/testsuite/gcc.dg/maxof-compile.c: expr (void)
        _Maxof (x);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
        _Minof (x);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
        _Maxof (1);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
        _Minof (1);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    -   _Maxof 1;  /* { dg-error "expected '('" } */
    -   _Minof 1;  /* { dg-error "expected '('" } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
    +   _Maxof 1;  /* { dg-error "expected '\\('" } */
    +   _Minof 1;  /* { dg-error "expected '\\('" } */
        _Maxof (int) {1};  /* { dg-error "expected ';'" } */
     @@ gcc/testsuite/gcc.dg/maxof-compile.c: void
      specs (void)
    @@ gcc/testsuite/gcc.dg/maxof-compile.c: void
        _Maxof (static int);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
        _Minof (static int);  /* { dg-error "to something not a type" } */
     -  /* { dg-error "expected ';'" "syntax error" { target *-*-* } .-1 } */
     -  /* { dg-error "expected statement" "syntax error 2" { target *-*-* } 
.-2 } */
    -+  /* { dg-error "expected ')'" "syntax error" { target *-*-* } .-1 } */
    ++  /* { dg-error "expected '\\)'" "syntax error" { target *-*-* } .-1 } */
        _Maxof (alignas(8) int);  /* { dg-error "alignment specified" } */
        _Minof (alignas(8) int);  /* { dg-error "alignment specified" } */
      }
-:  ------------ > 3:  56794ade90a9 c: _Maxof and _Minof have not been accepted 
yet by the C Committee
-:  ------------ > 4:  104197b2b14a c: Allow _Maxof(bool) & _Minof(bool), and 
add -Wmaxof-bool
-- 
2.51.0

Reply via email to