[ir] Convert RenameConflicts to a free function

Bug: tint:1718
Change-Id: I7eda0d7a47101fb34a02f68974f70f1327ed7ca8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143829
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index 98c580e..d760e8c 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -94,14 +94,21 @@
     explicit State(ir::Module& m) : mod(m) {}
 
     Program Run() {
+        // Run transforms need to sanitize for WGSL.
+        {
+            auto result = RenameConflicts(&mod);
+            if (!result) {
+                b.Diagnostics().add_error(diag::System::Transform, result.Failure());
+                return Program(std::move(b));
+            }
+        }
+
         if (auto res = ir::Validate(mod); !res) {
             // IR module failed validation.
             b.Diagnostics() = res.Failure();
             return Program{resolver::Resolve(b)};
         }
 
-        RenameConflicts{}.Run(&mod);
-
         if (mod.root_block) {
             RootBlock(mod.root_block);
         }
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
index 8795491..eadae08 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
@@ -22,6 +22,7 @@
 #include "src/tint/lang/core/ir/loop.h"
 #include "src/tint/lang/core/ir/module.h"
 #include "src/tint/lang/core/ir/multi_in_block.h"
+#include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/core/ir/var.h"
 #include "src/tint/lang/core/type/matrix.h"
 #include "src/tint/lang/core/type/scalar.h"
@@ -35,12 +36,12 @@
 #include "src/tint/utils/rtti/switch.h"
 #include "src/tint/utils/text/string.h"
 
-TINT_INSTANTIATE_TYPEINFO(tint::wgsl::writer::RenameConflicts);
-
 namespace tint::wgsl::writer {
 
+namespace {
+
 /// PIMPL state for the transform, for a single function.
-struct RenameConflicts::State {
+struct State {
     /// Constructor
     /// @param i the IR module
     explicit State(ir::Module* i) : ir(i) {}
@@ -272,11 +273,17 @@
     }
 };
 
-RenameConflicts::RenameConflicts() = default;
-RenameConflicts::~RenameConflicts() = default;
+}  // namespace
 
-void RenameConflicts::Run(ir::Module* ir) const {
+Result<SuccessType, std::string> RenameConflicts(ir::Module* ir) {
+    auto result = ValidateAndDumpIfNeeded(*ir, "RenameConflicts transform");
+    if (!result) {
+        return result;
+    }
+
     State{ir}.Process();
+
+    return Success;
 }
 
 }  // namespace tint::wgsl::writer
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.h b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.h
index 918b331..9dc9620 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.h
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.h
@@ -15,26 +15,23 @@
 #ifndef SRC_TINT_LANG_WGSL_WRITER_IR_TO_PROGRAM_RENAME_CONFLICTS_H_
 #define SRC_TINT_LANG_WGSL_WRITER_IR_TO_PROGRAM_RENAME_CONFLICTS_H_
 
-#include "src/tint/lang/core/ir/transform/transform.h"
+#include <string>
+
+#include "src/tint/utils/result/result.h"
+
+// Forward declarations.
+namespace tint::ir {
+class Module;
+}
 
 namespace tint::wgsl::writer {
 
 /// RenameConflicts is a transform that renames declarations which prevent identifiers from
 /// resolving to the correct declaration, and those with identical identifiers declared in the same
 /// scope.
-class RenameConflicts final : public Castable<RenameConflicts, ir::transform::Transform> {
-  public:
-    /// Constructor
-    RenameConflicts();
-    /// Destructor
-    ~RenameConflicts() override;
-
-    /// @copydoc ir::transform::Transform::Run
-    void Run(ir::Module* module) const override;
-
-  private:
-    struct State;
-};
+/// @param module the module to transform
+/// @returns an error string on failure
+Result<SuccessType, std::string> RenameConflicts(ir::Module* module);
 
 }  // namespace tint::wgsl::writer
 
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
index 95279ae..cd09164 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts_test.cc
@@ -42,7 +42,8 @@
         }
 
         // Run the transforms.
-        RenameConflicts{}.Run(&mod);
+        auto result = RenameConflicts(&mod);
+        EXPECT_TRUE(result) << result.Failure();
 
         // Validate the output IR.
         auto res = ir::Validate(mod);