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 {
  tint_array<int4, 4> a;
};

thread int counter = 0;
int foo() {
  counter = (counter + 1);
  return counter;
}
int bar() {
  counter = (counter + 2);
  return counter;
}
void tint_symbol() {
  S x = S{};
  thread S* const p = x;
  thread int4* const v = p.a[foo()];
  int const v_1 = bar();
  v[v_1] = (v[v_1] + 5);
}
program_source:19:12: error: program scope variable must reside in constant address space
thread int counter = 0;
           ^
program_source:30:19: error: no viable conversion from 'S' to 'S *const'
  thread S* const p = x;
                  ^   ~
program_source:31:27: error: member reference type 'S *const' is a pointer; did you mean to use '->'?
  thread int4* const v = p.a[foo()];
                         ~^
                          ->
program_source:31:22: error: cannot initialize a variable of type 'int4 *const' with an lvalue of type 'int __attribute__((ext_vector_type(4)))' (vector of 4 'int' values)
  thread int4* const v = p.a[foo()];
                     ^   ~~~~~~~~~~

