Fix parsing error with structs containing arrays.
Previously, a struct containing a vardecl with multiple declarations
would interpret arrays incorrectly. An array would be applied to ALL
variables in the decl after its initial appearance. That is,
`int w, x[10], y, z;` would be interpreted as
`int w, x[10], y[10], z[10];`.
This is now fixed and our test case runs as expected.
Change-Id: I5b4a617c58cdfb83face651effd42770a1f68638
Bug: oss-fuzz:37622
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/441879
Commit-Queue: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 316c0fd..3a3ae6a 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -473,6 +473,7 @@
const ASTNode::VarData& vd = var.getVarData();
// Read array size if one is present.
+ const Type* fieldType = type;
if (vd.fIsArray) {
const ASTNode& size = *var.begin();
if (!size || size.fKind != ASTNode::Kind::kInt) {
@@ -485,10 +486,10 @@
}
// Add the array dimensions to our type.
int arraySize = size.getInt();
- type = fSymbols.addArrayDimension(type, arraySize);
+ fieldType = fSymbols.addArrayDimension(fieldType, arraySize);
}
- fields.push_back(Type::Field(modifiers, vd.fName, type));
+ fields.push_back(Type::Field(modifiers, vd.fName, fieldType));
if (vd.fIsArray ? var.begin()->fNext : var.fFirstChild) {
this->error(declsNode.fOffset, "initializers are not permitted on struct fields");
}