Fix ICE in use-after-scope w/ -fno-tree-dce (PR sanitize/79783).
authorMartin Liska <mliska@suse.cz>
Mon, 6 Mar 2017 10:20:33 +0000 (11:20 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 6 Mar 2017 10:20:33 +0000 (10:20 +0000)
2017-03-06  Martin Liska  <mliska@suse.cz>

PR sanitize/79783
* asan.c (asan_expand_poison_ifn): Do not expand ASAN_POISON
when having a SSA NAME w/o VAR_DECL assigned to it.
2017-03-06  Martin Liska  <mliska@suse.cz>

PR sanitize/79783
* g++.dg/asan/pr79783.C: New test.

From-SVN: r245912

gcc/ChangeLog
gcc/asan.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/asan/pr79783.C [new file with mode: 0644]

index b588b47..35f5288 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-06  Martin Liska  <mliska@suse.cz>
+
+       PR sanitize/79783
+       * asan.c (asan_expand_poison_ifn): Do not expand ASAN_POISON
+       when having a SSA NAME w/o VAR_DECL assigned to it.
+
 2017-03-06  Prachi Godbole  <prachi.godbole@imgtec.com>
 
        * config/mips/mips-msa.md (msa_dotp_<su>_d, msa_dpadd_<su>_d,
index 6cdd59b..7223e3c 100644 (file)
@@ -3107,12 +3107,16 @@ asan_expand_poison_ifn (gimple_stmt_iterator *iter,
 {
   gimple *g = gsi_stmt (*iter);
   tree poisoned_var = gimple_call_lhs (g);
-  if (!poisoned_var)
+  if (!poisoned_var || has_zero_uses (poisoned_var))
     {
       gsi_remove (iter, true);
       return true;
     }
 
+  if (SSA_NAME_VAR (poisoned_var) == NULL_TREE)
+    SET_SSA_NAME_VAR_OR_IDENTIFIER (poisoned_var,
+                                   create_tmp_var (TREE_TYPE (poisoned_var)));
+
   tree shadow_var = create_asan_shadow_var (SSA_NAME_VAR (poisoned_var),
                                            shadow_vars_mapping);
 
index 9a44150..83e7a99 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-06  Martin Liska  <mliska@suse.cz>
+
+       PR sanitize/79783
+       * g++.dg/asan/pr79783.C: New test.
+
 2017-03-06  Prachi Godbole  <prachi.godbole@imgtec.com>
 
        * gcc.target/mips/msa-dotp.c: New tests.
diff --git a/gcc/testsuite/g++.dg/asan/pr79783.C b/gcc/testsuite/g++.dg/asan/pr79783.C
new file mode 100644 (file)
index 0000000..939f60b
--- /dev/null
@@ -0,0 +1,19 @@
+// PR sanitizer/79783
+// { dg-options "-fno-tree-dce" }
+
+struct A
+{
+  static void foo(const char&) {}
+};
+
+struct B
+{
+  B() { A::foo(char()); }
+};
+
+struct C
+{
+  virtual void bar() const { B b; }
+};
+
+C c;