diff --git a/sycl/test/abi/abi_crossing_type_traits.cpp b/sycl/test/abi/abi_crossing_type_traits.cpp new file mode 100644 index 0000000000000..9c0556b60c270 --- /dev/null +++ b/sycl/test/abi/abi_crossing_type_traits.cpp @@ -0,0 +1,144 @@ +// Test to check type traits of SYCL types when crossing ABI boundaries. +// Type traits, like POD, trivially copyable, standard layout, etc if changed +// outside the ABI breaking window can break the ABI and cause UB. + +// RUN: %clangxx -fsycl -o %t.out %s +// RUN: %t.out 2>&1 | FileCheck %s + +#include +#include +#include +#include +#include + +using namespace sycl; + +// For a type to be POD, it has to be trivial and standard layout. +// For a type to be trivial, it has to be trivially copyable and +// trivially default constructible. +// Don't use std::is_pod as it is deprecated in C++20 or std::is_trivial +// as it will be deprecated in C++26. +template void check_type_traits() { + std::cout << "Trivially copyable: " + << std::is_trivially_copyable_v << "\n"; + std::cout << "Trivially default constructible: " + << std::is_trivially_default_constructible_v << "\n"; + std::cout << "Standard layout: " << std::is_standard_layout_v << "\n"; +} + +int main() { + + // CHECK: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits< + accessor>(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits< + detail::compile_time_kernel_info_v1::CompileTimeKernelInfoTy>(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 1 + // CHECK-NEXT: Trivially default constructible: 1 + // CHECK-NEXT: Standard layout: 1 + check_type_traits>(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + // CHECK-NEXT: Trivially copyable: 0 + // CHECK-NEXT: Trivially default constructible: 0 + // CHECK-NEXT: Standard layout: 0 + check_type_traits(); + + return 0; +}