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. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2026-06-04 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. --- gcc/testsuite/c-c++-common/builtin-bswapg-2.c.jj 2026-06-02 20:34:31.734277865 +0200 +++ gcc/testsuite/c-c++-common/builtin-bswapg-2.c 2026-06-03 20:45:08.218078645 +0200 @@ -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|argument 1 in call to function '__builtin_bswapg' has 'char' type)" } */ --- gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c.jj 2026-06-02 20:34:31.000000000 +0200 +++ gcc/testsuite/c-c++-common/builtin-bitreverseg-2.c 2026-06-03 20:45:20.855914650 +0200 @@ -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|argument 1 in call to function '__builtin_bitreverseg' has 'char' type)" } */ --- gcc/testsuite/c-c++-common/pr111309-2.c.jj 2023-11-22 00:00:30.379677899 +0100 +++ gcc/testsuite/c-c++-common/pr111309-2.c 2026-06-03 20:39:35.484396332 +0200 @@ -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" } */ } --- gcc/testsuite/c-c++-common/pr111309-3.c.jj 2026-05-27 01:08:54.568701218 +0200 +++ gcc/testsuite/c-c++-common/pr111309-3.c 2026-06-03 20:53:18.907712043 +0200 @@ -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" } */ +} Jakub
