// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s typedef vector float3; typedef vector double2; typedef vector double3; // expected-error@+1 {{class template 'Buffer' requires template arguments}} Buffer BufferErr1; // expected-error@+1 {{too few template arguments for class template 'Buffer'}} Buffer<> BufferErr2; // test implicit Buffer concept Buffer r1; Buffer r2; Buffer Buff; Buffer r4; // expected-error@+4 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{template declaration from hidden source: template requires __is_typed_resource_element_compatible class Buffer}} // expected-note@*:* {{because 'Buffer' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(hlsl::Buffer)' evaluated to false}} Buffer > r5; struct s { int x; }; struct Empty {}; template struct TemplatedBuffer { T a; }; template struct TemplatedVector { vector v; }; // structs not allowed // expected-error@+4 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{template declaration from hidden source: template requires __is_typed_resource_element_compatible class Buffer}} // expected-note@*:* {{because 's' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(s)' evaluated to false}} Buffer r6; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'Empty' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(Empty)' evaluated to false}} Buffer r7; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'TemplatedBuffer' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedBuffer)' evaluated to false}} Buffer > r8; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'TemplatedVector' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector)' evaluated to false}} Buffer > r9; // arrays not allowed // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'half[4]' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(half[4])' evaluated to false}} Buffer r10; typedef vector int8; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'int8' (aka 'vector') does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector)' evaluated to false}} Buffer r11; typedef int MyInt; Buffer r12; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'bool' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(bool)' evaluated to false}} Buffer r13; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'vector' (vector of 2 'bool' values) does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector)' evaluated to false}} Buffer> r14; enum numbers { one, two, three }; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'numbers' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(numbers)' evaluated to false}} Buffer r15; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'double3' (aka 'vector') does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector)' evaluated to false}} Buffer r16; struct threeDoubles { double a; double b; double c; }; // expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} // expected-note@*:* {{because 'threeDoubles' does not satisfy '__is_typed_resource_element_compatible'}} // expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(threeDoubles)' evaluated to false}} Buffer BufferErr3; [numthreads(1,1,1)] void main() { (void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::Buffer>'}} // expected-note@* {{implicitly declared private here}} // expected-error@+2 {{cannot assign to return value because function 'operator[]' returns a const value}} // expected-note@* {{function 'operator[]' which returns const-qualified type 'vector const hlsl_device &' declared here}} Buff[0] = 0.0; } // expected-error@+2 {{class template 'Buffer' requires template arguments}} // expected-note@*:* {{template declaration from hidden source: template requires __is_typed_resource_element_compatible class Buffer {}}} void f1(Buffer B) {} // expected-error@+2 {{class template 'Buffer' requires template arguments}} // expected-note@*:* {{template declaration from hidden source: template requires __is_typed_resource_element_compatible class Buffer {}}} Buffer f2(); struct S { // expected-error@+2 {{class template 'Buffer' requires template arguments}} // expected-note@*:* {{template declaration from hidden source: template requires __is_typed_resource_element_compatible class Buffer {}}} Buffer B; };