[tint] Fix crash when ProcessASTTransforms fails
If the function returns tint::Failure, the `res.Get()` calls crash as
there is no program in the tint::Result object.
Move the `PrintWGSL()` logic to `ProcessASTTransforms` for the
specific case where there is a program but it was not valid.
Fixed: 390165484
Change-Id: I8cea182e515568a553c5cc721471113b26f30534
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/222094
Auto-Submit: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/cmd/tint/main.cc b/src/tint/cmd/tint/main.cc
index 3c78b6f..ef52aa1 100644
--- a/src/tint/cmd/tint/main.cc
+++ b/src/tint/cmd/tint/main.cc
@@ -701,7 +701,14 @@
AddSubstituteOverrides(res.Get(), transform_manager, transform_inputs);
tint::ast::transform::DataMap outputs;
- return transform_manager.Run(program, std::move(transform_inputs), outputs);
+ auto transformed = transform_manager.Run(program, std::move(transform_inputs), outputs);
+ if (!transformed.IsValid()) {
+ std::stringstream err;
+ tint::cmd::PrintWGSL(err, transformed);
+ err << transformed.Diagnostics() << "\n";
+ return tint::Failure(err.str());
+ }
+ return transformed;
}
#if TINT_BUILD_SPV_WRITER
@@ -754,9 +761,8 @@
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_SPV_WRITER
auto res = ProcessASTTransforms(options, inspector, src_program);
- if (res != tint::Success || !res->IsValid()) {
- tint::cmd::PrintWGSL(std::cerr, res.Get());
- std::cerr << res->Diagnostics() << "\n";
+ if (res != tint::Success) {
+ std::cerr << res.Failure().reason << "\n";
return 1;
}
@@ -891,9 +897,8 @@
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_MSL_WRITER
auto transform_res = ProcessASTTransforms(options, inspector, src_program);
- if (transform_res != tint::Success || !transform_res->IsValid()) {
- tint::cmd::PrintWGSL(std::cerr, transform_res.Get());
- std::cerr << transform_res->Diagnostics() << "\n";
+ if (transform_res != tint::Success) {
+ std::cerr << transform_res.Failure().reason << "\n";
return 1;
}
@@ -1016,9 +1021,8 @@
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_HLSL_WRITER
auto res = ProcessASTTransforms(options, inspector, src_program);
- if (res != tint::Success || !res->IsValid()) {
- tint::cmd::PrintWGSL(std::cerr, res.Get());
- std::cerr << res->Diagnostics() << "\n";
+ if (res != tint::Success) {
+ std::cerr << res.Failure().reason << "\n";
return 1;
}
@@ -1154,9 +1158,8 @@
[[maybe_unused]] tint::Program& src_program) {
#if TINT_BUILD_GLSL_WRITER
auto res = ProcessASTTransforms(options, inspector, src_program);
- if (res != tint::Success || !res->IsValid()) {
- tint::cmd::PrintWGSL(std::cerr, res.Get());
- std::cerr << res->Diagnostics() << "\n";
+ if (res != tint::Success) {
+ std::cerr << res.Failure().reason << "\n";
return 1;
}