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

Reply via email to