Add expected errors to every test file.

This was (crudely) automated with shell scripts:
http://go/paste/5484300603490304

Change-Id: Ic9e1c93112772d303d1158eb26d995f27b439eba
Bug: skia:12665
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/505637
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/resources/sksl/errors/ArraySplitDimensions.sksl b/resources/sksl/errors/ArraySplitDimensions.sksl
index b98afc2..b138427 100644
--- a/resources/sksl/errors/ArraySplitDimensions.sksl
+++ b/resources/sksl/errors/ArraySplitDimensions.sksl
@@ -1 +1,5 @@
 float[2] x[2];
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArraySplitDimensionsInFuncBody.sksl b/resources/sksl/errors/ArraySplitDimensionsInFuncBody.sksl
index 76c4f08..ebe124e 100644
--- a/resources/sksl/errors/ArraySplitDimensionsInFuncBody.sksl
+++ b/resources/sksl/errors/ArraySplitDimensionsInFuncBody.sksl
@@ -1 +1,5 @@
 void func() { float[2] x[2]; }
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArraySplitDimensionsInFuncDecl.sksl b/resources/sksl/errors/ArraySplitDimensionsInFuncDecl.sksl
index f1a0dfe..659c9cf 100644
--- a/resources/sksl/errors/ArraySplitDimensionsInFuncDecl.sksl
+++ b/resources/sksl/errors/ArraySplitDimensionsInFuncDecl.sksl
@@ -1 +1,5 @@
 void func(float[2] x[2]) {}
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArraySplitDimensionsInStruct.sksl b/resources/sksl/errors/ArraySplitDimensionsInStruct.sksl
index 351f1c7..bbec234 100644
--- a/resources/sksl/errors/ArraySplitDimensionsInStruct.sksl
+++ b/resources/sksl/errors/ArraySplitDimensionsInStruct.sksl
@@ -1 +1,5 @@
 struct S { float[2] x[2]; };
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTooManyDimensions.sksl b/resources/sksl/errors/ArrayTooManyDimensions.sksl
index aca7490..6036a38 100644
--- a/resources/sksl/errors/ArrayTooManyDimensions.sksl
+++ b/resources/sksl/errors/ArrayTooManyDimensions.sksl
@@ -1 +1,5 @@
 float x[2][2];
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTooManyDimensionsInFuncBody.sksl b/resources/sksl/errors/ArrayTooManyDimensionsInFuncBody.sksl
index c067db2..8cd0683 100644
--- a/resources/sksl/errors/ArrayTooManyDimensionsInFuncBody.sksl
+++ b/resources/sksl/errors/ArrayTooManyDimensionsInFuncBody.sksl
@@ -1 +1,5 @@
 void main() { float x[2][2]; }
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTooManyDimensionsInFuncDecl.sksl b/resources/sksl/errors/ArrayTooManyDimensionsInFuncDecl.sksl
index bd1bf03..c5233be 100644
--- a/resources/sksl/errors/ArrayTooManyDimensionsInFuncDecl.sksl
+++ b/resources/sksl/errors/ArrayTooManyDimensionsInFuncDecl.sksl
@@ -1 +1,5 @@
 void func(float x[2][2]) {}
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTooManyDimensionsInStruct.sksl b/resources/sksl/errors/ArrayTooManyDimensionsInStruct.sksl
index 4c15ed8..af88fe1 100644
--- a/resources/sksl/errors/ArrayTooManyDimensionsInStruct.sksl
+++ b/resources/sksl/errors/ArrayTooManyDimensionsInStruct.sksl
@@ -1 +1,5 @@
 struct S { float x[2][2]; };
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTypeTooManyDimensions.sksl b/resources/sksl/errors/ArrayTypeTooManyDimensions.sksl
index 9807106..3622801 100644
--- a/resources/sksl/errors/ArrayTypeTooManyDimensions.sksl
+++ b/resources/sksl/errors/ArrayTypeTooManyDimensions.sksl
@@ -1 +1,5 @@
 float[2][2] x;
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncBody.sksl b/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncBody.sksl
index 099f5c9..a609cef 100644
--- a/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncBody.sksl
+++ b/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncBody.sksl
@@ -1 +1,5 @@
 void main() { float[2][2] x; }
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncDecl.sksl b/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncDecl.sksl
index 2cf1ba8..ba73f3f 100644
--- a/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncDecl.sksl
+++ b/resources/sksl/errors/ArrayTypeTooManyDimensionsInFuncDecl.sksl
@@ -1 +1,5 @@
 void func(float[2][2] x) {}
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayTypeTooManyDimensionsInStruct.sksl b/resources/sksl/errors/ArrayTypeTooManyDimensionsInStruct.sksl
index 054dca0..5e0e58a 100644
--- a/resources/sksl/errors/ArrayTypeTooManyDimensionsInStruct.sksl
+++ b/resources/sksl/errors/ArrayTypeTooManyDimensionsInStruct.sksl
@@ -1 +1,5 @@
 struct S { float[2][2] x; };
+
+/*%%*
+multi-dimensional arrays are not supported
+*%%*/
diff --git a/resources/sksl/errors/ArrayUnspecifiedDimensions.sksl b/resources/sksl/errors/ArrayUnspecifiedDimensions.sksl
index 854c224..16b84d1 100644
--- a/resources/sksl/errors/ArrayUnspecifiedDimensions.sksl
+++ b/resources/sksl/errors/ArrayUnspecifiedDimensions.sksl
@@ -3,3 +3,10 @@
 in int arrBool[true];
 
 int unsized_in_expression() { return int[](0)[0]; }
+
+/*%%*
+expected array dimension
+array size must be an integer
+array size must be an integer
+missing index in '[]'
+*%%*/
diff --git a/resources/sksl/errors/AssignmentTypeMismatch.sksl b/resources/sksl/errors/AssignmentTypeMismatch.sksl
index bb8e3c9..26e5e8a 100644
--- a/resources/sksl/errors/AssignmentTypeMismatch.sksl
+++ b/resources/sksl/errors/AssignmentTypeMismatch.sksl
@@ -6,3 +6,13 @@
 int function_ref_in_global_variable = mix;
 float3x3 type_ref_in_global_variable = float3x3;
 
+
+/*%%*
+expected 'int', but found 'float'
+type mismatch: '=' cannot operate on 'int', 'float'
+type mismatch: '*=' cannot operate on 'int3', 'float'
+expected '(' to begin function call
+expected '(' to begin constructor invocation
+expected '(' to begin function call
+expected '(' to begin constructor invocation
+*%%*/
diff --git a/resources/sksl/errors/BadCaps.sksl b/resources/sksl/errors/BadCaps.sksl
index 91c6ff2..fc87522 100644
--- a/resources/sksl/errors/BadCaps.sksl
+++ b/resources/sksl/errors/BadCaps.sksl
@@ -1 +1,5 @@
 bool b = sk_Caps.bugFreeDriver;
+
+/*%%*
+unknown capability flag 'bugFreeDriver'
+*%%*/
diff --git a/resources/sksl/errors/BadConstInitializers.sksl b/resources/sksl/errors/BadConstInitializers.sksl
index 5c45f76..73aa9a9 100644
--- a/resources/sksl/errors/BadConstInitializers.sksl
+++ b/resources/sksl/errors/BadConstInitializers.sksl
@@ -20,3 +20,13 @@
 void from_non_const_expression()         { const float x = u + u; }
 void from_mixed_expression()             { const float x = c + u; }
 void from_non_const_struct_field()       { const float x = s.f; }
+
+/*%%*
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+'const' variable initializer must be a constant expression
+*%%*/
diff --git a/resources/sksl/errors/BadFieldAccess.sksl b/resources/sksl/errors/BadFieldAccess.sksl
index a4010e8..bbf5ee5 100644
--- a/resources/sksl/errors/BadFieldAccess.sksl
+++ b/resources/sksl/errors/BadFieldAccess.sksl
@@ -5,3 +5,11 @@
 void not_a_bvec()     { S s; s.f = bool3(true); }
 void not_a_struct()   { S s; s.f.missing; }
 void not_an_array()   { S s; s.f[0]; }
+
+/*%%*
+type 'S' does not have a field named 'missing'
+not a function
+type mismatch: '=' cannot operate on 'float', 'bool3'
+invalid swizzle component 'm'
+expected array, but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/BadIndex.sksl b/resources/sksl/errors/BadIndex.sksl
index cbc5f13..d68b32e 100644
--- a/resources/sksl/errors/BadIndex.sksl
+++ b/resources/sksl/errors/BadIndex.sksl
@@ -1,2 +1,7 @@
 void int_not_array()      { int x = 2[0]; }
 void index_float2_twice() { float2 x = float2(0); int y = x[0][0]; }
+
+/*%%*
+expected array, but found 'int'
+expected array, but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/BadModifiers.sksl b/resources/sksl/errors/BadModifiers.sksl
index 17065e2..7884a4b 100644
--- a/resources/sksl/errors/BadModifiers.sksl
+++ b/resources/sksl/errors/BadModifiers.sksl
@@ -4,3 +4,24 @@
            inline noinline float test) {}
 
 const in out uniform flat noperspective sk_has_side_effects inline noinline float var;
+
+/*%%*
+'const' is not permitted here
+'in' is not permitted here
+'out' is not permitted here
+'uniform' is not permitted here
+'flat' is not permitted here
+'noperspective' is not permitted here
+functions cannot be both 'inline' and 'noinline'
+'uniform' is not permitted here
+'flat' is not permitted here
+'noperspective' is not permitted here
+'sk_has_side_effects' is not permitted here
+'inline' is not permitted here
+'noinline' is not permitted here
+'in uniform' variables not permitted
+'sk_has_side_effects' is not permitted here
+'inline' is not permitted here
+'noinline' is not permitted here
+'const' variables must be initialized
+*%%*/
diff --git a/resources/sksl/errors/BadOctal.sksl b/resources/sksl/errors/BadOctal.sksl
index 4bf6c1c..a7fe38b 100644
--- a/resources/sksl/errors/BadOctal.sksl
+++ b/resources/sksl/errors/BadOctal.sksl
@@ -1,2 +1,7 @@
 int i1 = 08;
 int i2 = 012349;
+
+/*%%*
+'08' is not a valid octal number
+expected expression, but found '08'
+*%%*/
diff --git a/resources/sksl/errors/BinaryInvalidType.sksl b/resources/sksl/errors/BinaryInvalidType.sksl
index 7f72417..86b4a48 100644
--- a/resources/sksl/errors/BinaryInvalidType.sksl
+++ b/resources/sksl/errors/BinaryInvalidType.sksl
@@ -53,3 +53,18 @@
 void arrayBoth() {
     float x = array * array;
 }
+
+/*%%*
+type mismatch: '*' cannot operate on '<INVALID>', 'int'
+type mismatch: '*' cannot operate on 'int', '<INVALID>'
+type mismatch: '*' cannot operate on '<INVALID>', '<INVALID>'
+type mismatch: '*' cannot operate on 'S', 'int'
+type mismatch: '*' cannot operate on 'int', 'S'
+type mismatch: '*' cannot operate on 'S', 'S'
+type mismatch: '*' cannot operate on 'sampler2D', 'int'
+type mismatch: '*' cannot operate on 'int', 'sampler2D'
+type mismatch: '*' cannot operate on 'sampler2D', 'sampler2D'
+type mismatch: '*' cannot operate on 'int[1]', 'int'
+type mismatch: '*' cannot operate on 'int', 'int[1]'
+type mismatch: '*' cannot operate on 'int[1]', 'int[1]'
+*%%*/
diff --git a/resources/sksl/errors/BinaryTypeCoercion.sksl b/resources/sksl/errors/BinaryTypeCoercion.sksl
index 6cc0395..7cfa99e 100644
--- a/resources/sksl/errors/BinaryTypeCoercion.sksl
+++ b/resources/sksl/errors/BinaryTypeCoercion.sksl
@@ -53,3 +53,26 @@
 void dimensions_ok_1()                  { F4x4 *= F4x4; }
 void dimensions_ok_2()                  { F4   *= F4x4; }
 void dimensions_disallowed_1()          { F4x4 *= F4;   }
+
+/*%%*
+type mismatch: '=' cannot operate on 'half', 'float'
+type mismatch: '=' cannot operate on 'half', 'float'
+type mismatch: '*=' cannot operate on 'half', 'float'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '*=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '*=' cannot operate on 'half4', 'float'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '=' cannot operate on 'half4', 'float4'
+type mismatch: '*=' cannot operate on 'half4', 'float4x4'
+type mismatch: '=' cannot operate on 'half4x4', 'float4x4'
+type mismatch: '=' cannot operate on 'half4x4', 'float4x4'
+type mismatch: '*=' cannot operate on 'half4x4', 'float4x4'
+type mismatch: '*=' cannot operate on 'float4x4', 'float4'
+*%%*/
diff --git a/resources/sksl/errors/BinaryTypeMismatch.sksl b/resources/sksl/errors/BinaryTypeMismatch.sksl
index c4cd45a..4a3eb55 100644
--- a/resources/sksl/errors/BinaryTypeMismatch.sksl
+++ b/resources/sksl/errors/BinaryTypeMismatch.sksl
@@ -6,3 +6,13 @@
 void float2_lt_float2() { bool x = float2(0) < float2(1); }
 void float2_lt_float()  { bool x = float2(0) < 0.0; }
 void float_lt_float2()  { bool x = 0.0 < float2(0); }
+
+/*%%*
+type mismatch: '*' cannot operate on 'int', 'bool'
+type mismatch: '||' cannot operate on 'int', 'float'
+type mismatch: '==' cannot operate on 'float2', 'int'
+type mismatch: '!=' cannot operate on 'float2', 'int'
+type mismatch: '<' cannot operate on 'float2', 'float2'
+type mismatch: '<' cannot operate on 'float2', 'float'
+type mismatch: '<' cannot operate on 'float', 'float2'
+*%%*/
diff --git a/resources/sksl/errors/BitShiftFloat.sksl b/resources/sksl/errors/BitShiftFloat.sksl
index 990242f..58a82a7 100644
--- a/resources/sksl/errors/BitShiftFloat.sksl
+++ b/resources/sksl/errors/BitShiftFloat.sksl
@@ -13,3 +13,16 @@
 void and() { x = x & 1; }
 void or()  { x = x | 1; }
 void xor() { x = x ^ 1; }
+
+/*%%*
+type mismatch: '>>=' cannot operate on 'float', 'int'
+type mismatch: '<<=' cannot operate on 'float', 'int'
+type mismatch: '&=' cannot operate on 'float', 'int'
+type mismatch: '|=' cannot operate on 'float', 'int'
+type mismatch: '^=' cannot operate on 'float', 'int'
+type mismatch: '>>' cannot operate on 'float', 'int'
+type mismatch: '<<' cannot operate on 'float', 'int'
+type mismatch: '&' cannot operate on 'float', 'int'
+type mismatch: '|' cannot operate on 'float', 'int'
+type mismatch: '^' cannot operate on 'float', 'int'
+*%%*/
diff --git a/resources/sksl/errors/BitShiftFloatMatrix.sksl b/resources/sksl/errors/BitShiftFloatMatrix.sksl
index 8d070b2..0b9374b 100644
--- a/resources/sksl/errors/BitShiftFloatMatrix.sksl
+++ b/resources/sksl/errors/BitShiftFloatMatrix.sksl
@@ -13,3 +13,16 @@
 void and() { x = x & 1; }
 void or()  { x = x | 1; }
 void xor() { x = x ^ 1; }
+
+/*%%*
+type mismatch: '>>=' cannot operate on 'float2x2', 'int'
+type mismatch: '<<=' cannot operate on 'float2x2', 'int'
+type mismatch: '&=' cannot operate on 'float2x2', 'int'
+type mismatch: '|=' cannot operate on 'float2x2', 'int'
+type mismatch: '^=' cannot operate on 'float2x2', 'int'
+type mismatch: '>>' cannot operate on 'float2x2', 'int'
+type mismatch: '<<' cannot operate on 'float2x2', 'int'
+type mismatch: '&' cannot operate on 'float2x2', 'int'
+type mismatch: '|' cannot operate on 'float2x2', 'int'
+type mismatch: '^' cannot operate on 'float2x2', 'int'
+*%%*/
diff --git a/resources/sksl/errors/BitShiftFloatVector.sksl b/resources/sksl/errors/BitShiftFloatVector.sksl
index 8186b0b..bac8a76 100644
--- a/resources/sksl/errors/BitShiftFloatVector.sksl
+++ b/resources/sksl/errors/BitShiftFloatVector.sksl
@@ -13,3 +13,16 @@
 void and() { x = x & 1; }
 void or()  { x = x | 1; }
 void xor() { x = x ^ 1; }
