Fixed DSLParser assertion error uncovered by fuzzer

Bug: oss-fuzz:38108
Change-Id: I0e055d837923f00b982bc395dbf29b6ff59a3b21
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/448896
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index 81b9160..5ee9f22 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -104,6 +104,7 @@
   "/sksl/errors/Ossfuzz37620.sksl",
   "/sksl/errors/Ossfuzz38106.sksl",
   "/sksl/errors/Ossfuzz38107.sksl",
+  "/sksl/errors/Ossfuzz38108.sksl",
   "/sksl/errors/Ossfuzz38140.sksl",
   "/sksl/errors/Ossfuzz38560.sksl",
   "/sksl/errors/Ossfuzz38865.sksl",
diff --git a/include/sksl/DSLSymbols.h b/include/sksl/DSLSymbols.h
index 93e32ad..13be7c6 100644
--- a/include/sksl/DSLSymbols.h
+++ b/include/sksl/DSLSymbols.h
@@ -57,7 +57,7 @@
 /**
  * Adds a variable to the current symbol table.
  */
-void AddToSymbolTable(DSLVarBase& var);
+void AddToSymbolTable(DSLVarBase& var, PositionInfo pos = PositionInfo::Capture());
 
 } // namespace dsl
 
diff --git a/resources/sksl/errors/DuplicateSymbol.sksl b/resources/sksl/errors/DuplicateSymbol.sksl
index 91f4b3f..fa73e8e 100644
--- a/resources/sksl/errors/DuplicateSymbol.sksl
+++ b/resources/sksl/errors/DuplicateSymbol.sksl
@@ -2,4 +2,6 @@
 int x;
 
 int main;
-void main() {}
+void main() {
+    int y,y;
+}
diff --git a/resources/sksl/errors/Ossfuzz38108.sksl b/resources/sksl/errors/Ossfuzz38108.sksl
new file mode 100644
index 0000000..de4bf01
--- /dev/null
+++ b/resources/sksl/errors/Ossfuzz38108.sksl
@@ -0,0 +1 @@
+int a,a;
\ No newline at end of file
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index f6800c2..8d284d1 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -884,6 +884,7 @@
                 errors.append(disassembly);
             }
             this->errorReporter().error(-1, errors);
+            this->errorReporter().reportPendingErrors(PositionInfo());
 #else
             SkDEBUGFAILF("%s", errors.c_str());
 #endif
@@ -957,7 +958,6 @@
 }
 
 String Compiler::errorText(bool showCount) {
-    this->errorReporter().reportPendingErrors(PositionInfo());
     if (showCount) {
         this->writeErrorCount();
     }
diff --git a/src/sksl/SkSLDSLParser.cpp b/src/sksl/SkSLDSLParser.cpp
index 71fdd2b..1d3a131 100644
--- a/src/sksl/SkSLDSLParser.cpp
+++ b/src/sksl/SkSLDSLParser.cpp
@@ -450,7 +450,7 @@
         }
         DSLGlobalVar next(mods, type, this->text(identifierName), std::move(anotherInitializer));
         Declare(next);
-        AddToSymbolTable(next);
+        AddToSymbolTable(next, this->position(identifierName));
     }
     this->expect(Token::Kind::TK_SEMICOLON, "';'");
 }
@@ -486,7 +486,7 @@
         }
         DSLVar next(mods, type, this->text(identifierName), std::move(anotherInitializer));
         DSLWriter::AddVarDeclaration(result, next);
-        AddToSymbolTable(next);
+        AddToSymbolTable(next, this->position(identifierName));
     }
     this->expect(Token::Kind::TK_SEMICOLON, "';'");
     return result;
diff --git a/src/sksl/dsl/DSLSymbols.cpp b/src/sksl/dsl/DSLSymbols.cpp
index 1ffde5a..4103898 100644
--- a/src/sksl/dsl/DSLSymbols.cpp
+++ b/src/sksl/dsl/DSLSymbols.cpp
@@ -35,11 +35,12 @@
     return s && s->is<Type>();
 }
 
-void AddToSymbolTable(DSLVarBase& var) {
+void AddToSymbolTable(DSLVarBase& var, PositionInfo pos) {
     const SkSL::Variable* skslVar = DSLWriter::Var(var);
     if (skslVar) {
         CurrentSymbolTable()->addWithoutOwnership(skslVar);
     }
+    DSLWriter::ReportErrors(pos);
 }
 
 const String* Retain(String string) {
diff --git a/tests/sksl/errors/DuplicateSymbol.glsl b/tests/sksl/errors/DuplicateSymbol.glsl
index 77dbf82..9e5cb06 100644
--- a/tests/sksl/errors/DuplicateSymbol.glsl
+++ b/tests/sksl/errors/DuplicateSymbol.glsl
@@ -2,4 +2,5 @@
 
 error: 2: symbol 'x' was already defined
 error: 5: symbol 'main' was already defined
-2 errors
+error: 6: symbol 'y' was already defined
+3 errors
diff --git a/tests/sksl/errors/Ossfuzz38108.glsl b/tests/sksl/errors/Ossfuzz38108.glsl
new file mode 100644
index 0000000..62df40c
--- /dev/null
+++ b/tests/sksl/errors/Ossfuzz38108.glsl
@@ -0,0 +1,4 @@
+### Compilation failed:
+
+error: 1: symbol 'a' was already defined
+1 error