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 {
  float a;
};

kernel void tint_symbol() {
  bool bool_var = false;
  bool const bool_let = false;
  int i32_var = 0;
  int const i32_let = 0;
  uint u32_var = 0u;
  uint const u32_let = 0u;
  float f32_var = 0.0f;
  float const f32_let = 0.0f;
  int2 v2i32_var = int2(0);
  int2 const v2i32_let = int2(0);
  uint3 v3u32_var = uint3(0u);
  uint3 const v3u32_let = uint3(0u);
  float4 v4f32_var = float4(0.0f);
  float4 const v4f32_let = float4(0.0f);
  float2x3 m2x3_var = float2x3(float3(0.0f), float3(0.0f));
  float3x4 const m3x4_let = float3x4(float4(0.0f), float4(0.0f), float4(0.0f));
  tint_array<float, 4> arr_var = tint_array<float, 4>{};
  tint_array<float, 4> const arr_let = tint_array<float, 4>{};
  S struct_var = S{};
  S const struct_let = S{};
  thread float* const ptr_f32 = f32_var;
  thread float4* const ptr_vec = v4f32_var;
  thread tint_array<float, 4>* const ptr_arr = arr_var;
}
program_source:40:23: error: cannot initialize a variable of type 'float *const' with an lvalue of type 'float'
  thread float* const ptr_f32 = f32_var;
                      ^         ~~~~~~~
program_source:41:24: error: cannot initialize a variable of type 'float4 *const' with an lvalue of type 'float4' (vector of 4 'float' values)
  thread float4* const ptr_vec = v4f32_var;
                       ^         ~~~~~~~~~
program_source:42:38: error: no viable conversion from 'tint_array<float, 4>' to 'tint_array<float, 4> *const'
  thread tint_array<float, 4>* const ptr_arr = arr_var;
                                     ^         ~~~~~~~