+
+/*%%*
+type mismatch: '>>=' cannot operate on 'float2', 'int'
+type mismatch: '<<=' cannot operate on 'float2', 'int'
+type mismatch: '&=' cannot operate on 'float2', 'int'
+type mismatch: '|=' cannot operate on 'float2', 'int'
+type mismatch: '^=' cannot operate on 'float2', 'int'
+type mismatch: '>>' cannot operate on 'float2', 'int'
+type mismatch: '<<' cannot operate on 'float2', 'int'
+type mismatch: '&' cannot operate on 'float2', 'int'
+type mismatch: '|' cannot operate on 'float2', 'int'
+type mismatch: '^' cannot operate on 'float2', 'int'
+*%%*/
diff --git a/resources/sksl/errors/BooleanArithmetic.sksl b/resources/sksl/errors/BooleanArithmetic.sksl
index f85819a..ed5f052 100644
--- a/resources/sksl/errors/BooleanArithmetic.sksl
+++ b/resources/sksl/errors/BooleanArithmetic.sksl
@@ -24,3 +24,31 @@
 bool2 bitand_boolean_vec() { return bool2(false, false) & bool2(true, true); }
 bool2 bitor_boolean_vec()  { return bool2(false, false) | bool2(true, true); }
 bool2 bitxor_boolean_vec() { return bool2(false, false) ^ bool2(true, true); }
+
+/*%%*
+type mismatch: '+' cannot operate on 'bool', 'bool'
+type mismatch: '-' cannot operate on 'bool', 'bool'
+type mismatch: '*' cannot operate on 'bool', 'bool'
+type mismatch: '/' cannot operate on 'bool', 'bool'
+type mismatch: '%' cannot operate on 'bool', 'bool'
+type mismatch: '<<' cannot operate on 'bool', 'bool'
+type mismatch: '>>' cannot operate on 'bool', 'bool'
+'-' cannot operate on 'bool'
+'~' cannot operate on 'bool'
+type mismatch: '&' cannot operate on 'bool', 'bool'
+type mismatch: '|' cannot operate on 'bool', 'bool'
+type mismatch: '^' cannot operate on 'bool', 'bool'
+type mismatch: '+' cannot operate on 'bool2', 'bool2'
+type mismatch: '-' cannot operate on 'bool2', 'bool2'
+type mismatch: '*' cannot operate on 'bool2', 'bool2'
+type mismatch: '/' cannot operate on 'bool2', 'bool2'
+type mismatch: '%' cannot operate on 'bool2', 'bool2'
+type mismatch: '<<' cannot operate on 'bool2', 'bool2'
+type mismatch: '>>' cannot operate on 'bool2', 'bool2'
+'!' cannot operate on 'bool2'
+'-' cannot operate on 'bool2'
+'~' cannot operate on 'bool2'
+type mismatch: '&' cannot operate on 'bool2', 'bool2'
+type mismatch: '|' cannot operate on 'bool2', 'bool2'
+type mismatch: '^' cannot operate on 'bool2', 'bool2'
+*%%*/
diff --git a/resources/sksl/errors/BreakOutsideLoop.sksl b/resources/sksl/errors/BreakOutsideLoop.sksl
index aee3f48..4da67cc 100644
--- a/resources/sksl/errors/BreakOutsideLoop.sksl
+++ b/resources/sksl/errors/BreakOutsideLoop.sksl
@@ -1 +1,5 @@
 void outside_while()   { while(true) {} if (true) break; }
+
+/*%%*
+break statement must be inside a loop or switch
+*%%*/
diff --git a/resources/sksl/errors/CallNonFunction.sksl b/resources/sksl/errors/CallNonFunction.sksl
index 9709277..0ce09c6 100644
--- a/resources/sksl/errors/CallNonFunction.sksl
+++ b/resources/sksl/errors/CallNonFunction.sksl
@@ -2,3 +2,7 @@
     float x = 3;
     x();
 }
+
+/*%%*
+not a function
+*%%*/
diff --git a/resources/sksl/errors/CanExitWithoutReturningValue.sksl b/resources/sksl/errors/CanExitWithoutReturningValue.sksl
index c565d4a..8482562 100644
--- a/resources/sksl/errors/CanExitWithoutReturningValue.sksl
+++ b/resources/sksl/errors/CanExitWithoutReturningValue.sksl
@@ -93,3 +93,27 @@
         default: return 2;
     }
 }
+
+/*%%*
+function 'if_only' can exit without returning a value
+function 'return_on_if_but_not_else' can exit without returning a value
+function 'return_on_else_but_not_if' can exit without returning a value
+function 'for_with_conditional_return' can exit without returning a value
+function 'for_with_conditional_break' can exit without returning a value
+function 'for_with_conditional_continue' can exit without returning a value
+function 'do_with_conditional_return' can exit without returning a value
+function 'do_with_conditional_break' can exit without returning a value
+function 'do_with_conditional_continue' can exit without returning a value
+function 'bad_if_else_chain' can exit without returning a value
+function 'switch_empty' can exit without returning a value
+function 'switch_with_no_default' can exit without returning a value
+function 'switch_with_break' can exit without returning a value
+continue statement cannot be used in a switch
+function 'switch_with_continue' can exit without returning a value
+function 'switch_with_fallthrough_off_bottom' can exit without returning a value
+function 'switch_with_conditional_break' can exit without returning a value
+continue statement cannot be used in a switch
+function 'switch_with_conditional_continue' can exit without returning a value
+function 'switch_with_conditional_if_then_return' can exit without returning a value
+function 'switch_with_conditional_break_then_fallthrough' can exit without returning a value
+*%%*/
diff --git a/resources/sksl/errors/ComparisonDimensional.sksl b/resources/sksl/errors/ComparisonDimensional.sksl
index 803de50..933fa4e 100644
--- a/resources/sksl/errors/ComparisonDimensional.sksl
+++ b/resources/sksl/errors/ComparisonDimensional.sksl
@@ -18,4 +18,22 @@
     float2 v2;
     float3 v3;
     return v2 == v3 || v2 != v3;
-}
\ No newline at end of file
+}
+/*%%*
+type mismatch: '==' cannot operate on 'float2', 'float'
+type mismatch: '==' cannot operate on 'float2', 'float2x2'
+type mismatch: '==' cannot operate on 'float2x2', 'float'
+type mismatch: '==' cannot operate on 'float', 'float2'
+type mismatch: '==' cannot operate on 'float2x2', 'float2'
+type mismatch: '==' cannot operate on 'float', 'float2x2'
+type mismatch: '!=' cannot operate on 'float2', 'float'
+type mismatch: '!=' cannot operate on 'float2', 'float2x2'
+type mismatch: '!=' cannot operate on 'float2x2', 'float'
+type mismatch: '!=' cannot operate on 'float', 'float2'
+type mismatch: '!=' cannot operate on 'float2x2', 'float2'
+type mismatch: '!=' cannot operate on 'float', 'float2x2'
+type mismatch: '==' cannot operate on 'float2x2', 'float3x3'
+type mismatch: '!=' cannot operate on 'float2x2', 'float3x3'
+type mismatch: '==' cannot operate on 'float2', 'float3'
+type mismatch: '!=' cannot operate on 'float2', 'float3'
+*%%*/
diff --git a/resources/sksl/errors/ConstructorArgumentCount.sksl b/resources/sksl/errors/ConstructorArgumentCount.sksl
index 6aece50..6977bdf 100644
--- a/resources/sksl/errors/ConstructorArgumentCount.sksl
+++ b/resources/sksl/errors/ConstructorArgumentCount.sksl
@@ -1,3 +1,9 @@
 void construct_float3_from_float_float()             { float3 x = float3(1.0, 2.0); }
 void construct_float3_from_float_float_float_float() { float3 x = float3(1.0, 2.0, 3.0, 4.0); }
 void construct_bool_from_int3()                      { bool   x = bool(int3(77)); }
+
+/*%%*
+invalid arguments to 'float3' constructor (expected 3 scalars, but found 2)
+invalid arguments to 'float3' constructor (expected 3 scalars, but found 4)
+'int3' is not a valid parameter to 'bool' constructor
+*%%*/
diff --git a/resources/sksl/errors/ConstructorTypeMismatch.sksl b/resources/sksl/errors/ConstructorTypeMismatch.sksl
index 2677a0a..4a54bbf 100644
--- a/resources/sksl/errors/ConstructorTypeMismatch.sksl
+++ b/resources/sksl/errors/ConstructorTypeMismatch.sksl
@@ -8,3 +8,12 @@
 void construct_float2x2_from_struct()   { float2x2 x = float2x2(foo); }
 void construct_float2x2_from_type()     { float2x2 x = float2x2(int); }
 void construct_float2x2_from_function() { float2x2 x = float2x2(sqrt); }
+
+/*%%*
+expected 'int', but found 'float2x2'
+'Foo' is not a valid parameter to 'float' constructor
+'Foo' is not a valid parameter to 'float2' constructor
+'Foo' is not a valid parameter to 'float2x2' constructor
+'<INVALID>' is not a valid parameter to 'float2x2' constructor
+'<INVALID>' is not a valid parameter to 'float2x2' constructor
+*%%*/
diff --git a/resources/sksl/errors/ContinueOutsideLoop.sksl b/resources/sksl/errors/ContinueOutsideLoop.sksl
index 0664576..e4b98f2 100644
--- a/resources/sksl/errors/ContinueOutsideLoop.sksl
+++ b/resources/sksl/errors/ContinueOutsideLoop.sksl
@@ -1,2 +1,7 @@
 void outside_for()   { for (;;) {} continue; }
 void inside_switch() { switch (1) { default: continue; } }
+
+/*%%*
+continue statement must be inside a loop
+continue statement must be inside a loop
+*%%*/
diff --git a/resources/sksl/errors/DivideByZero.sksl b/resources/sksl/errors/DivideByZero.sksl
index 597765d..7f72ecc 100644
--- a/resources/sksl/errors/DivideByZero.sksl
+++ b/resources/sksl/errors/DivideByZero.sksl
@@ -2,3 +2,10 @@
 float b = 1 / 0;
 float c = 1.0 / 0.0;
 float d = -67.0 / (3.0 - 3);
+
+/*%%*
+division by zero
+division by zero
+division by zero
+division by zero
+*%%*/
diff --git a/resources/sksl/errors/DoTypeMismatch.sksl b/resources/sksl/errors/DoTypeMismatch.sksl
index 40dc166..ae27a62 100644
--- a/resources/sksl/errors/DoTypeMismatch.sksl
+++ b/resources/sksl/errors/DoTypeMismatch.sksl
@@ -1,3 +1,7 @@
 void main() {
     do {} while (float2(1));
 }
+
+/*%%*
+expected 'bool', but found 'float2'
+*%%*/
diff --git a/resources/sksl/errors/DuplicateFunction.sksl b/resources/sksl/errors/DuplicateFunction.sksl
index adf45e7..4125e2c 100644
--- a/resources/sksl/errors/DuplicateFunction.sksl
+++ b/resources/sksl/errors/DuplicateFunction.sksl
@@ -1,2 +1,6 @@
 void main() {}
 void main() {}
+
+/*%%*
+duplicate definition of void main()
+*%%*/
diff --git a/resources/sksl/errors/DuplicateOutput.sksl b/resources/sksl/errors/DuplicateOutput.sksl
index 67a083b..6a48738 100644
--- a/resources/sksl/errors/DuplicateOutput.sksl
+++ b/resources/sksl/errors/DuplicateOutput.sksl
@@ -1 +1,5 @@
 layout (location=0, index=0) out half4 duplicateOutput;
+
+/*%%*
+out location=0, index=0 is reserved for sk_FragColor
+*%%*/
diff --git a/resources/sksl/errors/DuplicateSymbol.sksl b/resources/sksl/errors/DuplicateSymbol.sksl
index fa73e8e..8785fcc 100644
--- a/resources/sksl/errors/DuplicateSymbol.sksl
+++ b/resources/sksl/errors/DuplicateSymbol.sksl
@@ -5,3 +5,9 @@
 void main() {
     int y,y;
 }
+
+/*%%*
+symbol 'x' was already defined
+symbol 'main' was already defined
+symbol 'y' was already defined
+*%%*/
diff --git a/resources/sksl/errors/EmptyArray.sksl b/resources/sksl/errors/EmptyArray.sksl
index d19fe4a..08502e1 100644
--- a/resources/sksl/errors/EmptyArray.sksl
+++ b/resources/sksl/errors/EmptyArray.sksl
@@ -1,2 +1,7 @@
 int disallowed_zero[0];
 int disallowed_negative[-1];
+
+/*%%*
+array size must be positive
+array size must be positive
+*%%*/
diff --git a/resources/sksl/errors/EmptyStruct.sksl b/resources/sksl/errors/EmptyStruct.sksl
index f14106c..d0245e8 100644
--- a/resources/sksl/errors/EmptyStruct.sksl
+++ b/resources/sksl/errors/EmptyStruct.sksl
@@ -1 +1,5 @@
 struct S { };
+
+/*%%*
+struct 'S' must contain at least one field
+*%%*/
diff --git a/resources/sksl/errors/ErrorsInDeadCode.sksl b/resources/sksl/errors/ErrorsInDeadCode.sksl
index ed7e732..2f297d2 100644
--- a/resources/sksl/errors/ErrorsInDeadCode.sksl
+++ b/resources/sksl/errors/ErrorsInDeadCode.sksl
@@ -4,3 +4,10 @@
 void error_in_dead_if_body()            { if (false) x = 5; }
 void error_in_dead_ternary_true_expr()  { true ? 5 : x; }
 void error_in_dead_ternary_false_expr() { false ? x : 5; }
+
+/*%%*
+unknown identifier 'x'
+unknown identifier 'x'
+unknown identifier 'x'
+unknown identifier 'x'
+*%%*/
diff --git a/resources/sksl/errors/FloatRemainder.sksl b/resources/sksl/errors/FloatRemainder.sksl
index fa77d2b..fd6f360 100644
--- a/resources/sksl/errors/FloatRemainder.sksl
+++ b/resources/sksl/errors/FloatRemainder.sksl
@@ -5,3 +5,8 @@
 
 void rem()    { x = x % y; }
 void rem_eq() { x %= y; }
+
+/*%%*
+type mismatch: '%' cannot operate on 'float', 'float'
+type mismatch: '%=' cannot operate on 'float', 'float'
+*%%*/
diff --git a/resources/sksl/errors/ForInitStmt.sksl b/resources/sksl/errors/ForInitStmt.sksl
index 92fdaa9..f1933b8 100644
--- a/resources/sksl/errors/ForInitStmt.sksl
+++ b/resources/sksl/errors/ForInitStmt.sksl
@@ -8,3 +8,7 @@
 void test_init_stmt_discard()   { for (discard;; )              {} }
 void test_init_stmt_type()      { for (void;; )                 {} }
 void test_init_stmt_deep()      { for (for(for(for(;;);;);;);;) {} }
+
+/*%%*
+expected expression, but found 'for'
+*%%*/
diff --git a/resources/sksl/errors/ForTypeMismatch.sksl b/resources/sksl/errors/ForTypeMismatch.sksl
index 26bb7c4..590027e 100644
--- a/resources/sksl/errors/ForTypeMismatch.sksl
+++ b/resources/sksl/errors/ForTypeMismatch.sksl
@@ -1,3 +1,7 @@
 void main() {
     for (int x = 0; x; x++) {}
 }
+
+/*%%*
+expected 'bool', but found 'int'
+*%%*/
diff --git a/resources/sksl/errors/FunctionParameterOfVoid.sksl b/resources/sksl/errors/FunctionParameterOfVoid.sksl
index fcae990..e5804da 100644
--- a/resources/sksl/errors/FunctionParameterOfVoid.sksl
+++ b/resources/sksl/errors/FunctionParameterOfVoid.sksl
@@ -1 +1,5 @@
 void func(void x) {}
