Mark private types as invalid in the public symbol table.

Previously, in public code, private types didn't exist anywhere in the
symbol table chain, and those names were free for the taking. Now, we
register them as invalid types in the public symbol table. This prevents
them from being used as variable names, and gives a more explicit error
if you try to use them as a type.

Change-Id: I9a943bf923639b72cbf36b1acf4b4fbe70982786
Bug: skia:12538
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/459119
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index ab6ac8b..b357734 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -637,6 +637,16 @@
   "/sksl/runtime_errors/ProgramTooLarge_NestedLoops.rts",
   "/sksl/runtime_errors/ProgramTooLarge_SplitLoops.rts",
   "/sksl/runtime_errors/ProgramTooLarge_StackDepth.rts",
+  "/sksl/runtime_errors/ReservedNameISampler2D.rts",
+  "/sksl/runtime_errors/ReservedNameSampler.rts",
+  "/sksl/runtime_errors/ReservedNameSampler1D.rts",
+  "/sksl/runtime_errors/ReservedNameSampler2D.rts",
+  "/sksl/runtime_errors/ReservedNameSampler2DRect.rts",
+  "/sksl/runtime_errors/ReservedNameSampler3D.rts",
+  "/sksl/runtime_errors/ReservedNameSamplerExternalOES.rts",
+  "/sksl/runtime_errors/ReservedNameSubpassInput.rts",
+  "/sksl/runtime_errors/ReservedNameSubpassInputMS.rts",
+  "/sksl/runtime_errors/ReservedNameTexture2D.rts",
   "/sksl/runtime_errors/UnsupportedTypeFragmentProcessor.rts",
   "/sksl/runtime_errors/UnsupportedTypeSampler.rts",
   "/sksl/runtime_errors/UnsupportedTypeTexture.rts",
