]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix bad interaction between inlining and thunk generation
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 20 Jun 2023 22:50:40 +0000 (00:50 +0200)
committerMarc Poulhiès <poulhies@adacore.com>
Tue, 27 Jun 2023 12:05:52 +0000 (14:05 +0200)
This may cause the type of the RESULT_DECL of a function which returns by
invisible reference to be turned into a reference type twice.

gcc/ada/

* gcc-interface/trans.cc (Subprogram_Body_to_gnu): Add guard to the
code turning the type of the RESULT_DECL into a reference type.
(maybe_make_gnu_thunk): Use a more precise guard in the same case.

gcc/ada/gcc-interface/trans.cc

index b74bb0683bf570545826cd519cb660985eab1c94..f5eadbbc895b99e80eb9dbb1b8d38e5887bdaec5 100644 (file)
@@ -3902,8 +3902,11 @@ Subprogram_Body_to_gnu (Node_Id gnat_node)
     gnu_return_var_elmt = NULL_TREE;
 
   /* If the function returns by invisible reference, make it explicit in the
-     function body.  See gnat_to_gnu_subprog_type for more details.  */
-  if (TREE_ADDRESSABLE (gnu_subprog_type))
+     function body, but beware that maybe_make_gnu_thunk may already have done
+     it if the function is inlined across units.  See gnat_to_gnu_subprog_type
+     for more details.  */
+  if (TREE_ADDRESSABLE (gnu_subprog_type)
+      && TREE_CODE (TREE_TYPE (gnu_result_decl)) != REFERENCE_TYPE)
     {
       TREE_TYPE (gnu_result_decl)
        = build_reference_type (TREE_TYPE (gnu_result_decl));
@@ -11015,7 +11018,7 @@ maybe_make_gnu_thunk (Entity_Id gnat_thunk, tree gnu_thunk)
      same transformation as Subprogram_Body_to_gnu here.  */
   if (TREE_ADDRESSABLE (TREE_TYPE (gnu_target))
       && DECL_EXTERNAL (gnu_target)
-      && !POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (gnu_target))))
+      && TREE_CODE (TREE_TYPE (DECL_RESULT (gnu_target))) != REFERENCE_TYPE)
     {
       TREE_TYPE (DECL_RESULT (gnu_target))
        = build_reference_type (TREE_TYPE (DECL_RESULT (gnu_target)));