| #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]; | 
 | }; | 
 |  | 
 | void deref_const() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int b = (*p)[0u]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | void no_deref_const() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int b = (*p)[0u]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | void deref_let() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int const i = 0; | 
 |   int b = (*p)[min(uint(i), 9u)]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | void no_deref_let() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int const i = 0; | 
 |   int b = (*p)[min(uint(i), 9u)]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | void deref_var() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int i = 0; | 
 |   int b = (*p)[min(uint(i), 9u)]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | void no_deref_var() { | 
 |   tint_array<int, 10> a = {}; | 
 |   thread tint_array<int, 10>* const p = (&a); | 
 |   int i = 0; | 
 |   int b = (*p)[min(uint(i), 9u)]; | 
 |   (*p)[0u] = 42; | 
 | } | 
 |  | 
 | kernel void v() { | 
 |   deref_const(); | 
 |   no_deref_const(); | 
 |   deref_let(); | 
 |   no_deref_let(); | 
 |   deref_var(); | 
 |   no_deref_var(); | 
 | } |