mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
3814e88007
commit
8ff04ff92d
|
|
@ -1,3 +1,9 @@
|
||||||
|
2016-10-04 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR c++/77804
|
||||||
|
* init.c (warn_placement_new_too_small): Avoid assuming an array type
|
||||||
|
has a constant size.
|
||||||
|
|
||||||
2016-10-04 Jakub Jelinek <jakub@redhat.com>
|
2016-10-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/77791
|
PR c++/77791
|
||||||
|
|
|
||||||
|
|
@ -2504,7 +2504,7 @@ warn_placement_new_too_small (tree type, tree nelts, tree size, tree oper)
|
||||||
&& warn_placement_new < 2)
|
&& warn_placement_new < 2)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The size of the buffer can only be adjusted down but not up. */
|
/* The size of the buffer can only be adjusted down but not up. */
|
||||||
gcc_checking_assert (0 <= adjust);
|
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))
|
else if (nelts && CONSTANT_CLASS_P (nelts))
|
||||||
bytes_need = tree_to_uhwi (nelts)
|
bytes_need = tree_to_uhwi (nelts)
|
||||||
* tree_to_uhwi (TYPE_SIZE_UNIT (type));
|
* 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));
|
bytes_need = tree_to_uhwi (TYPE_SIZE_UNIT (type));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The type is a VLA. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (bytes_avail < bytes_need)
|
if (bytes_avail < bytes_need)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-10-04 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
PR c++/77804
|
||||||
|
* g++.dg/warn/Wplacement-new-size-4.C: New test.
|
||||||
|
|
||||||
2016-10-04 Jakub Jelinek <jakub@redhat.com>
|
2016-10-04 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/77791
|
PR c++/77791
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue