SkSL DSL now reports the C++ line numbers of errors

This is done a best-effort basis. Positions will only be reported in
Clang and GCC, and may not be reported in every possible situation.

Change-Id: I7efb15781546b95e667fee34e488366174bb5f36
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/374600
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/tests/SkSLDSLTest.cpp b/tests/SkSLDSLTest.cpp
index 0055f78..ac73b93 100644
--- a/tests/SkSLDSLTest.cpp
+++ b/tests/SkSLDSLTest.cpp
@@ -96,8 +96,10 @@
     REPORTER_ASSERT(r, !whitespace_insensitive_compare("a b c  d", "\n\n\nabc"));
 }
 
-static SkSL::String stringize(DSLStatement& stmt)  { return stmt.release()->description(); }
-static SkSL::String stringize(DSLExpression& expr) { return expr.release()->description(); }
+static SkSL::String stringize(DSLStatement& stmt)          { return stmt.release()->description(); }
+static SkSL::String stringize(DSLPossibleStatement& stmt)  { return stmt.release()->description(); }
+static SkSL::String stringize(DSLExpression& expr)         { return expr.release()->description(); }
+static SkSL::String stringize(DSLPossibleExpression& expr) { return expr.release()->description(); }
 static SkSL::String stringize(SkSL::IRNode& node)  { return node.description(); }
 
 template <typename T>
@@ -379,17 +381,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '+' cannot operate on 'bool2', 'float'\n");
-        (Bool2(true) + a).release();
+        DSLExpression((Bool2(true) + a)).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '+=' cannot operate on 'float', 'bool2'\n");
-        (a += Bool2(true)).release();
+        DSLExpression((a += Bool2(true))).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1.0 += a).release();
+        DSLExpression((1.0 += a)).release();
     }
 }
 
@@ -410,17 +412,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '-' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) - a).release();
+        DSLExpression(Bool2(true) - a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '-=' cannot operate on 'int', 'bool2'\n");
-        (a -= Bool2(true)).release();
+        DSLExpression(a -= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1.0 -= a).release();
+        DSLExpression(1.0 -= a).release();
     }
 }
 
@@ -441,17 +443,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '*' cannot operate on 'bool2', 'float'\n");
-        (Bool2(true) * a).release();
+        DSLExpression(Bool2(true) * a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '*=' cannot operate on 'float', 'bool2'\n");
-        (a *= Bool2(true)).release();
+        DSLExpression(a *= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1.0 *= a).release();
+        DSLExpression(1.0 *= a).release();
     }
 }
 
@@ -475,28 +477,28 @@
 
     {
         ExpectError error(r, "error: type mismatch: '/' cannot operate on 'bool2', 'float'\n");
-        (Bool2(true) / a).release();
+        DSLExpression(Bool2(true) / a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '/=' cannot operate on 'float', 'bool2'\n");
-        (a /= Bool2(true)).release();
+        DSLExpression(a /= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1.0 /= a).release();
+        DSLExpression(1.0 /= a).release();
     }
 
     {
         ExpectError error(r, "error: division by zero\n");
-        (a /= 0).release();
+        DSLExpression(a /= 0).release();
     }
 
     {
         Var c(kFloat2, "c");
         ExpectError error(r, "error: division by zero\n");
-        (c /= Float2(Float(0), 1)).release();
+        DSLExpression(c /= Float2(Float(0), 1)).release();
     }
 }
 
@@ -517,28 +519,28 @@
 
     {
         ExpectError error(r, "error: type mismatch: '%' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) % a).release();
+        DSLExpression(Bool2(true) % a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '%=' cannot operate on 'int', 'bool2'\n");
-        (a %= Bool2(true)).release();
+        DSLExpression(a %= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 %= a).release();
+        DSLExpression(1 %= a).release();
     }
 
     {
         ExpectError error(r, "error: division by zero\n");
-        (a %= 0).release();
+        DSLExpression(a %= 0).release();
     }
 
     {
         Var c(kInt2, "c");
         ExpectError error(r, "error: division by zero\n");
-        (c %= Int2(Int(0), 1)).release();
+        DSLExpression(c %= Int2(Int(0), 1)).release();
     }
 }
 
@@ -559,17 +561,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '<<' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) << a).release();
+        DSLExpression(Bool2(true) << a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '<<=' cannot operate on 'int', 'bool2'\n");
-        (a <<= Bool2(true)).release();
+        DSLExpression(a <<= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 <<= a).release();
+        DSLExpression(1 <<= a).release();
     }
 }
 
@@ -590,17 +592,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '>>' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) >> a).release();
+        DSLExpression(Bool2(true) >> a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '>>=' cannot operate on 'int', 'bool2'\n");
-        (a >>= Bool2(true)).release();
+        DSLExpression(a >>= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 >>= a).release();
+        DSLExpression(1 >>= a).release();
     }
 }
 
@@ -621,17 +623,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '&' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) & a).release();
+        DSLExpression(Bool2(true) & a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '&=' cannot operate on 'int', 'bool2'\n");
-        (a &= Bool2(true)).release();
+        DSLExpression(a &= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 &= a).release();
+        DSLExpression(1 &= a).release();
     }
 }
 
@@ -652,17 +654,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '|' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) | a).release();
+        DSLExpression(Bool2(true) | a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '|=' cannot operate on 'int', 'bool2'\n");
-        (a |= Bool2(true)).release();
+        DSLExpression(a |= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 |= a).release();
+        DSLExpression(1 |= a).release();
     }
 }
 