+
+/*%%*
+expected ')', but found 'x'
+*%%*/
diff --git a/resources/sksl/errors/GenericArgumentMismatch.sksl b/resources/sksl/errors/GenericArgumentMismatch.sksl
index fd0ebdb..0dc3470 100644
--- a/resources/sksl/errors/GenericArgumentMismatch.sksl
+++ b/resources/sksl/errors/GenericArgumentMismatch.sksl
@@ -1,3 +1,8 @@
 void sin_int_int() { float x = sin(1, 2); }
 void sin_bool()    { float x = sin(true); }
 
+
+/*%%*
+no match for sin(int, int)
+no match for sin(bool)
+*%%*/
diff --git a/resources/sksl/errors/IfTypeMismatch.sksl b/resources/sksl/errors/IfTypeMismatch.sksl
index 74e23b2..b612fa9 100644
--- a/resources/sksl/errors/IfTypeMismatch.sksl
+++ b/resources/sksl/errors/IfTypeMismatch.sksl
@@ -1,3 +1,7 @@
 void main() {
     if (3) {}
 }
+
+/*%%*
+expected 'bool', but found 'int'
+*%%*/
diff --git a/resources/sksl/errors/InVarWithInitializerExpression.sksl b/resources/sksl/errors/InVarWithInitializerExpression.sksl
index 419b9fc..4556329 100644
--- a/resources/sksl/errors/InVarWithInitializerExpression.sksl
+++ b/resources/sksl/errors/InVarWithInitializerExpression.sksl
@@ -1 +1,5 @@
 in float x = 1;
+
+/*%%*
+'in' variables cannot use initializer expressions
+*%%*/
diff --git a/resources/sksl/errors/IncompleteExpression.sksl b/resources/sksl/errors/IncompleteExpression.sksl
index d8f361f..2f3d609 100644
--- a/resources/sksl/errors/IncompleteExpression.sksl
+++ b/resources/sksl/errors/IncompleteExpression.sksl
@@ -2,3 +2,8 @@
     int;
     return half4(0);
 }
+
+/*%%*
+expected '(' to begin constructor invocation
+expected a type, but found 'return'
+*%%*/
diff --git a/resources/sksl/errors/IncompleteFunctionCall.sksl b/resources/sksl/errors/IncompleteFunctionCall.sksl
index 45a2763..f5403f9 100644
--- a/resources/sksl/errors/IncompleteFunctionCall.sksl
+++ b/resources/sksl/errors/IncompleteFunctionCall.sksl
@@ -2,3 +2,8 @@
     mix;
     return half4(0);
 }
+
+/*%%*
+expected '(' to begin function call
+expected a type, but found 'return'
+*%%*/
diff --git a/resources/sksl/errors/InterfaceBlockMemberReservedName.sksl b/resources/sksl/errors/InterfaceBlockMemberReservedName.sksl
index 93029fb..ffaafcd 100644
--- a/resources/sksl/errors/InterfaceBlockMemberReservedName.sksl
+++ b/resources/sksl/errors/InterfaceBlockMemberReservedName.sksl
@@ -5,3 +5,7 @@
 float4 main() {
     return ib.float.xxxx;
 }
+
+/*%%*
+expected an identifier, but found type 'float'
+*%%*/
diff --git a/resources/sksl/errors/InterfaceBlockReservedName.sksl b/resources/sksl/errors/InterfaceBlockReservedName.sksl
index 66ca967..7aba2bf 100644
--- a/resources/sksl/errors/InterfaceBlockReservedName.sksl
+++ b/resources/sksl/errors/InterfaceBlockReservedName.sksl
@@ -5,3 +5,7 @@
 float4 main() {
     return float.f.xxxx;
 }
+
+/*%%*
+expected ';', but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/InterfaceBlockScope.sksl b/resources/sksl/errors/InterfaceBlockScope.sksl
index cd913e0..55aebad 100644
--- a/resources/sksl/errors/InterfaceBlockScope.sksl
+++ b/resources/sksl/errors/InterfaceBlockScope.sksl
@@ -1,3 +1,7 @@
 uniform testBlock {
     float x;
 } test[x];
+
+/*%%*
+unknown identifier 'x'
+*%%*/
diff --git a/resources/sksl/errors/InterfaceBlockStorageModifiers.sksl b/resources/sksl/errors/InterfaceBlockStorageModifiers.sksl
index 13073e7..1535c08 100644
--- a/resources/sksl/errors/InterfaceBlockStorageModifiers.sksl
+++ b/resources/sksl/errors/InterfaceBlockStorageModifiers.sksl
@@ -1 +1,5 @@
 uniform foo { out int x; };
+
+/*%%*
+'out' is not permitted here
+*%%*/
diff --git a/resources/sksl/errors/InterfaceBlockWithNoMembers.sksl b/resources/sksl/errors/InterfaceBlockWithNoMembers.sksl
index 148f69a..2f32f29 100644
--- a/resources/sksl/errors/InterfaceBlockWithNoMembers.sksl
+++ b/resources/sksl/errors/InterfaceBlockWithNoMembers.sksl
@@ -1,2 +1,7 @@
 const S {};
 testBlock {} x[2];
+
+/*%%*
+interface block 'S' must contain at least one member
+interface block 'testBlock' must contain at least one member
+*%%*/
diff --git a/resources/sksl/errors/IntrinsicInGlobalVariable.sksl b/resources/sksl/errors/IntrinsicInGlobalVariable.sksl
index f24d23a..8006286 100644
--- a/resources/sksl/errors/IntrinsicInGlobalVariable.sksl
+++ b/resources/sksl/errors/IntrinsicInGlobalVariable.sksl
@@ -1,2 +1,6 @@
 half4 c = blend_src_over(half4(1), half4(0));
 void f() {}
+
+/*%%*
+global variable initializer must be a constant expression
+*%%*/
diff --git a/resources/sksl/errors/InvalidAssignment.sksl b/resources/sksl/errors/InvalidAssignment.sksl
index d838ef3..58a6a20 100644
--- a/resources/sksl/errors/InvalidAssignment.sksl
+++ b/resources/sksl/errors/InvalidAssignment.sksl
@@ -21,3 +21,19 @@
 void assign_to_const_param(const int x)          { x = 0; }
 void assign_to_const_array_param(const int x[1]) { x[0] = 0; }
 void assign_to_const_struct_param(const S s)     { s.f = 0; }
+
+/*%%*
+cannot assign to this expression
+cannot modify immutable variable 'u'
+cannot modify immutable variable 'x'
+cannot assign to this expression
+cannot write to the same swizzle field more than once
+cannot modify immutable variable 'l'
+cannot modify immutable variable 'r'
+cannot modify immutable variable 'l'
+cannot assign to this expression
+cannot assign to this expression
+cannot modify immutable variable 'x'
+cannot modify immutable variable 'x'
+cannot modify immutable variable 's'
+*%%*/
diff --git a/resources/sksl/errors/InvalidOutParams.sksl b/resources/sksl/errors/InvalidOutParams.sksl
index 6194db8..9df805e 100644
--- a/resources/sksl/errors/InvalidOutParams.sksl
+++ b/resources/sksl/errors/InvalidOutParams.sksl
@@ -4,3 +4,9 @@
 void test_a() { inc1(0); }
 void test_b() { inc4(float4(0)); }
 void test_c() { inc1(sqrt(1)); }
+
+/*%%*
+cannot assign to this expression
+cannot assign to this expression
+cannot assign to this expression
+*%%*/
diff --git a/resources/sksl/errors/InvalidToken.sksl b/resources/sksl/errors/InvalidToken.sksl
index ec523f8..5ec472d 100644
--- a/resources/sksl/errors/InvalidToken.sksl
+++ b/resources/sksl/errors/InvalidToken.sksl
@@ -1,2 +1,6 @@
 💩
 void main() {}
+
+/*%%*
+invalid token
+*%%*/
diff --git a/resources/sksl/errors/InvalidUnary.sksl b/resources/sksl/errors/InvalidUnary.sksl
index 186e124..19ba562 100644
--- a/resources/sksl/errors/InvalidUnary.sksl
+++ b/resources/sksl/errors/InvalidUnary.sksl
@@ -7,3 +7,13 @@
 void not_integer()          { int x = !12; }
 void positive_struct()      { Foo x = +bar; }
 void negative_struct()      { Foo x = -bar; }
+
+/*%%*
+'++' cannot operate on 'float4x4'
+'--' cannot operate on 'float3'
+'++' cannot operate on 'float4x4'
+'--' cannot operate on 'float3'
+'!' cannot operate on 'int'
+'+' cannot operate on 'Foo'
+'-' cannot operate on 'Foo'
+*%%*/
diff --git a/resources/sksl/errors/LayoutInFunctions.sksl b/resources/sksl/errors/LayoutInFunctions.sksl
index d3b3ba1..b2d30fb 100644
--- a/resources/sksl/errors/LayoutInFunctions.sksl
+++ b/resources/sksl/errors/LayoutInFunctions.sksl
@@ -25,3 +25,28 @@
     set = 1,
     builtin = 1,
     input_attachment_index = 1) float x) {}
+
+/*%%*
+layout qualifier 'origin_upper_left' is not permitted here
+layout qualifier 'push_constant' is not permitted here
+layout qualifier 'blend_support_all_equations' is not permitted here
+layout qualifier 'color' is not permitted here
+layout qualifier 'location' is not permitted here
+layout qualifier 'offset' is not permitted here
+layout qualifier 'binding' is not permitted here
+layout qualifier 'index' is not permitted here
+layout qualifier 'set' is not permitted here
+layout qualifier 'builtin' is not permitted here
+layout qualifier 'input_attachment_index' is not permitted here
+layout qualifier 'origin_upper_left' is not permitted here
+layout qualifier 'push_constant' is not permitted here
+layout qualifier 'blend_support_all_equations' is not permitted here
+layout qualifier 'color' is not permitted here
+layout qualifier 'location' is not permitted here
+layout qualifier 'offset' is not permitted here
+layout qualifier 'binding' is not permitted here
+layout qualifier 'index' is not permitted here
+layout qualifier 'set' is not permitted here
+layout qualifier 'builtin' is not permitted here
+layout qualifier 'input_attachment_index' is not permitted here
+*%%*/
diff --git a/resources/sksl/errors/LayoutInInterfaceBlock.sksl b/resources/sksl/errors/LayoutInInterfaceBlock.sksl
index 5aad89a..0f4787f 100644
--- a/resources/sksl/errors/LayoutInInterfaceBlock.sksl
+++ b/resources/sksl/errors/LayoutInInterfaceBlock.sksl
@@ -4,3 +4,8 @@
     layout(binding=1) A y;  // Not allowed
     layout(set=0) A z;      // Not allowed
 };
+
+/*%%*
+layout qualifier 'binding' is not permitted here
+layout qualifier 'set' is not permitted here
+*%%*/
diff --git a/resources/sksl/errors/LayoutInStruct.sksl b/resources/sksl/errors/LayoutInStruct.sksl
index e9e124a..ab695c8 100644
--- a/resources/sksl/errors/LayoutInStruct.sksl
+++ b/resources/sksl/errors/LayoutInStruct.sksl
@@ -7,4 +7,8 @@
 
 void main(){
     a.x++;
-}
\ No newline at end of file
+}
+/*%%*
+layout qualifier 'binding' is not permitted on a struct field
+layout qualifier 'set' is not permitted on a struct field
+*%%*/
diff --git a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
index 7638796..abb8005 100644
--- a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
+++ b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
@@ -23,3 +23,20 @@
     builtin = 2,
     input_attachment_index = 2
 ) float x;
+
+/*%%*
+layout qualifier 'origin_upper_left' appears more than once
+layout qualifier 'push_constant' appears more than once
+layout qualifier 'blend_support_all_equations' appears more than once
+layout qualifier 'color' appears more than once
+layout qualifier 'location' appears more than once
+layout qualifier 'offset' appears more than once
+layout qualifier 'binding' appears more than once
+layout qualifier 'index' appears more than once
+layout qualifier 'set' appears more than once
+layout qualifier 'builtin' appears more than once
+layout qualifier 'input_attachment_index' appears more than once
+'layout(color)' is only permitted in runtime effects
+'layout(color)' is only permitted on 'uniform' variables
+'layout(color)' is not permitted on variables of type 'float'
+*%%*/
diff --git a/resources/sksl/errors/MatrixIndexOutOfRange.sksl b/resources/sksl/errors/MatrixIndexOutOfRange.sksl
index e57ac22..ecdfc6e 100644
--- a/resources/sksl/errors/MatrixIndexOutOfRange.sksl
+++ b/resources/sksl/errors/MatrixIndexOutOfRange.sksl
@@ -29,3 +29,22 @@
 void half4_3_constidx()        { half3x3 m;      const int INDEX = 3;          half3 v = m[INDEX]; }
 void half4_4_constidx()        { half3x3 m;      const int INDEX = 4;          half3 v = m[INDEX]; }
 void half4_huge_constidx()     { half3x3 m;      const int INDEX = 1000000000; half3 v = m[INDEX]; }
+
+/*%%*
+index -1 out of range for 'half2x4'
+index 2 out of range for 'half2x4'
+index 3 out of range for 'half2x4'
+index 4 out of range for 'half2x4'
+index 1000000000 out of range for 'half2x4'
+index -1 out of range for 'half3x3'
+index 3 out of range for 'half3x3'
+index 4 out of range for 'half3x3'
+index 1000000000 out of range for 'half3x3'
+index -1 out of range for 'half4x2'
+index 4 out of range for 'half4x2'
+index 1000000000 out of range for 'half4x2'
+index -1 out of range for 'half3x3'
+index 3 out of range for 'half3x3'
+index 4 out of range for 'half3x3'
+index 1000000000 out of range for 'half3x3'
+*%%*/
diff --git a/resources/sksl/errors/MatrixInlinedIndexOutOfRange.sksl b/resources/sksl/errors/MatrixInlinedIndexOutOfRange.sksl
index f9a8722..489bc6e 100644
--- a/resources/sksl/errors/MatrixInlinedIndexOutOfRange.sksl
+++ b/resources/sksl/errors/MatrixInlinedIndexOutOfRange.sksl
@@ -11,3 +11,8 @@
     float3 undefined = indexMatrix(-1) + indexMatrix(3);
     return colorGreen;
 }
+
+/*%%*
+index -1 out of range for 'float3x3'
+index 3 out of range for 'float3x3'
+*%%*/
diff --git a/resources/sksl/errors/MatrixToVectorCast3x3.sksl b/resources/sksl/errors/MatrixToVectorCast3x3.sksl
index 6767a32..d94e744 100644
--- a/resources/sksl/errors/MatrixToVectorCast3x3.sksl
+++ b/resources/sksl/errors/MatrixToVectorCast3x3.sksl
@@ -5,3 +5,10 @@
 half2   testVec2      = half2(testMatrix3x3);
 half3   testVec3      = half3(testMatrix3x3);
 half4   testVec4      = half4(testMatrix3x3);
+
+/*%%*
+'half3x3' is not a valid parameter to 'half' constructor; use '[0][0]' instead
+'half3x3' is not a valid parameter to 'half2' constructor
+'half3x3' is not a valid parameter to 'half3' constructor
+'half3x3' is not a valid parameter to 'half4' constructor
+*%%*/
diff --git a/resources/sksl/errors/MatrixToVectorCastBoolean.sksl b/resources/sksl/errors/MatrixToVectorCastBoolean.sksl
index cacfc1a..ef25f21 100644
--- a/resources/sksl/errors/MatrixToVectorCastBoolean.sksl
+++ b/resources/sksl/errors/MatrixToVectorCastBoolean.sksl
@@ -5,3 +5,9 @@
 bool2   testVec2      = bool2(testMatrix2x2);
 bool3   testVec3      = bool3(testMatrix2x2);
 bool4   testVec4      = bool4(testMatrix2x2);  // not an error
+
+/*%%*
+'half2x2' is not a valid parameter to 'bool' constructor
+'half2x2' is not a valid parameter to 'bool2' constructor
+'half2x2' is not a valid parameter to 'bool3' constructor
+*%%*/
diff --git a/resources/sksl/errors/MatrixToVectorCastInteger.sksl b/resources/sksl/errors/MatrixToVectorCastInteger.sksl
index 9a9966f..b574457 100644
--- a/resources/sksl/errors/MatrixToVectorCastInteger.sksl
+++ b/resources/sksl/errors/MatrixToVectorCastInteger.sksl
@@ -5,3 +5,9 @@
 int2   testVec2      = int2(testMatrix2x2);
 int3   testVec3      = int3(testMatrix2x2);
 int4   testVec4      = int4(testMatrix2x2);  // not an error
