blob: 940a4f55b47ab2fe9a6ef68d923438db7e3c99fb [file] [log] [blame]
Yaxun Liu4bbdebc2018-11-08 16:55:46 +00001// RUN: %clang_cc1 %s -triple=amdgcn-amd-amdhsa -emit-llvm -o - | FileCheck %s
2
3template<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>
23 my_vector_type(U x) noexcept
24 {
25 for (auto i = 0u; i != rank; ++i) data[i] = x;
26 }
27 my_vector_type& operator+=(const my_vector_type& x) noexcept
28 {
29 data += x.data;
30 return *this;
31 }
32 };
33
34template<typename T, unsigned int n>
35 inline
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
42using char1 = my_vector_type<char, 1>;
43
44int 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}