Skip to content

Commit

Permalink
[wgsl] fix variable initializers wrt control flow
Browse files Browse the repository at this point in the history
  • Loading branch information
kvark committed Feb 9, 2021
1 parent 5b94ecd commit 4f19903
Showing 1 changed file with 17 additions and 12 deletions.
29 changes: 17 additions & 12 deletions src/front/wgsl/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1565,14 +1565,16 @@ impl Parser {
&mut self,
lexer: &mut Lexer<'a>,
mut context: StatementContext<'a, '_, '_>,
is_uniform_control_flow: bool,
) -> Result<Option<crate::Statement>, Error<'a>> {
let word = match lexer.next() {
Token::Separator(';') => return Ok(None),
Token::Paren('{') => {
self.scopes.push(Scope::Block);
let mut statements = Vec::new();
while !lexer.skip(Token::Paren('}')) {
let s = self.parse_statement(lexer, context.reborrow())?;
let s =
self.parse_statement(lexer, context.reborrow(), is_uniform_control_flow)?;
statements.extend(s);
}
self.scopes.pop();
Expand Down Expand Up @@ -1606,10 +1608,11 @@ impl Parser {

let init = if lexer.skip(Token::Operation('=')) {
let value = self.parse_general_expression(lexer, context.as_expression())?;
if let crate::Expression::Constant(handle) = context.expressions[value] {
Init::Constant(handle)
} else {
Init::Variable(value)
match context.expressions[value] {
crate::Expression::Constant(handle) if is_uniform_control_flow => {
Init::Constant(handle)
}
_ => Init::Variable(value),
}
} else {
Init::Empty
Expand Down Expand Up @@ -1652,9 +1655,9 @@ impl Parser {
let condition = self.parse_general_expression(lexer, context.as_expression())?;
lexer.expect(Token::Paren(')'))?;

let accept = self.parse_block(lexer, context.reborrow())?;
let accept = self.parse_block(lexer, context.reborrow(), false)?;
let reject = if lexer.skip(Token::Word("else")) {
self.parse_block(lexer, context.reborrow())?
self.parse_block(lexer, context.reborrow(), false)?
} else {
Vec::new()
};
Expand Down Expand Up @@ -1707,7 +1710,7 @@ impl Parser {
if lexer.skip(Token::Paren('}')) {
break false;
}
let s = self.parse_statement(lexer, context.reborrow())?;
let s = self.parse_statement(lexer, context.reborrow(), false)?;
body.extend(s);
};

Expand All @@ -1719,7 +1722,7 @@ impl Parser {
}
Token::Word("default") => {
lexer.expect(Token::Separator(':'))?;
default = self.parse_block(lexer, context.reborrow())?;
default = self.parse_block(lexer, context.reborrow(), false)?;
}
Token::Paren('}') => break,
other => return Err(Error::Unexpected(other, "switch item")),
Expand All @@ -1739,14 +1742,14 @@ impl Parser {

loop {
if lexer.skip(Token::Word("continuing")) {
continuing = self.parse_block(lexer, context.reborrow())?;
continuing = self.parse_block(lexer, context.reborrow(), false)?;
lexer.expect(Token::Paren('}'))?;
break;
}
if lexer.skip(Token::Paren('}')) {
break;
}
let s = self.parse_statement(lexer, context.reborrow())?;
let s = self.parse_statement(lexer, context.reborrow(), false)?;
body.extend(s);
}

Expand Down Expand Up @@ -1786,12 +1789,13 @@ impl Parser {
&mut self,
lexer: &mut Lexer<'a>,
mut context: StatementContext<'a, '_, '_>,
is_uniform_control_flow: bool,
) -> Result<Vec<crate::Statement>, Error<'a>> {
self.scopes.push(Scope::Block);
lexer.expect(Token::Paren('{'))?;
let mut statements = Vec::new();
while !lexer.skip(Token::Paren('}')) {
let s = self.parse_statement(lexer, context.reborrow())?;
let s = self.parse_statement(lexer, context.reborrow(), is_uniform_control_flow)?;
statements.extend(s);
}
self.scopes.pop();
Expand Down Expand Up @@ -1866,6 +1870,7 @@ impl Parser {
functions: &module.functions,
arguments: &fun.arguments,
},
true,
)?;
// fixup the IR
ensure_block_returns(&mut fun.body);
Expand Down

0 comments on commit 4f19903

Please sign in to comment.