https://github.com/pow2clk created 
https://github.com/llvm/llvm-project/pull/216834

HLSL doesn't require template parameter braces if the type has default template 
parameter values. In particular, this allows declaring vectors, matrices, and 
buffers without any angle brackets. This builds on the work done to allow this 
for Texture2D (#184207) which limited the application based on number of 
template arguments. This allowed only for those valid cases that only had one 
template parameter. This also corrects mistakenly included default arguments 
for RW textures and adds them for Buffers.

Existing tests for matrix aliases, vector aliases, and buffers are modified to 
expect and verify the new behavior. Since they were not so well tested, Texture 
and RWTexture tests are added modeled after the existing Buffer counterparts. 
HLSL doesn't require template parameter braces if the type has default template 
parameter values.

>From 0e969d9d7a923098f0cfa3e4b2db0e86902b224a Mon Sep 17 00:00:00 2001
From: Gregory Roth <[email protected]>
Date: Mon, 17 Aug 2026 13:25:07 -0700
Subject: [PATCH] [HLSL] Permit template-less HLSL builtin types with default
 args

HLSL doesn't require template parameter braces if the type has default template 
parameter values.
In particular, this allows declaring vectors, matrices, and buffers without any 
angle brackets.
This builds on the work done to allow this for Texture2D (#184207) which 
limited the application based on number of template arguments.
This allowed only for those valid cases that only had one template parameter.
This also corrects mistakenly included default arguments for RW textures and 
adds them for Buffers.

Existing tests for matrix aliases, vector aliases, and buffers are modified to 
expect and verify the new behavior.
Since they were not so well tested, Texture and RWTexture tests are added 
modeled after the existing Buffer counterparts.
HLSL doesn't require template parameter braces if the type has default template 
parameter values.
---
 clang/lib/Sema/HLSLExternalSemaSource.cpp     |  11 +-
 clang/lib/Sema/SemaHLSL.cpp                   |   2 +-
 clang/test/AST/HLSL/TypedBuffers-AST.hlsl     |   8 +-
 clang/test/AST/HLSL/matrix-alias.hlsl         |  12 +-
 clang/test/AST/HLSL/vector-alias.hlsl         |  10 +-
 clang/test/SemaHLSL/BuiltIns/Buffers.hlsl     |  26 +---
 clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl   |  12 +-
 clang/test/SemaHLSL/BuiltIns/RWTextures.hlsl  | 128 ++++++++++++++++++
 clang/test/SemaHLSL/BuiltIns/Textures.hlsl    | 110 +++++++++++++++
 .../test/SemaHLSL/BuiltIns/matrix-errors.hlsl |   3 -
 .../test/SemaHLSL/BuiltIns/vector-errors.hlsl |   3 -
 11 files changed, 276 insertions(+), 49 deletions(-)
 create mode 100644 clang/test/SemaHLSL/BuiltIns/RWTextures.hlsl
 create mode 100644 clang/test/SemaHLSL/BuiltIns/Textures.hlsl

diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp 
b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index 61998e5653a00..e02a75851d9f3 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -541,8 +541,10 @@ void 
HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
         .completeDefinition();
   });
 
+  QualType Float4Ty = AST.getExtVectorType(AST.FloatTy, 4);
   Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer")
-             .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
+             .addSimpleTemplateParams({"element_type"}, {Float4Ty},
+                                      TypedBufferConcept)
              .finalizeForwardDeclaration();
 
   onCompletion(Decl, [this](CXXRecordDecl *Decl) {
@@ -689,7 +691,6 @@ void 
HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
     setupSamplerType(Decl, *SemaPtr).completeDefinition();
   });
 
-  QualType Float4Ty = AST.getExtVectorType(AST.FloatTy, 4);
   Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Texture2D")
              .addSimpleTemplateParams({"element_type"}, {Float4Ty},
                                       TypedBufferConcept)
@@ -710,8 +711,7 @@ void 
HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
   });
 
   Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWTexture2D")
