writer/hlsl: Emit `static` for private global variables

Fixed: tint:812
Change-Id: I822eb6b13f07a74eb47c4c8e18d1f75dcc4818bf
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51366
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index b516533..9d58070 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -1893,9 +1893,11 @@
       }
 
       switch (var->StorageClass()) {
-        case ast::StorageClass::kPrivate:
         case ast::StorageClass::kUniformConstant:
           break;
+        case ast::StorageClass::kPrivate:
+          out << "static ";
+          break;
         case ast::StorageClass::kWorkgroup:
           out << "groupshared ";
           break;
diff --git a/src/writer/hlsl/generator_impl_member_accessor_test.cc b/src/writer/hlsl/generator_impl_member_accessor_test.cc
index 423a046..431912d 100644
--- a/src/writer/hlsl/generator_impl_member_accessor_test.cc
+++ b/src/writer/hlsl/generator_impl_member_accessor_test.cc
@@ -137,7 +137,7 @@
   float mem;
 };
 
-Data str;
+static Data str;
 
 [numthreads(1, 1, 1)]
 void test_function() {
diff --git a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
index 2b6d390..a1345bd 100644
--- a/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
+++ b/src/writer/hlsl/generator_impl_variable_decl_statement_test.cc
@@ -75,7 +75,7 @@
   gen.increment_indent();
 
   ASSERT_TRUE(gen.Generate(out)) << gen.error();
-  EXPECT_THAT(result(), HasSubstr("  float a;\n"));
+  EXPECT_THAT(result(), HasSubstr("  static float a;\n"));
 }
 
 TEST_F(HlslGeneratorImplTest_VariableDecl,
diff --git a/test/bug/tint/749.spvasm.expected.hlsl b/test/bug/tint/749.spvasm.expected.hlsl
index 1b2d3db..76a11e3 100644
--- a/test/bug/tint/749.spvasm.expected.hlsl
+++ b/test/bug/tint/749.spvasm.expected.hlsl
@@ -1 +1 @@
-SKIP: TINT_UNIMPLEMENTED crbug.com/tint/726: module-scope private and workgroup variables not yet implemented
+SKIP: crbug.com/tint/818: [HLSL] Loop emission broken for `let` function declarations
diff --git a/test/ptr_ref/load/global/i32.spvasm.expected.hlsl b/test/ptr_ref/load/global/i32.spvasm.expected.hlsl
index 86cdfa8..fb22f46 100644
--- a/test/ptr_ref/load/global/i32.spvasm.expected.hlsl
+++ b/test/ptr_ref/load/global/i32.spvasm.expected.hlsl
@@ -1,4 +1,4 @@
-int I = 0;
+static int I = 0;
 
 [numthreads(1, 1, 1)]
 void main() {
diff --git a/test/ptr_ref/load/global/i32.wgsl.expected.hlsl b/test/ptr_ref/load/global/i32.wgsl.expected.hlsl
index 4a6e9e6..e0b038b 100644
--- a/test/ptr_ref/load/global/i32.wgsl.expected.hlsl
+++ b/test/ptr_ref/load/global/i32.wgsl.expected.hlsl
@@ -1,4 +1,4 @@
-int I;
+static int I;
 
 [numthreads(1, 1, 1)]
 void main() {
diff --git a/test/ptr_ref/load/global/struct_field.spvasm.expected.hlsl b/test/ptr_ref/load/global/struct_field.spvasm.expected.hlsl
index 16f9b25..ff544b6 100644
--- a/test/ptr_ref/load/global/struct_field.spvasm.expected.hlsl
+++ b/test/ptr_ref/load/global/struct_field.spvasm.expected.hlsl
@@ -1 +1,14 @@
-SKIP: error: pointers not supported in HLSL
+struct S {
+  int i;
+};
+
+static S V;
+
+[numthreads(1, 1, 1)]
+void main() {
+  int i = 0;
+  const int x_15 = V.i;
+  i = x_15;
+  return;
+}
+
diff --git a/test/ptr_ref/load/global/struct_field.wgsl.expected.hlsl b/test/ptr_ref/load/global/struct_field.wgsl.expected.hlsl
index 80e03bb..18e0b41 100644
--- a/test/ptr_ref/load/global/struct_field.wgsl.expected.hlsl
+++ b/test/ptr_ref/load/global/struct_field.wgsl.expected.hlsl
@@ -2,7 +2,7 @@
   int i;
 };
 
-S V;
+static S V;
 
 [numthreads(1, 1, 1)]
 void main() {
diff --git a/test/ptr_ref/store/global/i32.spvasm.expected.hlsl b/test/ptr_ref/store/global/i32.spvasm.expected.hlsl
index 104200b..92138e7 100644
--- a/test/ptr_ref/store/global/i32.spvasm.expected.hlsl
+++ b/test/ptr_ref/store/global/i32.spvasm.expected.hlsl
@@ -1,4 +1,4 @@
-int I = 0;
+static int I = 0;
 
 [numthreads(1, 1, 1)]
 void main() {
diff --git a/test/ptr_ref/store/global/i32.wgsl.expected.hlsl b/test/ptr_ref/store/global/i32.wgsl.expected.hlsl
index 44c1654..2ae66cf 100644
--- a/test/ptr_ref/store/global/i32.wgsl.expected.hlsl
+++ b/test/ptr_ref/store/global/i32.wgsl.expected.hlsl
@@ -1,4 +1,4 @@
-int I;
+static int I;
 
 [numthreads(1, 1, 1)]
 void main() {
diff --git a/test/ptr_ref/store/global/struct_field.spvasm.expected.hlsl b/test/ptr_ref/store/global/struct_field.spvasm.expected.hlsl
index 16f9b25..0f641c8 100644
--- a/test/ptr_ref/store/global/struct_field.spvasm.expected.hlsl
+++ b/test/ptr_ref/store/global/struct_field.spvasm.expected.hlsl
@@ -1 +1,12 @@
-SKIP: error: pointers not supported in HLSL
+struct S {
+  int i;
+};
+
+static S V;
+
+[numthreads(1, 1, 1)]
+void main() {
+  V.i = 5;
+  return;
+}
+
diff --git a/test/ptr_ref/store/local/i32.wgsl.expected.hlsl b/test/ptr_ref/store/local/i32.wgsl.expected.hlsl
index 16f9b25..b3db42f 100644
--- a/test/ptr_ref/store/local/i32.wgsl.expected.hlsl
+++ b/test/ptr_ref/store/local/i32.wgsl.expected.hlsl
@@ -1 +1 @@
-SKIP: error: pointers not supported in HLSL
+SKIP: Failed to generate: error: pointers not supported in HLSL