Richard Trieu | 1bb8cb5 | 2013-05-15 00:44:06 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu |
Richard Trieu | 1bb8cb5 | 2013-05-15 00:44:06 +0000 | [diff] [blame] | 2 | |
| 3 | // PR15216 |
| 4 | // Don't crash when taking computing the offset of structs with large arrays. |
Serge Pavlov | e8caa30 | 2013-07-16 07:14:18 +0000 | [diff] [blame] | 5 | const unsigned long Size = (1l << 60); |
Richard Trieu | 1bb8cb5 | 2013-05-15 00:44:06 +0000 | [diff] [blame] | 6 | |
Richard Trieu | ee2f8f2 | 2013-05-16 01:46:09 +0000 | [diff] [blame] | 7 | struct Chunk1 { |
Richard Trieu | 1bb8cb5 | 2013-05-15 00:44:06 +0000 | [diff] [blame] | 8 | char padding[Size]; |
| 9 | char more_padding[1][Size]; |
| 10 | char data; |
| 11 | }; |
| 12 | |
Richard Trieu | ee2f8f2 | 2013-05-16 01:46:09 +0000 | [diff] [blame] | 13 | int test1 = __builtin_offsetof(struct Chunk1, data); |
Richard Trieu | 1bb8cb5 | 2013-05-15 00:44:06 +0000 | [diff] [blame] | 14 | |
Richard Trieu | ee2f8f2 | 2013-05-16 01:46:09 +0000 | [diff] [blame] | 15 | struct 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. |
| 22 | int test2 = __builtin_offsetof(struct Chunk2, data); // expected-error{{initializer element is not a compile-time constant}} |