-             .addSimpleTemplateParams({"element_type"}, {Float4Ty},
-                                      TypedBufferConcept)
+             .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
              .finalizeForwardDeclaration();
 
   onCompletion(Decl, [this](CXXRecordDecl *Decl) {
@@ -750,8 +750,7 @@ void 
HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
 
   // RWTexture2DArray — same as RWTexture2D but IsArray=true
   Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWTexture2DArray")
-             .addSimpleTemplateParams({"element_type"}, {Float4Ty},
-                                      TypedBufferConcept)
+             .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
              .finalizeForwardDeclaration();
 
   onCompletion(Decl, [this](CXXRecordDecl *Decl) {
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 184339044e5bf..66336cba257c7 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -6689,7 +6689,7 @@ QualType SemaHLSL::ActOnTemplateShorthand(TemplateDecl 
*Template,
     return QualType();
 
   TemplateParameterList *Params = Template->getTemplateParameters();
-  if (!Params || Params->size() != 1)
+  if (!Params)
     return QualType();
 
   if (!Template->isImplicit())
diff --git a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl 
b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
index a2708e0782bef..8122d1568abc1 100644
--- a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
+++ b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
@@ -2,7 +2,7 @@
 // RUN:   -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer 
-check-prefix=EMPTY %s
 //
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
-// RUN:   -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer 
-check-prefix=EMPTY %s
+// RUN:   -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer 
-check-prefixes=EMPTY,EMPTY-SRV %s
 //
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer \
@@ -26,6 +26,9 @@
 
 // EMPTY: ClassTemplateDecl {{.*}} implicit [[RESOURCE]]
 // EMPTY-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 
element_type
+// EMPTY-SRV-NEXT: TemplateArgument type 'vector<float, 4>'
+// EMPTY-SRV-NEXT: ExtVectorType {{.*}} 'vector<float, 4>'
+// EMPTY-SRV-NEXT: BuiltinType {{.*}} 'float'
 // EMPTY-NEXT: ConceptSpecializationExpr {{.*}} 'bool' Concept {{.*}} 
'__is_typed_resource_element_compatible'
 // EMPTY-NEXT: ImplicitConceptSpecializationDecl
 // EMPTY-NEXT: TemplateArgument type 'type-parameter-0-0'
@@ -48,6 +51,9 @@ RESOURCE<float> Buffer;
 
 // CHECK: ClassTemplateDecl {{.*}} implicit referenced [[RESOURCE]]
 // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 
element_type
+// CHECK-SRV-NEXT: TemplateArgument type 'vector<float, 4>'
+// CHECK-SRV-NEXT: ExtVectorType {{.*}} 'vector<float, 4>'
+// CHECK-SRV-NEXT: BuiltinType {{.*}} 'float'
 // CHECK-NEXT: ConceptSpecializationExpr {{.*}} 'bool' Concept {{.*}}  
'__is_typed_resource_element_compatible'
 // CHECK-NEXT: ImplicitConceptSpecializationDecl
 // CHECK-NEXT: TemplateArgument type 'type-parameter-0-0'
diff --git a/clang/test/AST/HLSL/matrix-alias.hlsl 
b/clang/test/AST/HLSL/matrix-alias.hlsl
index e3a3c6c5dd015..13367659078cc 100644
--- a/clang/test/AST/HLSL/matrix-alias.hlsl
+++ b/clang/test/AST/HLSL/matrix-alias.hlsl
@@ -40,10 +40,16 @@ void entry() {
   // CHECK: DeclStmt 0x{{[0-9a-fA-F]+}} <line:38:3, col:31>
   // CHECK-NEXT: VarDecl 0x{{[0-9a-fA-F]+}} <col:3, col:24> col:24 Mat4x4d 
'matrix<double, 4, 4>'
 
-  // Verify that the implicit arguments generate the correct type.
-  matrix<> ImpMat4x4;
+  // Verify that the default arguments generate the correct type.
+  matrix<> DefMat4x4;
 
   // CHECK: DeclStmt 0x{{[0-9a-fA-F]+}} <line:44:3, col:21>
-  // CHECK-NEXT: VarDecl 0x{{[0-9a-fA-F]+}} <col:3, col:12> col:12 ImpMat4x4 
'matrix<>':'matrix<float, 4, 4>'
+  // CHECK-NEXT: VarDecl 0x{{[0-9a-fA-F]+}} <col:3, col:12> col:12 DefMat4x4 
'matrix<>':'matrix<float, 4, 4>'
+
+  // Verify that the implicit arguments generate the correct type.
+  matrix ImpMat4x4;
+
+  // CHECK: DeclStmt 0x{{[0-9a-fA-F]+}} <line:50:3, col:19>
+  // CHECK-NEXT: VarDecl 0x{{[0-9a-fA-F]+}} <col:3, col:10> col:10 ImpMat4x4 
'hlsl::matrix<float, 4, 4>':'matrix<float, 4, 4>'
   return;
 }
diff --git a/clang/test/AST/HLSL/vector-alias.hlsl 
b/clang/test/AST/HLSL/vector-alias.hlsl
index f3d28d6d3d55e..10c11bc2f7761 100644
--- a/clang/test/AST/HLSL/vector-alias.hlsl
+++ b/clang/test/AST/HLSL/vector-alias.hlsl
@@ -44,10 +44,16 @@ void entry() {
   // CHECK: DeclStmt {{.*}}
   // CHECK-NEXT: VarDecl {{.*}} Vec3 'vector<double, 3>' cinit
 
+  // Verify that the default arguments generate the correct type.
+  vector<> DefVec4 = {1.0, 2.0, 3.0, 4.0};
+
+  // CHECK: DeclStmt
+  // CHECK-NEXT: VarDecl {{.*}} DefVec4 'vector<>':'vector<float, 4>' cinit
+
   // Verify that the implicit arguments generate the correct type.
-  vector<> ImpVec4 = {1.0, 2.0, 3.0, 4.0};
+  vector ImpVec4 = {1.0, 2.0, 3.0, 4.0};
 
   // CHECK: DeclStmt
-  // CHECK-NEXT: VarDecl {{.*}} ImpVec4 'vector<>':'vector<float, 4>' cinit
+  // CHECK-NEXT: VarDecl {{.*}} ImpVec4 'hlsl::vector<float, 
4>':'vector<float, 4>' cinit
   return;
 }
diff --git a/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl
index db4a6746f6fb3..0d106f74e4465 100644
--- a/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl
@@ -5,20 +5,13 @@ typedef vector<double, 2> double2;
 typedef vector<double, 3> 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<int> r1;
 Buffer<float> r2;
 Buffer<float3> Buff;
 Buffer<double2> r4;
 
-// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}}
-// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class Buffer}}
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
 // expected-note@*:* {{because 'Buffer<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
 // expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(hlsl::Buffer<int>)' 
evaluated to false}}
 Buffer<Buffer<int> > r5;
@@ -38,8 +31,7 @@ template<typename T> struct TemplatedVector {
 };
 
 // structs not allowed
-// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}}
-// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class Buffer}}
+// expected-error@+3 {{constraints not satisfied for class template '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<s> r6;
@@ -116,17 +108,3 @@ void main() {
   // expected-note@* {{function 'operator[]' which returns const-qualified 
type 'vector<float, 3> 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 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class Buffer {}}}
-void f1(Buffer B) {}
-
-// expected-error@+2 {{class template 'Buffer' requires template arguments}}
-// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class Buffer {}}}
-Buffer f2();
-
-struct S {
-  // expected-error@+2 {{class template 'Buffer' requires template arguments}}
-  // expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class Buffer {}}}
-  Buffer B;
-};
diff --git a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
index a767743a0eccc..68f59d542970a 100644
--- a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
@@ -5,10 +5,12 @@ typedef vector<double, 2> double2;
 typedef vector<double, 3> double3;
 
 
-// expected-error@+1 {{class template 'RWBuffer' requires template arguments}}
+// expected-error@+2 {{class template 'RWBuffer' requires template arguments}}
+// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWBuffer}}
 RWBuffer BufferErr1;
 
-// expected-error@+1 {{too few template arguments for class template 
'RWBuffer'}}
+// expected-error@+2 {{too few template arguments for class template 
'RWBuffer'}}
+// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWBuffer}}
 RWBuffer<> BufferErr2;
 
 // test implicit RWBuffer concept
