aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ubsan/pr59437.C24
-rw-r--r--gcc/vtable-verify.c6
4 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0f34fb2..110c0a0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-12-10 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/59437
+ * vtable-verify.c (var_is_used_for_virtual_call_p): Check the
+ return value of gimple_call_fn. Use is_gimple_call/is_gimple_assign
+ instead of gimple_code.
+
2013-12-10 Maxim Kuvyrkov <maxim@kugelworks.com>
* config.gcc (mips*-mti-linux*, mips64*-*-linux*):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 404569e..09a1323 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-09 Marek Polacek <polacek@redhat.com>
+
+ PR sanitizer/59437
+ * g++.dg/ubsan/pr59437.C: New test.
+
2013-12-10 Max Ostapenko <m.ostapenko@partner.samsung.com>
* c-c++-common/tsan/thread_leak2.c: `dg-skip-if' removed.
diff --git a/gcc/testsuite/g++.dg/ubsan/pr59437.C b/gcc/testsuite/g++.dg/ubsan/pr59437.C
new file mode 100644
index 0000000..0e77ccd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/pr59437.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-fsanitize=null -fvtable-verify=std" }
+// { dg-skip-if "" { *-*-* } { "-flto" } { "" } }
+
+template < typename T > struct A
+{
+ T foo ();
+};
+template < typename T > struct C: virtual public A < T >
+{
+ C & operator<< (C & (C &));
+};
+template < typename T >
+C < T > &endl (C < int > &c)
+{
+ c.foo ();
+ return c;
+}
+C < int > cout;
+void
+fn ()
+{
+ cout << endl;
+}
diff --git a/gcc/vtable-verify.c b/gcc/vtable-verify.c
index dabb77b..af61e93 100644
--- a/gcc/vtable-verify.c
+++ b/gcc/vtable-verify.c
@@ -513,10 +513,10 @@ var_is_used_for_virtual_call_p (tree lhs, int *mem_ref_depth)
{
gimple stmt2 = USE_STMT (use_p);
- if (gimple_code (stmt2) == GIMPLE_CALL)
+ if (is_gimple_call (stmt2))
{
tree fncall = gimple_call_fn (stmt2);
- if (TREE_CODE (fncall) == OBJ_TYPE_REF)
+ if (fncall && TREE_CODE (fncall) == OBJ_TYPE_REF)
found_vcall = true;
else
return false;
@@ -527,7 +527,7 @@ var_is_used_for_virtual_call_p (tree lhs, int *mem_ref_depth)
(gimple_phi_result (stmt2),
mem_ref_depth);
}
- else if (gimple_code (stmt2) == GIMPLE_ASSIGN)
+ else if (is_gimple_assign (stmt2))
{
tree rhs = gimple_assign_rhs1 (stmt2);
if (TREE_CODE (rhs) == ADDR_EXPR