]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: ICE with nullptr as case expression [PR108424]
authorMarek Polacek <polacek@redhat.com>
Wed, 18 Jan 2023 19:51:59 +0000 (14:51 -0500)
committerMarek Polacek <polacek@redhat.com>
Wed, 18 Jan 2023 21:49:57 +0000 (16:49 -0500)
In this ICE-on-invalid, we crash on

  gcc_assert (INTEGRAL_TYPE_P (type));

in perform_integral_promotions, because a nullptr is an INTEGER_CST,
but not INTEGRAL_TYPE_P, and check_case_value is only checking the
former.  In the test I'm testing other "shall be an integral constant
expression" contexts as well.

PR c/108424

gcc/c-family/ChangeLog:

* c-common.cc (check_case_value): Check INTEGRAL_TYPE_P.

gcc/testsuite/ChangeLog:

* gcc.dg/c2x-nullptr-6.c: New test.

gcc/c-family/c-common.cc
gcc/testsuite/gcc.dg/c2x-nullptr-6.c [new file with mode: 0644]

index 76c8abef296009d0cabd1a0f4c4a3c5c8f047375..ae92cd5adaf5e86d6b4e52b73fada7bc7561db6c 100644 (file)
@@ -2238,7 +2238,8 @@ check_case_value (location_t loc, tree value)
   if (value == NULL_TREE)
     return value;
 
-  if (TREE_CODE (value) == INTEGER_CST)
+  if (INTEGRAL_TYPE_P (TREE_TYPE (value))
+      && TREE_CODE (value) == INTEGER_CST)
     /* Promote char or short to int.  */
     value = perform_integral_promotions (value);
   else if (value != error_mark_node)
diff --git a/gcc/testsuite/gcc.dg/c2x-nullptr-6.c b/gcc/testsuite/gcc.dg/c2x-nullptr-6.c
new file mode 100644 (file)
index 0000000..24e14fa
--- /dev/null
@@ -0,0 +1,33 @@
+/* PR c/108424 */
+/* { dg-options "-std=c2x" } */
+
+struct S {
+  int i;
+  int : nullptr; /* { dg-error "not an integer constant" } */
+};
+
+enum E { X = nullptr }; /* { dg-error "not an integer constant" } */
+
+alignas(nullptr) int g; /* { dg-error "not an integer constant" } */
+
+int arr[10] = { [nullptr] = 1 }; /* { dg-error "not of integer type" } */
+
+_Static_assert (nullptr, "nullptr"); /* { dg-error "not an integer" } */
+
+void f (int n)
+{
+  switch (n) {
+  case nullptr: /* { dg-error "an integer constant" } */
+  default:
+  }
+
+  switch (n) {
+  case 1 ... nullptr: /* { dg-error "an integer constant" } */
+  default:
+  }
+
+  switch (n) {
+  case nullptr ... 2: /* { dg-error "an integer constant" } */
+  default:
+  }
+}