mirror of https://github.com/microsoft/clang.git
Limit number of bits in size representation so that bit size fit 64 bits.
This fixes PR8256 and some others. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6afc66dc25
commit
e8caa30d61
|
@ -111,11 +111,12 @@ unsigned ConstantArrayType::getNumAddressingBits(ASTContext &Context,
|
|||
unsigned ConstantArrayType::getMaxSizeBits(ASTContext &Context) {
|
||||
unsigned Bits = Context.getTypeSize(Context.getSizeType());
|
||||
|
||||
// GCC appears to only allow 63 bits worth of address space when compiling
|
||||
// for 64-bit, so we do the same.
|
||||
if (Bits == 64)
|
||||
--Bits;
|
||||
|
||||
// Limit the number of bits in size_t so that maximal bit size fits 64 bit
|
||||
// integer (see PR8256). We can do this as currently there is no hardware
|
||||
// that supports full 64-bit virtual space.
|
||||
if (Bits > 61)
|
||||
Bits = 61;
|
||||
|
||||
return Bits;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
|
||||
void f() {
|
||||
int a[2147483647U][2147483647U]; // expected-error{{array is too large}}
|
||||
int b[1073741825U - 1U][2147483647U];
|
||||
int c[18446744073709551615U/sizeof(int)/2];
|
||||
int b[1073741825U - 1U][2147483647U]; // expected-error{{array is too large}}
|
||||
}
|
||||
|
||||
void pr8256 () {
|
||||
typedef char a[1LL<<61]; // expected-error {{array is too large}}
|
||||
typedef char b[(long long)sizeof(a)-1];
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
// PR15216
|
||||
// Don't crash when taking computing the offset of structs with large arrays.
|
||||
const unsigned long Size = (1l << 62);
|
||||
const unsigned long Size = (1l << 60);
|
||||
|
||||
struct Chunk1 {
|
||||
char padding[Size];
|
||||
|
|
Loading…
Reference in New Issue