PR c++/98413 - ICE on placement new and member pointer
authorMartin Sebor <msebor@redhat.com>
Wed, 23 Dec 2020 23:28:06 +0000 (16:28 -0700)
committerMartin Sebor <msebor@redhat.com>
Wed, 23 Dec 2020 23:36:47 +0000 (16:36 -0700)
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.

gcc/builtins.c
gcc/testsuite/g++.dg/warn/pr98413.C [new file with mode: 0644]

index 28e4444..498a112 100644 (file)
@@ -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 (file)
index 0000000..877871a
--- /dev/null
@@ -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" }
+}