2
0
Эх сурвалжийг харах

Report error for unsupported types of SV semantics (#3043)

Vishal Sharma 4 жил өмнө
parent
commit
bece3d4faf
31 өөрчлөгдсөн 915 нэмэгдсэн , 35 устгасан
  1. 36 2
      include/dxc/DXIL/DxilSemantic.h
  2. 158 33
      lib/DXIL/DxilSemantic.cpp
  3. 50 0
      lib/HLSL/HLSignatureLower.cpp
  4. 3 0
      lib/HLSL/HLSignatureLower.h
  5. 44 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_cs_input_semantics.hlsl
  6. 20 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_barycentric.hlsl
  7. 13 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_clipdistance.hlsl
  8. 17 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_coverage.hlsl
  9. 13 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_culldistance.hlsl
  10. 26 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_cullprimitive.hlsl
  11. 21 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depth.hlsl
  12. 21 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depthgreaterequal.hlsl
  13. 21 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depthlessequal.hlsl
  14. 33 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_domainlocation.hlsl
  15. 39 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_gsinstanceid.hlsl
  16. 15 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_innercoverage.hlsl
  17. 37 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_insidetessfactor.hlsl
  18. 15 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_instanceid.hlsl
  19. 17 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_isfrontface.hlsl
  20. 48 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_outputcontrolid.hlsl
  21. 12 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_position.hlsl
  22. 39 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_primitiveid.hlsl
  23. 39 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_rendertargetarrayindex.hlsl
  24. 15 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_sampleindex.hlsl
  25. 19 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_shadingrate.hlsl
  26. 25 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_stencilref.hlsl
  27. 18 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_target.hlsl
  28. 36 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_tessfactor.hlsl
  29. 15 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_vertexid.hlsl
  30. 12 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_viewid.hlsl
  31. 38 0
      tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_viewportarrayindex.hlsl

+ 36 - 2
include/dxc/DXIL/DxilSemantic.h

@@ -12,6 +12,7 @@
 #pragma once
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/IR/Type.h"
 
 #include "DxilConstants.h"
 #include "DxilShaderModel.h"
@@ -23,6 +24,33 @@ class Semantic {
 public:
   using Kind = DXIL::SemanticKind;
 
+  enum class CompTy {
+    BoolTy             = 1 << 0,
+    HalfTy             = 1 << 1,
+    Int16Ty            = 1 << 2,
+    FloatTy            = 1 << 3,
+    Int32Ty            = 1 << 4,
+    DoubleTy           = 1 << 5,
+    Int64Ty            = 1 << 6,
+    HalfOrFloatTy      = HalfTy | FloatTy,
+    BoolOrInt32Ty      = BoolTy | Int32Ty,
+    BoolOrInt16Or32Ty  = BoolTy | Int16Ty | Int32Ty,
+    FloatOrInt32Ty     = FloatTy | Int32Ty,
+    Int16Or32Ty        = Int16Ty | Int32Ty,
+    AnyIntTy           = BoolTy | Int16Ty | Int32Ty | Int64Ty,
+    AnyFloatTy         = HalfTy | FloatTy | DoubleTy,
+    AnyTy              = AnyIntTy | AnyFloatTy,
+  };
+
+  enum class SizeClass {
+    Unknown,
+    Scalar,
+    Vec2,
+    Vec3,
+    Vec4,
+    Other
+  };
+
   static const int kUndefinedRow = -1;
   static const int kUndefinedCol = -1;
 
@@ -41,13 +69,19 @@ public:
   const char *GetName() const;
   bool IsArbitrary() const;
   bool IsInvalid() const;
+  bool IsSupportedType(llvm::Type *semTy) const;
+  CompTy GetCompType(llvm::Type* ty) const;
+  SizeClass GetCompCount(llvm::Type* ty) const;
 
 private:
   Kind m_Kind;                   // Semantic kind.
-  const char *m_pszName;              // Canonical name (for system semantics).
+  const char *m_pszName;         // Canonical name (for system semantics).
+  CompTy m_allowedTys;           // Types allowed for the semantic
+  SizeClass m_minCompCount;      // Minimum component count that is allowed for a semantic
+  SizeClass m_maxCompCount;      // Maximum component count that is allowed for a semantic
 
   Semantic() = delete;
-  Semantic(Kind Kind, const char *pszName);
+  Semantic(Kind Kind, const char *pszName, CompTy allowedTys, SizeClass minCompCount, SizeClass maxCompCount);
 
   // Table of all semantic properties.
   static const unsigned kNumSemanticRecords = (unsigned)Kind::Invalid + 1;

+ 158 - 33
lib/DXIL/DxilSemantic.cpp

@@ -11,6 +11,7 @@
 #include "dxc/DXIL/DxilSemantic.h"
 #include "dxc/DXIL/DxilSignature.h"
 #include "dxc/DXIL/DxilShaderModel.h"
+#include "dxc/DXIL/DxilUtil.h"
 #include "dxc/Support/Global.h"
 
 #include <string>
@@ -24,9 +25,15 @@ namespace hlsl {
 // Semantic class methods.
 //
 Semantic::Semantic(Kind Kind,
-                   const char *pszName)
+                   const char *pszName,
+                   CompTy allowedTys,
+                   SizeClass minCompCount,
+                   SizeClass maxCompCount)
 : m_Kind(Kind)
 , m_pszName(pszName)
+, m_allowedTys(allowedTys)
+, m_minCompCount(minCompCount)
+, m_maxCompCount(maxCompCount)
 {
 }
 
@@ -113,41 +120,159 @@ bool Semantic::IsInvalid() const {
   return m_Kind == Kind::Invalid;
 }
 
+Semantic::SizeClass Semantic::GetCompCount(llvm::Type* ty) const {
+
+  if (!ty->isVectorTy() && !dxilutil::IsIntegerOrFloatingPointType(ty))
+    return SizeClass::Unknown;
+
+  if (ty->isVectorTy()) {
+    if (ty->getVectorNumElements() == 1) {
+      return SizeClass::Scalar;
+    }
+    else if (ty->getVectorNumElements() == 2) {
+      return SizeClass::Vec2;
+    }
+    else if (ty->getVectorNumElements() == 3) {
+      return SizeClass::Vec3;
+    }
+    else if (ty->getVectorNumElements() == 4) {
+      return SizeClass::Vec4;
+    }
+    else {
+      DXASSERT(false, "Unexpected number of vector elements.");
+      return SizeClass::Unknown;
+    }
+  }
+
+  return SizeClass::Scalar;
+}
+
+Semantic::CompTy Semantic::GetCompType(llvm::Type* ty) const {
+
+  if (!ty->isVectorTy() && !dxilutil::IsIntegerOrFloatingPointType(ty))
+    return CompTy::AnyTy;
+
+  if (ty->isVectorTy())
+    ty = ty->getScalarType();
+
+  // must be an integer or a floating point type here
+  DXASSERT_NOMSG(dxilutil::IsIntegerOrFloatingPointType(ty));
+  if (ty->getScalarType()->isIntegerTy()) {
+    if (ty->getScalarSizeInBits() == 1) {
+      return CompTy::BoolTy;
+    } else if (ty->getScalarSizeInBits() == 16) {
+      return CompTy::Int16Ty;
+    } else if (ty->getScalarSizeInBits() == 32) {
+      return CompTy::Int32Ty;
+    } else {
+      return CompTy::Int64Ty;
+    }
+  } else {
+    if (ty->isHalfTy()) {
+      return CompTy::HalfTy;
+    } else if (ty->isFloatTy()) {
+      return CompTy::FloatTy;
+    } else {
+      DXASSERT_NOMSG(ty->isDoubleTy());
+      return CompTy::DoubleTy;
+    }
+  }
+}
+
+static bool IsScalarOrVectorTy(llvm::Type* ty) {
+  if (dxilutil::IsIntegerOrFloatingPointType(ty))
+    return true;
+  if (ty->isVectorTy() &&
+    dxilutil::IsIntegerOrFloatingPointType(ty->getVectorElementType()))
+    return true;
+  return false;
+}
+
+bool Semantic::IsSupportedType(llvm::Type* semTy) const {
+
+  if (m_Kind == Kind::Invalid)
+    return false;
+
+  // Skip type checking for Arbitrary kind
+  if (m_Kind == Kind::Arbitrary)
+    return true;
+
+  if (!IsScalarOrVectorTy(semTy)) {
+    // We only allow scalar or vector types as a valid semantic type except in some cases
+    // such as Clip/Cull or Tessfactor.
+    if (m_minCompCount == SizeClass::Other) {
+      if (semTy->isArrayTy()) {
+        semTy = semTy->getArrayElementType();
+        // TessFactor or InsideTessFactor must either be float[2] or float
+        if ((m_Kind == Kind::TessFactor ||
+             m_Kind == Kind::InsideTessFactor) &&
+          !dxilutil::IsIntegerOrFloatingPointType(semTy)) {
+          return false;
+        }
+        // Clip/Cull can be array of scalar or vector
+        if ((m_Kind == Kind::ClipDistance ||
+          m_Kind == Kind::CullDistance) &&
+          !IsScalarOrVectorTy(semTy)) {
+          return false;
+        }
+      }
+      else {
+        // Do not support other types such as matrix.
+        return false;
+      }
+    }
+    else {
+      return false;
+    }
+  }
+
+  if (((unsigned)m_allowedTys & (unsigned)GetCompType(semTy)) == 0)
+    return false;
+
+  // Skip type-shape validation for semantics marked as Other
+  if (m_minCompCount == SizeClass::Other)
+    return true;
+
+  SizeClass compSzClass = GetCompCount(semTy);
+  return compSzClass >= m_minCompCount &&
+    compSzClass <= m_maxCompCount;
+}
+
 typedef Semantic SP;
 const Semantic Semantic::ms_SemanticTable[kNumSemanticRecords] = {
   // Kind                         Name
-  SP(Kind::Arbitrary,             nullptr),
-  SP(Kind::VertexID,              "SV_VertexID"),
-  SP(Kind::InstanceID,            "SV_InstanceID"),
-  SP(Kind::Position,              "SV_Position"),
-  SP(Kind::RenderTargetArrayIndex,"SV_RenderTargetArrayIndex"),
-  SP(Kind::ViewPortArrayIndex,    "SV_ViewportArrayIndex"),
-  SP(Kind::ClipDistance,          "SV_ClipDistance"),
-  SP(Kind::CullDistance,          "SV_CullDistance"),
-  SP(Kind::OutputControlPointID,  "SV_OutputControlPointID"),
-  SP(Kind::DomainLocation,        "SV_DomainLocation"),
-  SP(Kind::PrimitiveID,           "SV_PrimitiveID"),
-  SP(Kind::GSInstanceID,          "SV_GSInstanceID"),
-  SP(Kind::SampleIndex,           "SV_SampleIndex"),
-  SP(Kind::IsFrontFace,           "SV_IsFrontFace"),
-  SP(Kind::Coverage,              "SV_Coverage"),
-  SP(Kind::InnerCoverage,         "SV_InnerCoverage"),
-  SP(Kind::Target,                "SV_Target"),
-  SP(Kind::Depth,                 "SV_Depth"),
-  SP(Kind::DepthLessEqual,        "SV_DepthLessEqual"),
-  SP(Kind::DepthGreaterEqual,     "SV_DepthGreaterEqual"),
-  SP(Kind::StencilRef,            "SV_StencilRef"),
-  SP(Kind::DispatchThreadID,      "SV_DispatchThreadID"),
-  SP(Kind::GroupID,               "SV_GroupID"),
-  SP(Kind::GroupIndex,            "SV_GroupIndex"),
-  SP(Kind::GroupThreadID,         "SV_GroupThreadID"),
-  SP(Kind::TessFactor,            "SV_TessFactor"),
-  SP(Kind::InsideTessFactor,      "SV_InsideTessFactor"),
-  SP(Kind::ViewID,                "SV_ViewID"),
-  SP(Kind::Barycentrics,          "SV_Barycentrics"),
-  SP(Kind::ShadingRate,           "SV_ShadingRate"),
-  SP(Kind::CullPrimitive,         "SV_CullPrimitive"),
-  SP(Kind::Invalid,               nullptr),
+  SP(Kind::Arbitrary,             nullptr,                     CompTy::AnyTy,              SizeClass::Other,  SizeClass::Other),
+  SP(Kind::VertexID,              "SV_VertexID",               CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::InstanceID,            "SV_InstanceID",             CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::Position,              "SV_Position",               CompTy::HalfOrFloatTy,      SizeClass::Vec4,   SizeClass::Vec4),
+  SP(Kind::RenderTargetArrayIndex,"SV_RenderTargetArrayIndex", CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::ViewPortArrayIndex,    "SV_ViewportArrayIndex",     CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::ClipDistance,          "SV_ClipDistance",           CompTy::HalfOrFloatTy,      SizeClass::Other,  SizeClass::Other),
+  SP(Kind::CullDistance,          "SV_CullDistance",           CompTy::HalfOrFloatTy,      SizeClass::Other,  SizeClass::Other),
+  SP(Kind::OutputControlPointID,  "SV_OutputControlPointID",   CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::DomainLocation,        "SV_DomainLocation",         CompTy::FloatTy,            SizeClass::Scalar, SizeClass::Vec3),
+  SP(Kind::PrimitiveID,           "SV_PrimitiveID",            CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::GSInstanceID,          "SV_GSInstanceID",           CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::SampleIndex,           "SV_SampleIndex",            CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::IsFrontFace,           "SV_IsFrontFace",            CompTy::BoolOrInt32Ty,      SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::Coverage,              "SV_Coverage",               CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::InnerCoverage,         "SV_InnerCoverage",          CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::Target,                "SV_Target",                 CompTy::AnyTy,              SizeClass::Scalar, SizeClass::Vec4),
+  SP(Kind::Depth,                 "SV_Depth",                  CompTy::HalfOrFloatTy,      SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::DepthLessEqual,        "SV_DepthLessEqual",         CompTy::HalfOrFloatTy,      SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::DepthGreaterEqual,     "SV_DepthGreaterEqual",      CompTy::HalfOrFloatTy,      SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::StencilRef,            "SV_StencilRef",             CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::DispatchThreadID,      "SV_DispatchThreadID",       CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Vec3),
+  SP(Kind::GroupID,               "SV_GroupID",                CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Vec3),
+  SP(Kind::GroupIndex,            "SV_GroupIndex",             CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::GroupThreadID,         "SV_GroupThreadID",          CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Vec3),
+  SP(Kind::TessFactor,            "SV_TessFactor",             CompTy::HalfOrFloatTy,      SizeClass::Other,  SizeClass::Other),
+  SP(Kind::InsideTessFactor,      "SV_InsideTessFactor",       CompTy::HalfOrFloatTy,      SizeClass::Other,  SizeClass::Other),
+  SP(Kind::ViewID,                "SV_ViewID",                 CompTy::Int32Ty,            SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::Barycentrics,          "SV_Barycentrics",           CompTy::HalfOrFloatTy,      SizeClass::Vec3,   SizeClass::Vec3),
+  SP(Kind::ShadingRate,           "SV_ShadingRate",            CompTy::Int16Or32Ty,        SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::CullPrimitive,         "SV_CullPrimitive",          CompTy::BoolOrInt16Or32Ty,  SizeClass::Scalar, SizeClass::Scalar),
+  SP(Kind::Invalid,               nullptr,                     CompTy::AnyTy,              SizeClass::Other,  SizeClass::Other),
 };
 
 } // namespace hlsl

+ 50 - 0
lib/HLSL/HLSignatureLower.cpp

@@ -1210,6 +1210,50 @@ void HLSignatureLower::GenerateDxilInputsOutputs(DXIL::SignatureKind SK) {
   }
 }
 
