SKIP: FAILED

struct Inner {
  float16_t scalar_f16;
  vector<float16_t, 3> vec3_f16;
  matrix<float16_t, 2, 4> mat2x4_f16;
};
struct S {
  Inner inner;
};

ByteAddressBuffer tint_symbol : register(t0, space0);
RWByteAddressBuffer tint_symbol_1 : register(u1, space0);

matrix<float16_t, 2, 4> tint_symbol_load_4(uint offset) {
  return matrix<float16_t, 2, 4>(tint_symbol.Load<vector<float16_t, 4> >((offset + 0u)), tint_symbol.Load<vector<float16_t, 4> >((offset + 8u)));
}

Inner tint_symbol_load_1(uint offset) {
  const Inner tint_symbol_2 = {tint_symbol.Load<float16_t>((offset + 0u)), tint_symbol.Load<vector<float16_t, 3> >((offset + 8u)), tint_symbol_load_4((offset + 16u))};
  return tint_symbol_2;
}

S tint_symbol_load(uint offset) {
  const S tint_symbol_3 = {tint_symbol_load_1((offset + 0u))};
  return tint_symbol_3;
}

void tint_symbol_1_store_4(uint offset, matrix<float16_t, 2, 4> value) {
  tint_symbol_1.Store<vector<float16_t, 4> >((offset + 0u), value[0u]);
  tint_symbol_1.Store<vector<float16_t, 4> >((offset + 8u), value[1u]);
}

void tint_symbol_1_store_1(uint offset, Inner value) {
  tint_symbol_1.Store<float16_t>((offset + 0u), value.scalar_f16);
  tint_symbol_1.Store<vector<float16_t, 3> >((offset + 8u), value.vec3_f16);
  tint_symbol_1_store_4((offset + 16u), value.mat2x4_f16);
}

void tint_symbol_1_store(uint offset, S value) {
  tint_symbol_1_store_1((offset + 0u), value.inner);
}

[numthreads(1, 1, 1)]
void main() {
  const S t = tint_symbol_load(0u);
  tint_symbol_1_store(0u, t);
  return;
}
