https://gcc.gnu.org/g:9362abf5e81eb2e6e35f55f36ff8e7a31aef4e9d

commit r15-3406-g9362abf5e81eb2e6e35f55f36ff8e7a31aef4e9d
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Fri Aug 23 09:44:06 2024 +0200

    ada: Plug loophole exposed by previous change
    
    The change causes more temporaries to be created at call sites for unaligned
    actual parameters, thus revealing that the machinery does not properly deal
    with unconstrained nominal subtypes for them.
    
    gcc/ada/
    
            * gcc-interface/trans.cc (create_temporary): Deal with types whose
            size is self-referential by allocating the maximum size.

Diff:
---
 gcc/ada/gcc-interface/trans.cc | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/gcc/ada/gcc-interface/trans.cc b/gcc/ada/gcc-interface/trans.cc
index caa0f56a34d9..fadd6b483d5a 100644
--- a/gcc/ada/gcc-interface/trans.cc
+++ b/gcc/ada/gcc-interface/trans.cc
@@ -4527,6 +4527,9 @@ storage_model_access_required_p (Node_Id gnat_node, 
Entity_Id *gnat_smo)
 static tree
 create_temporary (const char *prefix, tree type)
 {
+  if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (type)))
+    type = maybe_pad_type (type, max_size (TYPE_SIZE (type), true), 0,
+                          Empty, false, false, true);
   tree gnu_temp
     = create_var_decl (create_tmp_var_name (prefix), NULL_TREE,
                      type, NULL_TREE,

Reply via email to