SKIP: FAILED

#include <metal_stdlib>
using namespace metal;
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 S_6 {
  tint_array<tint_array<float3, 18>, 13> field0;
};

thread tint_array<float4x4, 58> x_75 = tint_array<float4x4, 58>{};
thread tint_array<S_6, 46> x_82 = tint_array<S_6, 46>{};
thread tint_array<float3, 37> x_85 = tint_array<float3, 37>{};
void main_1() {
  uint const x_88 = 58u;
}
fragment void tint_symbol() {
  main_1();
}
program_source:19:33: error: program scope variable must reside in constant address space
thread tint_array<float4x4, 58> x_75 = tint_array<float4x4, 58>{};
                                ^
program_source:20:28: error: program scope variable must reside in constant address space
thread tint_array<S_6, 46> x_82 = tint_array<S_6, 46>{};
                           ^
program_source:21:31: error: program scope variable must reside in constant address space
thread tint_array<float3, 37> x_85 = tint_array<float3, 37>{};
                              ^
program_source:23:14: warning: unused variable 'x_88' [-Wunused-variable]
  uint const x_88 = 58u;
             ^

