[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;
     }