diff options
author | Martin Sebor <msebor@redhat.com> | 2020-12-23 16:28:06 -0700 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2020-12-23 16:36:47 -0700 |
commit | fdd8560cce9f10fe5dcd26483440be136b81701d (patch) | |
tree | 9aeb0396d0788c3b36c78b9b0b30051087d27e1b /gcc | |
parent | eb81c997d81033407576a2376b6ce24b0646d3a1 (diff) | |
download | gcc-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.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr98413.C | 23 |
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" } +} |