// WARNING: This file is machine generated by fidlgen.

#include <fidl/test/unionsandwich/llcpp/fidl.h>

#include <memory>

void ::fidl_test_unionsandwich::wire::UnionSize8Alignment4::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionSize8Alignment4) == sizeof(fidl_xunion_t));
  static_assert(offsetof(UnionSize8Alignment4, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(UnionSize8Alignment4, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

void ::fidl_test_unionsandwich::wire::UnionSize36Alignment4::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionSize36Alignment4) == sizeof(fidl_xunion_t));
  static_assert(offsetof(UnionSize36Alignment4, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(UnionSize36Alignment4, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

void ::fidl_test_unionsandwich::wire::UnionSize12Alignment4::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionSize12Alignment4) == sizeof(fidl_xunion_t));
  static_assert(offsetof(UnionSize12Alignment4, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(UnionSize12Alignment4, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}

void ::fidl_test_unionsandwich::wire::UnionSize24Alignment8::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionSize24Alignment8) == sizeof(fidl_xunion_t));
  static_assert(offsetof(UnionSize24Alignment8, ordinal_) ==
                offsetof(fidl_xunion_t, tag));
  static_assert(offsetof(UnionSize24Alignment8, envelope_) ==
                offsetof(fidl_xunion_t, envelope));
}