+
+/*%%*
+'half2x2' is not a valid parameter to 'int' constructor
+'half2x2' is not a valid parameter to 'int2' constructor
+'half2x2' is not a valid parameter to 'int3' constructor
+*%%*/
diff --git a/resources/sksl/errors/MatrixToVectorCastTooSmall.sksl b/resources/sksl/errors/MatrixToVectorCastTooSmall.sksl
index 328789e..fe7c891 100644
--- a/resources/sksl/errors/MatrixToVectorCastTooSmall.sksl
+++ b/resources/sksl/errors/MatrixToVectorCastTooSmall.sksl
@@ -5,3 +5,9 @@
 half2   testVec2      = half2(testMatrix2x2);
 half3   testVec3      = half3(testMatrix2x2);
 half4   testVec4      = half4(testMatrix2x2);  // not an error
+
+/*%%*
+'half2x2' is not a valid parameter to 'half' constructor; use '[0][0]' instead
+'half2x2' is not a valid parameter to 'half2' constructor
+'half2x2' is not a valid parameter to 'half3' constructor
+*%%*/
diff --git a/resources/sksl/errors/MismatchedNumbers.sksl b/resources/sksl/errors/MismatchedNumbers.sksl
index 9d2e424..ea3615f 100644
--- a/resources/sksl/errors/MismatchedNumbers.sksl
+++ b/resources/sksl/errors/MismatchedNumbers.sksl
@@ -73,3 +73,56 @@
 void   u_minus_i_disallowed()              { u - i; }
 void   u_mul_i_disallowed()                { u * i; }
 void   u_div_i_disallowed()                { u / i; }
+
+/*%%*
+type mismatch: '=' cannot operate on 'int', 'float'
+type mismatch: '=' cannot operate on 'uint', 'float'
+type mismatch: '=' cannot operate on 'int', 'uint'
+type mismatch: '=' cannot operate on 'int', 'float'
+type mismatch: '=' cannot operate on 'float', 'int'
+function 'f_eq_i_disallowed' can exit without returning a value
+type mismatch: '=' cannot operate on 'float', 'uint'
+function 'f_eq_u_disallowed' can exit without returning a value
+type mismatch: '=' cannot operate on 'uint', 'int'
+type mismatch: '=' cannot operate on 'uint', 'float'
+type mismatch: '+' cannot operate on 'int', 'float'
+type mismatch: '-' cannot operate on 'int', 'float'
+type mismatch: '*' cannot operate on 'int', 'float'
+type mismatch: '/' cannot operate on 'int', 'float'
+type mismatch: '+' cannot operate on 'float', 'int'
+type mismatch: '-' cannot operate on 'float', 'int'
+type mismatch: '*' cannot operate on 'float', 'int'
+type mismatch: '/' cannot operate on 'float', 'int'
+type mismatch: '+' cannot operate on 'uint', 'float'
+type mismatch: '-' cannot operate on 'uint', 'float'
+type mismatch: '*' cannot operate on 'uint', 'float'
+type mismatch: '/' cannot operate on 'uint', 'float'
+type mismatch: '+' cannot operate on 'float', 'uint'
+type mismatch: '-' cannot operate on 'float', 'uint'
+type mismatch: '*' cannot operate on 'float', 'uint'
+type mismatch: '/' cannot operate on 'float', 'uint'
+type mismatch: '+' cannot operate on 'int', 'float'
+type mismatch: '-' cannot operate on 'int', 'float'
+type mismatch: '*' cannot operate on 'int', 'float'
+type mismatch: '/' cannot operate on 'int', 'float'
+type mismatch: '+' cannot operate on 'float', 'int'
+type mismatch: '-' cannot operate on 'float', 'int'
+type mismatch: '*' cannot operate on 'float', 'int'
+type mismatch: '/' cannot operate on 'float', 'int'
+type mismatch: '+' cannot operate on 'uint', 'float'
+type mismatch: '-' cannot operate on 'uint', 'float'
+type mismatch: '*' cannot operate on 'uint', 'float'
+type mismatch: '/' cannot operate on 'uint', 'float'
+type mismatch: '+' cannot operate on 'float', 'uint'
+type mismatch: '-' cannot operate on 'float', 'uint'
+type mismatch: '*' cannot operate on 'float', 'uint'
+type mismatch: '/' cannot operate on 'float', 'uint'
+type mismatch: '+' cannot operate on 'int', 'uint'
+type mismatch: '-' cannot operate on 'int', 'uint'
+type mismatch: '*' cannot operate on 'int', 'uint'
+type mismatch: '/' cannot operate on 'int', 'uint'
+type mismatch: '+' cannot operate on 'uint', 'int'
+type mismatch: '-' cannot operate on 'uint', 'int'
+type mismatch: '*' cannot operate on 'uint', 'int'
+type mismatch: '/' cannot operate on 'uint', 'int'
+*%%*/
diff --git a/resources/sksl/errors/ModifiersInStruct.sksl b/resources/sksl/errors/ModifiersInStruct.sksl
index ba68d15..c5bafc5 100644
--- a/resources/sksl/errors/ModifiersInStruct.sksl
+++ b/resources/sksl/errors/ModifiersInStruct.sksl
@@ -5,3 +5,11 @@
     noperspective float4 d;
     inout bool e;
 };
+
+/*%%*
+modifier 'const' is not permitted on a struct field
+modifier 'uniform' is not permitted on a struct field
+modifier 'flat' is not permitted on a struct field
+modifier 'noperspective' is not permitted on a struct field
+modifier 'inout' is not permitted on a struct field
+*%%*/
diff --git a/resources/sksl/errors/MultipleFields.sksl b/resources/sksl/errors/MultipleFields.sksl
index da0c9e3..77cdf1a 100644
--- a/resources/sksl/errors/MultipleFields.sksl
+++ b/resources/sksl/errors/MultipleFields.sksl
@@ -3,3 +3,7 @@
   float var;
 };
 
+
+/*%%*
+field 'var' was already defined in the same struct ('Varyings')
+*%%*/
diff --git a/resources/sksl/errors/MultipleFieldsInInterfaceBlocks.sksl b/resources/sksl/errors/MultipleFieldsInInterfaceBlocks.sksl
index 617d03b..fa25f31 100644
--- a/resources/sksl/errors/MultipleFieldsInInterfaceBlocks.sksl
+++ b/resources/sksl/errors/MultipleFieldsInInterfaceBlocks.sksl
@@ -5,3 +5,8 @@
 
 IB1 { float f; };
 IB2 { float f; };
+
+/*%%*
+field 'f' was already defined in the same interface block ('IB')
+symbol 'f' was already defined
+*%%*/
diff --git a/resources/sksl/errors/NoES3ModifierInUserCode.sksl b/resources/sksl/errors/NoES3ModifierInUserCode.sksl
index f9ce51b..b47605e 100644
--- a/resources/sksl/errors/NoES3ModifierInUserCode.sksl
+++ b/resources/sksl/errors/NoES3ModifierInUserCode.sksl
@@ -1,2 +1,6 @@
 $es3 void fn() {}
 
+
+/*%%*
+'$es3' is not permitted here
+*%%*/
diff --git a/resources/sksl/errors/OpaqueTypeAssignment.sksl b/resources/sksl/errors/OpaqueTypeAssignment.sksl
index 99058ae..e62900a 100644
--- a/resources/sksl/errors/OpaqueTypeAssignment.sksl
+++ b/resources/sksl/errors/OpaqueTypeAssignment.sksl
@@ -4,3 +4,11 @@
 void declare() { sampler d; }
 void initialize() { sampler e = a; }
 void assign() { a = b; }
+
+/*%%*
+opaque type 'sampler' cannot use initializer expressions
+variables of type 'sampler' must be global
+variables of type 'sampler' must be global
+opaque type 'sampler' cannot use initializer expressions
+assignments to opaque type 'sampler' are not permitted
+*%%*/
diff --git a/resources/sksl/errors/OpaqueTypeConstruction.sksl b/resources/sksl/errors/OpaqueTypeConstruction.sksl
index 7421927..55abf0b 100644
--- a/resources/sksl/errors/OpaqueTypeConstruction.sksl
+++ b/resources/sksl/errors/OpaqueTypeConstruction.sksl
@@ -3,3 +3,7 @@
 void main() {
     func(sampler(a));
 }
+
+/*%%*
+cannot construct 'sampler'
+*%%*/
diff --git a/resources/sksl/errors/OpaqueTypeInArray.sksl b/resources/sksl/errors/OpaqueTypeInArray.sksl
index 81074cd..d5eb56d 100644
--- a/resources/sksl/errors/OpaqueTypeInArray.sksl
+++ b/resources/sksl/errors/OpaqueTypeInArray.sksl
@@ -2,3 +2,10 @@
 in sampler[1] b;
 void fnC() { sampler c[1]; }
 void fnD() { sampler[1] d; }
+
+/*%%*
+opaque type 'sampler' may not be used in an array
+opaque type 'sampler' may not be used in an array
+opaque type 'sampler' may not be used in an array
+opaque type 'sampler' may not be used in an array
+*%%*/
diff --git a/resources/sksl/errors/OpaqueTypeInInterfaceBlock.sksl b/resources/sksl/errors/OpaqueTypeInInterfaceBlock.sksl
index 0c5e503..519d1dd 100644
--- a/resources/sksl/errors/OpaqueTypeInInterfaceBlock.sksl
+++ b/resources/sksl/errors/OpaqueTypeInInterfaceBlock.sksl
@@ -1 +1,5 @@
 Bad { sampler x; };
+
+/*%%*
+variables of type 'sampler' must be global
+*%%*/
diff --git a/resources/sksl/errors/OpaqueTypeInStruct.sksl b/resources/sksl/errors/OpaqueTypeInStruct.sksl
index cd18704..a21b996 100644
--- a/resources/sksl/errors/OpaqueTypeInStruct.sksl
+++ b/resources/sksl/errors/OpaqueTypeInStruct.sksl
@@ -1,3 +1,7 @@
 struct Bad { sampler x; };
 uniform Bad b;
 void main() {}
