1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s 2 3typedef vector<float, 3> float3; 4typedef vector<double, 2> double2; 5typedef vector<double, 3> double3; 6 7 8// expected-error@+1 {{class template 'RWBuffer' requires template arguments}} 9RWBuffer BufferErr1; 10 11// expected-error@+1 {{too few template arguments for class template 'RWBuffer'}} 12RWBuffer<> BufferErr2; 13 14// test implicit RWBuffer concept 15RWBuffer<int> r1; 16RWBuffer<float> r2; 17RWBuffer<float3> Buffer; 18RWBuffer<double2> r4; 19 20// expected-error@+4 {{constraints not satisfied for class template 'RWBuffer'}} 21// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class RWBuffer}} 22// expected-note@*:* {{because 'hlsl::RWBuffer<int>' does not satisfy '__is_typed_resource_element_compatible'}} 23// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(hlsl::RWBuffer<int>)' evaluated to false}} 24RWBuffer<RWBuffer<int> > r5; 25 26struct s { 27 int x; 28}; 29 30struct Empty {}; 31 32template<typename T> struct TemplatedBuffer { 33 T a; 34}; 35 36template<typename T> struct TemplatedVector { 37 vector<T, 4> v; 38}; 39 40// structs not allowed 41// expected-error@+4 {{constraints not satisfied for class template 'RWBuffer'}} 42// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class RWBuffer}} 43// expected-note@*:* {{because 's' does not satisfy '__is_typed_resource_element_compatible'}} 44// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(s)' evaluated to false}} 45RWBuffer<s> r6; 46// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 47// expected-note@*:* {{because 'Empty' does not satisfy '__is_typed_resource_element_compatible'}} 48// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(Empty)' evaluated to false}} 49RWBuffer<Empty> r7; 50 51// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 52// expected-note@*:* {{because 'TemplatedBuffer<int>' does not satisfy '__is_typed_resource_element_compatible'}} 53// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedBuffer<int>)' evaluated to false}} 54RWBuffer<TemplatedBuffer<int> > r8; 55// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 56// expected-note@*:* {{because 'TemplatedVector<int>' does not satisfy '__is_typed_resource_element_compatible'}} 57// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector<int>)' evaluated to false}} 58RWBuffer<TemplatedVector<int> > r9; 59 60// arrays not allowed 61// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 62// expected-note@*:* {{because 'half[4]' does not satisfy '__is_typed_resource_element_compatible'}} 63// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(__fp16[4])' evaluated to false}} 64RWBuffer<half[4]> r10; 65 66typedef vector<int, 8> int8; 67// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 68// expected-note@*:* {{because 'vector<int, 8>' (vector of 8 'int' values) does not satisfy '__is_typed_resource_element_compatible'}} 69// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(int __attribute__((ext_vector_type(8))))' evaluated to false}} 70RWBuffer<int8> r11; 71 72typedef int MyInt; 73RWBuffer<MyInt> r12; 74 75// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 76// expected-note@*:* {{because 'bool' does not satisfy '__is_typed_resource_element_compatible'}} 77// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(_Bool)' evaluated to false}} 78RWBuffer<bool> r13; 79 80// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 81// expected-note@*:* {{because 'vector<bool, 2>' (vector of 2 'bool' values) does not satisfy '__is_typed_resource_element_compatible'}} 82// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(_Bool __attribute__((ext_vector_type(2))))' evaluated to false}} 83RWBuffer<vector<bool, 2>> r14; 84 85enum numbers { one, two, three }; 86 87// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 88// expected-note@*:* {{because 'numbers' does not satisfy '__is_typed_resource_element_compatible'}} 89// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(numbers)' evaluated to false}} 90RWBuffer<numbers> r15; 91 92// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 93// expected-note@*:* {{because 'vector<double, 3>' (vector of 3 'double' values) does not satisfy '__is_typed_resource_element_compatible'}} 94// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(double __attribute__((ext_vector_type(3))))' evaluated to false}} 95RWBuffer<double3> r16; 96 97 98struct threeDoubles { 99 double a; 100 double b; 101 double c; 102}; 103 104// expected-error@+3 {{constraints not satisfied for class template 'RWBuffer'}} 105// expected-note@*:* {{because 'threeDoubles' does not satisfy '__is_typed_resource_element_compatible'}} 106// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(threeDoubles)' evaluated to false}} 107RWBuffer<threeDoubles> BufferErr3; 108 109 110[numthreads(1,1,1)] 111void main() { 112 (void)Buffer.__handle; // expected-error {{'__handle' is a private member of 'hlsl::RWBuffer<vector<float, 3>>'}} 113 // expected-note@* {{implicitly declared private here}} 114} 115