From: Serge Pavlov Date: Tue, 16 Jul 2013 07:14:18 +0000 (+0000) Subject: Limit number of bits in size representation so that bit size fit 64 bits. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e8caa30d6124b915fb6bfb3fb2d0eb4857381d08;p=clang 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 --- diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index af4ea09672..4068b2b898 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -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; } diff --git a/test/Sema/array-size-64.c b/test/Sema/array-size-64.c index f22e8e77d2..0e094bfa6b 100644 --- a/test/Sema/array-size-64.c +++ b/test/Sema/array-size-64.c @@ -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]; +} + diff --git a/test/Sema/offsetof-64.c b/test/Sema/offsetof-64.c index fb3d6e98d1..4a80dee2fc 100644 --- a/test/Sema/offsetof-64.c +++ b/test/Sema/offsetof-64.c @@ -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];