Hi!

Clobber stmts, being artificial statements, were certainly never
meant to be instrumented.  In 4.8 when asan has been introduced into gcc,
the lhs of clobber could be only a decl and as a whole decl store would not
be really instrumented, but with *this clobbers in 4.9 that is no longer the
case.

Fixed thusly, tested on x86_64-linux, committed to trunk and 4.9 as obvious.

2014-09-18  Jakub Jelinek  <ja...@redhat.com>

        PR c++/62017
        * asan.c (transform_statements): Don't instrument clobber statements.

        * g++.dg/asan/pr62017.C: New test.

--- gcc/asan.c.jj       2014-09-08 22:12:52.000000000 +0200
+++ gcc/asan.c  2014-09-18 14:34:30.023446693 +0200
@@ -2072,6 +2072,7 @@ transform_statements (void)
          if (has_stmt_been_instrumented_p (s))
            gsi_next (&i);
          else if (gimple_assign_single_p (s)
+                  && !gimple_clobber_p (s)
                   && maybe_instrument_assignment (&i))
            /*  Nothing to do as maybe_instrument_assignment advanced
                the iterator I.  */;
--- gcc/testsuite/g++.dg/asan/pr62017.C.jj      2014-09-18 14:44:03.964525585 
+0200
+++ gcc/testsuite/g++.dg/asan/pr62017.C 2014-09-18 14:43:52.000000000 +0200
@@ -0,0 +1,17 @@
+// PR c++/62017
+// { dg-do run }
+
+struct A
+{
+  int x;
+  virtual ~A () {}
+};
+struct B : public virtual A {};
+struct C : public virtual A {};
+struct D : public B, virtual public C {};
+
+int
+main ()
+{
+  D d;
+}

        Jakub

Reply via email to