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>
|
||||
|
||||
PR c++/77791
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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>
|
||||
|
||||
PR c++/77791
|
||||
|
14
gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C
Normal file
14
gcc/testsuite/g++.dg/warn/Wplacement-new-size-4.C
Normal file
@ -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
Block a user