@@ -683,17 +685,17 @@
 
     {
         ExpectError error(r, "error: type mismatch: '^' cannot operate on 'bool2', 'int'\n");
-        (Bool2(true) ^ a).release();
+        DSLExpression(Bool2(true) ^ a).release();
     }
 
     {
         ExpectError error(r, "error: type mismatch: '^=' cannot operate on 'int', 'bool2'\n");
-        (a ^= Bool2(true)).release();
+        DSLExpression(a ^= Bool2(true)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (1 ^= a).release();
+        DSLExpression(1 ^= a).release();
     }
 }
 
@@ -711,7 +713,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '&&' cannot operate on 'bool', 'int'\n");
-        (a && 5).release();
+        DSLExpression(a && 5).release();
     }
 }
 
@@ -729,7 +731,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '||' cannot operate on 'bool', 'int'\n");
-        (a || 5).release();
+        DSLExpression(a || 5).release();
     }
 }
 
@@ -754,7 +756,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '==' cannot operate on 'int', 'bool2'\n");
-        (a == Bool2(true)).release();
+        DSLExpression(a == Bool2(true)).release();
     }
 }
 
@@ -769,7 +771,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '!=' cannot operate on 'int', 'bool2'\n");
-        (a != Bool2(true)).release();
+        DSLExpression(a != Bool2(true)).release();
     }
 }
 
@@ -784,7 +786,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '>' cannot operate on 'int', 'bool2'\n");
-        (a > Bool2(true)).release();
+        DSLExpression(a > Bool2(true)).release();
     }
 }
 
@@ -799,7 +801,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '>=' cannot operate on 'int', 'bool2'\n");
-        (a >= Bool2(true)).release();
+        DSLExpression(a >= Bool2(true)).release();
     }
 }
 
@@ -814,7 +816,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '<' cannot operate on 'int', 'bool2'\n");
-        (a < Bool2(true)).release();
+        DSLExpression(a < Bool2(true)).release();
     }
 }
 
@@ -829,7 +831,7 @@
 
     {
         ExpectError error(r, "error: type mismatch: '<=' cannot operate on 'int', 'bool2'\n");
-        (a <= Bool2(true)).release();
+        DSLExpression(a <= Bool2(true)).release();
     }
 }
 
@@ -841,7 +843,7 @@
 
     {
         ExpectError error(r, "error: '!' cannot operate on 'int'\n");
-        (!a).release();
+        DSLExpression(!a).release();
     }
 }
 
@@ -853,7 +855,7 @@
 
     {
         ExpectError error(r, "error: '~' cannot operate on 'bool'\n");
-        (~b).release();
+        DSLExpression(~b).release();
     }
 }
 
@@ -868,22 +870,22 @@
 
     {
         ExpectError error(r, "error: '++' cannot operate on 'bool'\n");
-        (++b).release();
+        DSLExpression(++b).release();
     }
 
     {
         ExpectError error(r, "error: '++' cannot operate on 'bool'\n");
-        (b++).release();
+        DSLExpression(b++).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (++(a + 1)).release();
+        DSLExpression(++(a + 1)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        ((a + 1)++).release();
+        DSLExpression((a + 1)++).release();
     }
 }
 
@@ -898,22 +900,22 @@
 
     {
         ExpectError error(r, "error: '--' cannot operate on 'bool'\n");
-        (--b).release();
+        DSLExpression(--b).release();
     }
 
     {
         ExpectError error(r, "error: '--' cannot operate on 'bool'\n");
-        (b--).release();
+        DSLExpression(b--).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        (--(a + 1)).release();
+        DSLExpression(--(a + 1)).release();
     }
 
     {
         ExpectError error(r, "error: cannot assign to this expression\n");
-        ((a + 1)--).release();
+        DSLExpression((a + 1)--).release();
     }
 }
 
@@ -1122,12 +1124,12 @@
 
     {
         ExpectError error(r, "error: expected 'bool', but found 'int'\n");
-        Select(a, 1, -1).release();
+        DSLExpression x = Select(a, 1, -1);
     }
 
     {
         ExpectError error(r, "error: ternary operator result mismatch: 'float2', 'float3'\n");
-        Select(a > 0, Float2(1), Float3(1)).release();
+        DSLExpression x = Select(a > 0, Float2(1), Float3(1));
     }
 }
 
@@ -1159,18 +1161,18 @@
 
     {
         ExpectError error(r, "error: duplicate case value '0'\n");
-        Switch(0, Case(0), Case(0)).release();
+        DSLStatement(Switch(0, Case(0), Case(0))).release();
     }
 
     {
         ExpectError error(r, "error: duplicate default case\n");
-        Switch(0, Default(a = 0), Default(a = 1)).release();
+        DSLStatement(Switch(0, Default(a = 0), Default(a = 1))).release();
     }
 
     {
         ExpectError error(r, "error: case value must be a constant integer\n");
         Var b(kInt);
-        Switch(0, Case(b)).release();
+        DSLStatement(Switch(0, Case(b))).release();
     }
 
     {
@@ -1240,7 +1242,7 @@
 
     {
         ExpectError error(r, "error: expected 'bool', but found 'int'\n");
-        While(7, Block()).release();
+        DSLStatement x = While(7, Block());
     }
 }
 
@@ -1253,17 +1255,17 @@
 
     {
         ExpectError error(r, "error: expected 'int', but found 'bool'\n");
-        a[true].release();
+        DSLExpression x = a[true];
     }
 
     {
         ExpectError error(r, "error: expected array, but found 'int'\n");
-        b[0].release();
+        DSLExpression x = b[0];
     }
 
     {
         ExpectError error(r, "error: index -1 out of range for 'int[5]'\n");
-        a[-1].release();
+        DSLExpression x = a[-1];
     }
 }