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