
Compute the offset from the record layout. Unfortunately, not all the test cases from the current interpreter work.
57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify=both,expected %s
|
|
// RUN: %clang_cc1 -verify=both,ref %s
|
|
|
|
// ref-no-diagnostics
|
|
|
|
typedef __SIZE_TYPE__ size_t;
|
|
|
|
int a;
|
|
static_assert(__builtin_object_size(&a, 0) == sizeof(int), "");
|
|
float f;
|
|
static_assert(__builtin_object_size(&f, 0) == sizeof(float), "");
|
|
int arr[2];
|
|
static_assert(__builtin_object_size(&arr, 0) == (sizeof(int)*2), "");
|
|
|
|
float arrf[2];
|
|
static_assert(__builtin_object_size(&arrf, 0) == (sizeof(float)*2), "");
|
|
static_assert(__builtin_object_size(&arrf[1], 0) == sizeof(float), "");
|
|
static_assert(__builtin_object_size(&arrf[2], 0) == 0, "");
|
|
|
|
|
|
|
|
struct S {
|
|
int a;
|
|
char c;
|
|
};
|
|
|
|
S s;
|
|
static_assert(__builtin_object_size(&s, 0) == sizeof(s), "");
|
|
|
|
S ss[2];
|
|
static_assert(__builtin_object_size(&ss[1], 0) == sizeof(s), "");
|
|
static_assert(__builtin_object_size(&ss[1].c, 0) == sizeof(int), "");
|
|
|
|
struct A { char buf[16]; };
|
|
struct B : A {};
|
|
struct C { int i; B bs[1]; } c;
|
|
static_assert(__builtin_object_size(&c.bs[0], 3) == 16);
|
|
static_assert(__builtin_object_size(&c.bs[1], 3) == 0);
|
|
|
|
/// These are from test/SemaCXX/builtin-object-size-cxx14.
|
|
/// They all don't work since they are rejected when evaluating the first
|
|
/// parameter of the __builtin_object_size call.
|
|
///
|
|
/// GCC rejects them as well.
|
|
namespace InvalidBase {
|
|
// Ensure this doesn't crash.
|
|
struct S { const char *name; };
|
|
S invalid_base(); // expected-note {{declared here}}
|
|
constexpr size_t bos_name = __builtin_object_size(invalid_base().name, 1); // expected-error {{must be initialized by a constant expression}} \
|
|
// expected-note {{non-constexpr function 'invalid_base'}}
|
|
|
|
struct T { ~T(); };
|
|
T invalid_base_2();
|
|
constexpr size_t bos_dtor = __builtin_object_size(&(T&)(T&&)invalid_base_2(), 0); // expected-error {{must be initialized by a constant expression}} \
|
|
// expected-note {{non-literal type 'T'}}
|
|
}
|