aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-12-27 23:46:13 -0500
committerJason Merrill <jason@redhat.com>2021-12-28 12:46:16 -0500
commitdb25655fa5dd23bba684ec7db628643c19e64d6a (patch)
tree952a5ca32034600f49ebfe6f6095558c8f3bfe9d /gcc
parent9258ac53cfcbe546e8b86a433e59343538743f74 (diff)
downloadgcc-db25655fa5dd23bba684ec7db628643c19e64d6a.zip
gcc-db25655fa5dd23bba684ec7db628643c19e64d6a.tar.gz
gcc-db25655fa5dd23bba684ec7db628643c19e64d6a.tar.bz2
c++: ICE on enum with bool value [PR99968]
BOOLEAN_TYPE also counts as integral, so verify_type should allow it. PR c++/99968 gcc/ChangeLog: * tree.c (verify_type): Allow enumerator with BOOLEAN_TYPE. gcc/testsuite/ChangeLog: * g++.dg/ext/is_enum2.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.dg/ext/is_enum2.C10
-rw-r--r--gcc/tree.c1
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/ext/is_enum2.C b/gcc/testsuite/g++.dg/ext/is_enum2.C
new file mode 100644
index 0000000..de14d6a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/is_enum2.C
@@ -0,0 +1,10 @@
+// PR c++/99968
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -g }
+
+template <class T> struct A {
+ using type = T;
+ static const bool value = false;
+};
+
+enum E { e0 = __is_enum(E), e1 = A<E>::value };
diff --git a/gcc/tree.c b/gcc/tree.c
index 0741e3b..d68d694 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -13704,6 +13704,7 @@ verify_type (const_tree t)
error_found = true;
}
if (TREE_CODE (TREE_TYPE (value)) != INTEGER_TYPE
+ && TREE_CODE (TREE_TYPE (value)) != BOOLEAN_TYPE
&& !useless_type_conversion_p (const_cast <tree> (t), TREE_TYPE (value)))
{
error ("enum value type is not %<INTEGER_TYPE%> nor convertible "