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