[clang] 9c09b08 - Revert "[HLSL] Support packoffset attribute in AST (#89836)" (#91473)

via cfe-commits cfe-commits at lists.llvm.org
Wed May 8 06:48:08 PDT 2024


Author: Xiang Li
Date: 2024-05-08T09:48:04-04:00
New Revision: 9c09b0840e82490ed194207adc03d3e7284b8764

URL: https://github.com/llvm/llvm-project/commit/9c09b0840e82490ed194207adc03d3e7284b8764
DIFF: https://github.com/llvm/llvm-project/commit/9c09b0840e82490ed194207adc03d3e7284b8764.diff

LOG: Revert "[HLSL] Support packoffset attribute in AST (#89836)" (#91473)

This reverts commit c5509fedc5757fffece385d9d068e36b26793ade.

Added: 
    

Modified: 
    clang/include/clang/Basic/Attr.td
    clang/include/clang/Basic/AttrDocs.td
    clang/include/clang/Basic/DiagnosticGroups.td
    clang/include/clang/Basic/DiagnosticParseKinds.td
    clang/include/clang/Basic/DiagnosticSemaKinds.td
    clang/lib/Parse/ParseHLSL.cpp
    clang/lib/Sema/SemaDeclAttr.cpp
    clang/lib/Sema/SemaHLSL.cpp

Removed: 
    clang/test/AST/HLSL/packoffset.hlsl
    clang/test/SemaHLSL/packoffset-invalid.hlsl


################################################################################
diff  --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index 52552ba488560..0225598cbbe8a 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -4415,18 +4415,6 @@ def HLSLResourceBinding: InheritableAttr {
   let Documentation = [HLSLResourceBindingDocs];
 }
 
-def HLSLPackOffset: HLSLAnnotationAttr {
-  let Spellings = [HLSLAnnotation<"packoffset">];
-  let LangOpts = [HLSL];
-  let Args = [IntArgument<"Subcomponent">, IntArgument<"Component">];
-  let Documentation = [HLSLPackOffsetDocs];
-  let AdditionalMembers = [{
-      unsigned getOffset() {
-        return subcomponent * 4 + component;
-      }
-  }];
-}
-
 def HLSLSV_DispatchThreadID: HLSLAnnotationAttr {
   let Spellings = [HLSLAnnotation<"SV_DispatchThreadID">];
   let Subjects = SubjectList<[ParmVar, Field]>;

diff  --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
index f351822ac74bd..8e6faabfae647 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -7408,26 +7408,6 @@ The full documentation is available here: https://docs.microsoft.com/en-us/windo
   }];
 }
 
-def HLSLPackOffsetDocs : Documentation {
-  let Category = DocCatFunction;
-  let Content = [{
-The packoffset attribute is used to change the layout of a cbuffer.
-Attribute spelling in HLSL is: ``packoffset( c[Subcomponent][.component] )``.
-A subcomponent is a register number, which is an integer. A component is in the form of [.xyzw].
-
-Examples:
-
-.. code-block:: c++
-
-  cbuffer A {
-    float3 a : packoffset(c0.y);
-    float4 b : packoffset(c4);
-  }
-
-The full documentation is available here: https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-variable-packoffset
-  }];
-}
-
 def HLSLSV_DispatchThreadIDDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{

diff  --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index 2beb1d45124b4..60f87da2a7387 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1507,9 +1507,6 @@ def BranchProtection : DiagGroup<"branch-protection">;
 // Warnings for HLSL Clang extensions
 def HLSLExtension : DiagGroup<"hlsl-extensions">;
 
-// Warning for mix packoffset and non-packoffset.
-def HLSLMixPackOffset : DiagGroup<"mix-packoffset">;
-
 // Warnings for DXIL validation
 def DXILValidation : DiagGroup<"dxil-validation">;
 

diff  --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index bc9d7cacc50b7..fdffb35ea0d95 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1754,7 +1754,5 @@ def err_hlsl_separate_attr_arg_and_number : Error<"wrong argument format for hls
 def ext_hlsl_access_specifiers : ExtWarn<
   "access specifiers are a clang HLSL extension">,
   InGroup<HLSLExtension>;
-def err_hlsl_unsupported_component : Error<"invalid component '%0' used; expected 'x', 'y', 'z', or 'w'">;
-def err_hlsl_packoffset_invalid_reg : Error<"invalid resource class specifier '%0' for packoffset, expected 'c'">;
 
 } // end of Parser diagnostics

diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d6863f90edb6e..9317ae675c72b 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12184,11 +12184,6 @@ def err_hlsl_init_priority_unsupported : Error<
 def err_hlsl_unsupported_register_type : Error<"invalid resource class specifier '%0' used; expected 'b', 's', 't', or 'u'">;
 def err_hlsl_unsupported_register_number : Error<"register number should be an integer">;
 def err_hlsl_expected_space : Error<"invalid space specifier '%0' used; expected 'space' followed by an integer, like space1">;
-def warn_hlsl_packoffset_mix : Warning<"cannot mix packoffset elements with nonpackoffset elements in a cbuffer">,
-    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_pointers_unsupported : Error<
   "%select{pointers|references}0 are unsupported in HLSL">;
 

diff  --git a/clang/lib/Parse/ParseHLSL.cpp b/clang/lib/Parse/ParseHLSL.cpp
index e9c8d6dca7bf5..f4cbece31f181 100644
--- a/clang/lib/Parse/ParseHLSL.cpp
+++ b/clang/lib/Parse/ParseHLSL.cpp
@@ -183,94 +183,6 @@ void Parser::ParseHLSLAnnotations(ParsedAttributes &Attrs,
       return;
     }
   } break;
-  case ParsedAttr::AT_HLSLPackOffset: {
-    // Parse 'packoffset( c[Subcomponent][.component] )'.
-    // Check '('.
-    if (ExpectAndConsume(tok::l_paren, diag::err_expected_lparen_after)) {
-      SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-      return;
-    }
-    // Check c[Subcomponent] as an identifier.
-    if (!Tok.is(tok::identifier)) {
-      Diag(Tok.getLocation(), diag::err_expected) << tok::identifier;
-      SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-      return;
-    }
-    StringRef OffsetStr = Tok.getIdentifierInfo()->getName();
-    SourceLocation SubComponentLoc = Tok.getLocation();
-    if (OffsetStr[0] != 'c') {
-      Diag(Tok.getLocation(), diag::err_hlsl_packoffset_invalid_reg)
-          << OffsetStr;
-      SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-      return;
-    }
-    OffsetStr = OffsetStr.substr(1);
-    unsigned SubComponent = 0;
-    if (!OffsetStr.empty()) {
-      // Make sure SubComponent is a number.
-      if (OffsetStr.getAsInteger(10, SubComponent)) {
-        Diag(SubComponentLoc.getLocWithOffset(1),
-             diag::err_hlsl_unsupported_register_number);
-        SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-        return;
-      }
-    }
-    unsigned Component = 0;
-    ConsumeToken(); // consume identifier.
-    SourceLocation ComponentLoc;
-    if (Tok.is(tok::period)) {
-      ConsumeToken(); // consume period.
-      if (!Tok.is(tok::identifier)) {
-        Diag(Tok.getLocation(), diag::err_expected) << tok::identifier;
-        SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-        return;
-      }
-      StringRef ComponentStr = Tok.getIdentifierInfo()->getName();
-      ComponentLoc = Tok.getLocation();
-      ConsumeToken(); // consume identifier.
-      // Make sure Component is a single character.
-      if (ComponentStr.size() != 1) {
-        Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
-            << ComponentStr;
-        SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-        return;
-      }
-      switch (ComponentStr[0]) {
-      case 'x':
-      case 'r':
-        Component = 0;
-        break;
-      case 'y':
-      case 'g':
-        Component = 1;
-        break;
-      case 'z':
-      case 'b':
-        Component = 2;
-        break;
-      case 'w':
-      case 'a':
-        Component = 3;
-        break;
-      default:
-        Diag(ComponentLoc, diag::err_hlsl_unsupported_component)
-            << ComponentStr;
-        SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-        return;
-      }
-    }
-    ASTContext &Ctx = Actions.getASTContext();
-    QualType SizeTy = Ctx.getSizeType();
-    uint64_t SizeTySize = Ctx.getTypeSize(SizeTy);
-    ArgExprs.push_back(IntegerLiteral::Create(
-        Ctx, llvm::APInt(SizeTySize, SubComponent), SizeTy, SubComponentLoc));
-    ArgExprs.push_back(IntegerLiteral::Create(
-        Ctx, llvm::APInt(SizeTySize, Component), SizeTy, ComponentLoc));
-    if (ExpectAndConsume(tok::r_paren, diag::err_expected)) {
-      SkipUntil(tok::r_paren, StopAtSemi); // skip through )
-      return;
-    }
-  } break;
   case ParsedAttr::UnknownAttribute:
     Diag(Loc, diag::err_unknown_hlsl_semantic) << II;
     return;

