Author: Helena Kotas
Date: 2025-12-20T10:34:37-08:00
New Revision: 91f14c1f4a03d94ea2aee0857b42b534850a2fd3

URL: 
https://github.com/llvm/llvm-project/commit/91f14c1f4a03d94ea2aee0857b42b534850a2fd3
DIFF: 
https://github.com/llvm/llvm-project/commit/91f14c1f4a03d94ea2aee0857b42b534850a2fd3.diff

LOG: [HLSL] Improve `packoffset` error message (#173077)

Aggregate types cannot have a component specified on a `packoffset` annotation 
(i.e. `packoffset(c1.y)`). If the component is preset and it is not 'x', the 
reported error is `register or packoffset bind is not valid`.

For non-aggregate types with a component that does not fit the constant buffer 
row size of 128 bits minus the component offset, the error message is 
`packoffset cannot cross register boundary`.

Also fixes grammar in a related error message.

Fixes #128109

Added: 
    

Modified: 
    clang/include/clang/Basic/DiagnosticSemaKinds.td
    clang/lib/Sema/SemaHLSL.cpp
    clang/test/SemaHLSL/packoffset-invalid.hlsl

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 51b6eba965103..95ef2a1d9f614 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13333,7 +13333,10 @@ def warn_hlsl_packoffset_mix : Warning<"cannot mix 
packoffset elements with nonp
     InGroup<HLSLMixPackOffset>;
 def err_hlsl_packoffset_overlap : Error<"packoffset overlap between %0, %1">;
 def err_hlsl_packoffset_cross_reg_boundary : Error<"packoffset cannot cross 
register boundary">;
-def err_hlsl_packoffset_alignment_mismatch : Error<"packoffset at 'y' not 
match alignment %0 required by %1">;
+def err_hlsl_invalid_register_or_packoffset
+    : Error<"register or packoffset bind is not valid">;
+def err_hlsl_packoffset_alignment_mismatch
+    : Error<"packoffset at 'y' does not match alignment %0 required by %1">;
 def err_hlsl_pointers_unsupported : Error<
   "%select{pointers|references}0 are unsupported in HLSL">;
 def err_hlsl_missing_resource_class : Error<"HLSL resource needs to have 
[[hlsl::resource_class()]] attribute">;

diff  --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index de3b946fd3b99..3db885022491e 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -1943,8 +1943,8 @@ void SemaHLSL::handlePackOffsetAttr(Decl *D, const 
ParsedAttr &AL) {
   // Check Component is valid for T.
   if (Component) {
     unsigned Size = getASTContext().getTypeSize(T);
-    if (IsAggregateTy || Size > 128) {
-      Diag(AL.getLoc(), diag::err_hlsl_packoffset_cross_reg_boundary);
+    if (IsAggregateTy) {
+      Diag(AL.getLoc(), diag::err_hlsl_invalid_register_or_packoffset);
       return;
     } else {
       // Make sure Component + sizeof(T) <= 4.

diff  --git a/clang/test/SemaHLSL/packoffset-invalid.hlsl 
b/clang/test/SemaHLSL/packoffset-invalid.hlsl
index 526a511edf1f2..f6cb140a991e0 100644
--- a/clang/test/SemaHLSL/packoffset-invalid.hlsl
+++ b/clang/test/SemaHLSL/packoffset-invalid.hlsl
@@ -48,14 +48,14 @@ struct ST {
 
 cbuffer Aggregate
 {
-    // expected-error@+1{{packoffset cannot cross register boundary}}
+    // expected-error@+1{{register or packoffset bind is not valid}}
     ST A1 : packoffset(c0.y);
-    // expected-error@+1{{packoffset cannot cross register boundary}}
+    // expected-error@+1{{register or packoffset bind is not valid}}
     float A2[2] : packoffset(c1.w);
 }
 
 cbuffer Double {
-    // expected-error@+1{{packoffset at 'y' not match alignment 64 required by 
'double'}}
+    // expected-error@+1{{packoffset at 'y' does not match alignment 64 
required by 'double'}}
     double d : packoffset(c.y);
     // expected-error@+1{{packoffset cannot cross register boundary}}
        double2 d2 : packoffset(c.z);


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

Reply via email to