gcc/gcc5-pr65004.patch

70 lines
2.0 KiB
Diff

2015-02-10 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/65004
* ubsan.c (ubsan_expand_vptr_ifn): Always return true.
* g++.dg/asan/pr65004.C: New test.
--- gcc/ubsan.c.jj 2015-01-28 08:39:53.000000000 +0100
+++ gcc/ubsan.c 2015-02-10 18:44:59.796872508 +0100
@@ -1148,7 +1148,7 @@ ubsan_expand_vptr_ifn (gimple_stmt_itera
/* Get rid of the UBSAN_VPTR call from the IR. */
unlink_stmt_vdef (stmt);
gsi_remove (&gsi, true);
- return gsi_end_p (*gsip);
+ return true;
}
/* Instrument a memory reference. BASE is the base of MEM, IS_LHS says
--- gcc/testsuite/g++.dg/asan/pr65004.C.jj 2015-02-10 18:49:48.521988574 +0100
+++ gcc/testsuite/g++.dg/asan/pr65004.C 2015-02-10 18:51:22.249407985 +0100
@@ -0,0 +1,48 @@
+// PR sanitizer/65004
+// { dg-do compile }
+// { dg-options "-fcompare-debug -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all" }
+
+namespace N {
+ template <typename Signature> struct function;
+ namespace detail {
+ namespace function {
+ struct vtable_base { };
+ }
+ }
+ struct function_base {
+ detail::function::vtable_base * vtable;
+ };
+ template <typename R, typename T0> struct function1 : public function_base { };
+ template <typename R, typename T0> struct function <R (T0)> : public function1 <R, T0> { };
+}
+namespace Bar {
+ typedef N::function <void (const char *)> WarningHandler;
+}
+namespace Foo {
+ struct FooRecord {
+ virtual ~FooRecord ();
+ };
+ struct TestRecord : public FooRecord {
+ long x;
+ };
+}
+namespace Foo {
+ using Bar::WarningHandler;
+ struct FooScanner {
+ WarningHandler warnHandler;
+ int readByte ();
+ long readSignedInteger ();
+ };
+ struct FooRecordReader {
+ FooScanner & scanner;
+ long readSInt ();
+ void readTestRecord (TestRecord * recp);
+ };
+ inline long FooRecordReader::readSInt () {
+ return scanner.readSignedInteger ();
+ }
+ void FooRecordReader::readTestRecord (TestRecord * recp) {
+ int infoByte = scanner.readByte ();
+ recp->x = readSInt ();
+ }
+