diff  --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 6d957ac09e1c3..6ca42856459f7 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -7309,55 +7309,6 @@ static void handleHLSLSV_DispatchThreadIDAttr(Sema &S, Decl *D,
   D->addAttr(::new (S.Context) HLSLSV_DispatchThreadIDAttr(S.Context, AL));
 }
 
-static void handleHLSLPackOffsetAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
-  if (!isa<VarDecl>(D) || !isa<HLSLBufferDecl>(D->getDeclContext())) {
-    S.Diag(AL.getLoc(), diag::err_hlsl_attr_invalid_ast_node)
-        << AL << "shader constant in a constant buffer";
-    return;
-  }
-
-  uint32_t SubComponent;
-  if (!checkUInt32Argument(S, AL, AL.getArgAsExpr(0), SubComponent))
-    return;
-  uint32_t Component;
-  if (!checkUInt32Argument(S, AL, AL.getArgAsExpr(1), Component))
-    return;
-
-  QualType T = cast<VarDecl>(D)->getType().getCanonicalType();
-  // Check if T is an array or struct type.
-  // TODO: mark matrix type as aggregate type.
-  bool IsAggregateTy = (T->isArrayType() || T->isStructureType());
-
-  // Check Component is valid for T.
-  if (Component) {
-    unsigned Size = S.getASTContext().getTypeSize(T);
-    if (IsAggregateTy || Size > 128) {
-      S.Diag(AL.getLoc(), diag::err_hlsl_packoffset_cross_reg_boundary);
-      return;
-    } else {
-      // Make sure Component + sizeof(T) <= 4.
-      if ((Component * 32 + Size) > 128) {
-        S.Diag(AL.getLoc(), diag::err_hlsl_packoffset_cross_reg_boundary);
-        return;
-      }
-      QualType EltTy = T;
-      if (const auto *VT = T->getAs<VectorType>())
-        EltTy = VT->getElementType();
-      unsigned Align = S.getASTContext().getTypeAlign(EltTy);
-      if (Align > 32 && Component == 1) {
-        // NOTE: Component 3 will hit err_hlsl_packoffset_cross_reg_boundary.
-        // So we only need to check Component 1 here.
-        S.Diag(AL.getLoc(), diag::err_hlsl_packoffset_alignment_mismatch)
-            << Align << EltTy;
-        return;
-      }
-    }
-  }
-
-  D->addAttr(::new (S.Context)
-                 HLSLPackOffsetAttr(S.Context, AL, SubComponent, Component));
-}
-
 static void handleHLSLShaderAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
   StringRef Str;
   SourceLocation ArgLoc;
@@ -9779,9 +9730,6 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
   case ParsedAttr::AT_HLSLSV_DispatchThreadID:
     handleHLSLSV_DispatchThreadIDAttr(S, D, AL);
     break;
-  case ParsedAttr::AT_HLSLPackOffset:
-    handleHLSLPackOffsetAttr(S, D, AL);
-    break;
   case ParsedAttr::AT_HLSLShader:
     handleHLSLShaderAttr(S, D, AL);
     break;

diff  --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 6a12c417e2f3a..bb9e37f18d370 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -39,89 +39,9 @@ Decl *SemaHLSL::ActOnStartBuffer(Scope *BufferScope, bool CBuffer,
   return Result;
 }
 
