https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91988

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
The failure is triggered by compile-time(!)

Breakpoint 6, symbol_table::create_edge (this=0x7ffff6810100, 
    caller=<cgraph_node * 0x7ffff680f708 "main"/3>, 
    callee=<cgraph_node * 0x7ffff680f870 "fun"/4>, call_stmt=0x7ffff7fefea0, 
    count=..., indir_unknown_callee=false)
    at /space/rguenther/src/svn/gcc-9-branch/gcc/cgraph.c:884
884           edge->inline_failed = CIF_MISMATCHED_ARGUMENTS;

and also

Breakpoint 7, early_inliner (fun=0x7ffff696b210)
    at /space/rguenther/src/svn/gcc-9-branch/gcc/ipa-inline.c:2841
2841                      edge->inline_failed = CIF_MISMATCHED_ARGUMENTS;

we ultimatively call

types_compatible_p (type1=<record_type 0x7ffff69641f8 A>, 
    type2=<reference_type 0x7ffff696e000>)

from

static bool
gimple_check_call_args (gimple *stmt, tree fndecl, bool args_count_match)
{
...
          if (TREE_VALUE (p) == error_mark_node
              || arg == error_mark_node
              || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
              || (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
                  && !fold_convertible_p (TREE_VALUE (p), arg)))
            return false;

we're looking at TYPE_ARG_TYPES here because we don't have a PARM_DECL
and as we know TYPE_ARG_TYPES do _not_ reflect by-reference semantics.
But we could take TREE_ADDRESSABLE as a hint.

Index: gcc/cgraph.c
===================================================================
--- gcc/cgraph.c        (revision 276396)
+++ gcc/cgraph.c        (working copy)
@@ -3728,7 +3728,10 @@ gimple_check_call_args (gimple *stmt, tr
              || arg == error_mark_node
              || TREE_CODE (TREE_VALUE (p)) == VOID_TYPE
              || (!types_compatible_p (TREE_VALUE (p), TREE_TYPE (arg))
-                 && !fold_convertible_p (TREE_VALUE (p), arg)))
+                 && !fold_convertible_p (TREE_VALUE (p), arg)
+                 /* TREE_ADDRESSABLE types are passed by reference.  */
+                 && !(POINTER_TYPE_P (TREE_TYPE (arg))
+                      && TREE_ADDRESSABLE (TREE_VALUE (p)))))
             return false;
        }
     }

fixes that (comparing the pointed-do type is probably too strict here).

Reply via email to