https://github.com/bogner updated 
https://github.com/llvm/llvm-project/pull/135909

>From cabe20bfd129a574f978c2a10e4f66a04cb85794 Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 2 Apr 2025 11:34:00 -0700
Subject: [PATCH 1/6] [HLSL] Add a warning for implicit bindings

Implicit bindings will cause very confusing crashes in the backend at present,
so this is intended at least partially as a stop gap until we get them
implemented (see #110722).

However, I do think that this is useful in the longer term as well as an
off-by-default warning, as it is quite easy to miss a binding or two when using
explicit bindings and the results of that can be surprisingly hard to debug.
I've filed #135907 to track turning this into an off-by-default warning or
removing it eventually as we see fit.
---
 clang/include/clang/Basic/DiagnosticGroups.td |  3 ++
 .../clang/Basic/DiagnosticSemaKinds.td        |  1 +
 clang/lib/Parse/ParseHLSL.cpp                 |  2 +-
 clang/lib/Sema/SemaHLSL.cpp                   |  9 ++++++
 .../test/AST/HLSL/ByteAddressBuffers-AST.hlsl | 12 ++++----
 clang/test/AST/HLSL/OutArgExpr.hlsl           |  6 ++--
 .../test/AST/HLSL/StructuredBuffers-AST.hlsl  | 20 ++++++-------
 clang/test/AST/HLSL/TypedBuffers-AST.hlsl     | 10 +++----
 .../AST/HLSL/ast-dump-comment-cbuffer.hlsl    |  4 +--
 clang/test/AST/HLSL/cbuffer.hlsl              |  8 +++---
 .../test/AST/HLSL/cbuffer_and_namespaces.hlsl |  8 +++---
 clang/test/AST/HLSL/default_cbuffer.hlsl      |  4 +--
 ...d_resource_element_compatible_concept.hlsl |  2 +-
 ...d_resource_element_compatible_concept.hlsl |  2 +-
 clang/test/AST/HLSL/packoffset.hlsl           |  2 +-
 clang/test/AST/HLSL/pch.hlsl                  |  9 ++----
 clang/test/AST/HLSL/pch_hlsl_buffer.hlsl      | 13 ++++-----
 clang/test/AST/HLSL/pch_with_buf.hlsl         |  7 ++---
 clang/test/AST/HLSL/private.hlsl              |  2 +-
 .../CodeGenHLSL/GlobalConstructorLib.hlsl     |  4 +--
 .../test/CodeGenHLSL/GlobalConstructors.hlsl  |  2 +-
 .../AppendStructuredBuffer-elementtype.hlsl   |  4 +--
 .../ConsumeStructuredBuffer-elementtype.hlsl  |  4 +--
 .../builtins/RWBuffer-elementtype.hlsl        |  4 +--
 .../builtins/RWBuffer-subscript.hlsl          |  4 +--
 .../RWStructuredBuffer-elementtype.hlsl       |  2 +-
 ...erOrderedStructuredBuffer-elementtype.hlsl |  2 +-
 .../StructuredBuffer-elementtype.hlsl         |  2 +-
 .../StructuredBuffers-methods-ps.hlsl         |  4 +--
 .../StructuredBuffers-subscripts.hlsl         |  2 +-
 clang/test/CodeGenHLSL/cbuffer.hlsl           |  3 +-
 clang/test/CodeGenHLSL/cbuffer_align.hlsl     |  4 +--
 .../CodeGenHLSL/cbuffer_and_namespaces.hlsl   |  4 +--
 ...uffer_with_static_global_and_function.hlsl |  3 +-
 clang/test/CodeGenHLSL/default_cbuffer.hlsl   |  5 ++--
 .../default_cbuffer_with_layout.hlsl          |  7 ++---
 .../implicit-norecurse-attrib.hlsl            |  4 +--
 clang/test/CodeGenHLSL/inline-functions.hlsl  | 12 ++++----
 clang/test/CodeGenHLSL/static-local-ctor.hlsl |  3 +-
 clang/test/ParserHLSL/cb_error.hlsl           |  2 +-
 .../ParserHLSL/hlsl_is_rov_attr_error.hlsl    |  2 +-
 .../hlsl_raw_buffer_attr_error.hlsl           |  2 +-
 .../ParserHLSL/hlsl_resource_class_attr.hlsl  |  2 +-
 .../hlsl_resource_handle_attrs.hlsl           |  2 +-
 clang/test/ParserHLSL/invalid_inside_cb.hlsl  |  2 +-
 clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl   |  2 +-
 .../SemaHLSL/BuiltIns/StructuredBuffers.hlsl  |  2 +-
 .../SemaHLSL/BuiltIns/hlsl_resource_t.hlsl    |  2 +-
 .../Language/AggregateSplatCast-errors.hlsl   |  4 +--
 clang/test/SemaHLSL/cb_error.hlsl             |  2 +-
 clang/test/SemaHLSL/export.hlsl               |  2 +-
 clang/test/SemaHLSL/packoffset-invalid.hlsl   |  2 +-
 .../SemaHLSL/resource_binding_attr_error.hlsl |  4 +--
 .../resource_binding_attr_error_basic.hlsl    |  2 +-
 .../resource_binding_attr_error_resource.hlsl |  2 +-
 ...urce_binding_attr_error_silence_diags.hlsl |  4 +--
 .../resource_binding_attr_error_space.hlsl    |  4 +--
 .../resource_binding_attr_error_udt.hlsl      |  2 +-
 .../SemaHLSL/resource_binding_implicit.hlsl   | 28 +++++++++++++++++++
 59 files changed, 151 insertions(+), 126 deletions(-)
 create mode 100644 clang/test/SemaHLSL/resource_binding_implicit.hlsl

diff --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index d97bbfee2e4d5..b234d60fee8fc 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1612,6 +1612,9 @@ def HLSLExtension : DiagGroup<"hlsl-extensions", 
[HLSL202y]>;
 // Warning for mix packoffset and non-packoffset.
 def HLSLMixPackOffset : DiagGroup<"mix-packoffset">;
 
+// Warning for implicit resource bindings.
+def HLSLImplicitBinding : DiagGroup<"hlsl-implicit-binding">;
+
 // Warnings for DXIL validation
 def DXILValidation : DiagGroup<"dxil-validation">;
 
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 3f7499d8656bd..6cbe8b60fe9bf 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12734,6 +12734,7 @@ def warn_hlsl_deprecated_register_type_i: 
Warning<"binding type 'i' ignored. The
 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 err_hlsl_space_on_global_constant : Error<"register space cannot be 
specified on global constants">;
+def warn_hlsl_implicit_binding : Warning<"resource has implicit register 
binding">, InGroup<HLSLImplicitBinding>, DefaultError;
 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">;
diff --git a/clang/lib/Parse/ParseHLSL.cpp b/clang/lib/Parse/ParseHLSL.cpp
index f4c109f9a81a2..b832f7b6792d9 100644
--- a/clang/lib/Parse/ParseHLSL.cpp
+++ b/clang/lib/Parse/ParseHLSL.cpp
@@ -75,6 +75,7 @@ Decl *Parser::ParseHLSLBuffer(SourceLocation &DeclEnd) {
   Decl *D = Actions.HLSL().ActOnStartBuffer(getCurScope(), IsCBuffer, 
BufferLoc,
                                             Identifier, IdentifierLoc,
                                             T.getOpenLocation());
+  Actions.ProcessDeclAttributeList(Actions.CurScope, D, Attrs);
 
   while (Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {
     // FIXME: support attribute on constants inside cbuffer/tbuffer.
@@ -98,7 +99,6 @@ Decl *Parser::ParseHLSLBuffer(SourceLocation &DeclEnd) {
   BufferScope.Exit();
   Actions.HLSL().ActOnFinishBuffer(D, DeclEnd);
 
-  Actions.ProcessDeclAttributeList(Actions.CurScope, D, Attrs);
   return D;
 }
 
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 0b442b75d174d..98f4f7dbe875d 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -541,6 +541,10 @@ void SemaHLSL::ActOnFinishBuffer(Decl *Dcl, SourceLocation 
RBrace) {
   // create buffer layout struct
   createHostLayoutStructForBuffer(SemaRef, BufDecl);
 
+  if (std::none_of(Dcl->attr_begin(), Dcl->attr_end(),
+                   [](Attr *A) { return isa<HLSLResourceBindingAttr>(A); }))
+    SemaRef.Diag(Dcl->getLocation(), diag::warn_hlsl_implicit_binding);
+
   SemaRef.PopDeclContext();
 }
 
@@ -3248,10 +3252,12 @@ void SemaHLSL::collectResourceBindingsOnVarDecl(VarDecl 
*VD) {
 void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) {
   assert(VD->hasGlobalStorage() && "expected global variable");
 
+  bool HasBinding = false;
   for (Attr *A : VD->attrs()) {
     HLSLResourceBindingAttr *RBA = dyn_cast<HLSLResourceBindingAttr>(A);
     if (!RBA)
       continue;
+    HasBinding = true;
 
     RegisterType RT = RBA->getRegisterType();
     assert(RT != RegisterType::I && "invalid or obsolete register type should "
@@ -3278,6 +3284,9 @@ void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) 
{
           << static_cast<int>(RT);
     }
   }
+
+  if (!HasBinding && VD->getType()->isHLSLResourceRecord())
+    SemaRef.Diag(VD->getLocation(), diag::warn_hlsl_implicit_binding);
 }
 
 static bool CastInitializer(Sema &S, ASTContext &Ctx, Expr *E,
diff --git a/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl 
b/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl
index 38e5b6281c42e..3a11aff5f651a 100644
--- a/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl
+++ b/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl
@@ -1,24 +1,24 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=ByteAddressBuffer %s | FileCheck 
-DRESOURCE=ByteAddressBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=ByteAddressBuffer %s | FileCheck 
-DRESOURCE=ByteAddressBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-SRV,CHECK-NOSUBSCRIPT %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=RWByteAddressBuffer %s | FileCheck 
-DRESOURCE=RWByteAddressBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RWByteAddressBuffer %s | FileCheck 
-DRESOURCE=RWByteAddressBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=RasterizerOrderedByteAddressBuffer %s | FileCheck 
-DRESOURCE=RasterizerOrderedByteAddressBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RasterizerOrderedByteAddressBuffer %s | FileCheck 
-DRESOURCE=RasterizerOrderedByteAddressBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT %s
 
diff --git a/clang/test/AST/HLSL/OutArgExpr.hlsl 
b/clang/test/AST/HLSL/OutArgExpr.hlsl
index b07c2efadbf4a..1cdb05418a3dd 100644
--- a/clang/test/AST/HLSL/OutArgExpr.hlsl
+++ b/clang/test/AST/HLSL/OutArgExpr.hlsl
@@ -1,7 +1,7 @@
 // RUN: rm -f %t.pch
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-pch 
-finclude-default-header -o %t.pch %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute 
-finclude-default-header -include-pch %t.pch %s -ast-dump | FileCheck 
--check-prefix=AST %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute 
-finclude-default-header -include-pch %t.pch %s -ast-print | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -emit-pch -finclude-default-header -o %t.pch %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -finclude-default-header -include-pch %t.pch %s 
-ast-dump | FileCheck --check-prefix=AST %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -finclude-default-header -include-pch %t.pch %s 
-ast-print | FileCheck %s
 
 
 #ifndef TEST_HLSL
diff --git a/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl 
b/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl
index dcead068f481e..5c4716a6b6ad0 100644
--- a/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl
+++ b/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl
@@ -1,40 +1,40 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=StructuredBuffer %s | FileCheck 
-DRESOURCE=StructuredBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=StructuredBuffer %s | FileCheck 
-DRESOURCE=StructuredBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-SRV,CHECK-SUBSCRIPT,CHECK-LOAD %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=RWStructuredBuffer %s | FileCheck 
-DRESOURCE=RWStructuredBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RWStructuredBuffer %s | FileCheck 
-DRESOURCE=RWStructuredBuffer \
 // RUN:   
-check-prefixes=CHECK,CHECK-UAV,CHECK-SUBSCRIPT,CHECK-COUNTER,CHECK-LOAD %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=AppendStructuredBuffer %s | FileCheck 
-DRESOURCE=AppendStructuredBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=AppendStructuredBuffer %s | FileCheck 
-DRESOURCE=AppendStructuredBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT,CHECK-APPEND %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=ConsumeStructuredBuffer %s | FileCheck 
-DRESOURCE=ConsumeStructuredBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=ConsumeStructuredBuffer %s | FileCheck 
-DRESOURCE=ConsumeStructuredBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT,CHECK-CONSUME %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \
 // RUN:  -DRESOURCE=RasterizerOrderedStructuredBuffer %s | FileCheck 
-DRESOURCE=RasterizerOrderedStructuredBuffer \
 // RUN:  -check-prefix=EMPTY %s
 //
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
 // RUN:   -DRESOURCE=RasterizerOrderedStructuredBuffer %s | FileCheck 
-DRESOURCE=RasterizerOrderedStructuredBuffer \
 // RUN:   -check-prefixes=CHECK,CHECK-UAV,CHECK-ROV,CHECK-SUBSCRIPT,CHECK-LOAD 
%s
 
diff --git a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl 
b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
index f665b06d691e8..fc345b79e4aa0 100644
--- a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
+++ b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl
@@ -1,7 +1,7 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-DEMPTY \
+// 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 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \
+// 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
 
@@ -66,7 +66,7 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: ' lvalue .__handle {{.*}} 
+// CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} 'const [[RESOURCE]]<element_type>' lvalue 
implicit this
 // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}}  'Index' 
'unsigned int'
 // CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
@@ -81,7 +81,7 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: ' lvalue .__handle {{.*}} 
+// CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit 
this
 // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}}  'Index' 
'unsigned int'
 // CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
@@ -96,7 +96,7 @@ RESOURCE<float> Buffer;
 // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t
 // CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]]
 // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]
-// CHECK-SAME: ' lvalue .__handle {{.*}} 
+// CHECK-SAME: ' lvalue .__handle {{.*}}
 // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit 
this
 // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}}  'Index' 
'unsigned int'
 // CHECK-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline
diff --git a/clang/test/AST/HLSL/ast-dump-comment-cbuffer.hlsl 
b/clang/test/AST/HLSL/ast-dump-comment-cbuffer.hlsl
index 37946b7cedea2..4cca9cc742c07 100644
--- a/clang/test/AST/HLSL/ast-dump-comment-cbuffer.hlsl
+++ b/clang/test/AST/HLSL/ast-dump-comment-cbuffer.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -Wdocumentation -ast-dump=json -x hlsl -triple 
dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefix=JSON
-// RUN: %clang_cc1 -Wdocumentation -ast-dump -x hlsl -triple 
dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefix=AST
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -Wdocumentation -ast-dump=json 
-x hlsl -triple dxil-pc-shadermodel6.3-library %s | FileCheck %s 
--check-prefix=JSON
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -Wdocumentation -ast-dump -x 
hlsl -triple dxil-pc-shadermodel6.3-library %s | FileCheck %s --check-prefix=AST
 
 // JSON:"kind": "HLSLBufferDecl",
 // JSON:"name": "A",
diff --git a/clang/test/AST/HLSL/cbuffer.hlsl b/clang/test/AST/HLSL/cbuffer.hlsl
index 5c5aa6fc5ab10..726183821e57f 100644
--- a/clang/test/AST/HLSL/cbuffer.hlsl
+++ b/clang/test/AST/HLSL/cbuffer.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -ast-dump -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -ast-dump -o - %s | FileCheck %s
 
 struct EmptyStruct {
 };
@@ -55,14 +55,14 @@ cbuffer CB {
 }
 _Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(OneFloat, 
__cblayout_CB), "");
 
-// Check that buffer layout struct does not include resources or empty types 
+// Check that buffer layout struct does not include resources or empty types
 // CHECK: HLSLBufferDecl {{.*}} line:[[# @LINE + 2]]:9 cbuffer CB
 // CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
 cbuffer CB {
   // CHECK: VarDecl {{.*}} used a2 'hlsl_constant float'
   float a2;
   // CHECK: VarDecl {{.*}} b2 'RWBuffer<float>':'hlsl::RWBuffer<float>'
-  RWBuffer<float> b2; 
+  RWBuffer<float> b2;
   // CHECK: VarDecl {{.*}} c2 'EmptyStruct'
   EmptyStruct c2;
   // CHECK: VarDecl {{.*}} d2 'float[0]'
@@ -123,7 +123,7 @@ 
_Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(TwoFloats, __cblay
 
 // check that layout struct is created for E because because its base struct
 // is empty and should be eliminated, and BTypedef should reuse the previously
-// defined '__cblayout_B' 
+// defined '__cblayout_B'
 // CHECK: HLSLBufferDecl {{.*}} line:[[# @LINE + 2]]:9 cbuffer CB
 // CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
 cbuffer CB {
diff --git a/clang/test/AST/HLSL/cbuffer_and_namespaces.hlsl 
b/clang/test/AST/HLSL/cbuffer_and_namespaces.hlsl
index b2860fe07216e..3589535923241 100644
--- a/clang/test/AST/HLSL/cbuffer_and_namespaces.hlsl
+++ b/clang/test/AST/HLSL/cbuffer_and_namespaces.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -ast-dump -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -ast-dump -o - %s | FileCheck %s
 
 // CHECK: CXXRecordDecl {{.*}} struct EmptyStruct definition
 struct EmptyStruct {
@@ -7,11 +7,11 @@ struct EmptyStruct {
 // CHECK: NamespaceDecl {{.*}} NS1
 namespace NS1 {
   // CHECK: CXXRecordDecl {{.*}} struct Foo definition
-  struct Foo { 
+  struct Foo {
     float a;
     EmptyStruct es;
   };
-  
+
   // CHECK: CXXRecordDecl {{.*}} struct Bar definition
   struct Bar {
     // CHECK: CXXRecordDecl {{.*}} struct Foo definition
@@ -56,7 +56,7 @@ struct CB1ExpectedShape {
 
_Static_assert(__builtin_hlsl_is_scalarized_layout_compatible(CB1ExpectedShape, 
__cblayout_CB1), "");
 
 namespace NS2 {
-  struct Foo { 
+  struct Foo {
     float d[4];
     EmptyStruct es;
   };
diff --git a/clang/test/AST/HLSL/default_cbuffer.hlsl 
b/clang/test/AST/HLSL/default_cbuffer.hlsl
index 9e0fce7cc53cf..03b3ebd0d9f2b 100644
--- a/clang/test/AST/HLSL/default_cbuffer.hlsl
+++ b/clang/test/AST/HLSL/default_cbuffer.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -ast-dump -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -ast-dump -o - %s | FileCheck %s
 
 struct EmptyStruct {
 };
@@ -14,7 +14,7 @@ struct S {
 float a;
 
 // CHECK: VarDecl {{.*}} b 'RWBuffer<float>':'hlsl::RWBuffer<float>'
-RWBuffer<float> b; 
+RWBuffer<float> b;
 
 // CHECK: VarDecl {{.*}} c 'EmptyStruct'
 EmptyStruct c;
diff --git 
a/clang/test/AST/HLSL/is_structured_resource_element_compatible_concept.hlsl 
b/clang/test/AST/HLSL/is_structured_resource_element_compatible_concept.hlsl
index a4f6e6c44794e..38c28b8e65394 100644
--- a/clang/test/AST/HLSL/is_structured_resource_element_compatible_concept.hlsl
+++ b/clang/test/AST/HLSL/is_structured_resource_element_compatible_concept.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-ast-dump-filter=__is_structured_resource_element_compatible %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-ast-dump-filter=__is_structured_resource_element_compatible %s | FileCheck %s
 
 // CHECK: ConceptDecl {{.*}} __is_structured_resource_element_compatible
 // CHECK: |-TemplateTypeParmDecl {{.*}} referenced typename depth 0 index 0 
element_type
diff --git 
a/clang/test/AST/HLSL/is_typed_resource_element_compatible_concept.hlsl 
b/clang/test/AST/HLSL/is_typed_resource_element_compatible_concept.hlsl
index 24a57624e2e9d..e4aefd5ac6aca 100644
--- a/clang/test/AST/HLSL/is_typed_resource_element_compatible_concept.hlsl
+++ b/clang/test/AST/HLSL/is_typed_resource_element_compatible_concept.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-ast-dump-filter=__is_typed_resource_element_compatible %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-library -x hlsl -ast-dump 
-ast-dump-filter=__is_typed_resource_element_compatible %s | FileCheck %s
 
 // CHECK: ConceptDecl {{.*}} __is_typed_resource_element_compatible
 // CHECK: |-TemplateTypeParmDecl {{.*}} referenced typename depth 0 index 0 
element_type
diff --git a/clang/test/AST/HLSL/packoffset.hlsl 
b/clang/test/AST/HLSL/packoffset.hlsl
index 1f57540aeac2f..4fe8aed5cb31a 100644
--- a/clang/test/AST/HLSL/packoffset.hlsl
+++ b/clang/test/AST/HLSL/packoffset.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-unknown-shadermodel6.3-library -S 
-finclude-default-header -fnative-half-type -ast-dump  -x hlsl %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-unknown-shadermodel6.3-library -S -finclude-default-header 
-fnative-half-type -ast-dump  -x hlsl %s | FileCheck %s
 
 
 // CHECK: HLSLBufferDecl {{.*}} cbuffer A
diff --git a/clang/test/AST/HLSL/pch.hlsl b/clang/test/AST/HLSL/pch.hlsl
index 483af0f5b4c79..58574a13b526b 100644
--- a/clang/test/AST/HLSL/pch.hlsl
+++ b/clang/test/AST/HLSL/pch.hlsl
@@ -1,12 +1,9 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl \
-// RUN:  -finclude-default-header -emit-pch -o %t %S/Inputs/pch.hlsl
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl \
-// RUN:  -finclude-default-header -include-pch %t -ast-dump-all %s \
-// RUN: | FileCheck  %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -finclude-default-header -emit-pch -o %t 
%S/Inputs/pch.hlsl
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -finclude-default-header -include-pch %t 
-ast-dump-all %s | FileCheck  %s
 
 // Make sure PCH works by using function declared in PCH header and declare a 
RWBuffer in current file.
 // CHECK:FunctionDecl 0x[[FOO:[0-9a-f]+]] <{{.*}}:2:1, line:4:1> line:2:8 
imported used foo 'float2 (float2, float2)'
-// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:10:1, col:23> col:23 Buffer 
'hlsl::RWBuffer<float>'
+// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:7:1, col:23> col:23 Buffer 
'hlsl::RWBuffer<float>'
 hlsl::RWBuffer<float> Buffer;
 
 float2 bar(float2 a, float2 b) {
diff --git a/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl 
b/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
index bfb89b4833677..fe955e27989b3 100644
--- a/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
+++ b/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
@@ -1,8 +1,5 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl \
-// RUN:   -emit-pch -o %t %s
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl \
-// RUN:   -include-pch %t -ast-dump-all %S/Inputs/empty.hlsl \
-// RUN: | FileCheck  %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -emit-pch -o %t %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -include-pch %t -ast-dump-all 
%S/Inputs/empty.hlsl | FileCheck  %s
 
 cbuffer A {
   float a;
@@ -17,19 +14,19 @@ float foo() {
 }
 
 // Make sure cbuffer/tbuffer works for PCH.
-// CHECK: HLSLBufferDecl {{.*}} line:7:9 imported <undeserialized 
declarations> cbuffer A
+// CHECK: HLSLBufferDecl {{.*}} line:4:9 imported <undeserialized 
declarations> cbuffer A
 // CHECK-NEXT: HLSLResourceClassAttr {{.*}} Implicit CBuffer
 // CHECK-NEXT: VarDecl 0x[[A:[0-9a-f]+]] {{.*}} imported used a 'hlsl_constant 
float'
 // CHECK-NEXT: CXXRecordDecl {{.*}} imported implicit <undeserialized 
declarations> struct __cblayout_A definition
 // CHECK: FieldDecl {{.*}} imported a 'float'
 
-// CHECK: HLSLBufferDecl {{.*}} line:11:9 imported <undeserialized 
declarations> tbuffer B
+// CHECK: HLSLBufferDecl {{.*}} line:8:9 imported <undeserialized 
declarations> tbuffer B
 // CHECK-NEXT: HLSLResourceClassAttr {{.*}} Implicit SRV
 // CHECK-NEXT: VarDecl 0x[[B:[0-9a-f]+]] {{.*}} imported used b 'hlsl_constant 
float'
 // CHECK-NEXT: CXXRecordDecl 0x{{[0-9a-f]+}} {{.*}} imported implicit 
<undeserialized declarations> struct __cblayout_B definition
 // CHECK: FieldDecl 0x{{[0-9a-f]+}} {{.*}} imported b 'float'
 
-// CHECK-NEXT: FunctionDecl {{.*}} line:15:7 imported foo 'float ()'
+// CHECK-NEXT: FunctionDecl {{.*}} line:12:7 imported foo 'float ()'
 // CHECK-NEXT: CompoundStmt {{.*}}
 // CHECK-NEXT: ReturnStmt {{.*}}
 // CHECK-NEXT: BinaryOperator {{.*}} 'float' '+'
diff --git a/clang/test/AST/HLSL/pch_with_buf.hlsl 
b/clang/test/AST/HLSL/pch_with_buf.hlsl
index 7fb5e2a3812ea..b9483f38fcce5 100644
--- a/clang/test/AST/HLSL/pch_with_buf.hlsl
+++ b/clang/test/AST/HLSL/pch_with_buf.hlsl
@@ -1,13 +1,12 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl 
-finclude-default-header -emit-pch -o %t %S/Inputs/pch_with_buf.hlsl
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl \
-// RUN:  -finclude-default-header -include-pch %t -ast-dump-all %s | FileCheck 
 %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -finclude-default-header -emit-pch -o %t 
%S/Inputs/pch_with_buf.hlsl
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -finclude-default-header -include-pch %t 
-ast-dump-all %s | FileCheck  %s
 
 // Make sure PCH works by using function declared in PCH header.
 // CHECK:FunctionDecl 0x[[FOO:[0-9a-f]+]] <{{.*}}:2:1, line:4:1> line:2:8 
imported used foo 'float2 (float2, float2)'
 // Make sure buffer defined in PCH works.
 // CHECK:VarDecl 0x{{[0-9a-f]+}} <line:6:1, col:17> col:17 imported Buf 
'RWBuffer<float>'
 // Make sure declare a RWBuffer in current file works.
-// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:11:1, col:23> col:23 Buf2 
'hlsl::RWBuffer<float>'
+// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:10:1, col:23> col:23 Buf2 
'hlsl::RWBuffer<float>'
 hlsl::RWBuffer<float> Buf2;
 
 float2 bar(float2 a, float2 b) {
diff --git a/clang/test/AST/HLSL/private.hlsl b/clang/test/AST/HLSL/private.hlsl
index e00afb8f5cbd8..4fd04792eaec0 100644
--- a/clang/test/AST/HLSL/private.hlsl
+++ b/clang/test/AST/HLSL/private.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -ast-dump -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -ast-dump -o - %s | FileCheck %s
 
 // CHECK: VarDecl {{.*}} global_scalar 'hlsl_private int' static cinit
 static int global_scalar = 0;
diff --git a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl 
b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl
index 09c44f6242c53..b798c2a6d6c4b 100644
--- a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl
+++ b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm 
-disable-llvm-passes %s -o - | FileCheck %s --check-prefixes=CHECK,NOINLINE
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -emit-llvm -O0 %s -o 
- | FileCheck %s --check-prefixes=CHECK,INLINE
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes %s -o - | 
FileCheck %s --check-prefixes=CHECK,NOINLINE
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -emit-llvm -O0 %s -o - | FileCheck %s 
--check-prefixes=CHECK,INLINE
 
 // Make sure global variable for ctors exist for lib profile.
 // CHECK:@llvm.global_ctors
diff --git a/clang/test/CodeGenHLSL/GlobalConstructors.hlsl 
b/clang/test/CodeGenHLSL/GlobalConstructors.hlsl
index 7b26dba0d1901..9d0d9d32aaea0 100644
--- a/clang/test/CodeGenHLSL/GlobalConstructors.hlsl
+++ b/clang/test/CodeGenHLSL/GlobalConstructors.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -emit-llvm 
-disable-llvm-passes %s -o - | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -emit-llvm -disable-llvm-passes %s -o - 
| FileCheck %s
 
 RWBuffer<float> Buffer;
 
diff --git 
a/clang/test/CodeGenHLSL/builtins/AppendStructuredBuffer-elementtype.hlsl 
b/clang/test/CodeGenHLSL/builtins/AppendStructuredBuffer-elementtype.hlsl
index 85face8eaeb6c..7fc01e59d3f8c 100644
--- a/clang/test/CodeGenHLSL/builtins/AppendStructuredBuffer-elementtype.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/AppendStructuredBuffer-elementtype.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s 
-check-prefixes=DXIL
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s -check-prefixes=DXIL
 
 struct MyStruct {
   float4 a;
@@ -11,7 +11,7 @@ struct MyStruct {
 // DXIL: %"class.hlsl::AppendStructuredBuffer.2" = type { 
target("dx.RawBuffer", i32, 1, 0)
 // DXIL: %"class.hlsl::AppendStructuredBuffer.3" = type { 
target("dx.RawBuffer", i64, 1, 0)
 // DXIL: %"class.hlsl::AppendStructuredBuffer.4" = type { 
target("dx.RawBuffer", i64, 1, 0)
-// DXIL: %"class.hlsl::AppendStructuredBuffer.5" = type { 
target("dx.RawBuffer", half, 1, 0) 
+// DXIL: %"class.hlsl::AppendStructuredBuffer.5" = type { 
target("dx.RawBuffer", half, 1, 0)
 // DXIL: %"class.hlsl::AppendStructuredBuffer.6" = type { 
target("dx.RawBuffer", float, 1, 0)
 // DXIL: %"class.hlsl::AppendStructuredBuffer.7" = type { 
target("dx.RawBuffer", double, 1, 0)
 // DXIL: %"class.hlsl::AppendStructuredBuffer.8" = type { 
target("dx.RawBuffer", <4 x i16>, 1, 0)
diff --git 
a/clang/test/CodeGenHLSL/builtins/ConsumeStructuredBuffer-elementtype.hlsl 
b/clang/test/CodeGenHLSL/builtins/ConsumeStructuredBuffer-elementtype.hlsl
index 5ed9e9ad8160f..338d73e9a3890 100644
--- a/clang/test/CodeGenHLSL/builtins/ConsumeStructuredBuffer-elementtype.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/ConsumeStructuredBuffer-elementtype.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s 
-check-prefixes=DXIL
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s -check-prefixes=DXIL
 
 struct MyStruct {
   float4 a;
@@ -11,7 +11,7 @@ struct MyStruct {
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.2" = type { 
target("dx.RawBuffer", i32, 1, 0)
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.3" = type { 
target("dx.RawBuffer", i64, 1, 0)
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.4" = type { 
target("dx.RawBuffer", i64, 1, 0)
-// DXIL: %"class.hlsl::ConsumeStructuredBuffer.5" = type { 
target("dx.RawBuffer", half, 1, 0) 
+// DXIL: %"class.hlsl::ConsumeStructuredBuffer.5" = type { 
target("dx.RawBuffer", half, 1, 0)
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.6" = type { 
target("dx.RawBuffer", float, 1, 0)
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.7" = type { 
target("dx.RawBuffer", double, 1, 0)
 // DXIL: %"class.hlsl::ConsumeStructuredBuffer.8" = type { 
target("dx.RawBuffer", <4 x i16>, 1, 0)
diff --git a/clang/test/CodeGenHLSL/builtins/RWBuffer-elementtype.hlsl 
b/clang/test/CodeGenHLSL/builtins/RWBuffer-elementtype.hlsl
index 0944ad59d5fb5..a8b6e543d82bd 100644
--- a/clang/test/CodeGenHLSL/builtins/RWBuffer-elementtype.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/RWBuffer-elementtype.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s 
-check-prefixes=DXIL
-// RUN: %clang_cc1 -triple spirv-pc-vulkan-compute -finclude-default-header 
-fnative-half-type -emit-llvm -o - %s | FileCheck %s -check-prefixes=SPIRV
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s -check-prefixes=DXIL
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple spirv-pc-vulkan-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s 
-check-prefixes=SPIRV
 
 // DXIL: %"class.hlsl::RWBuffer" = type { target("dx.TypedBuffer", i16, 1, 0, 
1) }
 // DXIL: %"class.hlsl::RWBuffer.0" = type { target("dx.TypedBuffer", i16, 1, 
0, 0) }
diff --git a/clang/test/CodeGenHLSL/builtins/RWBuffer-subscript.hlsl 
b/clang/test/CodeGenHLSL/builtins/RWBuffer-subscript.hlsl
index 2ad5b82a02912..6f296b5609c67 100644
--- a/clang/test/CodeGenHLSL/builtins/RWBuffer-subscript.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/RWBuffer-subscript.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 
%s | FileCheck %s --check-prefixes=DXC,CHECK
-// RUN: %clang_cc1 -triple spirv1.6-pc-vulkan1.3-compute -emit-llvm -o - -O0 
%s | FileCheck %s --check-prefixes=SPIRV,CHECK
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 %s | FileCheck %s 
--check-prefixes=DXC,CHECK
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
spirv1.6-pc-vulkan1.3-compute -emit-llvm -o - -O0 %s | FileCheck %s 
--check-prefixes=SPIRV,CHECK
 
 RWBuffer<int> In;
 RWBuffer<int> Out;
diff --git 
a/clang/test/CodeGenHLSL/builtins/RWStructuredBuffer-elementtype.hlsl 
b/clang/test/CodeGenHLSL/builtins/RWStructuredBuffer-elementtype.hlsl
index f2f6956ce1541..2fdeca2dda6fb 100644
--- a/clang/test/CodeGenHLSL/builtins/RWStructuredBuffer-elementtype.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/RWStructuredBuffer-elementtype.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s
 
 // CHECK: %"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", 
i16, 1, 0) }
 // CHECK: %"class.hlsl::RWStructuredBuffer.0" = type { target("dx.RawBuffer", 
i16, 1, 0) }
diff --git 
a/clang/test/CodeGenHLSL/builtins/RasterizerOrderedStructuredBuffer-elementtype.hlsl
 
b/clang/test/CodeGenHLSL/builtins/RasterizerOrderedStructuredBuffer-elementtype.hlsl
index 68d626de689f2..e50d97b119058 100644
--- 
a/clang/test/CodeGenHLSL/builtins/RasterizerOrderedStructuredBuffer-elementtype.hlsl
+++ 
b/clang/test/CodeGenHLSL/builtins/RasterizerOrderedStructuredBuffer-elementtype.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s 
-check-prefixes=DXIL
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s -check-prefixes=DXIL
 
 struct MyStruct {
   float4 a;
diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffer-elementtype.hlsl 
b/clang/test/CodeGenHLSL/builtins/StructuredBuffer-elementtype.hlsl
index d322cdc0d0645..0986c9b3330f0 100644
--- a/clang/test/CodeGenHLSL/builtins/StructuredBuffer-elementtype.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/StructuredBuffer-elementtype.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.2-compute 
-finclude-default-header -fnative-half-type -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.2-compute -finclude-default-header -fnative-half-type 
-emit-llvm -o - %s | FileCheck %s
 
 // CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", i16, 
0, 0) }
 // CHECK: %"class.hlsl::StructuredBuffer.0" = type { target("dx.RawBuffer", 
i16, 0, 0) }
diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl 
b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl
index 5b1d8e3052eae..f2aea4e376b03 100644
--- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-pixel -x hlsl -emit-llvm 
-disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-DXIL
-// RUN-DISABLED: %clang_cc1 -triple spirv-vulkan-pixel -x hlsl -emit-llvm 
-disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SPIRV
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-pixel -x hlsl -emit-llvm -disable-llvm-passes -o - %s | 
FileCheck %s --check-prefixes=CHECK,CHECK-DXIL
+// RUN-DISABLED: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
spirv-vulkan-pixel -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck 
%s --check-prefixes=CHECK,CHECK-SPIRV
 
 // NOTE: SPIRV codegen for resource methods is not yet implemented
 
diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-subscripts.hlsl 
b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-subscripts.hlsl
index 2af7c3ed3219f..c86aca6f342e0 100644
--- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-subscripts.hlsl
+++ b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-subscripts.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 
%s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 %s | FileCheck %s
 
 StructuredBuffer<int> In;
 RWStructuredBuffer<int> Out1;
diff --git a/clang/test/CodeGenHLSL/cbuffer.hlsl 
b/clang/test/CodeGenHLSL/cbuffer.hlsl
index 0a0465cc44e91..e13999a9982e2 100644
--- a/clang/test/CodeGenHLSL/cbuffer.hlsl
+++ b/clang/test/CodeGenHLSL/cbuffer.hlsl
@@ -1,5 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute \
-// RUN:   -fnative-half-type -emit-llvm -disable-llvm-passes -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute -fnative-half-type -emit-llvm 
-disable-llvm-passes -o - %s | FileCheck %s
 
 // CHECK: %__cblayout_CBScalars = type <{ float, double, half, i64, i32, i16, 
i32, i64 }>
 // CHECK: %__cblayout_CBVectors = type <{ <3 x float>, <3 x double>, <2 x 
half>, <3 x i64>, <4 x i32>, <3 x i16>, <3 x i64> }>
diff --git a/clang/test/CodeGenHLSL/cbuffer_align.hlsl 
b/clang/test/CodeGenHLSL/cbuffer_align.hlsl
index 25fe20da7a230..42abe4f3421d1 100644
--- a/clang/test/CodeGenHLSL/cbuffer_align.hlsl
+++ b/clang/test/CodeGenHLSL/cbuffer_align.hlsl
@@ -1,6 +1,4 @@
-// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \
-// RUN:   dxil-pc-shadermodel6.3-library %s -fnative-half-type \
-// RUN:   -fsyntax-only -verify -verify-ignore-unexpected=warning
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -std=hlsl2021 
-finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s 
-fnative-half-type -fsyntax-only -verify -verify-ignore-unexpected=warning
 
 struct S0 {
   half a;
diff --git a/clang/test/CodeGenHLSL/cbuffer_and_namespaces.hlsl 
b/clang/test/CodeGenHLSL/cbuffer_and_namespaces.hlsl
index 7cbde19b67d1f..188c9831044e6 100644
--- a/clang/test/CodeGenHLSL/cbuffer_and_namespaces.hlsl
+++ b/clang/test/CodeGenHLSL/cbuffer_and_namespaces.hlsl
@@ -1,6 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \
-// RUN:   dxil-pc-shadermodel6.3-library %s \
-// RUN:   -emit-llvm -disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -x hlsl 
-triple dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - 
| FileCheck %s
 
 // Make sure cbuffer inside namespace works.
 
diff --git 
a/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl 
b/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl
index 5eecfc41579f2..611e041f0df63 100644
--- a/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl
+++ b/clang/test/CodeGenHLSL/cbuffer_with_static_global_and_function.hlsl
@@ -1,5 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.3-library %s \
-// RUN:   -emit-llvm -disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - | 
FileCheck %s
 
 // CHECK: %__cblayout_A = type <{ float }>
 
diff --git a/clang/test/CodeGenHLSL/default_cbuffer.hlsl 
b/clang/test/CodeGenHLSL/default_cbuffer.hlsl
index 82dc01eb09be2..bec048a80d82b 100644
--- a/clang/test/CodeGenHLSL/default_cbuffer.hlsl
+++ b/clang/test/CodeGenHLSL/default_cbuffer.hlsl
@@ -1,5 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute \
-// RUN:   -fnative-half-type -emit-llvm -disable-llvm-passes -o - %s | 
FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute -fnative-half-type -emit-llvm 
-disable-llvm-passes -o - %s | FileCheck %s
 
 // CHECK: %"__cblayout_$Globals" = type <{ float, float, target("dx.Layout", 
%__cblayout_S, 4, 0) }>
 // CHECK: %__cblayout_S = type <{ float }>
@@ -20,7 +19,7 @@ struct S {
 };
 
 float a;
-RWBuffer<float> b; 
+RWBuffer<float> b;
 EmptyStruct c;
 float d[0];
 RWBuffer<float> e[2];
diff --git a/clang/test/CodeGenHLSL/default_cbuffer_with_layout.hlsl 
b/clang/test/CodeGenHLSL/default_cbuffer_with_layout.hlsl
index 1400288ba7699..7e69e1c040935 100644
--- a/clang/test/CodeGenHLSL/default_cbuffer_with_layout.hlsl
+++ b/clang/test/CodeGenHLSL/default_cbuffer_with_layout.hlsl
@@ -1,5 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute \
-// RUN:            -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.3-compute -emit-llvm -disable-llvm-passes -o - %s | 
FileCheck %s
 
 // CHECK: %"__cblayout_$Globals" = type <{ i32, float, [4 x double], <4 x 
i32>, <4 x float>,
 // CHECK-SAME: target("dx.Layout", %S, 8, 0) }>
@@ -16,7 +15,7 @@
 
 struct S {
   float2 v;
-}; 
+};
 
 int a;
 float b : register(c1);
@@ -34,4 +33,4 @@ void main() {
 
 // CHECK: !hlsl.cbs = !{![[CB:.*]]}
 // CHECK: ![[CB]] = !{ptr @"$Globals.cb", ptr addrspace(2) @a, ptr 
addrspace(2) @b, ptr addrspace(2) @c,
-// CHECK-SAME: ptr addrspace(2) @d, ptr addrspace(2) @e, ptr addrspace(2) @s}
\ No newline at end of file
+// CHECK-SAME: ptr addrspace(2) @d, ptr addrspace(2) @e, ptr addrspace(2) @s}
diff --git a/clang/test/CodeGenHLSL/implicit-norecurse-attrib.hlsl 
b/clang/test/CodeGenHLSL/implicit-norecurse-attrib.hlsl
index a8ab6ce98ae7e..ab5001a0496de 100644
--- a/clang/test/CodeGenHLSL/implicit-norecurse-attrib.hlsl
+++ b/clang/test/CodeGenHLSL/implicit-norecurse-attrib.hlsl
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -x hlsl -triple dxil-pc-shadermodel6.3-library  
-finclude-default-header %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
-// RUN: %clang_cc1 -x hlsl -triple dxil-pc-shadermodel6.0-compute  
-finclude-default-header %s -emit-llvm -disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -x hlsl -triple 
dxil-pc-shadermodel6.3-library  -finclude-default-header %s -emit-llvm 
-disable-llvm-passes -o - | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -x hlsl -triple 
dxil-pc-shadermodel6.0-compute  -finclude-default-header %s -emit-llvm 
-disable-llvm-passes -o - | FileCheck %s
 
 // Verify that a few different function types all get the NoRecurse attribute
 
diff --git a/clang/test/CodeGenHLSL/inline-functions.hlsl 
b/clang/test/CodeGenHLSL/inline-functions.hlsl
index 4748eeee7475f..c69fee902e305 100644
--- a/clang/test/CodeGenHLSL/inline-functions.hlsl
+++ b/clang/test/CodeGenHLSL/inline-functions.hlsl
@@ -1,9 +1,9 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library %s -emit-llvm 
-disable-llvm-passes -o - | FileCheck %s 
--check-prefixes=CHECK,NOINLINE,OPT_ATTR
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -O0 -o 
- | FileCheck %s --check-prefixes=CHECK,INLINE,OPT_ATTR
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -O1 -o 
- | FileCheck %s --check-prefixes=CHECK,INLINE,NOOPT_ATTR
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute %s -emit-llvm 
-disable-llvm-passes -o - | FileCheck %s --check-prefixes=CHECK,NOINLINE
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute %s -emit-llvm -O0 -o 
- | FileCheck %s --check-prefixes=CHECK,INLINE,OPT_ATTR
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute %s -emit-llvm -O1 -o 
- | FileCheck %s --check-prefixes=CHECK,INLINE,NOOPT_ATTR
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes -o - | 
FileCheck %s --check-prefixes=CHECK,NOINLINE,OPT_ATTR
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library %s -emit-llvm -O0 -o - | FileCheck %s 
--check-prefixes=CHECK,INLINE,OPT_ATTR
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library %s -emit-llvm -O1 -o - | FileCheck %s 
--check-prefixes=CHECK,INLINE,NOOPT_ATTR
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute %s -emit-llvm -disable-llvm-passes -o - | 
FileCheck %s --check-prefixes=CHECK,NOINLINE
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute %s -emit-llvm -O0 -o - | FileCheck %s 
--check-prefixes=CHECK,INLINE,OPT_ATTR
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute %s -emit-llvm -O1 -o - | FileCheck %s 
--check-prefixes=CHECK,INLINE,NOOPT_ATTR
 
 // Tests that user functions will always be inlined.
 // This includes exported functions and mangled entry point implementation 
functions.
diff --git a/clang/test/CodeGenHLSL/static-local-ctor.hlsl 
b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
index eba37e3f4c6b8..7aeb5e987d6b2 100644
--- a/clang/test/CodeGenHLSL/static-local-ctor.hlsl
+++ b/clang/test/CodeGenHLSL/static-local-ctor.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - 
-disable-llvm-passes %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -emit-llvm -o - -disable-llvm-passes %s | 
FileCheck %s
 
 // Verify that no per variable _Init_thread instructions are emitted for 
non-trivial static locals
 // These would normally be emitted by the MicrosoftCXXABI, but the DirectX 
backend should exlude them
@@ -34,4 +34,3 @@ void main() {
   mybuf = buf[0];
   InitBuf(mybuf);
 }
-
diff --git a/clang/test/ParserHLSL/cb_error.hlsl 
b/clang/test/ParserHLSL/cb_error.hlsl
index 245bf0a03fac9..f6c2dd9fd26ab 100644
--- a/clang/test/ParserHLSL/cb_error.hlsl
+++ b/clang/test/ParserHLSL/cb_error.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 // expected-error@+2 {{expected identifier}}
 // expected-error@+1 {{expected unqualified-id}}
diff --git a/clang/test/ParserHLSL/hlsl_is_rov_attr_error.hlsl 
b/clang/test/ParserHLSL/hlsl_is_rov_attr_error.hlsl
index 3b2c12e7a96c5..9920b65561527 100644
--- a/clang/test/ParserHLSL/hlsl_is_rov_attr_error.hlsl
+++ b/clang/test/ParserHLSL/hlsl_is_rov_attr_error.hlsl
@@ -8,7 +8,7 @@ __hlsl_resource_t [[hlsl::is_rov]] res1;
 
 // expected-error@+1{{'is_rov' attribute takes no arguments}}
 __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::is_rov(3)]] res2;
-  
+
 // expected-error@+1{{use of undeclared identifier 'gibberish'}}
 __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::is_rov(gibberish)]] 
res3;
 
diff --git a/clang/test/ParserHLSL/hlsl_raw_buffer_attr_error.hlsl 
b/clang/test/ParserHLSL/hlsl_raw_buffer_attr_error.hlsl
index 77530cbf9e4d9..a638d1d3e156c 100644
--- a/clang/test/ParserHLSL/hlsl_raw_buffer_attr_error.hlsl
+++ b/clang/test/ParserHLSL/hlsl_raw_buffer_attr_error.hlsl
@@ -5,7 +5,7 @@
 
 // expected-error@+1{{'raw_buffer' attribute takes no arguments}}
 __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::raw_buffer(3)]] res2;
-  
+
 // expected-error@+1{{use of undeclared identifier 'gibberish'}}
 __hlsl_resource_t [[hlsl::resource_class(UAV)]] 
[[hlsl::raw_buffer(gibberish)]] res3;
 
diff --git a/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl 
b/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
index fbada8b4b99f7..36995e28b3b85 100644
--- a/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
+++ b/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -ast-dump -o 
- %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -ast-dump -o - %s | FileCheck %s
 
 // CHECK: CXXRecordDecl 0x{{[0-9a-f]+}} {{.*}} struct MyBuffer definition
 // CHECK: FieldDecl 0x{{[0-9a-f]+}} <line:[[# @LINE + 3]]:3, col:51> col:51 h 
'__hlsl_resource_t
diff --git a/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl 
b/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl
index b5737f5dac8a9..f2cc8918c0ff1 100644
--- a/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl
+++ b/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -ast-dump -o 
- %s | FileCheck %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -ast-dump -o - %s | FileCheck %s
 
 // CHECK: ClassTemplateSpecializationDecl {{.*}} class RWBuffer definition 
implicit_instantiation
 // CHECK: TemplateArgument type 'float'
diff --git a/clang/test/ParserHLSL/invalid_inside_cb.hlsl 
b/clang/test/ParserHLSL/invalid_inside_cb.hlsl
index b74021fd22422..926f53e58bc7f 100644
--- a/clang/test/ParserHLSL/invalid_inside_cb.hlsl
+++ b/clang/test/ParserHLSL/invalid_inside_cb.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -std=hlsl202x -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -std=hlsl202x -o - -fsyntax-only %s -verify
 
 // template not allowed inside cbuffer.
 cbuffer A {
diff --git a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
index 34930d8963688..91e96b995585f 100644
--- a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl 
-fsyntax-only -verify %s
+// 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;
diff --git a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl 
b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
index fb14429025d5a..991b04c80ac86 100644
--- a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl 
-fsyntax-only -verify %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s
 
 typedef vector<float, 3> float3;
 
diff --git a/clang/test/SemaHLSL/BuiltIns/hlsl_resource_t.hlsl 
b/clang/test/SemaHLSL/BuiltIns/hlsl_resource_t.hlsl
index a17ec327ba9e7..83fad4b8deb7c 100644
--- a/clang/test/SemaHLSL/BuiltIns/hlsl_resource_t.hlsl
+++ b/clang/test/SemaHLSL/BuiltIns/hlsl_resource_t.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -triple 
dxil-unknown-shadermodel6.3-library %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -fsyntax-only -verify -triple 
dxil-unknown-shadermodel6.3-library %s
 
 // Note: As HLSL resource type are sizeless type, we don't exhaustively
 // test for cases covered by sizeless-1.c and similar tests.
diff --git a/clang/test/SemaHLSL/Language/AggregateSplatCast-errors.hlsl 
b/clang/test/SemaHLSL/Language/AggregateSplatCast-errors.hlsl
index 662dae27e8200..7dc3c3e1c3e6c 100644
--- a/clang/test/SemaHLSL/Language/AggregateSplatCast-errors.hlsl
+++ b/clang/test/SemaHLSL/Language/AggregateSplatCast-errors.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.6-library %s -verify -verify-ignore-unexpected=note
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.6-library %s -verify -verify-ignore-unexpected=note
 
 struct S {
   int A : 8;
@@ -46,4 +46,4 @@ struct X {
 export void cantCast5() {
   X x = (X)1;
   // expected-error@-1 {{no matching conversion for C-style cast from 'int' to 
'X'}}
-}
\ No newline at end of file
+}
diff --git a/clang/test/SemaHLSL/cb_error.hlsl 
b/clang/test/SemaHLSL/cb_error.hlsl
index 95c917a9bb9ee..9640ab252b942 100644
--- a/clang/test/SemaHLSL/cb_error.hlsl
+++ b/clang/test/SemaHLSL/cb_error.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 // expected-note@+1 {{declared here}}
 cbuffer a {
diff --git a/clang/test/SemaHLSL/export.hlsl b/clang/test/SemaHLSL/export.hlsl
index 2d19fa561fa0a..bda68db09287c 100644
--- a/clang/test/SemaHLSL/export.hlsl
+++ b/clang/test/SemaHLSL/export.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - %s 
-verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - %s -verify
 
 export void f1();
 
diff --git a/clang/test/SemaHLSL/packoffset-invalid.hlsl 
b/clang/test/SemaHLSL/packoffset-invalid.hlsl
index 526a511edf1f2..0b06d55ccd688 100644
--- a/clang/test/SemaHLSL/packoffset-invalid.hlsl
+++ b/clang/test/SemaHLSL/packoffset-invalid.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -finclude-default-header -triple 
dxil-pc-shadermodel6.3-library -fnative-half-type -verify %s
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -finclude-default-header -triple 
dxil-pc-shadermodel6.3-library -fnative-half-type -verify %s
 
 // expected-warning@+1{{cannot mix packoffset elements with nonpackoffset 
elements in a cbuffer}}
 cbuffer Mix
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error.hlsl
index 74aff79f0e37f..a3a91c3ddddb8 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 template<typename T>
 struct MyTemplatedSRV {
@@ -58,7 +58,7 @@ void bar(MyTemplatedSRV<float> U : register(u3)) {
 
 }
 
-struct S {  
+struct S {
   // expected-error@+1 {{'register' attribute only applies to cbuffer/tbuffer 
and external global variables}}
   MyTemplatedSRV<float> U : register(u3);
 };
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error_basic.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error_basic.hlsl
index 760c057630a7f..5d4059f9a9cf4 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error_basic.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error_basic.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 // expected-error@+1{{binding type 't' only applies to SRV resources}}
 float f1 : register(t0);
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error_resource.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error_resource.hlsl
index 4b6af47c0ab72..a003a11765105 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error_resource.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error_resource.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 // This test validates the diagnostics that are emitted when a variable with a 
"resource" type
 // is bound to a register using the register annotation
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error_silence_diags.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error_silence_diags.hlsl
index e63f264452da7..70b53524d3faa 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error_silence_diags.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error_silence_diags.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only -Wno-legacy-constant-register-binding %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only 
-Wno-legacy-constant-register-binding %s -verify
 
 // expected-no-diagnostics
 float f2 : register(b9);
@@ -11,7 +11,7 @@ cbuffer g_cbuffer1 {
 
 
 struct Eg12{
-  RWBuffer<int> a;  
+  RWBuffer<int> a;
 };
 
 Eg12 e12 : register(c9);
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error_space.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error_space.hlsl
index 70e64e6ca7528..e66b1114ac320 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error_space.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error_space.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 // valid
 cbuffer cbuf {
@@ -30,7 +30,7 @@ cbuffer cbuf4 {
   // this test validates that no diagnostic is emitted on the space parameter, 
because
   // this register annotation is not in the global scope.
   // expected-error@+1 {{binding type 'u' only applies to UAV resources}}
-  float a : register(u2, space3); 
+  float a : register(u2, space3);
 }
 
 // expected-error@+1 {{invalid space specifier 's2' used; expected 'space' 
followed by an integer, like space1}}
diff --git a/clang/test/SemaHLSL/resource_binding_attr_error_udt.hlsl 
b/clang/test/SemaHLSL/resource_binding_attr_error_udt.hlsl
index 40517f393e128..3472ea762487b 100644
--- a/clang/test/SemaHLSL/resource_binding_attr_error_udt.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_attr_error_udt.hlsl
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -o - 
-fsyntax-only %s -verify
+// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
 
 template<typename T>
 struct MyTemplatedUAV {
diff --git a/clang/test/SemaHLSL/resource_binding_implicit.hlsl 
b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
new file mode 100644
index 0000000000000..c015cb6b31553
--- /dev/null
+++ b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -Wno-error=hlsl-implicit-binding -triple 
dxil-pc-shadermodel6.3-library -x hlsl -o - -fsyntax-only %s -verify
+
+// expected-warning@+1 {{resource has implicit register binding}}
+cbuffer cb0 {
+  int a;
+}
+
+// No warning - this is an element of the $Globals buffer not it's own binding.
+float b;
+
+// expected-warning@+1 {{resource has implicit register binding}}
+RWBuffer<int> c;
+
+// No warning - explicit binding.
+RWBuffer<float> d : register(u0);
+
+struct S { int x; };
+// expected-warning@+1 {{resource has implicit register binding}}
+StructuredBuffer<S> e;
+
+// No warning - __hlsl_resource_t isn't itself a resource object.
+__hlsl_resource_t [[hlsl::resource_class(SRV)]] f;
+
+struct CustomSRV {
+  __hlsl_resource_t [[hlsl::resource_class(SRV)]] x;
+};
+// expected-warning@+1 {{resource has implicit register binding}}
+CustomSRV g;

>From 005e4b741390a548fe3124b8ae96cf61a4eabba1 Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 16 Apr 2025 11:30:28 -0700
Subject: [PATCH 2/6] fixup: space only tests and looser regex

---
 clang/test/AST/HLSL/pch.hlsl                       | 2 +-
 clang/test/AST/HLSL/pch_hlsl_buffer.hlsl           | 6 +++---
 clang/test/AST/HLSL/pch_with_buf.hlsl              | 2 +-
 clang/test/SemaHLSL/resource_binding_implicit.hlsl | 6 ++++++
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/clang/test/AST/HLSL/pch.hlsl b/clang/test/AST/HLSL/pch.hlsl
index 58574a13b526b..353f894b8bc25 100644
--- a/clang/test/AST/HLSL/pch.hlsl
+++ b/clang/test/AST/HLSL/pch.hlsl
@@ -3,7 +3,7 @@
 
 // Make sure PCH works by using function declared in PCH header and declare a 
RWBuffer in current file.
 // CHECK:FunctionDecl 0x[[FOO:[0-9a-f]+]] <{{.*}}:2:1, line:4:1> line:2:8 
imported used foo 'float2 (float2, float2)'
-// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:7:1, col:23> col:23 Buffer 
'hlsl::RWBuffer<float>'
+// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:{{[0-9]+}}:1, col:23> col:23 Buffer 
'hlsl::RWBuffer<float>'
 hlsl::RWBuffer<float> Buffer;
 
 float2 bar(float2 a, float2 b) {
diff --git a/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl 
b/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
index fe955e27989b3..9c73f587b7210 100644
--- a/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
+++ b/clang/test/AST/HLSL/pch_hlsl_buffer.hlsl
@@ -14,19 +14,19 @@ float foo() {
 }
 
 // Make sure cbuffer/tbuffer works for PCH.
-// CHECK: HLSLBufferDecl {{.*}} line:4:9 imported <undeserialized 
declarations> cbuffer A
+// CHECK: HLSLBufferDecl {{.*}} line:{{[0-9]+}}:9 imported <undeserialized 
declarations> cbuffer A
 // CHECK-NEXT: HLSLResourceClassAttr {{.*}} Implicit CBuffer
 // CHECK-NEXT: VarDecl 0x[[A:[0-9a-f]+]] {{.*}} imported used a 'hlsl_constant 
float'
 // CHECK-NEXT: CXXRecordDecl {{.*}} imported implicit <undeserialized 
declarations> struct __cblayout_A definition
 // CHECK: FieldDecl {{.*}} imported a 'float'
 
-// CHECK: HLSLBufferDecl {{.*}} line:8:9 imported <undeserialized 
declarations> tbuffer B
+// CHECK: HLSLBufferDecl {{.*}} line:{{[0-9]+}}:9 imported <undeserialized 
declarations> tbuffer B
 // CHECK-NEXT: HLSLResourceClassAttr {{.*}} Implicit SRV
 // CHECK-NEXT: VarDecl 0x[[B:[0-9a-f]+]] {{.*}} imported used b 'hlsl_constant 
float'
 // CHECK-NEXT: CXXRecordDecl 0x{{[0-9a-f]+}} {{.*}} imported implicit 
<undeserialized declarations> struct __cblayout_B definition
 // CHECK: FieldDecl 0x{{[0-9a-f]+}} {{.*}} imported b 'float'
 
-// CHECK-NEXT: FunctionDecl {{.*}} line:12:7 imported foo 'float ()'
+// CHECK-NEXT: FunctionDecl {{.*}} line:{{[0-9]+}}:7 imported foo 'float ()'
 // CHECK-NEXT: CompoundStmt {{.*}}
 // CHECK-NEXT: ReturnStmt {{.*}}
 // CHECK-NEXT: BinaryOperator {{.*}} 'float' '+'
diff --git a/clang/test/AST/HLSL/pch_with_buf.hlsl 
b/clang/test/AST/HLSL/pch_with_buf.hlsl
index b9483f38fcce5..4a0bced6bbc33 100644
--- a/clang/test/AST/HLSL/pch_with_buf.hlsl
+++ b/clang/test/AST/HLSL/pch_with_buf.hlsl
@@ -6,7 +6,7 @@
 // Make sure buffer defined in PCH works.
 // CHECK:VarDecl 0x{{[0-9a-f]+}} <line:6:1, col:17> col:17 imported Buf 
'RWBuffer<float>'
 // Make sure declare a RWBuffer in current file works.
-// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:10:1, col:23> col:23 Buf2 
'hlsl::RWBuffer<float>'
+// CHECK:VarDecl 0x{{[0-9a-f]+}} <{{.*}}:{{[0-9]+}}:1, col:23> col:23 Buf2 
'hlsl::RWBuffer<float>'
 hlsl::RWBuffer<float> Buf2;
 
 float2 bar(float2 a, float2 b) {
diff --git a/clang/test/SemaHLSL/resource_binding_implicit.hlsl 
b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
index c015cb6b31553..22d42266dcdd1 100644
--- a/clang/test/SemaHLSL/resource_binding_implicit.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
@@ -14,6 +14,12 @@ RWBuffer<int> c;
 // No warning - explicit binding.
 RWBuffer<float> d : register(u0);
 
+// No warning - explicit binding.
+RWBuffer<float> dd : register(space1);
+
+// No warning - explicit binding.
+RWBuffer<float> ddd : register(u3, space4);
+
 struct S { int x; };
 // expected-warning@+1 {{resource has implicit register binding}}
 StructuredBuffer<S> e;

>From eacde9ae3a318ddc201acf8c86b36e9dfa6586e8 Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 16 Apr 2025 12:29:15 -0700
Subject: [PATCH 3/6] fixup: Handle resource arrays

---
 clang/lib/Sema/SemaHLSL.cpp                        | 2 +-
 clang/test/SemaHLSL/resource_binding_implicit.hlsl | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 98f4f7dbe875d..a6702fde92b8c 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -3285,7 +3285,7 @@ void SemaHLSL::processExplicitBindingsOnDecl(VarDecl *VD) 
{
     }
   }
 
-  if (!HasBinding && VD->getType()->isHLSLResourceRecord())
+  if (!HasBinding && isResourceRecordTypeOrArrayOf(VD))
     SemaRef.Diag(VD->getLocation(), diag::warn_hlsl_implicit_binding);
 }
 
diff --git a/clang/test/SemaHLSL/resource_binding_implicit.hlsl 
b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
index 22d42266dcdd1..5a19b60ee86f6 100644
--- a/clang/test/SemaHLSL/resource_binding_implicit.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
@@ -32,3 +32,9 @@ struct CustomSRV {
 };
 // expected-warning@+1 {{resource has implicit register binding}}
 CustomSRV g;
+
+// expected-warning@+1 {{resource has implicit register binding}}
+RWBuffer<float> h[10];
+
+// No warning - explicit binding.
+RWBuffer<float> hh[100] : register(u4);

>From ac9950f4ac7e5c50922bf867a2e87b8e5bc46de0 Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 16 Apr 2025 12:34:10 -0700
Subject: [PATCH 4/6] fixup: only specifying space is indeed implicit

---
 clang/test/SemaHLSL/resource_binding_implicit.hlsl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/SemaHLSL/resource_binding_implicit.hlsl 
b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
index 5a19b60ee86f6..ce9f0d1ac364f 100644
--- a/clang/test/SemaHLSL/resource_binding_implicit.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
@@ -14,7 +14,7 @@ RWBuffer<int> c;
 // No warning - explicit binding.
 RWBuffer<float> d : register(u0);
 
-// No warning - explicit binding.
+// expected-warning@+1 {{resource has implicit register binding}}
 RWBuffer<float> dd : register(space1);
 
 // No warning - explicit binding.

>From 65a7eeec29650d3b97bee531ec239d00687b90cb Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 16 Apr 2025 13:22:57 -0700
Subject: [PATCH 5/6] Add overload of isResourceRecordTypeOrArrayOf matching
 #135120

---
 clang/lib/Sema/SemaHLSL.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index a6702fde92b8c..76fb81d39d67c 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -305,6 +305,10 @@ static bool isResourceRecordTypeOrArrayOf(const Type *Ty) {
   return HLSLAttributedResourceType::findHandleTypeOnResource(Ty) != nullptr;
 }
 
+static bool isResourceRecordTypeOrArrayOf(VarDecl *VD) {
+  return isResourceRecordTypeOrArrayOf(VD->getType().getTypePtr());
+}
+
 // Returns true if the type is a leaf element type that is not valid to be
 // included in HLSL Buffer, such as a resource class, empty struct, zero-sized
 // array, or a builtin intangible type. Returns false it is a valid leaf 
element

>From 1876e21c801f5194e02777b42fe7539cd85769a9 Mon Sep 17 00:00:00 2001
From: Justin Bogner <m...@justinbogner.com>
Date: Wed, 16 Apr 2025 13:23:19 -0700
Subject: [PATCH 6/6] Disable test that needs #135287

---
 clang/test/SemaHLSL/resource_binding_implicit.hlsl | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/clang/test/SemaHLSL/resource_binding_implicit.hlsl 
b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
index ce9f0d1ac364f..8f0e721c7153f 100644
--- a/clang/test/SemaHLSL/resource_binding_implicit.hlsl
+++ b/clang/test/SemaHLSL/resource_binding_implicit.hlsl
@@ -14,8 +14,9 @@ RWBuffer<int> c;
 // No warning - explicit binding.
 RWBuffer<float> d : register(u0);
 
-// expected-warning@+1 {{resource has implicit register binding}}
-RWBuffer<float> dd : register(space1);
+// TODO: Add this test once #135287 lands
+// TODO: ... @+1 {{resource has implicit register binding}}
+// TODO: RWBuffer<float> dd : register(space1);
 
 // No warning - explicit binding.
 RWBuffer<float> ddd : register(u3, space4);

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

Reply via email to