When a too large array is requested, use QualType() to indicate there is not 
a valid type being created.

http://llvm-reviews.chandlerc.com/D800

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D800?vs=1974&id=1977#toc

Files:
  test/Sema/offsetof-64.c
  lib/Sema/SemaType.cpp

Index: test/Sema/offsetof-64.c
===================================================================
--- test/Sema/offsetof-64.c
+++ test/Sema/offsetof-64.c
@@ -1,15 +1,22 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu
-// expected-no-diagnostics
 
 // PR15216
 // Don't crash when taking computing the offset of structs with large arrays.
 const unsigned long Size = (1l << 62);
 
-struct Chunk {
+struct Chunk1 {
   char padding[Size];
   char more_padding[1][Size];
   char data;
 };
 
-int test1 = __builtin_offsetof(struct Chunk, data);
+int test1 = __builtin_offsetof(struct Chunk1, data);
 
+struct Chunk2 {
+  char padding[Size][Size][Size];  // expected-error 2{{array is too large}}
+  char data;
+};
+
+// FIXME: Remove this error when the constant evaluator learns to
+// ignore bad types.
+int test2 = __builtin_offsetof(struct Chunk2, data);  // 
expected-error{{initializer element is not a compile-time constant}} 
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -1549,10 +1549,12 @@
       // Is the array too large?
       unsigned ActiveSizeBits
         = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
-      if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
+      if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context)) {
         Diag(ArraySize->getLocStart(), diag::err_array_too_large)
           << ConstVal.toString(10)
           << ArraySize->getSourceRange();
+        return QualType();
+      }
     }
 
     T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
Index: test/Sema/offsetof-64.c
===================================================================
--- test/Sema/offsetof-64.c
+++ test/Sema/offsetof-64.c
@@ -1,15 +1,22 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu
-// expected-no-diagnostics
 
 // PR15216
 // Don't crash when taking computing the offset of structs with large arrays.
 const unsigned long Size = (1l << 62);
 
-struct Chunk {
+struct Chunk1 {
   char padding[Size];
   char more_padding[1][Size];
   char data;
 };
 
-int test1 = __builtin_offsetof(struct Chunk, data);
+int test1 = __builtin_offsetof(struct Chunk1, data);
 
+struct Chunk2 {
+  char padding[Size][Size][Size];  // expected-error 2{{array is too large}}
+  char data;
+};
+
+// FIXME: Remove this error when the constant evaluator learns to
+// ignore bad types.
+int test2 = __builtin_offsetof(struct Chunk2, data);  // expected-error{{initializer element is not a compile-time constant}} 
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -1549,10 +1549,12 @@
       // Is the array too large?
       unsigned ActiveSizeBits
         = ConstantArrayType::getNumAddressingBits(Context, T, ConstVal);
-      if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context))
+      if (ActiveSizeBits > ConstantArrayType::getMaxSizeBits(Context)) {
         Diag(ArraySize->getLocStart(), diag::err_array_too_large)
           << ConstVal.toString(10)
           << ArraySize->getSourceRange();
+        return QualType();
+      }
     }
 
     T = Context.getConstantArrayType(T, ConstVal, ASM, Quals);
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to