11bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu
21bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu
31bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu// PR15216
41bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu// Don't crash when taking computing the offset of structs with large arrays.
5e8caa30d6124b915fb6bfb3fb2d0eb4857381d08Serge Pavlovconst unsigned long Size = (1l << 60);
61bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu
7ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieustruct Chunk1 {
81bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu  char padding[Size];
91bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu  char more_padding[1][Size];
101bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu  char data;
111bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu};
121bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu
13ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieuint test1 = __builtin_offsetof(struct Chunk1, data);
141bb8cb5558f46502b84e3b2935b7f5b4c1759d21Richard Trieu
15ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieustruct Chunk2 {
16ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu  char padding[Size][Size][Size];  // expected-error 2{{array is too large}}
17ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu  char data;
18ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu};
19ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu
20ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu// FIXME: Remove this error when the constant evaluator learns to
21ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieu// ignore bad types.
22ee2f8f2f7c4eacfa305a29fcd916d63c650ca847Richard Trieuint test2 = __builtin_offsetof(struct Chunk2, data);  // expected-error{{initializer element is not a compile-time constant}}
23