+bool HLSignatureLower::ValidateSemanticType(llvm::Function* F) {
+  bool result = true;
+  DxilFunctionAnnotation* funcAnnotation = HLM.GetFunctionAnnotation(F);
+  if (!funcAnnotation) {
+    return result;
+  }
+  for (Argument& arg : F->args()) {
+    DxilParameterAnnotation &paramAnnotation =
+      funcAnnotation->GetParameterAnnotation(arg.getArgNo());
+    llvm::StringRef semanticStr = paramAnnotation.GetSemanticString();
+    if (semanticStr.empty()) {
+      continue;
+    }
+    unsigned index;
+    StringRef baseSemanticStr;
+    Semantic::DecomposeNameAndIndex(semanticStr, &baseSemanticStr, &index);
+    const Semantic* semantic = Semantic::GetByName(baseSemanticStr);
+    Type* argTy = arg.getType();
+
+    if (argTy->isPointerTy())
+      argTy = cast<PointerType>(argTy)->getPointerElementType();
+
+    if (argTy->isArrayTy()) {
+      // Array type for arguments with specific qualifiers are expected.
+      // In this case, we do validation on array's element type.
+      DxilParamInputQual inputQual = paramAnnotation.GetParamInputQual();
+      if (inputQual == DxilParamInputQual::InputPatch ||
+        inputQual == DxilParamInputQual::InputPrimitive ||
+        inputQual == DxilParamInputQual::OutIndices ||
+        inputQual == DxilParamInputQual::OutPrimitives ||
+        inputQual == DxilParamInputQual::OutputPatch ||
+        inputQual == DxilParamInputQual::OutVertices) {
+        argTy = cast<ArrayType>(argTy)->getArrayElementType();
+      }
+    }
+
+    if (!semantic->IsSupportedType(argTy)) {
+      dxilutil::EmitErrorOnFunction(F->getContext(), F, "invalid type used for \'"+ semanticStr.str() + "\' semantic.");
+      result = false;
+    }
+  }
+  return result;
+}
+
 void HLSignatureLower::GenerateDxilCSInputs() {
   OP *hlslOP = HLM.GetOP();
 
@@ -1721,6 +1765,12 @@ void HLSignatureLower::GenerateGetMeshPayloadOperation() {
 }
 // Lower signatures.
 void HLSignatureLower::Run() {
+
+  // Generate error and exit if semantic type
+  // is not one of the allowed types
+  if (!ValidateSemanticType(Entry))
+    return;
+
   DxilFunctionProps &props = HLM.GetDxilFunctionProps(Entry);
   if (props.IsGraphics()) {
     if (props.IsMS()) {

+ 3 - 0
lib/HLSL/HLSignatureLower.h

@@ -13,6 +13,8 @@
 #include <unordered_set>
 #include <unordered_map>
 #include "dxc/DXIL/DxilConstants.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Argument.h"
 
 namespace llvm {
 class Value;
@@ -53,6 +55,7 @@ private:
   void GenerateDxilPrimOutputs();
   void GenerateDxilInputsOutputs(DXIL::SignatureKind SK);
   void GenerateDxilCSInputs();
+  bool ValidateSemanticType(llvm::Function* F);
   void GenerateDxilPatchConstantLdSt();
   void GenerateDxilPatchConstantFunctionInputs();
   void GenerateClipPlanesForVS(llvm::Value *outPosition);

+ 44 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_cs_input_semantics.hlsl

@@ -0,0 +1,44 @@
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint2 -DGI_TY=uint -DGID_TY=uint2 -DGTID_TY=uint2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint -DGI_TY=uint -DGID_TY=uint -DGTID_TY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=min16uint3 -DGI_TY=min16uint -DGID_TY=min16uint3 -DGTID_TY=min16uint3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=min16uint2 -DGI_TY=min16uint -DGID_TY=min16uint2 -DGTID_TY=min16uint2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=min16uint -DGI_TY=min16uint -DGID_TY=min16uint -DGTID_TY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_2 -enable-16bit-types -DTID_TY=uint16_t3 -DGI_TY=uint16_t -DGID_TY=uint16_t3 -DGTID_TY=uint16_t3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_2 -enable-16bit-types -DTID_TY=uint16_t2 -DGI_TY=uint16_t -DGID_TY=uint16_t2 -DGTID_TY=uint16_t2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_2 -enable-16bit-types -DTID_TY=uint16_t -DGI_TY=uint16_t -DGID_TY=uint16_t -DGTID_TY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=float3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_TID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=float1x1 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_TID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=float -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_TID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=bool -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_TID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=min16float -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_TID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=float3 -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GI_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=float1x1 -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GI_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=float -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GI_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=bool -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GI_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=min16float -DGID_TY=uint3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GI_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=float3 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=float1x1 -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=float -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=bool -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=min16float -DGTID_TY=uint3 %s | FileCheck %s -check-prefix=CHK_GID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=float3 %s | FileCheck %s -check-prefix=CHK_GTID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=float1x1 %s | FileCheck %s -check-prefix=CHK_GTID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=float %s | FileCheck %s -check-prefix=CHK_GTID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=bool %s | FileCheck %s -check-prefix=CHK_GTID_TY_ERR
+// RUN: %dxc -E main -T cs_6_0 -DTID_TY=uint3 -DGI_TY=uint -DGID_TY=uint3 -DGTID_TY=min16float %s | FileCheck %s -check-prefix=CHK_GTID_TY_ERR
+
+// Verify error gets reported for non-integer types on CS input semantics on integeral types
+
+// CHK_NO_ERR: define void @main
+// CHK_TID_TY_ERR: error: invalid type used for 'SV_DispatchThreadID' semantic
+// CHK_GI_TY_ERR: error: invalid type used for 'SV_GroupIndex' semantic
+// CHK_GID_TY_ERR: error: invalid type used for 'SV_GroupID' semantic
+// CHK_GTID_TY_ERR: error: invalid type used for 'SV_GroupThreadID' semantic
+
+
+[numthreads(1, 1, 1)]
+void main(TID_TY tid : SV_DispatchThreadID, 
+GI_TY gi : SV_GroupIndex, 
+GID_TY gid : SV_GroupID, 
+GTID_TY gtid : SV_GroupThreadID ) {}

+ 20 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_barycentric.hlsl

@@ -0,0 +1,20 @@
+// RUN: %dxc -E main -T ps_6_4 -DTY=float3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=min16float3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -enable-16bit-types -DTY=float16_t3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2x1 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint4 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_Barycentrics' semantic
+
+float4 main(TY a : SV_Barycentrics) : SV_Target
+{
+  return 0;
+}

+ 13 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_clipdistance.hlsl

@@ -0,0 +1,13 @@
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_ClipDistance' semantic
+
+void main(TY id : SV_ClipDistance) {}

+ 17 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_coverage.hlsl

@@ -0,0 +1,17 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_Coverage' semantic
+
+void main(inout TY c: SV_Coverage)
+{
+   c=0;
+}

+ 13 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_culldistance.hlsl

@@ -0,0 +1,13 @@
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_CullDistance' semantic
+
+void main(TY id : SV_CullDistance) {}

+ 26 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_cullprimitive.hlsl

@@ -0,0 +1,26 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16int %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16int1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=int16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=int16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_CullPrimitive' semantic
+
+uint main(TY b : SV_CullPrimitive) : SV_Target {
+  return b;
+}

+ 21 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depth.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_Depth' semantic
+
+TY main(out TY d : SV_Depth) : SV_Target
+{
+  d = 2 * d;
+  return 0;
+}

+ 21 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depthgreaterequal.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_DepthGreaterEqual' semantic
+
+TY main(out TY d : SV_DepthGreaterEqual) : SV_Target
+{
+  d = 2 * d;
+  return 0;
+}

+ 21 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_depthlessequal.hlsl

@@ -0,0 +1,21 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=float16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_DepthLessEqual' semantic
+
+TY main(out TY d : SV_DepthLessEqual) : SV_Target
+{
+  d = 2 * d;
+  return 0;
+}

+ 33 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_domainlocation.hlsl

@@ -0,0 +1,33 @@
+// RUN: %dxc -E main -T ds_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_DomainLocation' semantic
+
+
+struct DSFoo
+{
+    float Edges[4]  : SV_TessFactor;
+    float Inside[2] : SV_InsideTessFactor;
+    float4 a : AAA;
+    float3 b[3] : BBB;
+};
+
+struct HSFoo
+{
+    float3 pos : AAA_HSFoo;
+};
+
+uint g_Idx1;
+
+[domain("quad")]
+float4 main(OutputPatch<HSFoo, 16> p, DSFoo input, TY UV : SV_DomainLocation) : SV_Position
+{
+    return 0;
+}

+ 39 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_gsinstanceid.hlsl

@@ -0,0 +1,39 @@
+// RUN: %dxc -E main -T gs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_GSInstanceID' semantic
+
+
+struct VSOut {
+  float2 uv : TEXCOORD0;
+};
+
+struct VSOutGSIn {
+  float3 posSize : POSSIZE;
+  float4 clr : COLOR;
+};
+
+struct VSOutGSArrayIn {
+  float3 posSize : POSSIZE;
+  float2 clr[2] : COLOR;
+};
+
+struct VSOutGSMatIn {
+  float3 posSize : POSSIZE;
+  float2x2 clr[2] : COLOR;
+};
+
+cbuffer b : register(b0) {
+  float2 invViewportSize;
+};
+
+// geometry shader that outputs 3 vertices from a point
+[maxvertexcount(3)] 
+[instance(24)]
+void main(point VSOutGSIn points[1], inout TriangleStream<VSOut> stream, TY InstanceID : SV_GSInstanceID) {  
+}

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_innercoverage.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_InnerCoverage' semantic
+
+void main(in TY c: SV_InnerCoverage)
+{
+}

+ 37 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_insidetessfactor.hlsl

@@ -0,0 +1,37 @@
+// RUN: %dxc -E main -T ds_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=bool3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_InsideTessFactor' semantic
+
+// HS PCF output
+struct HsPcfOut {
+  float  outTessFactor[4]   : SV_TessFactor;
+  TY     inTessFactor[2]    : SV_InsideTessFactor;
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex input structs
+struct DsCpIn {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex output structs
+struct DsCpOut {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+[domain("quad")]
+DsCpOut main(OutputPatch<DsCpIn, 3> patch, HsPcfOut pcfData) {
+  DsCpOut dsOut;
+  dsOut = (DsCpOut)0;
+  return dsOut;
+}

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_instanceid.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_InstanceID' semantic
+
+void main(TY id : SV_InstanceID) {}

+ 17 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_isfrontface.hlsl

@@ -0,0 +1,17 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_IsFrontFace' semantic
+
+void main(in TY c: SV_IsFrontFace)
+{
+}

+ 48 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_outputcontrolid.hlsl

@@ -0,0 +1,48 @@
+// RUN: %dxc -E main -T hs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T hs_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=float3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T hs_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_OutputControlPointID' semantic
+
+
+struct MatStruct {
+  int2 uv : TEXCOORD0;
+  float3x4  m_ObjectToWorld : TEXCOORD1;
+};
+
+struct Output {
+  float edges[3] : SV_TessFactor;
+  float inside : SV_InsideTessFactor;
+};
+
+Output Patch(InputPatch<MatStruct, 3> inputs)
+{
+  Output ret;
+  int i = inputs[0].uv.x;
+  int j = inputs[0].uv.y;
+
+  ret.edges[0] = inputs[0].m_ObjectToWorld[0][0];
+  ret.edges[1] = inputs[0].m_ObjectToWorld[0][1];
+  ret.edges[2] = inputs[0].m_ObjectToWorld[0][2];
+  ret.inside = 1.0f;
+  return ret;
+}
+
+
+
+[domain("tri")]
+[partitioning("fractional_odd")]
+[outputtopology("triangle_cw")]
+[patchconstantfunc("Patch")]
+[outputcontrolpoints(3)]
+[shader("hull")]
+float4 main(InputPatch<MatStruct, 3> input, TY id : SV_OutputControlPointID) : SV_Position
+{
+  return 0;
+}

+ 12 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_position.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc -E main -T vs_6_2 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=float16_t4 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16float4 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_Position' semantic
+
+void main(TY id : SV_Position) {}

+ 39 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_primitiveid.hlsl

@@ -0,0 +1,39 @@
+// RUN: %dxc -E main -T gs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T gs_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_PrimitiveID' semantic
+
+
+struct VSOut {
+  float2 uv : TEXCOORD0;
+};
+
+struct VSOutGSIn {
+  float3 posSize : POSSIZE;
+  float4 clr : COLOR;
+};
+
+struct VSOutGSArrayIn {
+  float3 posSize : POSSIZE;
+  float2 clr[2] : COLOR;
+};
+
+struct VSOutGSMatIn {
+  float3 posSize : POSSIZE;
+  float2x2 clr[2] : COLOR;
+};
+
+cbuffer b : register(b0) {
+  float2 invViewportSize;
+};
+
+// geometry shader that outputs 3 vertices from a point
+[maxvertexcount(3)] 
+[instance(24)]
+void main(point VSOutGSIn points[1], inout TriangleStream<VSOut> stream, TY PrimID : SV_PrimitiveID) {  
+}

+ 39 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_rendertargetarrayindex.hlsl

@@ -0,0 +1,39 @@
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=bool3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_ERR
+
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_RenderTargetArrayIndex' semantic
+
+// HS PCF output
+struct HsPcfOut {
+  float  outTessFactor[4]   : SV_TessFactor;
+  float  inTessFactor[2]    : SV_InsideTessFactor;
+  TY   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex input structs
+struct DsCpIn {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex output structs
+struct DsCpOut {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+[domain("quad")]
+DsCpOut main(OutputPatch<DsCpIn, 3> patch, HsPcfOut pcfData) {
+  DsCpOut dsOut;
+  dsOut = (DsCpOut)0;
+  return dsOut;
+}

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_sampleindex.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -E main -T ps_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_SampleIndex' semantic
+
+void main(in TY c: SV_SampleIndex)
+{
+}

+ 19 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_shadingrate.hlsl

@@ -0,0 +1,19 @@
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2x1 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint4 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_ShadingRate' semantic
+
+float2 main(TY r : SV_ShadingRate) : SV_Target {
+  return 2 * r;
+}

+ 25 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_stencilref.hlsl

@@ -0,0 +1,25 @@
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2x1 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint4 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_StencilRef' semantic
+
+void main(out TY a : SV_StencilRef
+         ,out float4 b : SV_Target)
+{
+    a = 0;
+    b = 0;
+}

+ 18 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_target.hlsl

@@ -0,0 +1,18 @@
+// RUN: %dxc -E main -T ps_6_4 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint3 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=uint4 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ps_6_4 -DTY=int2x1 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_Target' semantic
+
+TY main() : SV_Target
+{
+  return 0;
+}

+ 36 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_tessfactor.hlsl

@@ -0,0 +1,36 @@
+// RUN: %dxc -E main -T ds_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16float %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=float16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=bool3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_TessFactor' semantic
+
+// HS PCF output
+struct HsPcfOut {
+  TY  outTessFactor[4]   : SV_TessFactor;
+  float  inTessFactor[2]    : SV_InsideTessFactor;
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex input structs
+struct DsCpIn {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+// Per-vertex output structs
+struct DsCpOut {
+  uint   index              : SV_RenderTargetArrayIndex;
+};
+
+[domain("quad")]
+DsCpOut main(OutputPatch<DsCpIn, 3> patch, HsPcfOut pcfData) {
+  DsCpOut dsOut;
+  dsOut = (DsCpOut)0;
+  return dsOut;
+}

+ 15 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_vertexid.hlsl

@@ -0,0 +1,15 @@
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_VertexID' semantic
+
+void main(TY id : SV_VertexID) {}

+ 12 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_viewid.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc -E main -T vs_6_2 -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T vs_6_2 -DTY=bool %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_ViewID' semantic
+
+void main(TY id : SV_ViewID) {}

+ 38 - 0
tools/clang/test/HLSLFileCheck/hlsl/diagnostics/errors/semantics_type_checking/unsupported_types_sv_viewportarrayindex.hlsl

@@ -0,0 +1,38 @@
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint16_t %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -enable-16bit-types -DTY=uint16_t1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=min16uint1 %s | FileCheck %s -check-prefix=CHK_NO_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float3 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=float4 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=int2x2 %s | FileCheck %s -check-prefix=CHK_ERR
+// RUN: %dxc -E main -T ds_6_2 -DTY=bool2 %s | FileCheck %s -check-prefix=CHK_ERR
+
+// CHK_NO_ERR: define void @main
+// CHK_ERR: error: invalid type used for 'SV_ViewportArrayIndex' semantic
+
+
+struct DSFoo
+{
+    float Edges[4]  : SV_TessFactor;
+    float Inside[2] : SV_InsideTessFactor;
+    float4 a : AAA;
+    float3 b[3] : BBB;
+};
+
+struct HSFoo
+{
+    float3 pos : AAA_HSFoo;
+};
+
+uint g_Idx1;
+
+[domain("quad")]
+float4 main(OutputPatch<HSFoo, 16> p, DSFoo input, TY UV : SV_ViewportArrayIndex) : SV_Position
+{
+    return 0;
+}