aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-06-13 22:05:20 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-06-13 22:05:20 +0200
commitf31a8339835b2dda14b622cf35555ea666966a9a (patch)
treeb9c27822cedec984109a2bf21ac94eb5c0961a8d
parentc60dc05326dbf6960dbaa898db854fd062afeecd (diff)
downloadgcc-f31a8339835b2dda14b622cf35555ea666966a9a.zip
gcc-f31a8339835b2dda14b622cf35555ea666966a9a.tar.gz
gcc-f31a8339835b2dda14b622cf35555ea666966a9a.tar.bz2
re PR sanitizer/80973 (ICE with lambda and -fsanitize=undefined)
PR c++/80973 * cp-gimplify.c (cp_genericize_r): Don't instrument MEM_REF second argument even if it has REFERENCE_TYPE. * g++.dg/ubsan/pr80973.C: New test. From-SVN: r249174
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/cp-gimplify.c10
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/ubsan/pr80973.C16
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ae91a9d..ca0f9b2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2017-06-13 Jakub Jelinek <jakub@redhat.com>
+ PR c++/80973
+ * cp-gimplify.c (cp_genericize_r): Don't instrument MEM_REF second
+ argument even if it has REFERENCE_TYPE.
+
PR c++/80984
* cp-gimplify.c (cp_genericize): Only look for VAR_DECLs in
BLOCK_VARS (outer) chain.
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index d546208..a0abd51 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1450,6 +1450,16 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
*stmt_p = cplus_expand_constant (stmt);
*walk_subtrees = 0;
}
+ else if (TREE_CODE (stmt) == MEM_REF)
+ {
+ /* For MEM_REF, make sure not to sanitize the second operand even
+ if it has reference type. It is just an offset with a type
+ holding other information. There is no other processing we
+ need to do for INTEGER_CSTs, so just ignore the second argument
+ unconditionally. */
+ cp_walk_tree (&TREE_OPERAND (stmt, 0), cp_genericize_r, data, NULL);
+ *walk_subtrees = 0;
+ }
else if (sanitize_flags_p ((SANITIZE_NULL
| SANITIZE_ALIGNMENT | SANITIZE_VPTR))
&& !wtd->no_sanitize_p)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5164fa9..f32b8c8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2017-06-13 Jakub Jelinek <jakub@redhat.com>
+ PR c++/80973
+ * g++.dg/ubsan/pr80973.C: New test.
+
PR c++/80984
* g++.dg/opt/nrv18.C: New test.
diff --git a/gcc/testsuite/g++.dg/ubsan/pr80973.C b/gcc/testsuite/g++.dg/ubsan/pr80973.C
new file mode 100644
index 0000000..b534fdb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/pr80973.C
@@ -0,0 +1,16 @@
+// PR c++/80973
+// { dg-do compile }
+// { dg-options "-fsanitize=undefined -std=c++14" }
+
+struct A {
+ A();
+ A(const A &);
+};
+struct B {
+ B();
+ template <typename... Args> auto g(Args &&... p1) {
+ return [=] { f(p1...); };
+ }
+ void f(A, const char *);
+};
+B::B() { g(A(), ""); }