-// Calculate the size of a legacy cbuffer type based on
-// https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-packing-rules
-static unsigned calculateLegacyCbufferSize(const ASTContext &Context,
-                                           QualType T) {
-  unsigned Size = 0;
-  constexpr unsigned CBufferAlign = 128;
-  if (const RecordType *RT = T->getAs<RecordType>()) {
-    const RecordDecl *RD = RT->getDecl();
-    for (const FieldDecl *Field : RD->fields()) {
-      QualType Ty = Field->getType();
-      unsigned FieldSize = calculateLegacyCbufferSize(Context, Ty);
-      unsigned FieldAlign = 32;
-      if (Ty->isAggregateType())
-        FieldAlign = CBufferAlign;
-      Size = llvm::alignTo(Size, FieldAlign);
-      Size += FieldSize;
-    }
-  } else if (const ConstantArrayType *AT = Context.getAsConstantArrayType(T)) {
-    if (unsigned ElementCount = AT->getSize().getZExtValue()) {
-      unsigned ElementSize =
-          calculateLegacyCbufferSize(Context, AT->getElementType());
-      unsigned AlignedElementSize = llvm::alignTo(ElementSize, CBufferAlign);
-      Size = AlignedElementSize * (ElementCount - 1) + ElementSize;
-    }
-  } else if (const VectorType *VT = T->getAs<VectorType>()) {
-    unsigned ElementCount = VT->getNumElements();
-    unsigned ElementSize =
-        calculateLegacyCbufferSize(Context, VT->getElementType());
-    Size = ElementSize * ElementCount;
-  } else {
-    Size = Context.getTypeSize(T);
-  }
-  return Size;
-}
-
 void SemaHLSL::ActOnFinishBuffer(Decl *Dcl, SourceLocation RBrace) {
   auto *BufDecl = cast<HLSLBufferDecl>(Dcl);
   BufDecl->setRBraceLoc(RBrace);
-
-  // Validate packoffset.
-  llvm::SmallVector<std::pair<VarDecl *, HLSLPackOffsetAttr *>> PackOffsetVec;
-  bool HasPackOffset = false;
-  bool HasNonPackOffset = false;
-  for (auto *Field : BufDecl->decls()) {
-    VarDecl *Var = dyn_cast<VarDecl>(Field);
-    if (!Var)
-      continue;
-    if (Field->hasAttr<HLSLPackOffsetAttr>()) {
-      PackOffsetVec.emplace_back(Var, Field->getAttr<HLSLPackOffsetAttr>());
-      HasPackOffset = true;
-    } else {
-      HasNonPackOffset = true;
-    }
-  }
-
-  if (HasPackOffset && HasNonPackOffset)
-    Diag(BufDecl->getLocation(), diag::warn_hlsl_packoffset_mix);
-
-  if (HasPackOffset) {
-    ASTContext &Context = getASTContext();
-    // Make sure no overlap in packoffset.
-    // Sort PackOffsetVec by offset.
-    std::sort(PackOffsetVec.begin(), PackOffsetVec.end(),
-              [](const std::pair<VarDecl *, HLSLPackOffsetAttr *> &LHS,
-                 const std::pair<VarDecl *, HLSLPackOffsetAttr *> &RHS) {
-                return LHS.second->getOffset() < RHS.second->getOffset();
-              });
-
-    for (unsigned i = 0; i < PackOffsetVec.size() - 1; i++) {
-      VarDecl *Var = PackOffsetVec[i].first;
-      HLSLPackOffsetAttr *Attr = PackOffsetVec[i].second;
-      unsigned Size = calculateLegacyCbufferSize(Context, Var->getType());
-      unsigned Begin = Attr->getOffset() * 32;
-      unsigned End = Begin + Size;
-      unsigned NextBegin = PackOffsetVec[i + 1].second->getOffset() * 32;
-      if (End > NextBegin) {
-        VarDecl *NextVar = PackOffsetVec[i + 1].first;
-        Diag(NextVar->getLocation(), diag::err_hlsl_packoffset_overlap)
-            << NextVar << Var;
-      }
-    }
-  }
-
   SemaRef.PopDeclContext();
 }
 