+
+/*%%*
+opaque type 'sampler' is not permitted in a struct
+*%%*/
diff --git a/resources/sksl/errors/OpenArray.sksl b/resources/sksl/errors/OpenArray.sksl
index 918a0ba..63de3bb 100644
--- a/resources/sksl/errors/OpenArray.sksl
+++ b/resources/sksl/errors/OpenArray.sksl
@@ -1,3 +1,9 @@
 void main(inout float4 color) {
     color.r[ = ( color.g );
 }
+
+/*%%*
+shader 'main' must be main() or main(float2)
+unknown identifier 'color'
+expected expression, but found '='
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz26700.sksl b/resources/sksl/errors/Ossfuzz26700.sksl
index 6a4e505..f6d9938 100644
--- a/resources/sksl/errors/Ossfuzz26700.sksl
+++ b/resources/sksl/errors/Ossfuzz26700.sksl
@@ -1,2 +1,6 @@
 q { int y; };
 G { int q=_; };
+
+/*%%*
+expected ';', but found '='
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz27614.sksl b/resources/sksl/errors/Ossfuzz27614.sksl
index bb9b8e2..87ceaca 100644
--- a/resources/sksl/errors/Ossfuzz27614.sksl
+++ b/resources/sksl/errors/Ossfuzz27614.sksl
@@ -1 +1,5 @@
 void main() { 0.5 - 0 * ~0 - half2(0) + 1; }
+
+/*%%*
+type mismatch: '-' cannot operate on 'float', 'int'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz27650.sksl b/resources/sksl/errors/Ossfuzz27650.sksl
index 9dec2c7..b715bbf 100644
--- a/resources/sksl/errors/Ossfuzz27650.sksl
+++ b/resources/sksl/errors/Ossfuzz27650.sksl
@@ -1 +1,6 @@
 void main() { int i=9E7; 2+int4(i); }
+
+/*%%*
+expected 'int', but found 'float'
+unknown identifier 'i'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz27663.sksl b/resources/sksl/errors/Ossfuzz27663.sksl
index 432f863..b07dc87 100644
--- a/resources/sksl/errors/Ossfuzz27663.sksl
+++ b/resources/sksl/errors/Ossfuzz27663.sksl
@@ -1 +1,6 @@
 void main() { sk_FragColor = float4(1) / - -half4(0); }
+
+/*%%*
+division by zero
+type mismatch: '=' cannot operate on 'half4', 'float4'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz28050.sksl b/resources/sksl/errors/Ossfuzz28050.sksl
index 21d86a7..854b583 100644
--- a/resources/sksl/errors/Ossfuzz28050.sksl
+++ b/resources/sksl/errors/Ossfuzz28050.sksl
@@ -2,3 +2,7 @@
 void wna()  { an(), float[1](); }
 void na()   { wna(); }
 void main() { na(), na(); }
+
+/*%%*
+invalid arguments to 'float[1]' constructor (expected 1 elements, but found 0)
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz29444.sksl b/resources/sksl/errors/Ossfuzz29444.sksl
index dc07ec1..551334e 100644
--- a/resources/sksl/errors/Ossfuzz29444.sksl
+++ b/resources/sksl/errors/Ossfuzz29444.sksl
@@ -2,3 +2,8 @@
 void  wna()  { an(), float[1](), float[1](); }
 void  na()   { wna(); }
 void  main() { na(), na(); }
+
+/*%%*
+invalid arguments to 'float[1]' constructor (expected 1 elements, but found 0)
+invalid arguments to 'float[1]' constructor (expected 1 elements, but found 0)
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz29845.sksl b/resources/sksl/errors/Ossfuzz29845.sksl
index 3b5b004..9576bf92 100644
--- a/resources/sksl/errors/Ossfuzz29845.sksl
+++ b/resources/sksl/errors/Ossfuzz29845.sksl
@@ -1,3 +1,8 @@
 struct Test {
     l();
     void m();
+
+/*%%*
+no type named 'l'
+expected a type, but found '('
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz29849.sksl b/resources/sksl/errors/Ossfuzz29849.sksl
index 9e00e95..d3039f6 100644
--- a/resources/sksl/errors/Ossfuzz29849.sksl
+++ b/resources/sksl/errors/Ossfuzz29849.sksl
@@ -2,3 +2,7 @@
     if (2 < 2) int a;
     a;
 }
+
+/*%%*
+variable 'a' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz31410.sksl b/resources/sksl/errors/Ossfuzz31410.sksl
index 40c7b9b..fa36f7d 100644
--- a/resources/sksl/errors/Ossfuzz31410.sksl
+++ b/resources/sksl/errors/Ossfuzz31410.sksl
@@ -1,3 +1,7 @@
 void main() {
     sk_FragColor+=(0), 1.*~2;
 }
+
+/*%%*
+type mismatch: '*' cannot operate on 'float', 'int'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz31469.sksl b/resources/sksl/errors/Ossfuzz31469.sksl
index bd23a0c..6f024d5 100644
--- a/resources/sksl/errors/Ossfuzz31469.sksl
+++ b/resources/sksl/errors/Ossfuzz31469.sksl
@@ -1,3 +1,7 @@
 half n() {}
 void S() { -n(); }
 void l() { S(); }
+
+/*%%*
+function 'n' can exit without returning a value
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz32156.sksl b/resources/sksl/errors/Ossfuzz32156.sksl
index b894a24..8387c53 100644
--- a/resources/sksl/errors/Ossfuzz32156.sksl
+++ b/resources/sksl/errors/Ossfuzz32156.sksl
@@ -1 +1,5 @@
 int s[3456*3456*928*48*8*4*544*8*8*544*8*48*8*4*544*184-51488*48*544*5888*48*8*54*544*54*544*5888*48*8*54*544*54];
+
+/*%%*
+array size must be an integer
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz32587.sksl b/resources/sksl/errors/Ossfuzz32587.sksl
index b113c9d..632951b 100644
--- a/resources/sksl/errors/Ossfuzz32587.sksl
+++ b/resources/sksl/errors/Ossfuzz32587.sksl
@@ -1,2 +1,7 @@
 const float x=1, _=x1;
 half x=x*8;
+
+/*%%*
+unknown identifier 'x1'
+expected 'half', but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz32851.sksl b/resources/sksl/errors/Ossfuzz32851.sksl
index 3b0c8bb..d91fb31 100644
--- a/resources/sksl/errors/Ossfuzz32851.sksl
+++ b/resources/sksl/errors/Ossfuzz32851.sksl
@@ -1 +1,6 @@
 int v=6/int2(bool2(0));
+
+/*%%*
+division by zero
+expected 'int', but found 'int2'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz36850.sksl b/resources/sksl/errors/Ossfuzz36850.sksl
index 87b1ce7..57a04fa 100644
--- a/resources/sksl/errors/Ossfuzz36850.sksl
+++ b/resources/sksl/errors/Ossfuzz36850.sksl
@@ -1,2 +1,5 @@
 T { int x; } f[];
 void main() { sk_FragCoord; }
+
+/*%%*
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz37457.sksl b/resources/sksl/errors/Ossfuzz37457.sksl
index 0cdfdaf..eefdfd8 100644
--- a/resources/sksl/errors/Ossfuzz37457.sksl
+++ b/resources/sksl/errors/Ossfuzz37457.sksl
@@ -1 +1,5 @@
 float a[b];
+
+/*%%*
+unknown identifier 'b'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz37465.sksl b/resources/sksl/errors/Ossfuzz37465.sksl
index c16257a..58cd972 100644
--- a/resources/sksl/errors/Ossfuzz37465.sksl
+++ b/resources/sksl/errors/Ossfuzz37465.sksl
@@ -1 +1,5 @@
 float f(const float x) { 5+x; }
+
+/*%%*
+function 'f' can exit without returning a value
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz37469.sksl b/resources/sksl/errors/Ossfuzz37469.sksl
index 3c22758..419b3e9 100644
--- a/resources/sksl/errors/Ossfuzz37469.sksl
+++ b/resources/sksl/errors/Ossfuzz37469.sksl
@@ -1 +1,3 @@
-k{int z;}m[];void main(){}
\ No newline at end of file
+k{int z;}m[];void main(){}
+/*%%*
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz37620.sksl b/resources/sksl/errors/Ossfuzz37620.sksl
index bfbc55b..af9debd 100644
--- a/resources/sksl/errors/Ossfuzz37620.sksl
+++ b/resources/sksl/errors/Ossfuzz37620.sksl
@@ -1 +1,5 @@
 void n() { for(;;exp); }
+
+/*%%*
+expected '(' to begin function call
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38106.sksl b/resources/sksl/errors/Ossfuzz38106.sksl
index 79dbe5c..3f2d5b7 100644
--- a/resources/sksl/errors/Ossfuzz38106.sksl
+++ b/resources/sksl/errors/Ossfuzz38106.sksl
@@ -1 +1,7 @@
 half R = 0 .;
+
+/*%%*
+expected identifier, but found ';'
+expected field name or swizzle mask after '.'
+expected ';', but found ''
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38107.sksl b/resources/sksl/errors/Ossfuzz38107.sksl
index f76dd23..22bfaf7 100644
--- a/resources/sksl/errors/Ossfuzz38107.sksl
+++ b/resources/sksl/errors/Ossfuzz38107.sksl
Binary files differ
diff --git a/resources/sksl/errors/Ossfuzz38108.sksl b/resources/sksl/errors/Ossfuzz38108.sksl
index de4bf01..9f8be49 100644
--- a/resources/sksl/errors/Ossfuzz38108.sksl
+++ b/resources/sksl/errors/Ossfuzz38108.sksl
@@ -1 +1,4 @@
-int a,a;
\ No newline at end of file
+int a,a;
+/*%%*
+symbol 'a' was already defined
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38140.sksl b/resources/sksl/errors/Ossfuzz38140.sksl
index 2515b81..61d2782 100644
--- a/resources/sksl/errors/Ossfuzz38140.sksl
+++ b/resources/sksl/errors/Ossfuzz38140.sksl
@@ -5,3 +5,10 @@
 half4 main(half4 src, half4 dst) {
     return blend_src_over(src, half4(1) - dst);
 }
+
+/*%%*
+function 'half4 blend_src_over(half4 src, half4 dst)' was already defined
+shader 'main' must be main() or main(float2)
+unknown identifier 'src'
+unknown identifier 'dst'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38560.sksl b/resources/sksl/errors/Ossfuzz38560.sksl
index 1b2eab7..225aa33 100644
--- a/resources/sksl/errors/Ossfuzz38560.sksl
+++ b/resources/sksl/errors/Ossfuzz38560.sksl
@@ -1 +1,6 @@
 void n() { for(int r,r;;) int s; }
+
+/*%%*
+symbol 'r' was already defined
+variable 's' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38865.sksl b/resources/sksl/errors/Ossfuzz38865.sksl
index 1ea5b80..62f2254 100644
--- a/resources/sksl/errors/Ossfuzz38865.sksl
+++ b/resources/sksl/errors/Ossfuzz38865.sksl
@@ -1 +1,4 @@
-void c=+
\ No newline at end of file
+void c=+
+/*%%*
+expected expression, but found ''
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz38944.sksl b/resources/sksl/errors/Ossfuzz38944.sksl
index b6b5aa5..e61c834 100644
--- a/resources/sksl/errors/Ossfuzz38944.sksl
+++ b/resources/sksl/errors/Ossfuzz38944.sksl
@@ -1 +1,4 @@
-int a = log(    
\ No newline at end of file
+int a = log(    
+/*%%*
+expected expression, but found ''
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz39000.sksl b/resources/sksl/errors/Ossfuzz39000.sksl
index 6a4e505..f6d9938 100644
--- a/resources/sksl/errors/Ossfuzz39000.sksl
+++ b/resources/sksl/errors/Ossfuzz39000.sksl
@@ -1,2 +1,6 @@
 q { int y; };
 G { int q=_; };
+
+/*%%*
+expected ';', but found '='
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz40427.sksl b/resources/sksl/errors/Ossfuzz40427.sksl
index 39350e6..5a8c3c4 100644
--- a/resources/sksl/errors/Ossfuzz40427.sksl
+++ b/resources/sksl/errors/Ossfuzz40427.sksl
@@ -1 +1,6 @@
 uint s, z = s.0s.0s - 1;
+
+/*%%*
+integer is out of range for type 'uint': -1
+expected 'uint', but found 'uint2'
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz40428.sksl b/resources/sksl/errors/Ossfuzz40428.sksl
index 78dc543..65d41043 100644
--- a/resources/sksl/errors/Ossfuzz40428.sksl
+++ b/resources/sksl/errors/Ossfuzz40428.sksl
@@ -1 +1,6 @@
 int x[~2147483649];
+
+/*%%*
+integer is out of range for type 'int': 2147483649
+array size must be an integer
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz40479.sksl b/resources/sksl/errors/Ossfuzz40479.sksl
index 8ab7eb8..ad7ccb3 100644
--- a/resources/sksl/errors/Ossfuzz40479.sksl
+++ b/resources/sksl/errors/Ossfuzz40479.sksl
@@ -1 +1,9 @@
 void[4016112253 .r1r
+
+/*%%*
+integer is out of range for type 'int': 4016112253
+array size must be an integer
+type 'void' may not be used in an array
+expected ']', but found ''
+expected an identifier, but found ''
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz40660.sksl b/resources/sksl/errors/Ossfuzz40660.sksl
index 6a7a322..de16ac9 100644
--- a/resources/sksl/errors/Ossfuzz40660.sksl
+++ b/resources/sksl/errors/Ossfuzz40660.sksl
@@ -1 +1,10 @@
 half i() { f[0 * (4, int4(3 `` -3689348940
+
+/*%%*
+unknown identifier 'f'
+expected ')' to complete function arguments, but found '`'
+expected ')' to complete expression, but found '`'
+integer is out of range for type 'int': 3689348940
+expected ']' to complete array access expression, but found ''
+expected ';', but found ''
+*%%*/
diff --git a/resources/sksl/errors/Ossfuzz44045.sksl b/resources/sksl/errors/Ossfuzz44045.sksl
index d00bf54..44ad4aa 100644
--- a/resources/sksl/errors/Ossfuzz44045.sksl
+++ b/resources/sksl/errors/Ossfuzz44045.sksl
@@ -1 +1,6 @@
 int[int3(half3(int3(half3(662666666.*6))))[1]] x;
+
+/*%%*
+integer is out of range for type 'int': 3976000000
+array size must be positive
+*%%*/
diff --git a/resources/sksl/errors/OverflowFloatLiteral.sksl b/resources/sksl/errors/OverflowFloatLiteral.sksl
index ed0cfb1..0e9f93e 100644
--- a/resources/sksl/errors/OverflowFloatLiteral.sksl
+++ b/resources/sksl/errors/OverflowFloatLiteral.sksl
@@ -1,3 +1,8 @@
 void main() {
     sk_FragColor.x = half4(3.41e+38);
 }
+
+/*%%*
+floating-point value is too large: 3.41e+38
+type mismatch: '=' cannot operate on 'half', 'half4'
+*%%*/
diff --git a/resources/sksl/errors/OverflowInlinedLiteral.sksl b/resources/sksl/errors/OverflowInlinedLiteral.sksl
index f89d677..3d30575 100644
--- a/resources/sksl/errors/OverflowInlinedLiteral.sksl
+++ b/resources/sksl/errors/OverflowInlinedLiteral.sksl
@@ -25,3 +25,12 @@
     negate_int4(int4(-2147483648));
 }
 
+
+/*%%*
+integer is out of range for type 'short': 99999
+integer is out of range for type 'short': 67890
+integer is out of range for type 'int': 5000000000
+integer is out of range for type 'int': 3000000000
+integer is out of range for type 'short': 32768
+integer is out of range for type 'int': 2147483648
+*%%*/
diff --git a/resources/sksl/errors/OverflowInt64Literal.sksl b/resources/sksl/errors/OverflowInt64Literal.sksl
index a651ea8..d6a695b 100644
--- a/resources/sksl/errors/OverflowInt64Literal.sksl
+++ b/resources/sksl/errors/OverflowInt64Literal.sksl
@@ -1 +1,5 @@
 const int not_five = 18446744073709551621; // actually 0x10000000000000005
+
+/*%%*
+integer is too large: 18446744073709551621
+*%%*/
diff --git a/resources/sksl/errors/OverflowIntLiteral.sksl b/resources/sksl/errors/OverflowIntLiteral.sksl
index 5b529f3..ba27e60 100644
--- a/resources/sksl/errors/OverflowIntLiteral.sksl
+++ b/resources/sksl/errors/OverflowIntLiteral.sksl
@@ -10,3 +10,12 @@
 
 int   cast_int   = int(2147483648.);                    // error
 short cast_short = short(32768.);                       // error
+
+/*%%*
+integer is out of range for type 'int': -2147483649
+integer is out of range for type 'int': 2147483648
+integer is out of range for type 'short': -32769
+integer is out of range for type 'short': 32768
+integer is out of range for type 'int': 2147483648
+integer is out of range for type 'short': 32768
+*%%*/
diff --git a/resources/sksl/errors/OverflowParamArraySize.sksl b/resources/sksl/errors/OverflowParamArraySize.sksl
index 74b4fa7..4927ced 100644
--- a/resources/sksl/errors/OverflowParamArraySize.sksl
+++ b/resources/sksl/errors/OverflowParamArraySize.sksl
@@ -1 +1,6 @@
 void fn(int arr[4294967296]);
+
+/*%%*
+integer is too large: 4294967296
+array size must be positive
+*%%*/
diff --git a/resources/sksl/errors/OverflowUintLiteral.sksl b/resources/sksl/errors/OverflowUintLiteral.sksl
index 6e017c2..4e6913f 100644
--- a/resources/sksl/errors/OverflowUintLiteral.sksl
+++ b/resources/sksl/errors/OverflowUintLiteral.sksl
@@ -10,3 +10,12 @@
 
 uint   cast_int   = uint(4294967296.);                 // error
 ushort cast_short = ushort(65536.);                    // error
+
+/*%%*
+integer is out of range for type 'uint': -1
+integer is too large: 4294967296
+integer is out of range for type 'ushort': -1
+integer is out of range for type 'ushort': 65536
+integer is out of range for type 'uint': 4294967296
+integer is out of range for type 'ushort': 65536
+*%%*/
diff --git a/resources/sksl/errors/PrecisionQualifiersDisallowed.sksl b/resources/sksl/errors/PrecisionQualifiersDisallowed.sksl
index ee1f7ed..ac46e81 100644
--- a/resources/sksl/errors/PrecisionQualifiersDisallowed.sksl
+++ b/resources/sksl/errors/PrecisionQualifiersDisallowed.sksl
@@ -2,3 +2,9 @@
 void h() { highp int x; }
 void m() { mediump int x; }
 void l() { lowp int x; }
+
+/*%%*
+precision qualifiers are not allowed
+precision qualifiers are not allowed
+precision qualifiers are not allowed
+*%%*/
diff --git a/resources/sksl/errors/PrivateTypes.sksl b/resources/sksl/errors/PrivateTypes.sksl
index a1b9845..93a35d7 100644
--- a/resources/sksl/errors/PrivateTypes.sksl
+++ b/resources/sksl/errors/PrivateTypes.sksl
@@ -10,3 +10,12 @@
 void vardecl_private()       { $genType g; }
 void ctor_mat_private()      { $mat(0); }
 void ctor_literal_private()  { $floatLiteral(0); }
+
+/*%%*
+type '$mat' is private
+type '$bvec' is private
+type '$ivec' is private
+type '$genType' is private
+type '$mat' is private
+type '$floatLiteral' is private
+*%%*/
diff --git a/resources/sksl/errors/PrivateVariables.sksl b/resources/sksl/errors/PrivateVariables.sksl
index d4623b9..00bd28b 100644
--- a/resources/sksl/errors/PrivateVariables.sksl
+++ b/resources/sksl/errors/PrivateVariables.sksl
@@ -3,3 +3,10 @@
     float $c[2];
     bool4 $d;
 }
+
+/*%%*
+name '$a' is reserved
+name '$b' is reserved
+name '$c' is reserved
+name '$d' is reserved
+*%%*/
diff --git a/resources/sksl/errors/ProgramTooLarge_Globals.sksl b/resources/sksl/errors/ProgramTooLarge_Globals.sksl
index bd3fa0f..af0ad17 100644
--- a/resources/sksl/errors/ProgramTooLarge_Globals.sksl
+++ b/resources/sksl/errors/ProgramTooLarge_Globals.sksl
@@ -11,3 +11,7 @@
 S extra_large[100];
 S xxl[50000];
 
+
+/*%%*
+global variable 'extra_large' exceeds the size limit
+*%%*/
diff --git a/resources/sksl/errors/ProgramTooLarge_Stack.sksl b/resources/sksl/errors/ProgramTooLarge_Stack.sksl
index b01e670..127f056 100644
--- a/resources/sksl/errors/ProgramTooLarge_Stack.sksl
+++ b/resources/sksl/errors/ProgramTooLarge_Stack.sksl
@@ -10,3 +10,7 @@
     S big_chungus;
     S no_report; // we don't need to report overflows past the first
 }
+
+/*%%*
+variable 'big_chungus' exceeds the stack size limit
+*%%*/
diff --git a/resources/sksl/errors/PrototypeInFuncBody.sksl b/resources/sksl/errors/PrototypeInFuncBody.sksl
index a9e88cc..cca9968 100644
--- a/resources/sksl/errors/PrototypeInFuncBody.sksl
+++ b/resources/sksl/errors/PrototypeInFuncBody.sksl
@@ -1,3 +1,8 @@
 void main() {
     float x();
 }
+
+/*%%*
+expected ';', but found '('
+expected expression, but found ')'
+*%%*/
diff --git a/resources/sksl/errors/RedeclareBasicType.sksl b/resources/sksl/errors/RedeclareBasicType.sksl
index 4079d8c..a094552 100644
--- a/resources/sksl/errors/RedeclareBasicType.sksl
+++ b/resources/sksl/errors/RedeclareBasicType.sksl
@@ -1 +1,5 @@
 float int;
+
+/*%%*
+expected an identifier, but found type 'int'
+*%%*/
diff --git a/resources/sksl/errors/RedeclareSamplerType.sksl b/resources/sksl/errors/RedeclareSamplerType.sksl
index 6c3a204..6f065e9 100644
--- a/resources/sksl/errors/RedeclareSamplerType.sksl
+++ b/resources/sksl/errors/RedeclareSamplerType.sksl
@@ -1 +1,5 @@
 sampler sampler;
