Fix memory leak in ShaderModuleBase::MakeError

Change the ShaderModuleBase::MakeError to return a Ref<ShaderModuleBase>
rather than a naked pointer. This Ref will be used and finally detached in
DeviceBase::APICreateShaderModule.

Bug: chromium:1223546
Change-Id: Ie4213f091e37fdc61c6e1f0bb742e8787bcb4eb8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/58660
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com>
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index 32c13f0..8643414 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -844,6 +844,7 @@
         std::unique_ptr<OwnedCompilationMessages> compilationMessages(
             std::make_unique<OwnedCompilationMessages>());
         if (ConsumedError(CreateShaderModule(descriptor, compilationMessages.get()), &result)) {
+            DAWN_ASSERT(result == nullptr);
             result = ShaderModuleBase::MakeError(this);
         }
         // Move compilation messages into ShaderModuleBase and emit tint errors and warnings
diff --git a/src/dawn_native/ShaderModule.cpp b/src/dawn_native/ShaderModule.cpp
index bdff7a7..4c23874 100644
--- a/src/dawn_native/ShaderModule.cpp
+++ b/src/dawn_native/ShaderModule.cpp
@@ -1307,8 +1307,8 @@
     }
 
     // static
-    ShaderModuleBase* ShaderModuleBase::MakeError(DeviceBase* device) {
-        return new ShaderModuleBase(device, ObjectBase::kError);
+    Ref<ShaderModuleBase> ShaderModuleBase::MakeError(DeviceBase* device) {
+        return AcquireRef(new ShaderModuleBase(device, ObjectBase::kError));
     }
 
     bool ShaderModuleBase::HasEntryPoint(const std::string& entryPoint) const {
diff --git a/src/dawn_native/ShaderModule.h b/src/dawn_native/ShaderModule.h
index dd3d34a..2717042 100644
--- a/src/dawn_native/ShaderModule.h
+++ b/src/dawn_native/ShaderModule.h
@@ -166,7 +166,7 @@
         ShaderModuleBase(DeviceBase* device, const ShaderModuleDescriptor* descriptor);
         ~ShaderModuleBase() override;
 
-        static ShaderModuleBase* MakeError(DeviceBase* device);
+        static Ref<ShaderModuleBase> MakeError(DeviceBase* device);
 
         // Return true iff the program has an entrypoint called `entryPoint`.
         bool HasEntryPoint(const std::string& entryPoint) const;