mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-07 13:45:51 +00:00
writer/wgsl: Add paren around LHS of member accessors
When the LHS type is not one of the common expression types Fixes operator precedence issues around pointers and member accesses. Change-Id: I81b01c0c1050d087d5d68a93d15a66ee14b2fed6 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/51365 Commit-Queue: Ben Clayton <bclayton@chromium.org> Reviewed-by: David Neto <dneto@google.com> Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
parent
ce8f868815
commit
ee449e2625
@ -155,9 +155,20 @@ bool GeneratorImpl::EmitArrayAccessor(ast::ArrayAccessorExpression* expr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool GeneratorImpl::EmitMemberAccessor(ast::MemberAccessorExpression* expr) {
|
bool GeneratorImpl::EmitMemberAccessor(ast::MemberAccessorExpression* expr) {
|
||||||
|
bool paren_lhs =
|
||||||
|
!expr->structure()
|
||||||
|
->IsAnyOf<ast::ArrayAccessorExpression, ast::CallExpression,
|
||||||
|
ast::IdentifierExpression, ast::MemberAccessorExpression,
|
||||||
|
ast::TypeConstructorExpression>();
|
||||||
|
if (paren_lhs) {
|
||||||
|
out_ << "(";
|
||||||
|
}
|
||||||
if (!EmitExpression(expr->structure())) {
|
if (!EmitExpression(expr->structure())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (paren_lhs) {
|
||||||
|
out_ << ")";
|
||||||
|
}
|
||||||
|
|
||||||
out_ << ".";
|
out_ << ".";
|
||||||
|
|
||||||
|
@ -34,6 +34,20 @@ TEST_F(WgslGeneratorImplTest, EmitExpression_MemberAccessor) {
|
|||||||
EXPECT_EQ(gen.result(), "str.mem");
|
EXPECT_EQ(gen.result(), "str.mem");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(WgslGeneratorImplTest, EmitExpression_MemberAccessor_OfDref) {
|
||||||
|
auto* s = Structure("Data", {Member("mem", ty.f32())});
|
||||||
|
Global("str", s, ast::StorageClass::kPrivate);
|
||||||
|
|
||||||
|
auto* p = Const("p", nullptr, AddressOf("str"));
|
||||||
|
auto* expr = MemberAccessor(Deref("p"), "mem");
|
||||||
|
WrapInFunction(p, expr);
|
||||||
|
|
||||||
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
|
ASSERT_TRUE(gen.EmitExpression(expr)) << gen.error();
|
||||||
|
EXPECT_EQ(gen.result(), "(*(p)).mem");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace wgsl
|
} // namespace wgsl
|
||||||
} // namespace writer
|
} // namespace writer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user