SKIP: FAILED

#include <metal_stdlib>
using namespace metal;
struct S1 {
  int a;
  int b;
  int c;
  int d;
};
struct S2 {
  int e;
  S1 f;
};
struct S3 {
  int g;
  S1 h;
  S2 i;
};
template<typename T, size_t N>
struct tint_array {
  const constant T& operator[](size_t i) const constant { return elements[i]; }
  device T& operator[](size_t i) device { return elements[i]; }
  const device T& operator[](size_t i) const device { return elements[i]; }
  thread T& operator[](size_t i) thread { return elements[i]; }
  const thread T& operator[](size_t i) const thread { return elements[i]; }
  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
  T elements[N];
};

struct T {
  tint_array<int, 2> a;
};

kernel void tint_symbol() {
  int const x = 42;
  S1 const empty = S1{};
  S1 const nonempty = S1{.a=1, .b=2, .c=3, .d=4};
  S1 const nonempty_with_expr = {.a=1, .b=x, .c=(x + 1), .d=nonempty.d};
  S3 const nested_empty = S3{};
  S3 const nested_nonempty = S3{.g=1, .h=S1{.a=2, .b=3, .c=4, .d=5}, .i=S2{.e=6, .f=S1{.a=7, .b=8, .c=9, .d=10}}};
  S1 const v = {.a=2, .b=x, .c=(x + 1), .d=nested_nonempty.i.f.d};
  S3 const nested_nonempty_with_expr = {.g=1, .h=v, .i={.e=6, .f=nonempty}};
  int const subexpr_empty = 0;
  int const subexpr_nonempty = 2;
  int const subexpr_nonempty_with_expr = {.a=1, .b=x, .c=(x + 1), .d=nonempty.d}.c;
  S1 const subexpr_nested_empty = S1{};
  S1 const subexpr_nested_nonempty = S1{.a=2, .b=3, .c=4, .d=5};
  S1 const subexpr_nested_nonempty_with_expr = {.e=1, .f={.a=2, .b=x, .c=(x + 1), .d=nested_nonempty.i.f.d}}.f;
  tint_array<T, 2> const aosoa_empty = tint_array<T, 2>{};
  tint_array<T, 2> const aosoa_nonempty = tint_array<T, 2>{T{.a=tint_array<int, 2>{1, 2}}, T{.a=tint_array<int, 2>{3, 4}}};
  tint_array<T, 2> const aosoa_nonempty_with_expr = tint_array<T, 2>{{.a=tint_array<int, 2>{1, (aosoa_nonempty[0].a[0] + 1)}}, aosoa_nonempty[1]};
}
program_source:45:13: error: excess elements in scalar initializer
  int const subexpr_nonempty_with_expr = {.a=1, .b=x, .c=(x + 1), .d=nonempty.d}.c;
            ^                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
program_source:45:81: error: expected ';' at end of declaration
  int const subexpr_nonempty_with_expr = {.a=1, .b=x, .c=(x + 1), .d=nonempty.d}.c;
                                                                                ^
                                                                                ;
program_source:48:50: error: field designator 'e' does not refer to any field in type 'const S1'
  S1 const subexpr_nested_nonempty_with_expr = {.e=1, .f={.a=2, .b=x, .c=(x + 1), .d=nested_nonempty.i.f.d}}.f;
                                                 ^
program_source:48:56: error: field designator 'f' does not refer to any field in type 'const S1'
  S1 const subexpr_nested_nonempty_with_expr = {.e=1, .f={.a=2, .b=x, .c=(x + 1), .d=nested_nonempty.i.f.d}}.f;
                                                       ^
program_source:48:109: error: expected ';' at end of declaration
  S1 const subexpr_nested_nonempty_with_expr = {.e=1, .f={.a=2, .b=x, .c=(x + 1), .d=nested_nonempty.i.f.d}}.f;
                                                                                                            ^
                                                                                                            ;
program_source:51:71: error: field designator cannot initialize a non-class type 'T[2]'
  tint_array<T, 2> const aosoa_nonempty_with_expr = tint_array<T, 2>{{.a=tint_array<int, 2>{1, (aosoa_nonempty[0].a[0] + 1)}}, aosoa_nonempty[1]};
                                                                      ^