@@ -17,8 +19,7 @@ RWBuffer<float> r2;
 RWBuffer<float3> Buff;
 RWBuffer<double2> r4;
 
-// expected-error@+4 {{constraints not satisfied for class template 
'RWBuffer'}}
-// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWBuffer}}
+// expected-error@+3 {{constraints not satisfied for class template 
'RWBuffer'}}
 // expected-note@*:* {{because 'RWBuffer<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
 // expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(hlsl::RWBuffer<int>)' 
evaluated to false}}
 RWBuffer<RWBuffer<int> > r5;
@@ -38,8 +39,7 @@ template<typename T> struct TemplatedVector {
 };
 
 // structs not allowed
-// expected-error@+4 {{constraints not satisfied for class template 
'RWBuffer'}}
-// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWBuffer}}
+// expected-error@+3 {{constraints not satisfied for class template 
'RWBuffer'}}
 // 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}}
 RWBuffer<s> r6;
diff --git a/clang/test/SemaHLSL/BuiltIns/RWTextures.hlsl 
b/clang/test/SemaHLSL/BuiltIns/RWTextures.hlsl
new file mode 100644
index 0000000000000..e933c27712584
--- /dev/null
+++ b/clang/test/SemaHLSL/BuiltIns/RWTextures.hlsl
@@ -0,0 +1,128 @@
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify 
-DTEXTURE=RWTexture2D %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify 
-DTEXTURE=RWTexture2DArray %s
+
+typedef vector<float, 3> float3;
+typedef vector<double, 2> double2;
+typedef vector<double, 3> double3;
+
+// expected-error-re@+2 {{class template 'RWTexture{{.*}}' requires template 
arguments}}
+// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWTexture}}
+TEXTURE TextureErr1;
+
+// expected-error-re@+2 {{too few template arguments for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWTexture}}
+TEXTURE<> TextureErr2;
+
+// test implicit Texture concept
+TEXTURE<float3> Tex;
+TEXTURE<int> r1;
+TEXTURE<float> r2;
+TEXTURE<double2> r4;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note-re@*:* {{because 'RWTexture{{.*}}<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note-re@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(hlsl::RWTexture{{.*}}<int>)'
 evaluated to false}}
