https://gcc.gnu.org/g:eaebd987e5492b23419b5c52482038a94066c640
commit r17-1370-geaebd987e5492b23419b5c52482038a94066c640 Author: Jakub Jelinek <[email protected]> Date: Fri Jun 5 11:01:13 2026 +0200 testsuite: Improve enum argument testing of __builtin_{clz,ctz,clrsb,ffs,parity,popcount,bswap,bitreverse}g On Wed, Jun 03, 2026 at 06:14:53PM +0000, Joseph Myers wrote: > The enumerated type error seems to be tested only for C++ (likewise for > __builtin_bitreverseg). Presumably it could be tested for C with a cast > to or variable of enumerated type, or by using an enumeration with fixed > underlying type. I've followed what was tested for the other builtins (clt/ctz/clrsb/ffs/parity/popcount). So, here is an incremental patch to extend the testing of enumeral arguments for all those builtins, including enums with fixed underlying type. 2026-06-05 Jakub Jelinek <[email protected]> * c-c++-common/builtin-bswapg-2.c: Add further enum related tests. * c-c++-common/builtin-bitreverseg-2.c: Likewise. * c-c++-common/pr111309-2.c: Likewise. * c-c++-common/pr111309-3.c: New test. Reviewed-by: Joseph Myers <[email protected]> Diff: --- gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c | 10 ++++++- gcc/testsuite/c-c++-common/builtin-bswapg-2.c | 10 ++++++- gcc/testsuite/c-c++-common/pr111309-2.c | 18 +++++++++++- gcc/testsuite/c-c++-common/pr111309-3.c | 33 ++++++++++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c b/gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c index cee5f061d635..d6d3a721db24 100644 --- a/gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c +++ b/gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c @@ -12,9 +12,17 @@ main () __builtin_bitreverseg (1.0L); /* { dg-error "'__builtin_bitreverseg' operand not an integral type" } */ struct S { int a; }; __builtin_bitreverseg ((struct S) { 42 }); /* { dg-error "'__builtin_bitreverseg' operand not an integral type" } */ - enum E { E0, E1 }; + enum E { E0, E1 } e; __builtin_bitreverseg (E1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has signed type" "" { target c } } */ /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" "" { target c++ } .-1 } */ + __builtin_bitreverseg (e); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" } */ + __builtin_bitreverseg ((enum E) 1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" } */ +#if !defined(__cplusplus) || __cplusplus >= 201103L + enum F : int { F0, F1 } f; + __builtin_bitreverseg (F1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" "" { target { c || c++11 } } } */ + __builtin_bitreverseg (f); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" "" { target { c || c++11 } } } */ + __builtin_bitreverseg ((enum F) 1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has enumerated type" "" { target { c || c++11 } } } */ +#endif __builtin_bitreverseg (false); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has boolean type" } */ __builtin_bitreverseg (1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has signed type" } */ __builtin_bitreverseg ((char) 1); /* { dg-error "argument 1 in call to function '__builtin_bitreverseg' has signed type" "" { target { ! unsigned_char } } } */ diff --git a/gcc/testsuite/c-c++-common/builtin-bswapg-2.c b/gcc/testsuite/c-c++-common/builtin-bswapg-2.c index 6004aa64c86f..23003b602f25 100644 --- a/gcc/testsuite/c-c++-common/builtin-bswapg-2.c +++ b/gcc/testsuite/c-c++-common/builtin-bswapg-2.c @@ -12,9 +12,17 @@ main () __builtin_bswapg (1.0L); /* { dg-error "'__builtin_bswapg' operand not an integral type" } */ struct S { int a; }; __builtin_bswapg ((struct S) { 42 }); /* { dg-error "'__builtin_bswapg' operand not an integral type" } */ - enum E { E0, E1 }; + enum E { E0, E1 } e; __builtin_bswapg (E1); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has signed type" "" { target c } } */ /* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" "" { target c++ } .-1 } */ + __builtin_bswapg (e); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" } */ + __builtin_bswapg ((enum E) 1);/* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" } */ +#if !defined(__cplusplus) || __cplusplus >= 201103L + enum F : int { F0, F1 } f; + __builtin_bswapg (F1); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" "" { target { c || c++11 } } } */ + __builtin_bswapg (f); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" "" { target { c || c++11 } } } */ + __builtin_bswapg ((enum F) 1);/* { dg-error "argument 1 in call to function '__builtin_bswapg' has enumerated type" "" { target { c || c++11 } } } */ +#endif __builtin_bswapg (false); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has boolean type" } */ __builtin_bswapg (1); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has signed type" } */ __builtin_bswapg ((char) 1); /* { dg-error "argument 1 in call to function '__builtin_bswapg' has signed type" "" { target { ! unsigned_char } } } */ diff --git a/gcc/testsuite/c-c++-common/pr111309-2.c b/gcc/testsuite/c-c++-common/pr111309-2.c index 13e967353bf0..d3d38c456b8c 100644 --- a/gcc/testsuite/c-c++-common/pr111309-2.c +++ b/gcc/testsuite/c-c++-common/pr111309-2.c @@ -11,7 +11,7 @@ void foo (void) { - enum E { E0 = 0 }; + enum E { E0 = 0 } e; struct S { int s; } s; __builtin_clzg (); /* { dg-error "too few arguments" } */ __builtin_clzg (0U, 1, 2); /* { dg-error "too many arguments" } */ @@ -21,12 +21,16 @@ foo (void) __builtin_clzg (true); /* { dg-error "has boolean type" } */ __builtin_clzg (E0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_clzg (e); /* { dg-error "has enumerated type" } */ + __builtin_clzg ((enum E) 0); /* { dg-error "has enumerated type" } */ __builtin_clzg (0, 0); /* { dg-error "has signed type" } */ __builtin_clzg (0.0, 0); /* { dg-error "does not have integral type" } */ __builtin_clzg (s, 0); /* { dg-error "does not have integral type" } */ __builtin_clzg (true, 0); /* { dg-error "has boolean type" } */ __builtin_clzg (E0, 0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_clzg (e, 0); /* { dg-error "has enumerated type" } */ + __builtin_clzg ((enum E) 0, 0);/* { dg-error "has enumerated type" } */ __builtin_clzg (0U, 2.0); /* { dg-error "does not have integral type" } */ __builtin_clzg (0U, s); /* { dg-error "does not have integral type" } */ __builtin_clzg (0U, 2LL); /* { dg-error "does not have 'int' type" } */ @@ -41,12 +45,16 @@ foo (void) __builtin_ctzg (true); /* { dg-error "has boolean type" } */ __builtin_ctzg (E0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_ctzg (e); /* { dg-error "has enumerated type" } */ + __builtin_ctzg ((enum E) 0); /* { dg-error "has enumerated type" } */ __builtin_ctzg (0, 0); /* { dg-error "has signed type" } */ __builtin_ctzg (0.0, 0); /* { dg-error "does not have integral type" } */ __builtin_ctzg (s, 0); /* { dg-error "does not have integral type" } */ __builtin_ctzg (true, 0); /* { dg-error "has boolean type" } */ __builtin_ctzg (E0, 0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_ctzg (e, 0); /* { dg-error "has enumerated type" } */ + __builtin_ctzg ((enum E) 0, 0);/* { dg-error "has enumerated type" } */ __builtin_ctzg (0U, 2.0); /* { dg-error "does not have integral type" } */ __builtin_ctzg (0U, 2LL); /* { dg-error "does not have 'int' type" } */ __builtin_ctzg (0U, 2U); /* { dg-error "does not have 'int' type" } */ @@ -59,6 +67,8 @@ foo (void) __builtin_clrsbg (s); /* { dg-error "does not have integral type" } */ __builtin_clrsbg (true); /* { dg-error "has boolean type" } */ __builtin_clrsbg (E0); /* { dg-error "has enumerated type" "" { target c++ } } */ + __builtin_clrsbg (e); /* { dg-error "has enumerated type" } */ + __builtin_clrsbg ((enum E) 0);/* { dg-error "has enumerated type" } */ __builtin_ffsg (); /* { dg-error "too few arguments" } */ __builtin_ffsg (0, 1); /* { dg-error "too many arguments" } */ __builtin_ffsg (0U); /* { dg-error "has unsigned type" } */ @@ -66,6 +76,8 @@ foo (void) __builtin_ffsg (s); /* { dg-error "does not have integral type" } */ __builtin_ffsg (true); /* { dg-error "has boolean type" } */ __builtin_ffsg (E0); /* { dg-error "has enumerated type" "" { target c++ } } */ + __builtin_ffsg (e); /* { dg-error "has enumerated type" } */ + __builtin_ffsg ((enum E) 0); /* { dg-error "has enumerated type" } */ __builtin_parityg (); /* { dg-error "too few arguments" } */ __builtin_parityg (0U, 1); /* { dg-error "too many arguments" } */ __builtin_parityg (0); /* { dg-error "has signed type" } */ @@ -74,6 +86,8 @@ foo (void) __builtin_parityg (true); /* { dg-error "has boolean type" } */ __builtin_parityg (E0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_parityg (e); /* { dg-error "has enumerated type" } */ + __builtin_parityg ((enum E) 0);/* { dg-error "has enumerated type" } */ __builtin_popcountg (); /* { dg-error "too few arguments" } */ __builtin_popcountg (0U, 1); /* { dg-error "too many arguments" } */ __builtin_popcountg (0); /* { dg-error "has signed type" } */ @@ -82,4 +96,6 @@ foo (void) __builtin_popcountg (true); /* { dg-error "has boolean type" } */ __builtin_popcountg (E0); /* { dg-error "has signed type" "" { target c } } */ /* { dg-error "has enumerated type" "" { target c++ } .-1 } */ + __builtin_popcountg (e); /* { dg-error "has enumerated type" } */ + __builtin_popcountg ((enum E) 0);/* { dg-error "has enumerated type" } */ } diff --git a/gcc/testsuite/c-c++-common/pr111309-3.c b/gcc/testsuite/c-c++-common/pr111309-3.c new file mode 100644 index 000000000000..b2514660d0bb --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr111309-3.c @@ -0,0 +1,33 @@ +/* PR c/111309 */ +/* { dg-do compile { target { c || c++11 } } } */ +/* { dg-additional-options "-std=c23" { target c } } */ + +void +foo (void) +{ + enum E : int { E0 = 0 } e; + __builtin_clzg (E0); /* { dg-error "has enumerated type" } */ + __builtin_clzg (e); /* { dg-error "has enumerated type" } */ + __builtin_clzg ((enum E) 0); /* { dg-error "has enumerated type" } */ + __builtin_clzg (E0, 0); /* { dg-error "has enumerated type" } */ + __builtin_clzg (e, 0); /* { dg-error "has enumerated type" } */ + __builtin_clzg ((enum E) 0, 0);/* { dg-error "has enumerated type" } */ + __builtin_ctzg (E0); /* { dg-error "has enumerated type" } */ + __builtin_ctzg (e); /* { dg-error "has enumerated type" } */ + __builtin_ctzg ((enum E) 0); /* { dg-error "has enumerated type" } */ + __builtin_ctzg (E0, 0); /* { dg-error "has enumerated type" } */ + __builtin_ctzg (e, 0); /* { dg-error "has enumerated type" } */ + __builtin_ctzg ((enum E) 0, 0);/* { dg-error "has enumerated type" } */ + __builtin_clrsbg (E0); /* { dg-error "has enumerated type" } */ + __builtin_clrsbg (e); /* { dg-error "has enumerated type" } */ + __builtin_clrsbg ((enum E) 0);/* { dg-error "has enumerated type" } */ + __builtin_ffsg (E0); /* { dg-error "has enumerated type" } */ + __builtin_ffsg (e); /* { dg-error "has enumerated type" } */ + __builtin_ffsg ((enum E) 0); /* { dg-error "has enumerated type" } */ + __builtin_parityg (E0); /* { dg-error "has enumerated type" } */ + __builtin_parityg (e); /* { dg-error "has enumerated type" } */ + __builtin_parityg ((enum E) 0);/* { dg-error "has enumerated type" } */ + __builtin_popcountg (E0); /* { dg-error "has enumerated type" } */ + __builtin_popcountg (e); /* { dg-error "has enumerated type" } */ + __builtin_popcountg ((enum E) 0);/* { dg-error "has enumerated type" } */ +}
