]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: another build_new_1 folding fix [PR111929]
authorPatrick Palka <ppalka@redhat.com>
Fri, 27 Oct 2023 15:31:02 +0000 (11:31 -0400)
committerPatrick Palka <ppalka@redhat.com>
Fri, 27 Oct 2023 15:31:02 +0000 (11:31 -0400)
In build_new_1, we also need to avoid folding 'outer_nelts_check' when
in a template context to prevent an ICE on the below testcase.  This
patch replaces the problematic fold_build2 call with build2 (we'll later
fold it if appropriate during cp_fully_fold).

In passing, this patch removes an unnecessary conversion of 'nelts'
since it should always already be a size_t (and 'convert' isn't the best
conversion entry point to use anyway since it lacks a complain parameter).

PR c++/111929

gcc/cp/ChangeLog:

* init.cc (build_new_1): Remove unnecessary call to convert
on 'nelts'.  Use build2 instead of fold_build2 for
'outer_nelts_checks'.

gcc/testsuite/ChangeLog:

* g++.dg/template/non-dependent28a.C: New test.

gcc/cp/init.cc
gcc/testsuite/g++.dg/template/non-dependent28a.C [new file with mode: 0644]

index 65d37c3c0c764e0752e7d2813e4ebb94b524daa6..6444f0a8518ed6a5e0e2b16b541776f204dd8274 100644 (file)
@@ -3261,7 +3261,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
       max_outer_nelts = wi::udiv_trunc (max_size, inner_size);
       max_outer_nelts_tree = wide_int_to_tree (sizetype, max_outer_nelts);
 
-      size = build2 (MULT_EXPR, sizetype, size, convert (sizetype, nelts));
+      size = build2 (MULT_EXPR, sizetype, size, nelts);
 
       if (TREE_CODE (cst_outer_nelts) == INTEGER_CST)
        {
@@ -3293,9 +3293,9 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
            - wi::clz (max_outer_nelts);
          max_outer_nelts = (max_outer_nelts >> shift) << shift;
 
-          outer_nelts_check = fold_build2 (LE_EXPR, boolean_type_node,
-                                          outer_nelts,
-                                          max_outer_nelts_tree);
+         outer_nelts_check = build2 (LE_EXPR, boolean_type_node,
+                                     outer_nelts,
+                                     max_outer_nelts_tree);
        }
     }
 
diff --git a/gcc/testsuite/g++.dg/template/non-dependent28a.C b/gcc/testsuite/g++.dg/template/non-dependent28a.C
new file mode 100644 (file)
index 0000000..d32520c
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/111929
+
+struct A { operator int(); };
+
+template<class>
+void f() {
+  new int[A()];
+}