+TEXTURE<TEXTURE<int> > r5;
+
+struct s {
+    int x;
+};
+
+struct Empty {};
+
+template<typename T> struct TemplatedTexture {
+    T a;
+};
+
+template<typename T> struct TemplatedVector {
+    vector<T, 4> v;
+};
+
+// structs not allowed
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<s> r6;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<Empty> r7;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{because 'TemplatedTexture<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(TemplatedTexture<int>)' 
evaluated to false}}
+TEXTURE<TemplatedTexture<int> > r8;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{because 'TemplatedVector<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector<int>)' 
evaluated to false}}
+TEXTURE<TemplatedVector<int> > r9;
+
+// arrays not allowed
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<half[4]> r10;
+
+typedef vector<int, 8> int8;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{because 'int8' (aka 'vector<int, 8>') does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<int, 8>)' evaluated 
to false}}37
+TEXTURE<int8> r11;
+
+typedef int MyInt;
+TEXTURE<MyInt> r12;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<bool> r13;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{because 'vector<bool, 2>' (vector of 2 'bool' values) 
does not satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<bool, 2>)' 
evaluated to false}}
+TEXTURE<vector<bool, 2>> r14;
+
+enum numbers { one, two, three };
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<numbers> r15;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// expected-note@*:* {{because 'double3' (aka 'vector<double, 3>') does not 
satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<double, 3>)' 
evaluated to false}}
+TEXTURE<double3> r16;
+
+
+struct threeDoubles {
+  double a;
+  double b;
+  double c;
+};
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'RWTexture{{.*}}'}}
+// 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}}
+TEXTURE<threeDoubles> TextureErr3;
+
+
+[numthreads(1,1,1)]
+void main() {
+  (void)Tex.__handle; // expected-error-re {{'__handle' is a private member of 
'hlsl::RWTexture{{.*}}<vector<float, 3>>'}}
+  // expected-note@* {{implicitly declared private here}}
+}
+
+// expected-error-re@+2 {{class template 'RWTexture{{.*}}' requires template 
arguments}}
+// expected-note-re@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWTexture{{.*}} {}}}
+void f1(TEXTURE B) {}
+
+// expected-error-re@+2 {{class template 'RWTexture{{.*}}' requires template 
arguments}}
+// expected-note-re@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWTexture{{.*}} {}}}
+TEXTURE f2();
+
+struct S {
+  // expected-error-re@+2 {{class template 'RWTexture{{.*}}' requires template 
arguments}}
+  // expected-note-re@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_typed_resource_element_compatible<element_type> class RWTexture{{.*}} {}}}
+  TEXTURE B;
+};
diff --git a/clang/test/SemaHLSL/BuiltIns/Textures.hlsl 
b/clang/test/SemaHLSL/BuiltIns/Textures.hlsl
new file mode 100644
index 0000000000000..6bec03f4e1c57
--- /dev/null
+++ b/clang/test/SemaHLSL/BuiltIns/Textures.hlsl
@@ -0,0 +1,110 @@
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify 
-DTEXTURE=Texture2D %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify 
-DTEXTURE=Texture2DArray %s
+
+typedef vector<float, 3> float3;
+typedef vector<double, 2> double2;
+typedef vector<double, 3> double3;
+
+// test implicit Texture concept
+TEXTURE<float3> Tex;
+TEXTURE<int> r1;
+TEXTURE<float> r2;
+TEXTURE<double2> r4;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note-re@*:* {{because 'Texture{{.*}}<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note-re@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(hlsl::Texture{{.*}}<int>)' 
evaluated to false}}
+TEXTURE<TEXTURE<int> > r5;
+
+struct s {
+    int x;
+};
+
+struct Empty {};
+
+template<typename T> struct TemplatedTexture {
+    T a;
+};
+
+template<typename T> struct TemplatedVector {
+    vector<T, 4> v;
+};
+
+// structs not allowed
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<s> r6;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<Empty> r7;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note@*:* {{because 'TemplatedTexture<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(TemplatedTexture<int>)' 
evaluated to false}}
+TEXTURE<TemplatedTexture<int> > r8;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note@*:* {{because 'TemplatedVector<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector<int>)' 
evaluated to false}}
+TEXTURE<TemplatedVector<int> > r9;
+
+// arrays not allowed
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<half[4]> r10;
+
+typedef vector<int, 8> int8;
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note@*:* {{because 'int8' (aka 'vector<int, 8>') does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<int, 8>)' evaluated 
to false}}37
+TEXTURE<int8> r11;
+
+typedef int MyInt;
+TEXTURE<MyInt> r12;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<bool> r13;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note@*:* {{because 'vector<bool, 2>' (vector of 2 'bool' values) 
does not satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<bool, 2>)' 
evaluated to false}}
+TEXTURE<vector<bool, 2>> r14;
+
+enum numbers { one, two, three };
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<numbers> r15;
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// expected-note@*:* {{because 'double3' (aka 'vector<double, 3>') does not 
satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<double, 3>)' 
evaluated to false}}
+TEXTURE<double3> r16;
+
+
+struct threeDoubles {
+  double a;
+  double b;
+  double c;
+};
+
+// expected-error-re@+3 {{constraints not satisfied for class template 
'Texture{{.*}}'}}
+// 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}}
+TEXTURE<threeDoubles> TextureErr3;
+
+
+[numthreads(1,1,1)]
+void main() {
+  (void)Tex.__handle; // expected-error-re {{'__handle' is a private member of 
'hlsl::Texture{{.*}}<vector<float, 3>>'}}
+  // 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<float, 3> const hlsl_device &' declared here}}
+  Tex[0] = 0.0;
+}
diff --git a/clang/test/SemaHLSL/BuiltIns/matrix-errors.hlsl 
b/clang/test/SemaHLSL/BuiltIns/matrix-errors.hlsl
index 2aa127f60ae22..4cc2be45af6bf 100644
--- a/clang/test/SemaHLSL/BuiltIns/matrix-errors.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/matrix-errors.hlsl
@@ -1,9 +1,6 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl 
-fsyntax-only -verify %s
 
 // Some bad declarations
