From 8ff04ff92d9d88ca84671e36600572558216eab2 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Tue, 4 Oct 2016 17:34:00 +0000 Subject: [PATCH] PR c++/77804 - Internal compiler error on incorrect initialization of new-d array gcc/cp/ChangeLog: PR c++/77804 * init.c (warn_placement_new_too_small): Avoid assuming an array type has a constant size. gcc/testsuite/ChangeLog: PR c++/77804 * g++.dg/warn/Wplacement-new-size-4.C: New test. From-SVN: r240754 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/init.c | 9 +++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 637aed4a00b..1aa8e73234c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-10-04 Martin Sebor + + PR c++/77804 + * init.c (warn_placement_new_too_small): Avoid assuming an array type + has a constant size. + 2016-10-04 Jakub Jelinek PR c++/77791 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 0d17370e468..2d5877d3041 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2504,7 +2504,7 @@ warn_placement_new_too_small (tree type, tree nelts, tree size, tree oper) && warn_placement_new < 2) return; } - + /* The size of the buffer can only be adjusted down but not up. */ gcc_checking_assert (0 <= adjust); @@ -2526,8 +2526,13 @@ warn_placement_new_too_small (tree type, tree nelts, tree size, tree oper) else if (nelts && CONSTANT_CLASS_P (nelts)) bytes_need = tree_to_uhwi (nelts) * tree_to_uhwi (TYPE_SIZE_UNIT (type)); - else + else if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))) bytes_need = tree_to_uhwi (TYPE_SIZE_UNIT (type)); + else + { + /* The type is a VLA. */ + return; + } if (bytes_avail < bytes_need) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b2e14a9c9c..6615024165b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-04 Martin Sebor + + PR c++/77804 + * g++.dg/warn/Wplacement-new-size-4.C: New test. + 2016-10-04 Jakub Jelinek PR c++/77791 diff --git a/gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C b/gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C new file mode 100644 index 00000000000..da9b1abf6ff --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C @@ -0,0 +1,14 @@ +// PR c++/77804 - Internal compiler error on incorrect initialization of +// new-d array +// { dg-do compile } +// { dg-additional-options "-Wplacement-new -Wvla -Wno-error=vla" } + +void* operator new[] (__SIZE_TYPE__ n, void *p) { return p; } + +int main() +{ + char buf[256]; + unsigned n = 10; + int* p = new (buf) (int[n]); // { dg-warning "non-constant array new length must be specified without parentheses around the type-id" } + // { dg-warning "ISO C\\+\\+ forbids variable length array" "vla warning" { target *-*-* } .-1 } +}