Remove fallthrough from fuzzer AST mutation.

This CL removes the logic to handle fallthrough in the AST fuzzer.

Bug: tint:1644
Change-Id: Ie636e2377bed8acfd7a644d2af6827efaf37a60e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/109000
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
This commit is contained in:
dan sinclair 2022-11-07 20:56:04 +00:00 committed by Dawn LUCI CQ
parent 8a519ac8a9
commit ec4b650adb
2 changed files with 9 additions and 75 deletions

View File

@ -19,7 +19,6 @@
#include <vector> #include <vector>
#include "src/tint/ast/block_statement.h" #include "src/tint/ast/block_statement.h"
#include "src/tint/ast/fallthrough_statement.h"
#include "src/tint/ast/for_loop_statement.h" #include "src/tint/ast/for_loop_statement.h"
#include "src/tint/ast/if_statement.h" #include "src/tint/ast/if_statement.h"
#include "src/tint/ast/loop_statement.h" #include "src/tint/ast/loop_statement.h"
@ -151,24 +150,9 @@ bool MutationDeleteStatement::CanBeDeleted(const ast::Statement& statement_node,
} }
if (auto* case_statement = statement_node.As<ast::CaseStatement>()) { if (auto* case_statement = statement_node.As<ast::CaseStatement>()) {
// It is not OK to delete the final case statement in a switch statement if the penultimate // It is not OK to delete the case statement which contains the default selector.
// case statement falls through to the final case statement. if (case_statement->ContainsDefault()) {
auto* switch_statement = return false;
program.Sem().Get(case_statement)->Parent()->Declaration()->As<ast::SwitchStatement>();
if (switch_statement->body.Length() > 1 &&
switch_statement->body[switch_statement->body.Length() - 1] == case_statement) {
// There are at least two case statements, and this is the final case statement.
auto& penultimate_case_statement_body_statements =
switch_statement->body[switch_statement->body.Length() - 2]->body->statements;
if (penultimate_case_statement_body_statements.Length() > 0 &&
penultimate_case_statement_body_statements
[penultimate_case_statement_body_statements.Length() - 1]
->Is<ast::FallthroughStatement>()) {
// The penultimate case statement falls through to the final case statement, thus
// the final case statement cannot be removed.
return false;
}
} }
} }

View File

@ -22,7 +22,6 @@
#include "src/tint/ast/assignment_statement.h" #include "src/tint/ast/assignment_statement.h"
#include "src/tint/ast/block_statement.h" #include "src/tint/ast/block_statement.h"
#include "src/tint/ast/case_statement.h" #include "src/tint/ast/case_statement.h"
#include "src/tint/ast/fallthrough_statement.h"
#include "src/tint/ast/for_loop_statement.h" #include "src/tint/ast/for_loop_statement.h"
#include "src/tint/ast/if_statement.h" #include "src/tint/ast/if_statement.h"
#include "src/tint/ast/switch_statement.h" #include "src/tint/ast/switch_statement.h"
@ -151,10 +150,7 @@ fn main() {
switch(1) { switch(1) {
case 0, 1: { case 0, 1: {
} }
default: { case 2, default: {
fallthrough;
}
case 2: {
} }
} }
})"; })";
@ -171,20 +167,14 @@ fn main() {
switch(1) { switch(1) {
case 0, 1: { case 0, 1: {
} }
default: { case 2, default: {
fallthrough;
}
case 2: {
} }
} }
})"; })";
auto expected = R"( auto expected = R"(
fn main() { fn main() {
switch(1) { switch(1) {
default: { case 2, default: {
fallthrough;
}
case 2: {
} }
} }
})"; })";
@ -199,43 +189,6 @@ fn main() {
CheckStatementDeletionWorks(original, expected, statement_finder); CheckStatementDeletionWorks(original, expected, statement_finder);
} }
TEST(DeleteStatementTest, DeleteFallthroughStatement) {
auto original = R"(
fn main() {
switch(1) {
case 0, 1: {
}
default: {
fallthrough;
}
case 2: {
}
}
})";
auto expected = R"(
fn main() {
switch(1) {
case 0, 1: {
}
default: {
}
case 2: {
}
}
})";
auto statement_finder = [](const Program& program) -> const ast::Statement* {
return program.AST()
.Functions()[0]
->body->statements[0]
->As<ast::SwitchStatement>()
->body[1]
->As<ast::CaseStatement>()
->body->statements[0]
->As<ast::FallthroughStatement>();
};
CheckStatementDeletionWorks(original, expected, statement_finder);
}
TEST(DeleteStatementTest, DeleteElse) { TEST(DeleteStatementTest, DeleteElse) {
auto original = R"( auto original = R"(
fn main() { fn main() {
@ -570,14 +523,11 @@ fn main() {
CheckStatementDeletionNotAllowed(original, statement_finder); CheckStatementDeletionNotAllowed(original, statement_finder);
} }
TEST(DeleteStatementTest, DoNotDeleteCaseDueToFallthrough) { TEST(DeleteStatementTest, DoNotDeleteCaseDueToDefault) {
auto original = R"( auto original = R"(
fn main() { fn main() {
switch(1) { switch(1) {
default: { case 2, default: {
fallthrough;
}
case 2: {
} }
} }
})"; })";
@ -586,7 +536,7 @@ fn main() {
.Functions()[0] .Functions()[0]
->body->statements[0] ->body->statements[0]
->As<ast::SwitchStatement>() ->As<ast::SwitchStatement>()
->body[1] ->body[0]
->As<ast::CaseStatement>(); ->As<ast::CaseStatement>();
}; };
CheckStatementDeletionNotAllowed(original, statement_finder); CheckStatementDeletionNotAllowed(original, statement_finder);