mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-14 15:46:28 +00:00
Fixup continue support in while loops.
The generators were not setting `emit_continuing_` when emitting while loops. This caused a crash when a `continue` was encountered. This CL adds the `emit_continuing_` setup to the while emission. It also guards the `emit_continuing_` usage with making sure the function is setup. Bug: tint:1490 Change-Id: Ia89c49e567acda71a1f851a582103723cff71d49 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/93960 Commit-Queue: Dan Sinclair <dsinclair@chromium.org> Auto-Submit: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
b4b82f55af
commit
4b88dbcf8e
@@ -1753,7 +1753,7 @@ bool GeneratorImpl::EmitCase(const ast::CaseStatement* stmt) {
|
||||
}
|
||||
|
||||
bool GeneratorImpl::EmitContinue(const ast::ContinueStatement*) {
|
||||
if (!emit_continuing_()) {
|
||||
if (!emit_continuing_ || !emit_continuing_()) {
|
||||
return false;
|
||||
}
|
||||
line() << "continue;";
|
||||
@@ -2534,6 +2534,9 @@ bool GeneratorImpl::EmitWhile(const ast::WhileStatement* stmt) {
|
||||
}
|
||||
}
|
||||
|
||||
auto emit_continuing = [&]() { return true; };
|
||||
TINT_SCOPED_ASSIGNMENT(emit_continuing_, emit_continuing);
|
||||
|
||||
// If the whilehas a multi-statement conditional, then we cannot emit this
|
||||
// as a regular while in GLSL. Instead we need to generate a `while(true)` loop.
|
||||
bool emit_as_loop = cond_pre.lines.size() > 0;
|
||||
|
||||
@@ -400,6 +400,25 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_While) {
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_While_WithContinue) {
|
||||
// while(true) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
auto* f = While(Expr(true), Block(Continue()));
|
||||
WrapInFunction(f);
|
||||
|
||||
GeneratorImpl& gen = Build();
|
||||
|
||||
gen.increment_indent();
|
||||
|
||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||
EXPECT_EQ(gen.result(), R"( while(true) {
|
||||
continue;
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
||||
// while(true && false) {
|
||||
// return;
|
||||
|
||||
@@ -2634,7 +2634,7 @@ bool GeneratorImpl::EmitCase(const ast::SwitchStatement* s, size_t case_idx) {
|
||||
}
|
||||
|
||||
bool GeneratorImpl::EmitContinue(const ast::ContinueStatement*) {
|
||||
if (!emit_continuing_()) {
|
||||
if (!emit_continuing_ || !emit_continuing_()) {
|
||||
return false;
|
||||
}
|
||||
line() << "continue;";
|
||||
@@ -3492,6 +3492,9 @@ bool GeneratorImpl::EmitWhile(const ast::WhileStatement* stmt) {
|
||||
}
|
||||
}
|
||||
|
||||
auto emit_continuing = [&]() { return true; };
|
||||
TINT_SCOPED_ASSIGNMENT(emit_continuing_, emit_continuing);
|
||||
|
||||
// If the while has a multi-statement conditional, then we cannot emit this
|
||||
// as a regular while in HLSL. Instead we need to generate a `while(true)` loop.
|
||||
bool emit_as_loop = cond_pre.lines.size() > 0;
|
||||
|
||||
@@ -392,6 +392,25 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_While) {
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_While_WithContinue) {
|
||||
// while(true) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
auto* f = While(Expr(true), Block(Continue()));
|
||||
WrapInFunction(f);
|
||||
|
||||
GeneratorImpl& gen = Build();
|
||||
|
||||
gen.increment_indent();
|
||||
|
||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||
EXPECT_EQ(gen.result(), R"( [loop] while(true) {
|
||||
continue;
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
||||
// while(true && false) {
|
||||
// return;
|
||||
|
||||
@@ -1521,7 +1521,7 @@ bool GeneratorImpl::EmitCase(const ast::CaseStatement* stmt) {
|
||||
}
|
||||
|
||||
bool GeneratorImpl::EmitContinue(const ast::ContinueStatement*) {
|
||||
if (!emit_continuing_()) {
|
||||
if (!emit_continuing_ || !emit_continuing_()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2136,6 +2136,9 @@ bool GeneratorImpl::EmitWhile(const ast::WhileStatement* stmt) {
|
||||
}
|
||||
}
|
||||
|
||||
auto emit_continuing = [&]() { return true; };
|
||||
TINT_SCOPED_ASSIGNMENT(emit_continuing_, emit_continuing);
|
||||
|
||||
// If the while has a multi-statement conditional, then we cannot emit this
|
||||
// as a regular while in MSL. Instead we need to generate a `while(true)` loop.
|
||||
bool emit_as_loop = cond_pre.lines.size() > 0;
|
||||
|
||||
@@ -363,6 +363,25 @@ TEST_F(MslGeneratorImplTest, Emit_While) {
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(MslGeneratorImplTest, Emit_While_WithContinue) {
|
||||
// while(true) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
auto* f = While(Expr(true), Block(Continue()));
|
||||
WrapInFunction(f);
|
||||
|
||||
GeneratorImpl& gen = Build();
|
||||
|
||||
gen.increment_indent();
|
||||
|
||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||
EXPECT_EQ(gen.result(), R"( while(true) {
|
||||
continue;
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(MslGeneratorImplTest, Emit_WhileWithMultiCond) {
|
||||
// while(true && false) {
|
||||
// return;
|
||||
|
||||
@@ -217,6 +217,25 @@ TEST_F(WgslGeneratorImplTest, Emit_While) {
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(WgslGeneratorImplTest, Emit_While_WithContinue) {
|
||||
// while(true) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
auto* f = While(Expr(true), Block(Continue()));
|
||||
WrapInFunction(f);
|
||||
|
||||
GeneratorImpl& gen = Build();
|
||||
|
||||
gen.increment_indent();
|
||||
|
||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||
EXPECT_EQ(gen.result(), R"( while(true) {
|
||||
continue;
|
||||
}
|
||||
)");
|
||||
}
|
||||
|
||||
TEST_F(WgslGeneratorImplTest, Emit_WhileMultiCond) {
|
||||
// while(true && false) {
|
||||
// return;
|
||||
|
||||
Reference in New Issue
Block a user