| // RUN: %clang_cc1 -triple x86_64-unknown-linux -DSANITIZER_ENABLED -fsanitize=address -fsanitize-address-field-padding=1 %s |
| // RUN: %clang_cc1 -triple x86_64-unknown-linux %s |
| |
| struct S { |
| ~S() {} |
| virtual void foo() {} |
| |
| int buffer[1]; |
| int other_field = 0; |
| }; |
| |
| union U { |
| S s; |
| }; |
| |
| struct Derived : S {}; |
| |
| static_assert(!__is_trivially_copyable(S)); |
| #ifdef SANITIZER_ENABLED |
| // Don't allow memcpy when the struct has poisoned padding bits. |
| // The sanitizer adds posion padding bits to struct S. |
| static_assert(sizeof(S) > 16); |
| static_assert(!__is_bitwise_cloneable(S)); |
| static_assert(sizeof(U) == sizeof(S)); // no padding bit for U. |
| static_assert(!__is_bitwise_cloneable(U)); |
| static_assert(!__is_bitwise_cloneable(S[2])); |
| static_assert(!__is_bitwise_cloneable(Derived)); |
| #else |
| static_assert(sizeof(S) == 16); |
| static_assert(__is_bitwise_cloneable(S)); |
| static_assert(__is_bitwise_cloneable(U)); |
| static_assert(__is_bitwise_cloneable(S[2])); |
| static_assert(__is_bitwise_cloneable(Derived)); |
| #endif |