re PR c++/82159 (ICE: in assign_temp, at function.c:961)
authorJakub Jelinek <jakub@redhat.com>
Wed, 27 Sep 2017 14:19:57 +0000 (16:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 27 Sep 2017 14:19:57 +0000 (16:19 +0200)
PR c++/82159
* gimplify.c (gimplify_modify_expr): Don't optimize away zero sized
lhs from calls if the lhs has addressable type.

* g++.dg/opt/pr82159.C: New test.

From-SVN: r253230

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr82159.C [new file with mode: 0644]

index d35c497b888946a7b1db899f309c011d855add4b..44783aab64b8e31df4f2afa28b9795fc7c51d698 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/82159
+       * gimplify.c (gimplify_modify_expr): Don't optimize away zero sized
+       lhs from calls if the lhs has addressable type.
+
 2017-09-27  Richard Biener  <rguenther@suse.de>
 
        * graphite.h (scop::max_alias_set): New member.
index 8b29a7179c51ffb96b97c8f847e74e9408e4d5f3..c3fd6ace84e6d4f7329bab53efe6f92493a7791f 100644 (file)
@@ -5479,7 +5479,12 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
      side as statements and throw away the assignment.  Do this after
      gimplify_modify_expr_rhs so we handle TARGET_EXPRs of addressable
      types properly.  */
-  if (zero_sized_type (TREE_TYPE (*from_p)) && !want_value)
+  if (zero_sized_type (TREE_TYPE (*from_p))
+      && !want_value
+      /* Don't do this for calls that return addressable types, expand_call
+        relies on those having a lhs.  */
+      && !(TREE_ADDRESSABLE (TREE_TYPE (*from_p))
+          && TREE_CODE (*from_p) == CALL_EXPR))
     {
       gimplify_stmt (from_p, pre_p);
       gimplify_stmt (to_p, pre_p);
index a61d510036c4341b7e25a616b5471ac4c2fa96bb..39682ce725965e2d2f46d0cc637744f1d649d540 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/82159
+       * g++.dg/opt/pr82159.C: New test.
+
 2017-09-27  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * gcc.dg/vect/pr65947-9.c: Use signed char explicitly.
diff --git a/gcc/testsuite/g++.dg/opt/pr82159.C b/gcc/testsuite/g++.dg/opt/pr82159.C
new file mode 100644 (file)
index 0000000..e39dbc3
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/82159
+// { dg-do compile }
+// { dg-options "" }
+
+template<int N>
+struct S
+{
+  ~S () {}
+  template<int M> S<M> foo () { return S<M> (); }
+  unsigned char data[N];
+};
+
+int
+main ()
+{
+  S<16> d;
+  S<0> t = d.foo<0> ();
+}