-hlsl::matrix ShouldWorkSomeday; // expected-error{{use of alias template 
'hlsl::matrix' requires template arguments}}
-// expected-note@*:* {{template declaration from hidden source: template 
<class element = float, int rows_count = 4, int cols_count = 4> requires 
rows_count <= 4 && cols_count <= 4 using matrix = matrix<element, rows_count, 
cols_count>}}
-
 hlsl::matrix<1,1,1> BadMat; // expected-error{{template argument for template 
type parameter must be a type}}
 // expected-note@*:* {{template parameter from hidden source: class element = 
float}}
 
diff --git a/clang/test/SemaHLSL/BuiltIns/vector-errors.hlsl 
b/clang/test/SemaHLSL/BuiltIns/vector-errors.hlsl
index 7af10a05f76f3..a5c6b9999caea 100644
--- a/clang/test/SemaHLSL/BuiltIns/vector-errors.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/vector-errors.hlsl
@@ -1,9 +1,6 @@
 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl 
-fsyntax-only -verify %s
 
 // Some bad declarations
-hlsl::vector ShouldWorkSomeday; // expected-error{{use of alias template 
'hlsl::vector' requires template arguments}}
-// expected-note@*:* {{template declaration from hidden source: template 
<class element = float, int element_count = 4> using vector = vector<element, 
element_count>}}
-
 hlsl::vector<1> BadVec; // expected-error{{template argument for template type 
parameter must be a type}}
 // expected-note@*:* {{template parameter from hidden source: class element = 
float}}
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to