58 lines · cpp
1// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify=both,expected %s2// RUN: %clang_cc1 -verify=both,ref %s3 4// ref-no-diagnostics5 6typedef __SIZE_TYPE__ size_t;7 8int a;9static_assert(__builtin_object_size(&a, 0) == sizeof(int), "");10float f;11static_assert(__builtin_object_size(&f, 0) == sizeof(float), "");12int arr[2];13static_assert(__builtin_object_size(&arr, 0) == (sizeof(int)*2), "");14 15float arrf[2];16static_assert(__builtin_object_size(&arrf, 0) == (sizeof(float)*2), "");17static_assert(__builtin_object_size(&arrf[1], 0) == sizeof(float), "");18static_assert(__builtin_object_size(&arrf[2], 0) == 0, "");19 20constexpr struct { int a; int b; } F{};21static_assert(__builtin_object_size(&F.a, 3) == sizeof(int));22 23struct S {24 int a;25 char c;26};27 28S s;29static_assert(__builtin_object_size(&s, 0) == sizeof(s), "");30 31S ss[2];32static_assert(__builtin_object_size(&ss[1], 0) == sizeof(s), "");33static_assert(__builtin_object_size(&ss[1].c, 0) == sizeof(int), "");34 35struct A { char buf[16]; };36struct B : A {};37struct C { int i; B bs[1]; } c;38static_assert(__builtin_object_size(&c.bs[0], 3) == 16);39static_assert(__builtin_object_size(&c.bs[1], 3) == 0);40 41/// These are from test/SemaCXX/builtin-object-size-cxx14.42/// They all don't work since they are rejected when evaluating the first43/// parameter of the __builtin_object_size call.44///45/// GCC rejects them as well.46namespace InvalidBase {47 // Ensure this doesn't crash.48 struct S { const char *name; };49 S invalid_base(); // expected-note {{declared here}}50 constexpr size_t bos_name = __builtin_object_size(invalid_base().name, 1); // expected-error {{must be initialized by a constant expression}} \51 // expected-note {{non-constexpr function 'invalid_base'}}52 53 struct T { ~T(); };54 T invalid_base_2();55 constexpr size_t bos_dtor = __builtin_object_size(&(T&)(T&&)invalid_base_2(), 0); // expected-error {{must be initialized by a constant expression}} \56 // expected-note {{non-literal type 'T'}}57}58