blob: 4a80dee2fc2fbe8901eae846695c629ba972a1d3 [file] [log] [blame]
Richard Trieu1bb8cb52013-05-15 00:44:06 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu
Richard Trieu1bb8cb52013-05-15 00:44:06 +00002
3// PR15216
4// Don't crash when taking computing the offset of structs with large arrays.
Serge Pavlove8caa302013-07-16 07:14:18 +00005const unsigned long Size = (1l << 60);
Richard Trieu1bb8cb52013-05-15 00:44:06 +00006
Richard Trieuee2f8f22013-05-16 01:46:09 +00007struct Chunk1 {
Richard Trieu1bb8cb52013-05-15 00:44:06 +00008 char padding[Size];
9 char more_padding[1][Size];
10 char data;
11};
12
Richard Trieuee2f8f22013-05-16 01:46:09 +000013int test1 = __builtin_offsetof(struct Chunk1, data);
Richard Trieu1bb8cb52013-05-15 00:44:06 +000014
Richard Trieuee2f8f22013-05-16 01:46:09 +000015struct Chunk2 {
16 char padding[Size][Size][Size]; // expected-error 2{{array is too large}}
17 char data;
18};
19
20// FIXME: Remove this error when the constant evaluator learns to
21// ignore bad types.
22int test2 = __builtin_offsetof(struct Chunk2, data); // expected-error{{initializer element is not a compile-time constant}}