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" } */
+}

Reply via email to