diff --git a/resources/sksl/runtime_errors/ReservedNameISampler2D.rts b/resources/sksl/runtime_errors/ReservedNameISampler2D.rts
new file mode 100644
index 0000000..8e1c7a9
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameISampler2D.rts
@@ -0,0 +1 @@
+int isampler2D;
diff --git a/resources/sksl/runtime_errors/ReservedNameSampler.rts b/resources/sksl/runtime_errors/ReservedNameSampler.rts
new file mode 100644
index 0000000..6e17057
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSampler.rts
@@ -0,0 +1 @@
+int sampler;
diff --git a/resources/sksl/runtime_errors/ReservedNameSampler1D.rts b/resources/sksl/runtime_errors/ReservedNameSampler1D.rts
new file mode 100644
index 0000000..c3406a2
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSampler1D.rts
@@ -0,0 +1 @@
+int sampler1D;
diff --git a/resources/sksl/runtime_errors/ReservedNameSampler2D.rts b/resources/sksl/runtime_errors/ReservedNameSampler2D.rts
new file mode 100644
index 0000000..1da7d63
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSampler2D.rts
@@ -0,0 +1 @@
+int sampler2D;
diff --git a/resources/sksl/runtime_errors/ReservedNameSampler2DRect.rts b/resources/sksl/runtime_errors/ReservedNameSampler2DRect.rts
new file mode 100644
index 0000000..fce4ef2
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSampler2DRect.rts
@@ -0,0 +1 @@
+int sampler2DRect;
diff --git a/resources/sksl/runtime_errors/ReservedNameSampler3D.rts b/resources/sksl/runtime_errors/ReservedNameSampler3D.rts
new file mode 100644
index 0000000..67f35af
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSampler3D.rts
@@ -0,0 +1 @@
+int sampler3D;
diff --git a/resources/sksl/runtime_errors/ReservedNameSamplerExternalOES.rts b/resources/sksl/runtime_errors/ReservedNameSamplerExternalOES.rts
new file mode 100644
index 0000000..7c25094
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSamplerExternalOES.rts
@@ -0,0 +1 @@
+int samplerExternalOES;
diff --git a/resources/sksl/runtime_errors/ReservedNameSubpassInput.rts b/resources/sksl/runtime_errors/ReservedNameSubpassInput.rts
new file mode 100644
index 0000000..d72bf43
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSubpassInput.rts
@@ -0,0 +1 @@
+int subpassInput;
diff --git a/resources/sksl/runtime_errors/ReservedNameSubpassInputMS.rts b/resources/sksl/runtime_errors/ReservedNameSubpassInputMS.rts
new file mode 100644
index 0000000..c139777
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameSubpassInputMS.rts
@@ -0,0 +1 @@
+int subpassInputMS;
diff --git a/resources/sksl/runtime_errors/ReservedNameTexture2D.rts b/resources/sksl/runtime_errors/ReservedNameTexture2D.rts
new file mode 100644
index 0000000..a632412
--- /dev/null
+++ b/resources/sksl/runtime_errors/ReservedNameTexture2D.rts
@@ -0,0 +1 @@
+int texture2D;
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 1b18daf..4acf300 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -243,7 +243,7 @@
 }
 
 static void add_glsl_type_aliases(SkSL::SymbolTable* symbols, const SkSL::BuiltinTypes& types) {
-    // Add some aliases to the runtime effect modules so that it's friendlier, and more like GLSL
+    // Add some aliases to the runtime effect modules so that it's friendlier, and more like GLSL.
     symbols->addAlias("vec2", types.fFloat2.get());
     symbols->addAlias("vec3", types.fFloat3.get());
     symbols->addAlias("vec4", types.fFloat4.get());
@@ -259,6 +259,12 @@
     symbols->addAlias("mat2", types.fFloat2x2.get());
     symbols->addAlias("mat3", types.fFloat3x3.get());
     symbols->addAlias("mat4", types.fFloat4x4.get());
+
+    // Alias every private type to "invalid". This will prevent code from using built-in names like
+    // `sampler2D` as variable names.
+    for (BuiltinTypePtr privateType : kPrivateTypes) {
+        symbols->addAlias((types.*privateType)->name(), types.fInvalid.get());
+    }
 }
 
 const ParsedModule& Compiler::loadPublicModule() {
diff --git a/src/sksl/ir/SkSLVarDeclarations.cpp b/src/sksl/ir/SkSLVarDeclarations.cpp
index 5a74b77..2aaf662 100644
--- a/src/sksl/ir/SkSLVarDeclarations.cpp
+++ b/src/sksl/ir/SkSLVarDeclarations.cpp
@@ -39,6 +39,10 @@
 
 void VarDeclaration::ErrorCheck(const Context& context, int line, const Modifiers& modifiers,
         const Type* baseType, Variable::Storage storage) {
+    if (*baseType == *context.fTypes.fInvalid) {
+        context.fErrors->error(line, "invalid type");
+        return;
+    }
     if (context.fConfig->strictES2Mode() && baseType->isArray()) {
         context.fErrors->error(line, "array size must appear after variable name");
     }
diff --git a/tests/sksl/runtime_errors/ReservedNameISampler2D.skvm b/tests/sksl/runtime_errors/ReservedNameISampler2D.skvm
new file mode 100644
index 0000000..e0d3619
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameISampler2D.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'isampler2D'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSampler.skvm b/tests/sksl/runtime_errors/ReservedNameSampler.skvm
new file mode 100644
index 0000000..4bce878
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSampler.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'sampler'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSampler1D.skvm b/tests/sksl/runtime_errors/ReservedNameSampler1D.skvm
new file mode 100644
index 0000000..70264fd
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSampler1D.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'sampler1D'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSampler2D.skvm b/tests/sksl/runtime_errors/ReservedNameSampler2D.skvm
new file mode 100644
index 0000000..d8fbc3a
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSampler2D.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'sampler2D'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSampler2DRect.skvm b/tests/sksl/runtime_errors/ReservedNameSampler2DRect.skvm
new file mode 100644
index 0000000..f0d4429
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSampler2DRect.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'sampler2DRect'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSampler3D.skvm b/tests/sksl/runtime_errors/ReservedNameSampler3D.skvm
new file mode 100644
index 0000000..e984d6a
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSampler3D.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'sampler3D'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSamplerExternalOES.skvm b/tests/sksl/runtime_errors/ReservedNameSamplerExternalOES.skvm
new file mode 100644
index 0000000..99baf0a
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSamplerExternalOES.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'samplerExternalOES'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSubpassInput.skvm b/tests/sksl/runtime_errors/ReservedNameSubpassInput.skvm
new file mode 100644
index 0000000..c19fa4f
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSubpassInput.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'subpassInput'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameSubpassInputMS.skvm b/tests/sksl/runtime_errors/ReservedNameSubpassInputMS.skvm
new file mode 100644
index 0000000..e61ed93
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameSubpassInputMS.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'subpassInputMS'
+1 error
diff --git a/tests/sksl/runtime_errors/ReservedNameTexture2D.skvm b/tests/sksl/runtime_errors/ReservedNameTexture2D.skvm
new file mode 100644
index 0000000..7ef55ad
--- /dev/null
+++ b/tests/sksl/runtime_errors/ReservedNameTexture2D.skvm
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: expected an identifier, but found type 'texture2D'
+1 error
diff --git a/tests/sksl/runtime_errors/UnsupportedTypeSampler.skvm b/tests/sksl/runtime_errors/UnsupportedTypeSampler.skvm
index b44c950..703c4fe 100644
--- a/tests/sksl/runtime_errors/UnsupportedTypeSampler.skvm
+++ b/tests/sksl/runtime_errors/UnsupportedTypeSampler.skvm
@@ -1,6 +1,4 @@
 ### Compilation failed:
 
-error: 1: no type named 'sampler2D'
-error: 1: no type named 's'
-error: 1: expected a declaration, but found ';'
-3 errors
+error: 1: invalid type
+1 error
diff --git a/tests/sksl/runtime_errors/UnsupportedTypeTexture.skvm b/tests/sksl/runtime_errors/UnsupportedTypeTexture.skvm
index 108bab9..703c4fe 100644
--- a/tests/sksl/runtime_errors/UnsupportedTypeTexture.skvm
+++ b/tests/sksl/runtime_errors/UnsupportedTypeTexture.skvm
@@ -1,6 +1,4 @@
 ### Compilation failed:
 
-error: 1: no type named 'texture2D'
-error: 1: no type named 's'
-error: 1: expected a declaration, but found ';'
-3 errors
+error: 1: invalid type
+1 error