diff  --git a/clang/test/AST/HLSL/packoffset.hlsl b/clang/test/AST/HLSL/packoffset.hlsl
deleted file mode 100644
index 9cfd88eeec330..0000000000000
--- a/clang/test/AST/HLSL/packoffset.hlsl
+++ /dev/null
@@ -1,100 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-unknown-shadermodel6.3-library -S -finclude-default-header  -ast-dump  -x hlsl %s | FileCheck %s
-
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer A
-cbuffer A
-{
-    // CHECK-NEXT: VarDecl {{.*}} A1 'float4'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 0
-    float4 A1 : packoffset(c);
-    // CHECK-NEXT: VarDecl {{.*}} col:11 A2 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 1 0
-    float A2 : packoffset(c1);
-    // CHECK-NEXT: VarDecl {{.*}} col:11 A3 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 1 1
-    float A3 : packoffset(c1.y);
-}
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer B
-cbuffer B
-{
-    // CHECK: VarDecl {{.*}} B0 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 1
-    float B0 : packoffset(c0.g);
-    // CHECK-NEXT: VarDecl {{.*}} B1 'double'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 2
-	double B1 : packoffset(c0.b);
-    // CHECK-NEXT: VarDecl {{.*}} B2 'half'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 0
-	half B2 : packoffset(c0.r);
-}
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer C
-cbuffer C
-{
-    // CHECK: VarDecl {{.*}} C0 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 1
-    float C0 : packoffset(c0.y);
-    // CHECK-NEXT: VarDecl {{.*}} C1 'float2'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 2
-	float2 C1 : packoffset(c0.z);
-    // CHECK-NEXT: VarDecl {{.*}} C2 'half'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0
-	half C2 : packoffset(c0.x);
-}
-
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer D
-cbuffer D
-{
-    // CHECK: VarDecl {{.*}} D0 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 1
-    float D0 : packoffset(c0.y);
-    // CHECK-NEXT: VarDecl {{.*}} D1 'float[2]'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 1 0
-	float D1[2] : packoffset(c1.x);
-    // CHECK-NEXT: VarDecl {{.*}} D2 'half3'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 2 1
-	half3 D2 : packoffset(c2.y);
-    // CHECK-NEXT: VarDecl {{.*}} D3 'double'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 2
-	double D3 : packoffset(c0.z);
-}
-
-struct ST {
-  float a;
-  float2 b;
-  half c;
-};
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer S
-cbuffer S {
-    // CHECK: VarDecl {{.*}} S0 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 1
-  float S0 : packoffset(c0.y);
-    // CHECK: VarDecl {{.*}} S1 'ST'
-    // CHECK: HLSLPackOffsetAttr {{.*}} 1 0
-  ST S1 : packoffset(c1);
-    // CHECK: VarDecl {{.*}} S2 'double2'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 2 0
-  double2 S2 : packoffset(c2);
-}
-
-struct ST2 {
-  float s0;
-  ST s1;
-  half s2;
-};
-
-// CHECK: HLSLBufferDecl {{.*}} cbuffer S2
-cbuffer S2 {
-    // CHECK: VarDecl {{.*}} S20 'float'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 0 3
-  float S20 : packoffset(c0.a);
-    // CHECK: VarDecl {{.*}} S21 'ST2'
-    // CHECK: HLSLPackOffsetAttr {{.*}} 1 0
-  ST2 S21 : packoffset(c1);
-    // CHECK: VarDecl {{.*}} S22 'half'
-    // CHECK-NEXT: HLSLPackOffsetAttr {{.*}} 3 1
-  half S22 : packoffset(c3.y);
-}