+
+/*%%*
+expected an identifier, but found type 'sampler'
+*%%*/
diff --git a/resources/sksl/errors/RedeclareStruct.sksl b/resources/sksl/errors/RedeclareStruct.sksl
index de433a5..f4704e9 100644
--- a/resources/sksl/errors/RedeclareStruct.sksl
+++ b/resources/sksl/errors/RedeclareStruct.sksl
@@ -1,3 +1,7 @@
 struct void {
     int x;
 };
+
+/*%%*
+expected an identifier, but found type 'void'
+*%%*/
diff --git a/resources/sksl/errors/RedeclareStructTypeWithName.sksl b/resources/sksl/errors/RedeclareStructTypeWithName.sksl
index a19e868..ef911dd 100644
--- a/resources/sksl/errors/RedeclareStructTypeWithName.sksl
+++ b/resources/sksl/errors/RedeclareStructTypeWithName.sksl
@@ -1,3 +1,7 @@
 struct foo {
     int x;
 } foo;
+
+/*%%*
+symbol 'foo' was already defined
+*%%*/
diff --git a/resources/sksl/errors/RedeclareUserType.sksl b/resources/sksl/errors/RedeclareUserType.sksl
index 4db23d1..d131fb4 100644
--- a/resources/sksl/errors/RedeclareUserType.sksl
+++ b/resources/sksl/errors/RedeclareUserType.sksl
@@ -1,2 +1,6 @@
 struct S { int x; };
 float S;
+
+/*%%*
+symbol 'S' was already defined
+*%%*/
diff --git a/resources/sksl/errors/RedeclareVariable.sksl b/resources/sksl/errors/RedeclareVariable.sksl
index 67ba3a8..e5ef434 100644
--- a/resources/sksl/errors/RedeclareVariable.sksl
+++ b/resources/sksl/errors/RedeclareVariable.sksl
@@ -13,3 +13,14 @@
     float y[4];
     S y;
 }
+
+/*%%*
+symbol 'x' was already defined
+symbol 'x' was already defined
+symbol 'x' was already defined
+symbol 'x' was already defined
+symbol 'y' was already defined
+symbol 'y' was already defined
+symbol 'y' was already defined
+symbol 'y' was already defined
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameAsm.sksl b/resources/sksl/errors/ReservedNameAsm.sksl
index a1f9976..fe19894 100644
--- a/resources/sksl/errors/ReservedNameAsm.sksl
+++ b/resources/sksl/errors/ReservedNameAsm.sksl
@@ -1 +1,5 @@
 int asm;
+
+/*%%*
+'asm' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameAttribute.sksl b/resources/sksl/errors/ReservedNameAttribute.sksl
index 53eda96..6e5dadd 100644
--- a/resources/sksl/errors/ReservedNameAttribute.sksl
+++ b/resources/sksl/errors/ReservedNameAttribute.sksl
@@ -1 +1,5 @@
 int attribute;
+
+/*%%*
+'attribute' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameCast.sksl b/resources/sksl/errors/ReservedNameCast.sksl
index 33774ff..de66633 100644
--- a/resources/sksl/errors/ReservedNameCast.sksl
+++ b/resources/sksl/errors/ReservedNameCast.sksl
@@ -1 +1,5 @@
 int cast;
+
+/*%%*
+'cast' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameDouble.sksl b/resources/sksl/errors/ReservedNameDouble.sksl
index 278ca4b..1d65060 100644
--- a/resources/sksl/errors/ReservedNameDouble.sksl
+++ b/resources/sksl/errors/ReservedNameDouble.sksl
@@ -1 +1,5 @@
 int double;
+
+/*%%*
+'double' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameDvec2.sksl b/resources/sksl/errors/ReservedNameDvec2.sksl
index 29d2e44..3ba0c4f 100644
--- a/resources/sksl/errors/ReservedNameDvec2.sksl
+++ b/resources/sksl/errors/ReservedNameDvec2.sksl
@@ -1 +1,5 @@
 int dvec2;
+
+/*%%*
+'dvec2' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameDvec3.sksl b/resources/sksl/errors/ReservedNameDvec3.sksl
index 1a25003..0e2e3ff 100644
--- a/resources/sksl/errors/ReservedNameDvec3.sksl
+++ b/resources/sksl/errors/ReservedNameDvec3.sksl
@@ -1 +1,5 @@
 int dvec3;
+
+/*%%*
+'dvec3' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameDvec4.sksl b/resources/sksl/errors/ReservedNameDvec4.sksl
index 1292810..2090c56 100644
--- a/resources/sksl/errors/ReservedNameDvec4.sksl
+++ b/resources/sksl/errors/ReservedNameDvec4.sksl
@@ -1 +1,5 @@
 int dvec4;
+
+/*%%*
+'dvec4' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameEnum.sksl b/resources/sksl/errors/ReservedNameEnum.sksl
index 817c703..98cca13 100644
--- a/resources/sksl/errors/ReservedNameEnum.sksl
+++ b/resources/sksl/errors/ReservedNameEnum.sksl
@@ -1 +1,5 @@
 int enum;
+
+/*%%*
+'enum' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameExtern.sksl b/resources/sksl/errors/ReservedNameExtern.sksl
index ae2f3fa..c06581c 100644
--- a/resources/sksl/errors/ReservedNameExtern.sksl
+++ b/resources/sksl/errors/ReservedNameExtern.sksl
@@ -1 +1,5 @@
 int extern;
+
+/*%%*
+'extern' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameExternal.sksl b/resources/sksl/errors/ReservedNameExternal.sksl
index eabb1e7..d18c27e 100644
--- a/resources/sksl/errors/ReservedNameExternal.sksl
+++ b/resources/sksl/errors/ReservedNameExternal.sksl
@@ -1 +1,5 @@
 int external;
+
+/*%%*
+'external' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameFixed.sksl b/resources/sksl/errors/ReservedNameFixed.sksl
index 17f4522..693bbe0 100644
--- a/resources/sksl/errors/ReservedNameFixed.sksl
+++ b/resources/sksl/errors/ReservedNameFixed.sksl
@@ -1 +1,5 @@
 int fixed;
+
+/*%%*
+'fixed' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameFvec2.sksl b/resources/sksl/errors/ReservedNameFvec2.sksl
index 31a9412..a1c7a5e 100644
--- a/resources/sksl/errors/ReservedNameFvec2.sksl
+++ b/resources/sksl/errors/ReservedNameFvec2.sksl
@@ -1 +1,5 @@
 int fvec2;
+
+/*%%*
+'fvec2' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameFvec3.sksl b/resources/sksl/errors/ReservedNameFvec3.sksl
index 4d9bdff..c220eba 100644
--- a/resources/sksl/errors/ReservedNameFvec3.sksl
+++ b/resources/sksl/errors/ReservedNameFvec3.sksl
@@ -1 +1,5 @@
 int fvec3;
+
+/*%%*
+'fvec3' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameFvec4.sksl b/resources/sksl/errors/ReservedNameFvec4.sksl
index 89adeab..2fe2c47 100644
--- a/resources/sksl/errors/ReservedNameFvec4.sksl
+++ b/resources/sksl/errors/ReservedNameFvec4.sksl
@@ -1 +1,5 @@
 int fvec4;
+
+/*%%*
+'fvec4' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameGoto.sksl b/resources/sksl/errors/ReservedNameGoto.sksl
index 5c9366d..a14eac4 100644
--- a/resources/sksl/errors/ReservedNameGoto.sksl
+++ b/resources/sksl/errors/ReservedNameGoto.sksl
@@ -1 +1,5 @@
 int goto;
+
+/*%%*
+'goto' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameHvec2.sksl b/resources/sksl/errors/ReservedNameHvec2.sksl
index 673d44b..bb8ba50 100644
--- a/resources/sksl/errors/ReservedNameHvec2.sksl
+++ b/resources/sksl/errors/ReservedNameHvec2.sksl
@@ -1 +1,5 @@
 int hvec2;
+
+/*%%*
+'hvec2' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameHvec3.sksl b/resources/sksl/errors/ReservedNameHvec3.sksl
index 0c96088..cd0d12e 100644
--- a/resources/sksl/errors/ReservedNameHvec3.sksl
+++ b/resources/sksl/errors/ReservedNameHvec3.sksl
@@ -1 +1,5 @@
 int hvec3;
+
+/*%%*
+'hvec3' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameHvec4.sksl b/resources/sksl/errors/ReservedNameHvec4.sksl
index 57b5589..cb13011 100644
--- a/resources/sksl/errors/ReservedNameHvec4.sksl
+++ b/resources/sksl/errors/ReservedNameHvec4.sksl
@@ -1 +1,5 @@
 int hvec4;
+
+/*%%*
+'hvec4' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameInput.sksl b/resources/sksl/errors/ReservedNameInput.sksl
index 9b75377..e242308 100644
--- a/resources/sksl/errors/ReservedNameInput.sksl
+++ b/resources/sksl/errors/ReservedNameInput.sksl
@@ -1 +1,5 @@
 int input;
+
+/*%%*
+'input' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameInterface.sksl b/resources/sksl/errors/ReservedNameInterface.sksl
index e3c734f..3daf3ec 100644
--- a/resources/sksl/errors/ReservedNameInterface.sksl
+++ b/resources/sksl/errors/ReservedNameInterface.sksl
@@ -1 +1,5 @@
 int interface;
+
+/*%%*
+'interface' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameInvariant.sksl b/resources/sksl/errors/ReservedNameInvariant.sksl
index 61a60d3..6eb9edf 100644
--- a/resources/sksl/errors/ReservedNameInvariant.sksl
+++ b/resources/sksl/errors/ReservedNameInvariant.sksl
@@ -1 +1,5 @@
 int invariant;
+
+/*%%*
+'invariant' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameLong.sksl b/resources/sksl/errors/ReservedNameLong.sksl
index a1dc6ac..cea68b3 100644
--- a/resources/sksl/errors/ReservedNameLong.sksl
+++ b/resources/sksl/errors/ReservedNameLong.sksl
@@ -1 +1,5 @@
 int long;
+
+/*%%*
+'long' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameNamespace.sksl b/resources/sksl/errors/ReservedNameNamespace.sksl
index 7d1b138..14e5dbb 100644
--- a/resources/sksl/errors/ReservedNameNamespace.sksl
+++ b/resources/sksl/errors/ReservedNameNamespace.sksl
@@ -1 +1,5 @@
 int namespace;
+
+/*%%*
+'namespace' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameOutput.sksl b/resources/sksl/errors/ReservedNameOutput.sksl
index 8038322..069d543 100644
--- a/resources/sksl/errors/ReservedNameOutput.sksl
+++ b/resources/sksl/errors/ReservedNameOutput.sksl
@@ -1 +1,5 @@
 int output;
+
+/*%%*
+'output' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNamePacked.sksl b/resources/sksl/errors/ReservedNamePacked.sksl
index 1d12190..f143575 100644
--- a/resources/sksl/errors/ReservedNamePacked.sksl
+++ b/resources/sksl/errors/ReservedNamePacked.sksl
@@ -1 +1,5 @@
 int packed;
+
+/*%%*
+'packed' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNamePrecision.sksl b/resources/sksl/errors/ReservedNamePrecision.sksl
index 567eb1f..2fe4c28 100644
--- a/resources/sksl/errors/ReservedNamePrecision.sksl
+++ b/resources/sksl/errors/ReservedNamePrecision.sksl
@@ -1 +1,5 @@
 int precision;
+
+/*%%*
+'precision' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNamePublic.sksl b/resources/sksl/errors/ReservedNamePublic.sksl
index e8c2ea7..fefe192 100644
--- a/resources/sksl/errors/ReservedNamePublic.sksl
+++ b/resources/sksl/errors/ReservedNamePublic.sksl
@@ -1 +1,5 @@
 int public;
+
+/*%%*
+'public' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSampler1DShadow.sksl b/resources/sksl/errors/ReservedNameSampler1DShadow.sksl
index adcbafe..7f48177 100644
--- a/resources/sksl/errors/ReservedNameSampler1DShadow.sksl
+++ b/resources/sksl/errors/ReservedNameSampler1DShadow.sksl
@@ -1 +1,5 @@
 int sampler1DShadow;
+
+/*%%*
+'sampler1DShadow' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSampler2DRectShadow.sksl b/resources/sksl/errors/ReservedNameSampler2DRectShadow.sksl
index 9c1c9e2..f579442 100644
--- a/resources/sksl/errors/ReservedNameSampler2DRectShadow.sksl
+++ b/resources/sksl/errors/ReservedNameSampler2DRectShadow.sksl
@@ -1 +1,5 @@
 int sampler2DRectShadow;
+
+/*%%*
+'sampler2DRectShadow' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSampler2DShadow.sksl b/resources/sksl/errors/ReservedNameSampler2DShadow.sksl
index 6342c24..1984327 100644
--- a/resources/sksl/errors/ReservedNameSampler2DShadow.sksl
+++ b/resources/sksl/errors/ReservedNameSampler2DShadow.sksl
@@ -1 +1,5 @@
 int sampler2DShadow;
+
+/*%%*
+'sampler2DShadow' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSampler3DRect.sksl b/resources/sksl/errors/ReservedNameSampler3DRect.sksl
index d8862f6..20eb001 100644
--- a/resources/sksl/errors/ReservedNameSampler3DRect.sksl
+++ b/resources/sksl/errors/ReservedNameSampler3DRect.sksl
@@ -1 +1,5 @@
 int sampler3DRect;
+
+/*%%*
+'sampler3DRect' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSamplerCube.sksl b/resources/sksl/errors/ReservedNameSamplerCube.sksl
index 9695e19..607a9f9 100644
--- a/resources/sksl/errors/ReservedNameSamplerCube.sksl
+++ b/resources/sksl/errors/ReservedNameSamplerCube.sksl
@@ -1 +1,5 @@
 int samplerCube;
+
+/*%%*
+'samplerCube' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSizeof.sksl b/resources/sksl/errors/ReservedNameSizeof.sksl
index 777754b..9157a95 100644
--- a/resources/sksl/errors/ReservedNameSizeof.sksl
+++ b/resources/sksl/errors/ReservedNameSizeof.sksl
@@ -1 +1,5 @@
 int sizeof;
+
+/*%%*
+'sizeof' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameStatic.sksl b/resources/sksl/errors/ReservedNameStatic.sksl
index 6187f82..9668851 100644
--- a/resources/sksl/errors/ReservedNameStatic.sksl
+++ b/resources/sksl/errors/ReservedNameStatic.sksl
@@ -1 +1,5 @@
 int static;
+
+/*%%*
+'static' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameSuperp.sksl b/resources/sksl/errors/ReservedNameSuperp.sksl
index 0cd0674..9f85eea 100644
--- a/resources/sksl/errors/ReservedNameSuperp.sksl
+++ b/resources/sksl/errors/ReservedNameSuperp.sksl
@@ -1 +1,5 @@
 int superp;
+
+/*%%*
+'superp' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameTemplate.sksl b/resources/sksl/errors/ReservedNameTemplate.sksl
index 7b4e44b..0e3a863 100644
--- a/resources/sksl/errors/ReservedNameTemplate.sksl
+++ b/resources/sksl/errors/ReservedNameTemplate.sksl
@@ -1 +1,5 @@
 int template;
+
+/*%%*
+'template' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameThis.sksl b/resources/sksl/errors/ReservedNameThis.sksl
index d0a833d..4961a72 100644
--- a/resources/sksl/errors/ReservedNameThis.sksl
+++ b/resources/sksl/errors/ReservedNameThis.sksl
@@ -1 +1,5 @@
 int this;
+
+/*%%*
+'this' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameTypedef.sksl b/resources/sksl/errors/ReservedNameTypedef.sksl
index 7ed7e00..f373c9d 100644
--- a/resources/sksl/errors/ReservedNameTypedef.sksl
+++ b/resources/sksl/errors/ReservedNameTypedef.sksl
@@ -1 +1,5 @@
 int typedef;
+
+/*%%*
+'typedef' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameUnion.sksl b/resources/sksl/errors/ReservedNameUnion.sksl
index e54b122..9e4c176 100644
--- a/resources/sksl/errors/ReservedNameUnion.sksl
+++ b/resources/sksl/errors/ReservedNameUnion.sksl
@@ -1 +1,5 @@
 int union;
+
+/*%%*
+'union' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameUnsigned.sksl b/resources/sksl/errors/ReservedNameUnsigned.sksl
index 8e0663c..f0f9271 100644
--- a/resources/sksl/errors/ReservedNameUnsigned.sksl
+++ b/resources/sksl/errors/ReservedNameUnsigned.sksl
@@ -1 +1,5 @@
 int unsigned;
+
+/*%%*
+'unsigned' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameUsing.sksl b/resources/sksl/errors/ReservedNameUsing.sksl
index 91bf9c4..bc24629 100644
--- a/resources/sksl/errors/ReservedNameUsing.sksl
+++ b/resources/sksl/errors/ReservedNameUsing.sksl
@@ -1 +1,5 @@
 int using;
+
+/*%%*
+'using' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameVarying.sksl b/resources/sksl/errors/ReservedNameVarying.sksl
index 00c5b45..32856f7 100644
--- a/resources/sksl/errors/ReservedNameVarying.sksl
+++ b/resources/sksl/errors/ReservedNameVarying.sksl
@@ -1 +1,5 @@
 int varying;
+
+/*%%*
+'varying' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReservedNameVolatile.sksl b/resources/sksl/errors/ReservedNameVolatile.sksl
index fa9e67a..d49e9d1 100644
--- a/resources/sksl/errors/ReservedNameVolatile.sksl
+++ b/resources/sksl/errors/ReservedNameVolatile.sksl
@@ -1 +1,5 @@
 int volatile;
+
+/*%%*
+'volatile' is a reserved word
+*%%*/
diff --git a/resources/sksl/errors/ReturnDifferentType.sksl b/resources/sksl/errors/ReturnDifferentType.sksl
index 5d258e4..ffd0ed9 100644
--- a/resources/sksl/errors/ReturnDifferentType.sksl
+++ b/resources/sksl/errors/ReturnDifferentType.sksl
@@ -1,2 +1,6 @@
 int main() { return 1; }
 void main() {}
