offsetof-64.c revision e8caa30d6124b915fb6bfb3fb2d0eb4857381d08
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