aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-12-23 16:28:06 -0700
committerMartin Sebor <msebor@redhat.com>2020-12-23 16:36:47 -0700
commitfdd8560cce9f10fe5dcd26483440be136b81701d (patch)
tree9aeb0396d0788c3b36c78b9b0b30051087d27e1b /gcc
parenteb81c997d81033407576a2376b6ce24b0646d3a1 (diff)
downloadgcc-fdd8560cce9f10fe5dcd26483440be136b81701d.zip
gcc-fdd8560cce9f10fe5dcd26483440be136b81701d.tar.gz
gcc-fdd8560cce9f10fe5dcd26483440be136b81701d.tar.bz2
PR c++/98413 - ICE on placement new and member pointer
gcc/ChangeLog: PR c++/98413 * builtins.c (get_offset_range): Avoid non-integers/-pointers. gcc/testsuite/ChangeLog: PR c++/98413 * g++.dg/warn/pr98413.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/builtins.c3
-rw-r--r--gcc/testsuite/g++.dg/warn/pr98413.C23
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 28e4444..498a112 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -5097,6 +5097,8 @@ get_offset_range (tree x, gimple *stmt, offset_int r[2], range_query *rvals)
x = TREE_OPERAND (x, 0);
tree type = TREE_TYPE (x);
+ if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
+ return false;
if (TREE_CODE (x) != INTEGER_CST
&& TREE_CODE (x) != SSA_NAME)
@@ -13398,6 +13400,7 @@ warn_dealloc_offset (location_t loc, tree exp, const access_ref &aref)
return false;
tree dealloc_decl = get_callee_fndecl (exp);
+
if (DECL_IS_OPERATOR_DELETE_P (dealloc_decl)
&& !DECL_IS_REPLACEABLE_OPERATOR (dealloc_decl))
{
diff --git a/gcc/testsuite/g++.dg/warn/pr98413.C b/gcc/testsuite/g++.dg/warn/pr98413.C
new file mode 100644
index 0000000..877871a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pr98413.C
@@ -0,0 +1,23 @@
+/* PR c++/98413 - ICE on placement new and member pointer
+ { dg-do compile }
+ { dg-options "-Wall" } */
+
+void* operator new (__SIZE_TYPE__, void *p) { return p; }
+
+struct A { int m; } a;
+
+void fc (int A::*p)
+{
+ new (&(a.*p)) char;
+}
+
+void fi (int A::*p)
+{
+ new (&(a.*p)) int;
+}
+
+void fB (int A::*p)
+{
+ struct B { int a[2]; };
+ new (&(a.*p)) B; // { dg-warning "\\\[-Wplacement-new" }
+}