+
+/*%%*
+functions 'void main()' and 'int main()' differ only in return type
+*%%*/
diff --git a/resources/sksl/errors/ReturnFromVoid.sksl b/resources/sksl/errors/ReturnFromVoid.sksl
index 35d09c8..6ba4a3d 100644
--- a/resources/sksl/errors/ReturnFromVoid.sksl
+++ b/resources/sksl/errors/ReturnFromVoid.sksl
@@ -1,3 +1,9 @@
 void a() { return true; }
 void b() { return b; }
 void c() { return int; }
+
+/*%%*
+may not return a value from a void function
+may not return a value from a void function
+may not return a value from a void function
+*%%*/
diff --git a/resources/sksl/errors/ReturnMissingValue.sksl b/resources/sksl/errors/ReturnMissingValue.sksl
index fe3fae5..42b03f8 100644
--- a/resources/sksl/errors/ReturnMissingValue.sksl
+++ b/resources/sksl/errors/ReturnMissingValue.sksl
@@ -1 +1,5 @@
 int foo() { return; }
+
+/*%%*
+expected function to return 'int'
+*%%*/
diff --git a/resources/sksl/errors/ReturnTypeMismatch.sksl b/resources/sksl/errors/ReturnTypeMismatch.sksl
index ee50b6e..b81f85c 100644
--- a/resources/sksl/errors/ReturnTypeMismatch.sksl
+++ b/resources/sksl/errors/ReturnTypeMismatch.sksl
@@ -1 +1,5 @@
 int foo() { return 1.0; }
+
+/*%%*
+expected 'int', but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/SelfReferentialInitializerExpression.sksl b/resources/sksl/errors/SelfReferentialInitializerExpression.sksl
index 3d06758..0fec0a0 100644
--- a/resources/sksl/errors/SelfReferentialInitializerExpression.sksl
+++ b/resources/sksl/errors/SelfReferentialInitializerExpression.sksl
@@ -1,2 +1,6 @@
 float foo(float v) { return v; }
 void main() { float x = foo(x); }
+
+/*%%*
+unknown identifier 'x'
+*%%*/
diff --git a/resources/sksl/errors/SpuriousFloat.sksl b/resources/sksl/errors/SpuriousFloat.sksl
index 5601612..488ec76 100644
--- a/resources/sksl/errors/SpuriousFloat.sksl
+++ b/resources/sksl/errors/SpuriousFloat.sksl
@@ -2,3 +2,7 @@
     float x;
     x = 1.5 2.5;
 }
+
+/*%%*
+expected ';', but found '2.5'
+*%%*/
diff --git a/resources/sksl/errors/StaticIfTest.sksl b/resources/sksl/errors/StaticIfTest.sksl
index b9a7667..ad01e37 100644
--- a/resources/sksl/errors/StaticIfTest.sksl
+++ b/resources/sksl/errors/StaticIfTest.sksl
@@ -5,3 +5,7 @@
         sk_FragColor = half4(1);
     }
 }
+
+/*%%*
+static if has non-static test
+*%%*/
diff --git a/resources/sksl/errors/StaticSwitchConditionalBreak.sksl b/resources/sksl/errors/StaticSwitchConditionalBreak.sksl
index 146d9d1..6df6e63 100644
--- a/resources/sksl/errors/StaticSwitchConditionalBreak.sksl
+++ b/resources/sksl/errors/StaticSwitchConditionalBreak.sksl
@@ -10,3 +10,7 @@
             sk_FragColor = half4(0);
     }
 }
+
+/*%%*
+static switch contains non-static conditional exit
+*%%*/
diff --git a/resources/sksl/errors/StaticSwitchTest.sksl b/resources/sksl/errors/StaticSwitchTest.sksl
index 5c66d85..9ce1506 100644
--- a/resources/sksl/errors/StaticSwitchTest.sksl
+++ b/resources/sksl/errors/StaticSwitchTest.sksl
@@ -8,3 +8,7 @@
             return half4(0);
     }
 }
+
+/*%%*
+static switch has non-static test
+*%%*/
diff --git a/resources/sksl/errors/StaticSwitchWithConditionalBreak.sksl b/resources/sksl/errors/StaticSwitchWithConditionalBreak.sksl
index b3e12135..b1acceb 100644
--- a/resources/sksl/errors/StaticSwitchWithConditionalBreak.sksl
+++ b/resources/sksl/errors/StaticSwitchWithConditionalBreak.sksl
@@ -1,3 +1,7 @@
 uniform half4 testInputs;
 
 void test_break()    { @switch (1) { case 1: if (testInputs.x > 2) break; } }
+
+/*%%*
+static switch contains non-static conditional exit
+*%%*/
diff --git a/resources/sksl/errors/StaticSwitchWithConditionalContinue.sksl b/resources/sksl/errors/StaticSwitchWithConditionalContinue.sksl
index aabefa2..dcdf411 100644
--- a/resources/sksl/errors/StaticSwitchWithConditionalContinue.sksl
+++ b/resources/sksl/errors/StaticSwitchWithConditionalContinue.sksl
@@ -1,3 +1,7 @@
 uniform half4 testInputs;
 
 void test_continue() { for (;;) { @switch (1) { case 1: if (testInputs.x > 3) continue; } } }
+
+/*%%*
+static switch contains non-static conditional exit
+*%%*/
diff --git a/resources/sksl/errors/StaticSwitchWithConditionalReturn.sksl b/resources/sksl/errors/StaticSwitchWithConditionalReturn.sksl
index 77c1d07..4c44d73 100644
--- a/resources/sksl/errors/StaticSwitchWithConditionalReturn.sksl
+++ b/resources/sksl/errors/StaticSwitchWithConditionalReturn.sksl
@@ -1,3 +1,7 @@
 uniform half4 testInputs;
 
 void test_return()   { @switch (1) { case 1: if (testInputs.x > 1) return; } }
+
+/*%%*
+static switch contains non-static conditional exit
+*%%*/
diff --git a/resources/sksl/errors/StructMemberReservedName.sksl b/resources/sksl/errors/StructMemberReservedName.sksl
index f0a1788..030d05f 100644
--- a/resources/sksl/errors/StructMemberReservedName.sksl
+++ b/resources/sksl/errors/StructMemberReservedName.sksl
@@ -5,3 +5,7 @@
 float4 main() {
     return s.float.xxxx;
 }
+
+/*%%*
+expected an identifier, but found type 'float'
+*%%*/
diff --git a/resources/sksl/errors/StructNameWithoutIdentifier.sksl b/resources/sksl/errors/StructNameWithoutIdentifier.sksl
index 987d9e0..f0c94f2 100644
--- a/resources/sksl/errors/StructNameWithoutIdentifier.sksl
+++ b/resources/sksl/errors/StructNameWithoutIdentifier.sksl
@@ -1,2 +1,6 @@
 struct S { float x; };
 S;
+
+/*%%*
+expected an identifier, but found ';'
+*%%*/
diff --git a/resources/sksl/errors/StructTooDeeplyNested.sksl b/resources/sksl/errors/StructTooDeeplyNested.sksl
index 65e1369..72221b2 100644
--- a/resources/sksl/errors/StructTooDeeplyNested.sksl
+++ b/resources/sksl/errors/StructTooDeeplyNested.sksl
@@ -7,3 +7,7 @@
 struct S7 { S6 x; };
 struct S8 { S7 x; };
 struct too_deep { S8 x; };
+
+/*%%*
+struct 'too_deep' is too deeply nested
+*%%*/
diff --git a/resources/sksl/errors/StructVariableReservedName.sksl b/resources/sksl/errors/StructVariableReservedName.sksl
index a05010e..2dd206e 100644
--- a/resources/sksl/errors/StructVariableReservedName.sksl
+++ b/resources/sksl/errors/StructVariableReservedName.sksl
@@ -5,3 +5,7 @@
 float4 main() {
     return float.f.xxxx;
 }
+
+/*%%*
+expected ';', but found 'float'
+*%%*/
diff --git a/resources/sksl/errors/SwitchDuplicateCase.sksl b/resources/sksl/errors/SwitchDuplicateCase.sksl
index c817049..30be7cd 100644
--- a/resources/sksl/errors/SwitchDuplicateCase.sksl
+++ b/resources/sksl/errors/SwitchDuplicateCase.sksl
@@ -6,3 +6,7 @@
             break;
     }
 }
+
+/*%%*
+duplicate case value '0'
+*%%*/
diff --git a/resources/sksl/errors/SwitchDuplicateDefault.sksl b/resources/sksl/errors/SwitchDuplicateDefault.sksl
index 4bdb94a..c18a033 100644
--- a/resources/sksl/errors/SwitchDuplicateDefault.sksl
+++ b/resources/sksl/errors/SwitchDuplicateDefault.sksl
@@ -5,3 +5,7 @@
             break;
     }
 }
+
+/*%%*
+expected expression, but found 'default'
+*%%*/
diff --git a/resources/sksl/errors/SwitchTypes.sksl b/resources/sksl/errors/SwitchTypes.sksl
index 911f8db..d0f182b 100644
--- a/resources/sksl/errors/SwitchTypes.sksl
+++ b/resources/sksl/errors/SwitchTypes.sksl
@@ -19,3 +19,15 @@
 void switch_case_uniform_int()     { switch (1) { case ui: break; } }
 void switch_case_const_float_var() { switch (1) { case cf: break; } }
 void switch_case_int_var()         { switch (1) { case i: break; } }
+
+/*%%*
+expected 'int', but found 'float2'
+expected 'int', but found 'float2'
+expected 'int', but found 'float'
+expected 'int', but found 'float'
+expected 'int', but found 'float'
+expected 'int', but found 'float'
+case value must be a constant integer
+expected 'int', but found 'float'
+case value must be a constant integer
+*%%*/
diff --git a/resources/sksl/errors/SwitchWithContinueInside.sksl b/resources/sksl/errors/SwitchWithContinueInside.sksl
index 8015e20..786a6e6 100644
--- a/resources/sksl/errors/SwitchWithContinueInside.sksl
+++ b/resources/sksl/errors/SwitchWithContinueInside.sksl
@@ -8,3 +8,8 @@
     while (true) @switch (0) { default: continue; }
     for (;;) @switch (5) { case 5: continue; }
 }
+
+/*%%*
+continue statement cannot be used in a switch
+continue statement cannot be used in a switch
+*%%*/
diff --git a/resources/sksl/errors/SwizzleConstantOutput.sksl b/resources/sksl/errors/SwizzleConstantOutput.sksl
index 9bbd9e4..d9d31ff 100644
--- a/resources/sksl/errors/SwizzleConstantOutput.sksl
+++ b/resources/sksl/errors/SwizzleConstantOutput.sksl
@@ -2,3 +2,7 @@
     float4 test = float4(1);
     test.xyz0 = float4(1);
 }
+
+/*%%*
+cannot assign to this expression
+*%%*/
diff --git a/resources/sksl/errors/SwizzleDomain.sksl b/resources/sksl/errors/SwizzleDomain.sksl
index 6b0fb60..7ce8ec2 100644
--- a/resources/sksl/errors/SwizzleDomain.sksl
+++ b/resources/sksl/errors/SwizzleDomain.sksl
@@ -23,3 +23,22 @@
 float4 zbpR() { return v.zbpR; }
 float4 waqB() { return v.waqB; }
 
+
+/*%%*
+invalid swizzle mask 'xyra'
+invalid swizzle mask 'zxtq'
+invalid swizzle mask 'wwRB'
+invalid swizzle mask 'rgxy'
+invalid swizzle mask 'bast'
+invalid swizzle mask 'gbLT'
+invalid swizzle mask 'sxyz'
+invalid swizzle mask 'tpbb'
+invalid swizzle mask 'qsTR'
+invalid swizzle mask 'LTxy'
+invalid swizzle mask 'TRba'
+invalid swizzle mask 'RBst'
+invalid swizzle mask 'xrsL'
+invalid swizzle mask 'ygtT'
+invalid swizzle mask 'zbpR'
+invalid swizzle mask 'waqB'
+*%%*/
diff --git a/resources/sksl/errors/SwizzleMatrix.sksl b/resources/sksl/errors/SwizzleMatrix.sksl
index 52587f7..efd90f1 100644
--- a/resources/sksl/errors/SwizzleMatrix.sksl
+++ b/resources/sksl/errors/SwizzleMatrix.sksl
@@ -2,3 +2,7 @@
     float2x2 x = float2x2(1);
     float y = x.y;
 }
+
+/*%%*
+type 'float2x2' does not have a field named 'y'
+*%%*/
diff --git a/resources/sksl/errors/SwizzleOnlyLiterals.sksl b/resources/sksl/errors/SwizzleOnlyLiterals.sksl
index 0450e2f..3f82bed 100644
--- a/resources/sksl/errors/SwizzleOnlyLiterals.sksl
+++ b/resources/sksl/errors/SwizzleOnlyLiterals.sksl
@@ -1 +1,5 @@
 void main() { float x = 1.0; x = x.0; }
+
+/*%%*
+swizzle must refer to base expression
+*%%*/
diff --git a/resources/sksl/errors/SwizzleOutOfBounds.sksl b/resources/sksl/errors/SwizzleOutOfBounds.sksl
index 2763adf..c21e992 100644
--- a/resources/sksl/errors/SwizzleOutOfBounds.sksl
+++ b/resources/sksl/errors/SwizzleOutOfBounds.sksl
@@ -1 +1,5 @@
 void main() { float3 test = float2(1).xyz; }
+
+/*%%*
+invalid swizzle component 'z'
+*%%*/
diff --git a/resources/sksl/errors/SwizzleTooManyComponents.sksl b/resources/sksl/errors/SwizzleTooManyComponents.sksl
index f91935d..f5f1cad 100644
--- a/resources/sksl/errors/SwizzleTooManyComponents.sksl
+++ b/resources/sksl/errors/SwizzleTooManyComponents.sksl
@@ -1 +1,5 @@
 void main() { float4 test = float2(1).xxxxx; }
+
+/*%%*
+too many components in swizzle mask
+*%%*/
diff --git a/resources/sksl/errors/TernaryMismatch.sksl b/resources/sksl/errors/TernaryMismatch.sksl
index 32625db..ccc5a38 100644
--- a/resources/sksl/errors/TernaryMismatch.sksl
+++ b/resources/sksl/errors/TernaryMismatch.sksl
@@ -1,2 +1,7 @@
 void bool_or_float()   { float x = 5 > 2 ? true : 1.0; }
 void float3_or_float() { float x = 5 > 2 ? float3(1) : 1.0; }
