1 // RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s
2
3 template<typename T, unsigned int n> struct my_vector_base;
4
5 template<typename T>
6 struct my_vector_base<T, 1> {
7 typedef T Native_vec_ __attribute__((ext_vector_type(1)));
8
9 union {
10 Native_vec_ data;
11 struct {
12 T x;
13 };
14 };
15 };
16
17 template<typename T, unsigned int rank>
18 struct my_vector_type : public my_vector_base<T, rank> {
19 using my_vector_base<T, rank>::data;
20 using typename my_vector_base<T, rank>::Native_vec_;
21
22 template< typename U>
my_vector_typemy_vector_type23 my_vector_type(U x) noexcept
24 {
25 for (auto i = 0u; i != rank; ++i) data[i] = x;
26 }
operator +=my_vector_type27 my_vector_type& operator+=(const my_vector_type& x) noexcept
28 {
29 data += x.data;
30 return *this;
31 }
32 };
33
34 template<typename T, unsigned int n>
35 inline
operator +(const my_vector_type<T,n> & x,const my_vector_type<T,n> & y)36 my_vector_type<T, n> operator+(
37 const my_vector_type<T, n>& x, const my_vector_type<T, n>& y) noexcept
38 {
39 return my_vector_type<T, n>{x} += y;
40 }
41
42 using char1 = my_vector_type<char, 1>;
43
mane()44 int mane() {
45
46 char1 f1{1};
47 char1 f2{1};
48
49 // CHECK: %[[a:[^ ]+]] = addrspacecast i16 addrspace(5)* %{{[^ ]+}} to i16*
50 // CHECK: %[[a:[^ ]+]] = addrspacecast %{{[^ ]+}} addrspace(5)* %{{[^ ]+}} to %{{[^ ]+}}
51
52 char1 f3 = f1 + f2;
53 }
54