https://github.com/V-FEXrt updated 
https://github.com/llvm/llvm-project/pull/141086

>From 9868eef5e0752545c88e44ba2fb5d1929feb1e1a Mon Sep 17 00:00:00 2001
From: Ashley Coleman <ascole...@microsoft.com>
Date: Thu, 22 May 2025 09:19:38 -0600
Subject: [PATCH 1/2] [HLSL] Add Buffer def to frontend

---
 clang/lib/Sema/HLSLExternalSemaSource.cpp     |  13 ++
 clang/test/SemaHLSL/BuiltIns/Buffers.hlsl     | 114 ++++++++++++++++++
 clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl   |   4 +-
 .../SemaHLSL/BuiltIns/StructuredBuffers.hlsl  |   4 +-
 4 files changed, 131 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/SemaHLSL/BuiltIns/Buffers.hlsl

diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp 
b/clang/lib/Sema/HLSLExternalSemaSource.cpp
index f09232a9db4da..b85f8fe9eacee 100644
--- a/clang/lib/Sema/HLSLExternalSemaSource.cpp
+++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp
@@ -265,6 +265,19 @@ void 
HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
       *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ true);
   ConceptDecl *StructuredBufferConcept = constructBufferConceptDecl(
       *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ false);
+
+  Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer")
+             .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
+             .finalizeForwardDeclaration();
+
+  onCompletion(Decl, [this](CXXRecordDecl *Decl) {
+    setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false,
+                    /*RawBuffer=*/false)
+        .addArraySubscriptOperators()
+        .addLoadMethods()
+        .completeDefinition();
+  });
+
   Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
              .addSimpleTemplateParams({"element_type"}, TypedBufferConcept)
              .finalizeForwardDeclaration();
diff --git a/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl
new file mode 100644
index 0000000000000..477a16a454a9c
--- /dev/null
+++ b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl
@@ -0,0 +1,114 @@
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s
+
+typedef vector<float, 3> float3;
+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-note@*:* {{because 'hlsl::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;
+
+struct s {
+    int x;
+};
+
+struct Empty {};
+
+template<typename T> struct TemplatedBuffer {
+    T a;
+};
+
+template<typename T> struct TemplatedVector {
+    vector<T, 4> v;
+};
+
+// 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-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;
+// 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<Empty> r7;
+
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
+// expected-note@*:* {{because 'TemplatedBuffer<int>' does not satisfy 
'__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(TemplatedBuffer<int>)' 
evaluated to false}}
+Buffer<TemplatedBuffer<int> > r8;
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
+// 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}}
+Buffer<TemplatedVector<int> > 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<half[4]> r10;
+
+typedef vector<int, 8> int8;
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
+// expected-note@*:* {{because 'vector<int, 8>' (vector of 8 'int' values) 
does not satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<int, 8>)' evaluated 
to false}}
+Buffer<int8> r11;
+
+typedef int MyInt;
+Buffer<MyInt> 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<bool> r13;
+
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
+// 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}}
+Buffer<vector<bool, 2>> 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<numbers> r15;
+
+// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}}
+// expected-note@*:* {{because 'vector<double, 3>' (vector of 3 'double' 
values) does not satisfy '__is_typed_resource_element_compatible'}}
+// expected-note@*:* {{because 
'__builtin_hlsl_is_typed_resource_element_compatible(vector<double, 3>)' 
evaluated to false}}
+Buffer<double3> 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<threeDoubles> BufferErr3;
+
+
+[numthreads(1,1,1)]
+void main() {
+  (void)Buff.__handle; // expected-error {{'__handle' is a private member of 
'hlsl::Buffer<vector<float, 3>>'}}
+  // expected-note@* {{implicitly declared private here}}
+}
diff --git a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
index 91e96b995585f..b4f59393a1768 100644
--- a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
@@ -14,7 +14,7 @@ RWBuffer<> BufferErr2;
 // test implicit RWBuffer concept
 RWBuffer<int> r1;
 RWBuffer<float> r2;
