Skip to content

Commit 13fc260

Browse files
johnstiles-googleSkia Commit-Bot
authored andcommitted
Reject struct vardecls with modifiers.
These aren't allowed in GLSL, and typically don't make sense. Change-Id: I0afca0df638590466922a809e91ef0be35b13ca8 Bug: skia:10765 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/324816 Commit-Queue: John Stiles <johnstiles@google.com> Auto-Submit: John Stiles <johnstiles@google.com> Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
1 parent 61003cd commit 13fc260

File tree

4 files changed

+29
-3
lines changed

4 files changed

+29
-3
lines changed

gn/sksl_tests.gni

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ sksl_error_tests = [
9999
"$_tests/sksl/errors/InvalidAssignment.sksl",
100100
"$_tests/sksl/errors/InvalidOutParams.sksl",
101101
"$_tests/sksl/errors/InvalidUnary.sksl",
102+
"$_tests/sksl/errors/ModifiersInStruct.sksl",
102103
"$_tests/sksl/errors/OpenArray.sksl",
103104
"$_tests/sksl/errors/ReturnDifferentType.sksl",
104105
"$_tests/sksl/errors/ReturnFromVoid.sksl",

src/sksl/SkSLParser.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,18 @@ ASTNode::ID Parser::structDeclaration() {
503503
return ASTNode::ID::Invalid();
504504
}
505505
ASTNode& declsNode = getNode(decls);
506+
Modifiers modifiers = declsNode.begin()->getModifiers();
507+
if (modifiers.fFlags != Modifiers::kNo_Flag) {
508+
String desc = modifiers.description();
509+
desc.pop_back(); // remove trailing space
510+
this->error(declsNode.fOffset,
511+
"modifier '" + desc + "' is not permitted on a struct field");
512+
}
513+
506514
const Symbol* symbol = fSymbols[(declsNode.begin() + 1)->getTypeData().fName];
507-
SkASSERT(symbol && symbol->kind() == Symbol::Kind::kType);
508-
const Type* type = (const Type*) symbol;
515+
SkASSERT(symbol);
516+
const Type* type = &symbol->as<Type>();
517+
509518
for (auto iter = declsNode.begin() + 2; iter != declsNode.end(); ++iter) {
510519
ASTNode& var = *iter;
511520
ASTNode::VarData vd = var.getVarData();
@@ -521,7 +530,8 @@ ASTNode::ID Parser::structDeclaration() {
521530
std::make_unique<Type>(typeName, Type::TypeKind::kArray, *type,
522531
(int)columns));
523532
}
524-
fields.push_back(Type::Field(declsNode.begin()->getModifiers(), vd.fName, type));
533+
534+
fields.push_back(Type::Field(modifiers, vd.fName, type));
525535
if (vd.fSizeCount ? (var.begin() + (vd.fSizeCount - 1))->fNext : var.fFirstChild) {
526536
this->error(declsNode.fOffset, "initializers are not permitted on struct fields");
527537
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct S {
2+
const float a;
3+
uniform int b;
4+
flat half4 c;
5+
noperspective float4 d;
6+
inout volatile restrict varying buffer coherent bool e;
7+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
### Compilation failed:
2+
3+
error: 1: modifier 'const' is not permitted on a struct field
4+
error: 1: modifier 'uniform' is not permitted on a struct field
5+
error: 1: modifier 'flat' is not permitted on a struct field
6+
error: 1: modifier 'noperspective' is not permitted on a struct field
7+
error: 1: modifier 'coherent volatile restrict buffer varying inout' is not permitted on a struct field
8+
5 errors

0 commit comments

Comments
 (0)