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

#include <fidl/test.protocolpayloads/cpp/wire_types.h>

void ::test_protocolpayloads::wire::MainProtocolTwoWayImportWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolTwoWayImportWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolTwoWayImportWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolTwoWayImportWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}

void ::test_protocolpayloads::wire::MainProtocolTwoWayAnonWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolTwoWayAnonWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolTwoWayAnonWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolTwoWayAnonWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}

void ::test_protocolpayloads::wire::MainProtocolOnImportWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolOnImportWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolOnImportWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolOnImportWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}

void ::test_protocolpayloads::wire::MainProtocolOnAnonWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolOnAnonWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolOnAnonWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolOnAnonWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}

void ::test_protocolpayloads::wire::MainProtocolTwoWayLocalWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolTwoWayLocalWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolTwoWayLocalWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolTwoWayLocalWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}

void ::test_protocolpayloads::wire::MainProtocolOnLocalWithErrorResult::
    SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(MainProtocolOnLocalWithErrorResult) ==
                sizeof(fidl_xunion_v2_t));
  static_assert(offsetof(MainProtocolOnLocalWithErrorResult, ordinal_) ==
                offsetof(fidl_xunion_v2_t, tag));
  static_assert(offsetof(MainProtocolOnLocalWithErrorResult, envelope_) ==
                offsetof(fidl_xunion_v2_t, envelope));
}
