https://gcc.gnu.org/g:ad951b9c2696a62fddf2502e3b68352a81264f7c

commit ad951b9c2696a62fddf2502e3b68352a81264f7c
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Thu Apr 17 16:19:35 2025 +0100

    gccrs: prealloc the initilizer vector
    
    There are two cases when initilizing an array, this is the
    const context which means we need to build the array ctor,
    which means using lots of memory, its super inefficient
    because we are using a big wrapper over the GCC internals here
    but preallocating the vectors here causes a:
    
      terminate called after throwing an instance of 'std::bad_alloc'
    
    So this is a handy error condition to rely on for this senario.
    
    Fixes Rust-GCC#3713
    Fixes Rust-GCC#3727
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-expr.cc (CompileExpr::array_copied_expr): 
prealloc the vector
    
    Signed-off-by: Philip Herron <herron.phi...@googlemail.com>

Diff:
---
 gcc/rust/backend/rust-compile-expr.cc | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gcc/rust/backend/rust-compile-expr.cc 
b/gcc/rust/backend/rust-compile-expr.cc
index 1e09c6c155ae..339317d81747 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -1972,8 +1972,12 @@ CompileExpr::array_copied_expr (location_t expr_locus,
   if (ctx->const_context_p ())
     {
       size_t idx = 0;
+
       std::vector<unsigned long> indexes;
       std::vector<tree> constructor;
+
+      indexes.reserve (len);
+      constructor.reserve (len);
       for (unsigned HOST_WIDE_INT i = 0; i < len; i++)
        {
          constructor.push_back (translated_expr);

Reply via email to