-RWBuffer<float3> Buffer;
+RWBuffer<float3> Buff;
 RWBuffer<double2> r4;
 
 // expected-error@+4 {{constraints not satisfied for class template 
'RWBuffer'}}
@@ -109,6 +109,6 @@ RWBuffer<threeDoubles> BufferErr3;
 
 [numthreads(1,1,1)]
 void main() {
-  (void)Buffer.__handle; // expected-error {{'__handle' is a private member of 
'hlsl::RWBuffer<vector<float, 3>>'}}
+  (void)Buff.__handle; // expected-error {{'__handle' is a private member of 
'hlsl::RWBuffer<vector<float, 3>>'}}
   // expected-note@* {{implicitly declared private here}}
 }
diff --git a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
index 991b04c80ac86..6596f73b25170 100644
--- a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
@@ -2,7 +2,7 @@
 
 typedef vector<float, 3> float3;
 
-StructuredBuffer<float3> Buffer;
+StructuredBuffer<float3> Buff;
 
 // expected-error@+2 {{class template 'StructuredBuffer' requires template 
arguments}}
 // expected-note@*:* {{template declaration from hidden source: template 
<typename element_type> requires 
__is_structured_resource_element_compatible<element_type> class 
StructuredBuffer {}}}
@@ -26,6 +26,6 @@ StructuredBuffer<Empty> BufferErr4;
 
 [numthreads(1,1,1)]
 void main() {
-  (void)Buffer.__handle; // expected-error {{'__handle' is a private member of 
'hlsl::StructuredBuffer<vector<float, 3>>'}}
+  (void)Buff.__handle; // expected-error {{'__handle' is a private member of 
'hlsl::StructuredBuffer<vector<float, 3>>'}}
   // expected-note@* {{implicitly declared private here}}
 }

>From 81b977dfa47241f55e6d4354622d120bb661d6af Mon Sep 17 00:00:00 2001
From: Ashley Coleman <ascole...@microsoft.com>
Date: Thu, 22 May 2025 13:09:41 -0600
Subject: [PATCH 2/2] Address comments

---
 clang/test/AST/HLSL/TypedBuffers-AST.hlsl | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl 
b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
index dad1ef17a1f86..f716501a35ad9 100644
--- a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
+++ b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
@@ -1,11 +1,18 @@
 // RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:   -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer 
-check-prefix=EMPTY %s
 //
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
+// RUN:   -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer 
-check-prefix=EMPTY %s
+//
 // RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV %s
+//
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN:   -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer \
+// RUN:   -check-prefixes=CHECK,CHECK-SRV %s
 
-// TODO: Add AST tests for Buffer and RasterizerOrderedBuffer here
+// TODO: Add AST tests for RasterizerOrderedBuffer here
 
 // This test tests two different AST generations each typed buffer.
 // The "EMPTY" test mode verifies the AST generated by forward declaration
@@ -54,6 +61,7 @@ RESOURCE<float> Buffer;
 // CHECK: FinalAttr {{.*}} Implicit final
 // CHECK-NEXT: FieldDecl {{.*}} implicit __handle '__hlsl_resource_t
 // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
 
 // Default constructor
@@ -125,7 +133,8 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
 // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}}  
'__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
 // CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} 'const [[RESOURCE]]<element_type>' lvalue 
implicit this
@@ -141,7 +150,8 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
 // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}}  
'__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
 // CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit 
this
@@ -159,7 +169,8 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr>
 // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}}  
'__builtin_hlsl_resource_getpointer' 'void (...) noexcept'
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
-// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
 // CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit 
this
@@ -173,4 +184,5 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: FinalAttr {{.*}} Implicit final
 // CHECK-NEXT: FieldDecl {{.*}} implicit referenced __handle '__hlsl_resource_t
 // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
+// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(float)]]

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to