diff  --git a/clang/test/SemaHLSL/packoffset-invalid.hlsl b/clang/test/SemaHLSL/packoffset-invalid.hlsl
deleted file mode 100644
index c5983f6fd7e07..0000000000000
--- a/clang/test/SemaHLSL/packoffset-invalid.hlsl
+++ /dev/null
@@ -1,122 +0,0 @@
-// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -verify %s
-
-// expected-warning at +1{{cannot mix packoffset elements with nonpackoffset elements in a cbuffer}}
-cbuffer Mix
-{
-    float4 M1 : packoffset(c0);
-    float M2;
-    float M3 : packoffset(c1.y);
-}
-
-// expected-warning at +1{{cannot mix packoffset elements with nonpackoffset elements in a cbuffer}}
-cbuffer Mix2
-{
-    float4 M4;
-    float M5 : packoffset(c1.y);
-    float M6 ;
-}
-
-// expected-error at +1{{attribute 'packoffset' only applies to shader constant in a constant buffer}}
-float4 g : packoffset(c0);
-
-cbuffer IllegalOffset
-{
-    // expected-error at +1{{invalid resource class specifier 't2' for packoffset, expected 'c'}}
-    float4 i1 : packoffset(t2);
-    // expected-error at +1{{invalid component 'm' used; expected 'x', 'y', 'z', or 'w'}}
-    float i2 : packoffset(c1.m);
-}
-
-cbuffer Overlap
-{
-    float4 o1 : packoffset(c0);
-    // expected-error at +1{{packoffset overlap between 'o2', 'o1'}}
-    float2 o2 : packoffset(c0.z);
-}
-
-cbuffer CrossReg
-{
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-    float4 c1 : packoffset(c0.y);
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-    float2 c2 : packoffset(c1.w);
-}
-
-struct ST {
-  float s;
-};
-
-cbuffer Aggregate
-{
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-    ST A1 : packoffset(c0.y);
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-    float A2[2] : packoffset(c1.w);
-}
-
-cbuffer Double {
-    // expected-error at +1{{packoffset at 'y' not match alignment 64 required by 'double'}}
-    double d : packoffset(c.y);
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-	double2 d2 : packoffset(c.z);
-    // expected-error at +1{{packoffset cannot cross register boundary}}
-	double3 d3 : packoffset(c.z);
-}
-
-cbuffer ParsingFail {
-// expected-error at +1{{expected identifier}}
-float pf0 : packoffset();
-// expected-error at +1{{expected identifier}}
-float pf1 : packoffset((c0));
-// expected-error at +1{{expected ')'}}
-float pf2 : packoffset(c0, x);
-// expected-error at +1{{invalid component 'X' used}}
-float pf3 : packoffset(c.X);
-// expected-error at +1{{expected '(' after ''}}
-float pf4 : packoffset;
-// expected-error at +1{{expected identifier}}
-float pf5 : packoffset(;
-// expected-error at +1{{expected '(' after '}}
-float pf6 : packoffset);
-// expected-error at +1{{expected '(' after '}}
-float pf7 : packoffset c0.x;
-
-// expected-error at +1{{invalid component 'xy' used}}
-float pf8 : packoffset(c0.xy);
-// expected-error at +1{{invalid component 'rg' used}}
-float pf9 : packoffset(c0.rg);
-// expected-error at +1{{invalid component 'yes' used}}
-float pf10 : packoffset(c0.yes);
-// expected-error at +1{{invalid component 'woo'}}
-float pf11 : packoffset(c0.woo);
-// expected-error at +1{{invalid component 'xr' used}}
-float pf12 : packoffset(c0.xr);
-}
-
-struct ST2 {
-  float a;
-  float2 b;
-};
-
-cbuffer S {
-  float S0 : packoffset(c0.y);
-  ST2 S1[2] : packoffset(c1);
-  // expected-error at +1{{packoffset overlap between 'S2', 'S1'}}
-  half2 S2 : packoffset(c1.w);
-  half2 S3 : packoffset(c2.w);
-}
-
-struct ST23 {
-  float s0;
-  ST2 s1;
-};
-
-cbuffer S2 {
-  float S20 : packoffset(c0.y);
-  ST2 S21 : packoffset(c1);
-  half2 S22 : packoffset(c2.w);
-  double S23[2] : packoffset(c3);
-  // expected-error at +1{{packoffset overlap between 'S24', 'S23'}}
-  float S24 : packoffset(c3.z);
-  float S25 : packoffset(c4.z);
-}


        


More information about the cfe-commits mailing list