+
+/*%%*
+ternary operator result mismatch: 'bool', 'float'
+ternary operator result mismatch: 'float3', 'float'
+*%%*/
diff --git a/resources/sksl/errors/UnassignedOutParameter.sksl b/resources/sksl/errors/UnassignedOutParameter.sksl
index 990d00d..55e5481 100644
--- a/resources/sksl/errors/UnassignedOutParameter.sksl
+++ b/resources/sksl/errors/UnassignedOutParameter.sksl
@@ -9,3 +9,8 @@
     testOut(p, p, p);
     testInout(p, p, p);
 }
+
+/*%%*
+function 'testOut' never assigns a value to out parameter 'b'
+function 'testOut' never assigns a value to out parameter 'c'
+*%%*/
diff --git a/resources/sksl/errors/UndeclaredFunction.sksl b/resources/sksl/errors/UndeclaredFunction.sksl
index a30eac1..4ee08a1 100644
--- a/resources/sksl/errors/UndeclaredFunction.sksl
+++ b/resources/sksl/errors/UndeclaredFunction.sksl
@@ -1 +1,5 @@
 void main() { int x = foo(1); }
+
+/*%%*
+unknown identifier 'foo'
+*%%*/
diff --git a/resources/sksl/errors/UndefinedFunction.sksl b/resources/sksl/errors/UndefinedFunction.sksl
index dc1062d..d41d886 100644
--- a/resources/sksl/errors/UndefinedFunction.sksl
+++ b/resources/sksl/errors/UndefinedFunction.sksl
@@ -1,3 +1,7 @@
 int foo(int x);
 
 void main() { int x = foo(1); }
+
+/*%%*
+function 'int foo(int x)' is not defined
+*%%*/
diff --git a/resources/sksl/errors/UndefinedSymbol.sksl b/resources/sksl/errors/UndefinedSymbol.sksl
index 54f86c2..2629e5c 100644
--- a/resources/sksl/errors/UndefinedSymbol.sksl
+++ b/resources/sksl/errors/UndefinedSymbol.sksl
@@ -5,3 +5,14 @@
 
 float e = f, g = h;
 float i = j, k;
+
+/*%%*
+unknown identifier 'x'
+unknown identifier 'x'
+unknown identifier 'x'
+unknown identifier 'x'
+unknown identifier 'z'
+unknown identifier 'f'
+unknown identifier 'h'
+unknown identifier 'j'
+*%%*/
diff --git a/resources/sksl/errors/UniformVarWithInitializerExpression.sksl b/resources/sksl/errors/UniformVarWithInitializerExpression.sksl
index 79d4194..17a2a05 100644
--- a/resources/sksl/errors/UniformVarWithInitializerExpression.sksl
+++ b/resources/sksl/errors/UniformVarWithInitializerExpression.sksl
@@ -1 +1,5 @@
 uniform float x = 1;
+
+/*%%*
+'uniform' variables cannot use initializer expressions
+*%%*/
diff --git a/resources/sksl/errors/UnknownDivideByZero.sksl b/resources/sksl/errors/UnknownDivideByZero.sksl
index 607cd9e..ed12c82 100644
--- a/resources/sksl/errors/UnknownDivideByZero.sksl
+++ b/resources/sksl/errors/UnknownDivideByZero.sksl
@@ -19,4 +19,22 @@
     y = (int4(unknownInput) % int4(int2(unknownInput, int(zero)), 1, 1)).x;
     y /= 0;
     y %= 0;
-}
\ No newline at end of file
+}
+/*%%*
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+division by zero
+*%%*/
diff --git a/resources/sksl/errors/UnscopedVariableInDoWhile.sksl b/resources/sksl/errors/UnscopedVariableInDoWhile.sksl
index 39dada8..fa169e7 100644
--- a/resources/sksl/errors/UnscopedVariableInDoWhile.sksl
+++ b/resources/sksl/errors/UnscopedVariableInDoWhile.sksl
@@ -1,3 +1,7 @@
 void main() {
     do int foo = 1, bar = foo; while (false);
 }
+
+/*%%*
+variable 'foo' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/UnscopedVariableInElse.sksl b/resources/sksl/errors/UnscopedVariableInElse.sksl
index 5f1a42a..877bc6c 100644
--- a/resources/sksl/errors/UnscopedVariableInElse.sksl
+++ b/resources/sksl/errors/UnscopedVariableInElse.sksl
@@ -1,3 +1,7 @@
 void main() {
     if (true) ; else half4 color = sk_FragColor;
 }
+
+/*%%*
+variable 'color' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/UnscopedVariableInFor.sksl b/resources/sksl/errors/UnscopedVariableInFor.sksl
index 9d62be7..88be1c1 100644
--- a/resources/sksl/errors/UnscopedVariableInFor.sksl
+++ b/resources/sksl/errors/UnscopedVariableInFor.sksl
@@ -1,3 +1,7 @@
 void main() {
     for (int x=0; x<10; ++x) float s = sqrt(4);
 }
+
+/*%%*
+variable 's' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/UnscopedVariableInIf.sksl b/resources/sksl/errors/UnscopedVariableInIf.sksl
index 912b58b..89cef37 100644
--- a/resources/sksl/errors/UnscopedVariableInIf.sksl
+++ b/resources/sksl/errors/UnscopedVariableInIf.sksl
@@ -1,3 +1,7 @@
 void main() {
     if (true) half4 x;
 }
+
+/*%%*
+variable 'x' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/UnscopedVariableInWhile.sksl b/resources/sksl/errors/UnscopedVariableInWhile.sksl
index 07da967..919bb36 100644
--- a/resources/sksl/errors/UnscopedVariableInWhile.sksl
+++ b/resources/sksl/errors/UnscopedVariableInWhile.sksl
@@ -1,3 +1,7 @@
 void main() {
     while (false) bool b;
 }
+
+/*%%*
+variable 'b' must be created in a scope
+*%%*/
diff --git a/resources/sksl/errors/UnsupportedGLSLIdentifiers.sksl b/resources/sksl/errors/UnsupportedGLSLIdentifiers.sksl
index 8c44b5e..570249c 100644
--- a/resources/sksl/errors/UnsupportedGLSLIdentifiers.sksl
+++ b/resources/sksl/errors/UnsupportedGLSLIdentifiers.sksl
@@ -1,2 +1,9 @@
 void fragcoord() { float x = gl_FragCoord.x; }
 void fragcolor() { float r = gl_FragColor.r; }
+
+/*%%*
+'gl_FragCoord' is a reserved word
+unknown identifier 'gl_FragCoord'
+'gl_FragColor' is a reserved word
+unknown identifier 'gl_FragColor'
+*%%*/
diff --git a/resources/sksl/errors/UsingInvalidValue.sksl b/resources/sksl/errors/UsingInvalidValue.sksl
index 705b1cd..158aafc 100644
--- a/resources/sksl/errors/UsingInvalidValue.sksl
+++ b/resources/sksl/errors/UsingInvalidValue.sksl
@@ -9,3 +9,14 @@
 int  g_expect_constructor_invocation_extra_initializer, ix = int;
 int  g_expect_function_call                                = func;
 int  g_expect_function_call_extra_initializer,          iy = func;
+
+/*%%*
+expected '(' to begin constructor invocation
+expected '(' to begin constructor invocation
+expected '(' to begin function call
+expected '(' to begin function call
+expected '(' to begin constructor invocation
+expected '(' to begin constructor invocation
+expected '(' to begin function call
+expected '(' to begin function call
+*%%*/
diff --git a/resources/sksl/errors/VectorIndexOutOfRange.sksl b/resources/sksl/errors/VectorIndexOutOfRange.sksl
index 92baa63..fed5e35 100644
--- a/resources/sksl/errors/VectorIndexOutOfRange.sksl
+++ b/resources/sksl/errors/VectorIndexOutOfRange.sksl
@@ -42,3 +42,27 @@
 void half4_3_constidx()        { half4 h;        const int INDEX = 3;          half v = h[INDEX]; }
 void half4_4_constidx()        { half4 h;        const int INDEX = 4;          half v = h[INDEX]; }
 void half4_huge_constidx()     { half4 h;        const int INDEX = 1000000000; half v = h[INDEX]; }
+
+/*%%*
+index -1 out of range for 'half4'
+index 4 out of range for 'half4'
+index 1000000000 out of range for 'half4'
+index -1 out of range for 'half3'
+index 3 out of range for 'half3'
+index 4 out of range for 'half3'
+index 1000000000 out of range for 'half3'
+index -1 out of range for 'half2'
+index 2 out of range for 'half2'
+index 3 out of range for 'half2'
+index 4 out of range for 'half2'
+index 1000000000 out of range for 'half2'
+index -1 out of range for 'half2'
+index 2 out of range for 'half2'
+index 1000000000 out of range for 'half2'
+index -1 out of range for 'half3'
+index 3 out of range for 'half3'
+index 1000000000 out of range for 'half3'
+index -1 out of range for 'half4'
+index 4 out of range for 'half4'
+index 1000000000 out of range for 'half4'
+*%%*/
diff --git a/resources/sksl/errors/VectorInlinedIndexOutOfRange.sksl b/resources/sksl/errors/VectorInlinedIndexOutOfRange.sksl
index 00ab557..8442693 100644
--- a/resources/sksl/errors/VectorInlinedIndexOutOfRange.sksl
+++ b/resources/sksl/errors/VectorInlinedIndexOutOfRange.sksl
@@ -11,3 +11,8 @@
     int undefined = indexVector(-1) + indexVector(3);
     return colorGreen;
 }
+
+/*%%*
+index -1 out of range for 'int3'
+index 3 out of range for 'int3'
+*%%*/
diff --git a/resources/sksl/errors/VectorSlice.sksl b/resources/sksl/errors/VectorSlice.sksl
index da930fc..37bba65 100644
--- a/resources/sksl/errors/VectorSlice.sksl
+++ b/resources/sksl/errors/VectorSlice.sksl
@@ -17,3 +17,15 @@
 const bool3 b3 = bool3(b4);
 const bool2 b2 = bool2(b4);
 const bool  b  = bool (b4);
+
+/*%%*
+'half4' is not a valid parameter to 'half3' constructor; use '.xyz' instead
+'half4' is not a valid parameter to 'half2' constructor; use '.xy' instead
+'half4' is not a valid parameter to 'half' constructor; use '.x' instead
+'int4' is not a valid parameter to 'int3' constructor; use '.xyz' instead
+'int4' is not a valid parameter to 'int2' constructor; use '.xy' instead
+'int4' is not a valid parameter to 'int' constructor; use '.x' instead
+'bool4' is not a valid parameter to 'bool3' constructor; use '.xyz' instead
+'bool4' is not a valid parameter to 'bool2' constructor; use '.xy' instead
+'bool4' is not a valid parameter to 'bool' constructor; use '.x' instead
+*%%*/
diff --git a/resources/sksl/errors/VoidConstructor.sksl b/resources/sksl/errors/VoidConstructor.sksl
index a2a2d1b..94df380 100644
--- a/resources/sksl/errors/VoidConstructor.sksl
+++ b/resources/sksl/errors/VoidConstructor.sksl
@@ -1,3 +1,7 @@
 void main() {
     void();
 }
+
+/*%%*
+cannot construct 'void'
+*%%*/
diff --git a/resources/sksl/errors/VoidInStruct.sksl b/resources/sksl/errors/VoidInStruct.sksl
index b6ee475..114d98e 100644
--- a/resources/sksl/errors/VoidInStruct.sksl
+++ b/resources/sksl/errors/VoidInStruct.sksl
@@ -6,3 +6,10 @@
     void[2] c;
     void[2] d[2];
 };
+
+/*%%*
+type 'void' may not be used in an array
+type 'void' may not be used in an array
+type 'void' may not be used in an array
+type 'void' is not permitted in a struct
+*%%*/
diff --git a/resources/sksl/errors/VoidVariable.sksl b/resources/sksl/errors/VoidVariable.sksl
index fc8ef43..a48b15e 100644
--- a/resources/sksl/errors/VoidVariable.sksl
+++ b/resources/sksl/errors/VoidVariable.sksl
@@ -3,3 +3,9 @@
 
 void a;
 void b = func();
+
+/*%%*
+variables of type 'void' are not allowed
+variables of type 'void' are not allowed
+global variable initializer must be a constant expression
+*%%*/
diff --git a/resources/sksl/errors/WhileTypeMismatch.sksl b/resources/sksl/errors/WhileTypeMismatch.sksl
index 6fc7664..85b4bb1 100644
--- a/resources/sksl/errors/WhileTypeMismatch.sksl
+++ b/resources/sksl/errors/WhileTypeMismatch.sksl
@@ -1,3 +1,7 @@
 void main() {
     while (float3(1)) {}
 }
+
+/*%%*
+expected 'bool', but found 'float3'
+*%%*/
diff --git a/tests/sksl/errors/Ossfuzz38106.glsl b/tests/sksl/errors/Ossfuzz38106.glsl
index 1e973cb..79bf67a 100644
--- a/tests/sksl/errors/Ossfuzz38106.glsl
+++ b/tests/sksl/errors/Ossfuzz38106.glsl
@@ -2,5 +2,5 @@
 
 error: 1: expected identifier, but found ';'
 error: 1: expected field name or swizzle mask after '.'
-error: 2: expected ';', but found ''
+error: 8: expected ';', but found ''
 3 errors
diff --git a/tests/sksl/errors/Ossfuzz38107.glsl b/tests/sksl/errors/Ossfuzz38107.glsl
index bc5afa7..5da5ebf 100644
--- a/tests/sksl/errors/Ossfuzz38107.glsl
+++ b/tests/sksl/errors/Ossfuzz38107.glsl
@@ -1,4 +1,4 @@
 ### Compilation failed:
 
-error: 1: invalid token
+error: 6: invalid token
 1 error
diff --git a/tests/sksl/errors/Ossfuzz38865.glsl b/tests/sksl/errors/Ossfuzz38865.glsl
index a9745e4..1a31a22 100644
--- a/tests/sksl/errors/Ossfuzz38865.glsl
+++ b/tests/sksl/errors/Ossfuzz38865.glsl
@@ -1,4 +1,4 @@
 ### Compilation failed:
 
-error: 1: expected expression, but found ''
+error: 5: expected expression, but found ''
 1 error
diff --git a/tests/sksl/errors/Ossfuzz38944.glsl b/tests/sksl/errors/Ossfuzz38944.glsl
index a9745e4..1a31a22 100644
--- a/tests/sksl/errors/Ossfuzz38944.glsl
+++ b/tests/sksl/errors/Ossfuzz38944.glsl
@@ -1,4 +1,4 @@
 ### Compilation failed:
 
-error: 1: expected expression, but found ''
+error: 5: expected expression, but found ''
 1 error
diff --git a/tests/sksl/errors/Ossfuzz40479.glsl b/tests/sksl/errors/Ossfuzz40479.glsl
index 6047fff..d402594 100644
--- a/tests/sksl/errors/Ossfuzz40479.glsl
+++ b/tests/sksl/errors/Ossfuzz40479.glsl
@@ -3,6 +3,6 @@
 error: 1: integer is out of range for type 'int': 4016112253
 error: 1: array size must be an integer
 error: 1: type 'void' may not be used in an array
-error: 2: expected ']', but found ''
-error: 2: expected an identifier, but found ''
+error: 10: expected ']', but found ''
+error: 10: expected an identifier, but found ''
 5 errors
diff --git a/tests/sksl/errors/Ossfuzz40660.glsl b/tests/sksl/errors/Ossfuzz40660.glsl
index 9fb063a..d431240 100644
--- a/tests/sksl/errors/Ossfuzz40660.glsl
+++ b/tests/sksl/errors/Ossfuzz40660.glsl
@@ -4,6 +4,6 @@
 error: 1: expected ')' to complete function arguments, but found '`'
 error: 1: expected ')' to complete expression, but found '`'
 error: 1: integer is out of range for type 'int': 3689348940
-error: 2: expected ']' to complete array access expression, but found ''
-error: 2: expected ';', but found ''
+error: 11: expected ']' to complete array access expression, but found ''
+error: 11: expected ';', but found ''
 6 errors