// RUN: %clang_cc1 -no-opaque-pointers %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s template<typename T, unsigned int n> struct my_vector_base; template<typename T> struct my_vector_base<T, 1> { typedef T Native_vec_ __attribute__((ext_vector_type(1))); union { Native_vec_ data; struct { T x; }; }; }; template<typename T, unsigned int rank> struct my_vector_type : public my_vector_base<T, rank> { using my_vector_base<T, rank>::data; using typename my_vector_base<T, rank>::Native_vec_; template< typename U> my_vector_type(U x) noexcept { for (auto i = 0u; i != rank; ++i) data[i] = x; } my_vector_type& operator+=(const my_vector_type& x) noexcept { data += x.data; return *this; } }; template<typename T, unsigned int n> inline my_vector_type<T, n> operator+( const my_vector_type<T, n>& x, const my_vector_type<T, n>& y) noexcept { return my_vector_type<T, n>{x} += y; } using char1 = my_vector_type<char, 1>; int mane() { char1 f1{1}; char1 f2{1}; // CHECK: %[[a:[^ ]+]] = addrspacecast i16 addrspace(5)* %{{[^ ]+}} to i16* // CHECK: %[[a:[^ ]+]] = addrspacecast %{{[^ ]+}} addrspace(5)* %{{[^ ]+}} to %{{[^ ]+}} char1 f3 = f1 + f2; }