The attached test crashed because we wound up with an SSA_NAME of
a reference type in get_range_info which has

  gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));

I think this could be fixed by treating "char &" the same as "char *" in
check_sizes (the POINTER_TYPE_P macro handles both pointers/references).

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2016-12-09  Marek Polacek  <pola...@redhat.com>

        PR middle-end/78750
        * builtins.c (check_sizes): Use POINTER_TYPE_P.

        * g++.dg/torture/pr78750.C: New.

diff --git gcc/builtins.c gcc/builtins.c
index 20515e7..b056e12 100644
--- gcc/builtins.c
+++ gcc/builtins.c
@@ -3091,7 +3091,7 @@ check_sizes (int opt, tree exp, tree size, tree maxlen, 
tree str, tree objsize)
     {
       /* STR is normally a pointer to string but as a special case
         it can be an integer denoting the length of a string.  */
-      if (TREE_CODE (TREE_TYPE (str)) == POINTER_TYPE)
+      if (POINTER_TYPE_P (TREE_TYPE (str)))
        {
          /* Try to determine the range of lengths the source string
             refers to.  If it can be determined add one to it for
diff --git gcc/testsuite/g++.dg/torture/pr78750.C 
gcc/testsuite/g++.dg/torture/pr78750.C
index e69de29..54232e6 100644
--- gcc/testsuite/g++.dg/torture/pr78750.C
+++ gcc/testsuite/g++.dg/torture/pr78750.C
@@ -0,0 +1,10 @@
+// PR middle-end/78750
+// { dg-do compile }
+
+extern "C" char *strcpy (char *, const char *);
+
+void
+fn (char *p, char &as)
+{
+  strcpy (p, &as);
+}

        Marek

Reply via email to