1*c5b890e9SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx14 -std=c++14 %s
2da1b4347SRichard Smith // RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s
38c892b55SGeorge Burgess IV
4762b3ef0SNico Weber typedef __SIZE_TYPE__ size_t;
5762b3ef0SNico Weber
68c892b55SGeorge Burgess IV namespace basic {
78c892b55SGeorge Burgess IV // Ensuring that __bos can be used in constexpr functions without anything
88c892b55SGeorge Burgess IV // sketchy going on...
bos0()98c892b55SGeorge Burgess IV constexpr int bos0() {
108c892b55SGeorge Burgess IV int k = 5;
118c892b55SGeorge Burgess IV char cs[10] = {};
128c892b55SGeorge Burgess IV return __builtin_object_size(&cs[k], 0);
138c892b55SGeorge Burgess IV }
148c892b55SGeorge Burgess IV
bos1()158c892b55SGeorge Burgess IV constexpr int bos1() {
168c892b55SGeorge Burgess IV int k = 5;
178c892b55SGeorge Burgess IV char cs[10] = {};
188c892b55SGeorge Burgess IV return __builtin_object_size(&cs[k], 1);
198c892b55SGeorge Burgess IV }
208c892b55SGeorge Burgess IV
bos2()218c892b55SGeorge Burgess IV constexpr int bos2() {
228c892b55SGeorge Burgess IV int k = 5;
238c892b55SGeorge Burgess IV char cs[10] = {};
248c892b55SGeorge Burgess IV return __builtin_object_size(&cs[k], 2);
258c892b55SGeorge Burgess IV }
268c892b55SGeorge Burgess IV
bos3()278c892b55SGeorge Burgess IV constexpr int bos3() {
288c892b55SGeorge Burgess IV int k = 5;
298c892b55SGeorge Burgess IV char cs[10] = {};
308c892b55SGeorge Burgess IV return __builtin_object_size(&cs[k], 3);
318c892b55SGeorge Burgess IV }
328c892b55SGeorge Burgess IV
338c892b55SGeorge Burgess IV static_assert(bos0() == sizeof(char) * 5, "");
348c892b55SGeorge Burgess IV static_assert(bos1() == sizeof(char) * 5, "");
358c892b55SGeorge Burgess IV static_assert(bos2() == sizeof(char) * 5, "");
368c892b55SGeorge Burgess IV static_assert(bos3() == sizeof(char) * 5, "");
378c892b55SGeorge Burgess IV }
388c892b55SGeorge Burgess IV
398c892b55SGeorge Burgess IV namespace in_enable_if {
408c892b55SGeorge Burgess IV // The code that prompted these changes was __bos in enable_if
418c892b55SGeorge Burgess IV
428c892b55SGeorge Burgess IV void copy5CharsInto(char *buf) // expected-note{{candidate}}
438c892b55SGeorge Burgess IV __attribute__((enable_if(__builtin_object_size(buf, 0) != -1 &&
448c892b55SGeorge Burgess IV __builtin_object_size(buf, 0) > 5,
458c892b55SGeorge Burgess IV "")));
468c892b55SGeorge Burgess IV
478c892b55SGeorge Burgess IV // We use different EvalModes for __bos with type 0 versus 1. Ensure 1 works,
488c892b55SGeorge Burgess IV // too...
498c892b55SGeorge Burgess IV void copy5CharsIntoStrict(char *buf) // expected-note{{candidate}}
508c892b55SGeorge Burgess IV __attribute__((enable_if(__builtin_object_size(buf, 1) != -1 &&
518c892b55SGeorge Burgess IV __builtin_object_size(buf, 1) > 5,
528c892b55SGeorge Burgess IV "")));
538c892b55SGeorge Burgess IV
548c892b55SGeorge Burgess IV struct LargeStruct {
558c892b55SGeorge Burgess IV int pad;
568c892b55SGeorge Burgess IV char buf[6];
578c892b55SGeorge Burgess IV int pad2;
588c892b55SGeorge Burgess IV };
598c892b55SGeorge Burgess IV
608c892b55SGeorge Burgess IV struct SmallStruct {
618c892b55SGeorge Burgess IV int pad;
628c892b55SGeorge Burgess IV char buf[5];
638c892b55SGeorge Burgess IV int pad2;
648c892b55SGeorge Burgess IV };
658c892b55SGeorge Burgess IV
noWriteToBuf()668c892b55SGeorge Burgess IV void noWriteToBuf() {
678c892b55SGeorge Burgess IV char buf[6];
688c892b55SGeorge Burgess IV copy5CharsInto(buf);
698c892b55SGeorge Burgess IV
708c892b55SGeorge Burgess IV LargeStruct large;
718c892b55SGeorge Burgess IV copy5CharsIntoStrict(large.buf);
728c892b55SGeorge Burgess IV }
738c892b55SGeorge Burgess IV
initTheBuf()748c892b55SGeorge Burgess IV void initTheBuf() {
758c892b55SGeorge Burgess IV char buf[6] = {};
768c892b55SGeorge Burgess IV copy5CharsInto(buf);
778c892b55SGeorge Burgess IV
788c892b55SGeorge Burgess IV LargeStruct large = {0, {}, 0};
798c892b55SGeorge Burgess IV copy5CharsIntoStrict(large.buf);
808c892b55SGeorge Burgess IV }
818c892b55SGeorge Burgess IV
828c892b55SGeorge Burgess IV int getI();
initTheBufWithALoop()838c892b55SGeorge Burgess IV void initTheBufWithALoop() {
848c892b55SGeorge Burgess IV char buf[6] = {};
858c892b55SGeorge Burgess IV for (unsigned I = getI(); I != sizeof(buf); ++I)
868c892b55SGeorge Burgess IV buf[I] = I;
878c892b55SGeorge Burgess IV copy5CharsInto(buf);
888c892b55SGeorge Burgess IV
898c892b55SGeorge Burgess IV LargeStruct large;
908c892b55SGeorge Burgess IV for (unsigned I = getI(); I != sizeof(buf); ++I)
918c892b55SGeorge Burgess IV large.buf[I] = I;
928c892b55SGeorge Burgess IV copy5CharsIntoStrict(large.buf);
938c892b55SGeorge Burgess IV }
948c892b55SGeorge Burgess IV
tooSmallBuf()958c892b55SGeorge Burgess IV void tooSmallBuf() {
968c892b55SGeorge Burgess IV char buf[5];
978c892b55SGeorge Burgess IV copy5CharsInto(buf); // expected-error{{no matching function for call}}
988c892b55SGeorge Burgess IV
998c892b55SGeorge Burgess IV SmallStruct small;
1008c892b55SGeorge Burgess IV copy5CharsIntoStrict(small.buf); // expected-error{{no matching function for call}}
1018c892b55SGeorge Burgess IV }
1028c892b55SGeorge Burgess IV }
10351ce8444SRichard Smith
10451ce8444SRichard Smith namespace InvalidBase {
10551ce8444SRichard Smith // Ensure this doesn't crash.
10651ce8444SRichard Smith struct S { const char *name; };
10751ce8444SRichard Smith S invalid_base();
108762b3ef0SNico Weber constexpr size_t bos_name = __builtin_object_size(invalid_base().name, 1);
109da1b4347SRichard Smith static_assert(bos_name == -1, "");
110da1b4347SRichard Smith
111da1b4347SRichard Smith struct T { ~T(); };
112da1b4347SRichard Smith T invalid_base_2();
113da1b4347SRichard Smith constexpr size_t bos_dtor = __builtin_object_size(&(T&)(T&&)invalid_base_2(), 0);
114da1b4347SRichard Smith static_assert(bos_dtor == -1, "");
11551ce8444SRichard Smith }
116*c5b890e9SRichard Smith
117*c5b890e9SRichard Smith // PR44268
bos_new()118*c5b890e9SRichard Smith constexpr int bos_new() { // cxx14-error {{constant expression}}
119*c5b890e9SRichard Smith void *p = new int; // cxx14-note {{until C++20}}
120*c5b890e9SRichard Smith return __builtin_object_size(p, 0);
121*c5b890e9SRichard Smith }
122