wgsl-reader: treat function formal params as const

They should only be singly-assigned.

This is required because consts can hold pointers, but
var's cannot.  And we need to support pointer arguments.

Bug: tint:275
Change-Id: I00a58734725bd08d40df71c736854a93c364a33c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/30923
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
David Neto 2020-10-23 23:39:25 +00:00 committed by Commit Bot service account
parent 9ab6e8b9eb
commit f81c1081ea
2 changed files with 12 additions and 2 deletions

View File

@ -1991,8 +1991,14 @@ ast::VariableList ParserImpl::param_list() {
return {}; return {};
for (;;) { for (;;) {
ret.push_back(std::make_unique<ast::Variable>( auto var = std::make_unique<ast::Variable>(source, name,
source, name, ast::StorageClass::kNone, type)); ast::StorageClass::kNone, type);
// Formal parameters are treated like a const declaration where the
// initializer value is provided by the call's argument. The key point is
// that it's not updatable after intially set. This is unlike C or GLSL
// which treat formal parameters like local variables that can be updated.
var->set_is_const(true);
ret.push_back(std::move(var));
t = peek(); t = peek();
if (!t.IsComma()) if (!t.IsComma())

View File

@ -38,6 +38,7 @@ TEST_F(ParserImplTest, ParamList_Single) {
EXPECT_EQ(e[0]->name(), "a"); EXPECT_EQ(e[0]->name(), "a");
EXPECT_EQ(e[0]->type(), i32); EXPECT_EQ(e[0]->type(), i32);
EXPECT_TRUE(e[0]->is_const());
} }
TEST_F(ParserImplTest, ParamList_Multiple) { TEST_F(ParserImplTest, ParamList_Multiple) {
@ -52,12 +53,15 @@ TEST_F(ParserImplTest, ParamList_Multiple) {
EXPECT_EQ(e[0]->name(), "a"); EXPECT_EQ(e[0]->name(), "a");
EXPECT_EQ(e[0]->type(), i32); EXPECT_EQ(e[0]->type(), i32);
EXPECT_TRUE(e[0]->is_const());
EXPECT_EQ(e[1]->name(), "b"); EXPECT_EQ(e[1]->name(), "b");
EXPECT_EQ(e[1]->type(), f32); EXPECT_EQ(e[1]->type(), f32);
EXPECT_TRUE(e[1]->is_const());
EXPECT_EQ(e[2]->name(), "c"); EXPECT_EQ(e[2]->name(), "c");
EXPECT_EQ(e[2]->type(), vec2); EXPECT_EQ(e[2]->type(), vec2);
EXPECT_TRUE(e[1]->is_const());
} }
TEST_F(ParserImplTest, ParamList_Empty) { TEST_F(ParserImplTest, ParamList_Empty) {