]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix error recovery for invalid arrays [PR123331]
authorJakub Jelinek <jakub@redhat.com>
Sat, 3 Jan 2026 11:15:30 +0000 (12:15 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 3 Jan 2026 11:15:30 +0000 (12:15 +0100)
The following testcase ICEs since the conditional
eltinit = build2 (INIT_EXPR, ...) has been added to cxx_eval_vec_init_1.

If there are errors, eltinit will be error_mark_node and we can ICE during
constant evaluation of that.

Fixed by skipping it for error operands.

2026-01-03  Jakub Jelinek  <jakub@redhat.com>

PR c++/123331
* constexpr.cc (cxx_eval_vec_init_1): Don't build INIT_EXPR if
eltinit is erroneous.

* g++.dg/other/pr123331.C: New test.

gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/other/pr123331.C [new file with mode: 0644]

index 2ed374fe10252656b34ed3dcf7a941ee583a77a1..9262da952e1c13fe8ca3962aa3bbc5123443b9fd 100644 (file)
@@ -6727,7 +6727,9 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
          eltinit = (perform_implicit_conversion_flags
                     (elttype, eltinit, complain,
                      LOOKUP_IMPLICIT|LOOKUP_NO_NARROWING));
-         if (CLASS_TYPE_P (elttype) && new_ctx.object)
+         if (CLASS_TYPE_P (elttype)
+             && new_ctx.object
+             && !error_operand_p (eltinit))
            /* Clarify what object is being initialized (118285).  */
            eltinit = build2 (INIT_EXPR, elttype, new_ctx.object, eltinit);
          eltinit = cxx_eval_constant_expression (&new_ctx, eltinit, lval,
diff --git a/gcc/testsuite/g++.dg/other/pr123331.C b/gcc/testsuite/g++.dg/other/pr123331.C
new file mode 100644 (file)
index 0000000..8aff2cc
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/123331
+// { dg-do compile }
+// { dg-additional-options "-O2" }
+
+struct A { virtual void foo () = 0; };
+struct B { A a[1]; };  // { dg-error "cannot declare field 'B::a' to be of abstract type 'A'" }
+// { dg-error "cannot construct an object of abstract type 'A'" "" { target *-*-* } .-1 }
+
+template <typename T>
+void
+bar (T x)
+{
+} 
+
+int
+main ()
+{
+  B b;
+  bar (b); 
+}