From dfdb731967d8427f09a90110985b0f71a670b3d9 Mon Sep 17 00:00:00 2001 From: Serge Pavlov Date: Tue, 16 Jul 2013 07:14:18 +0000 Subject: [PATCH] Limit number of bits in size representation so that bit size fit 64 bits. This fixes PR8256 and some others. llvm-svn: 186385 --- clang/lib/AST/Type.cpp | 11 ++++++----- clang/test/Sema/array-size-64.c | 9 +++++++-- clang/test/Sema/offsetof-64.c | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index af4ea09..4068b2b 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/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/clang/test/Sema/array-size-64.c b/clang/test/Sema/array-size-64.c index f22e8e7..0e094bfa 100644 --- a/clang/test/Sema/array-size-64.c +++ b/clang/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/clang/test/Sema/offsetof-64.c b/clang/test/Sema/offsetof-64.c index fb3d6e9..4a80dee 100644 --- a/clang/test/Sema/offsetof-64.c +++ b/clang/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]; -- 2.7.4