[chromium-style] Adding/moving constructors and destructors.

This CL adds missing constructors and destructors. Others are moved
from the header file to implementation files.

Bug: dawn:1405
Change-Id: I06657d4a4faa437ca5a95a0067a8f9f9bbc89d12
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/89181
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/AsyncTask.cpp b/src/dawn/native/AsyncTask.cpp
index 00e6a64..2f0face 100644
--- a/src/dawn/native/AsyncTask.cpp
+++ b/src/dawn/native/AsyncTask.cpp
@@ -77,4 +77,8 @@
     waitableTask->taskManager->HandleTaskCompletion(waitableTask.Get());
 }
 
+AsyncTaskManager::WaitableTask::WaitableTask() = default;
+
+AsyncTaskManager::WaitableTask::~WaitableTask() = default;
+
 }  // namespace dawn::native
diff --git a/src/dawn/native/AsyncTask.h b/src/dawn/native/AsyncTask.h
index d2c28fa..e1d130e 100644
--- a/src/dawn/native/AsyncTask.h
+++ b/src/dawn/native/AsyncTask.h
@@ -47,6 +47,9 @@
   private:
     class WaitableTask : public RefCounted {
       public:
+        WaitableTask();
+        ~WaitableTask();
+
         AsyncTask asyncTask;
         AsyncTaskManager* taskManager;
         std::unique_ptr<dawn::platform::WaitableEvent> waitableEvent;
diff --git a/src/dawn/native/BlobCache.cpp b/src/dawn/native/BlobCache.cpp
index 9ec4750..878ded6 100644
--- a/src/dawn/native/BlobCache.cpp
+++ b/src/dawn/native/BlobCache.cpp
@@ -27,6 +27,12 @@
     }
 }
 
+CachedBlob::CachedBlob(CachedBlob&&) = default;
+
+CachedBlob::~CachedBlob() = default;
+
+CachedBlob& CachedBlob::operator=(CachedBlob&&) = default;
+
 bool CachedBlob::Empty() const {
     return mSize == 0;
 }
diff --git a/src/dawn/native/BlobCache.h b/src/dawn/native/BlobCache.h
index 8565429..b1c0a63 100644
--- a/src/dawn/native/BlobCache.h
+++ b/src/dawn/native/BlobCache.h
@@ -31,6 +31,10 @@
 class CachedBlob {
   public:
     explicit CachedBlob(size_t size = 0);
+    CachedBlob(CachedBlob&&);
+    ~CachedBlob();
+
+    CachedBlob& operator=(CachedBlob&&);
 
     bool Empty() const;
     const uint8_t* Data() const;
diff --git a/src/dawn/native/BuddyMemoryAllocator.cpp b/src/dawn/native/BuddyMemoryAllocator.cpp
index d21ecf1..f744440 100644
--- a/src/dawn/native/BuddyMemoryAllocator.cpp
+++ b/src/dawn/native/BuddyMemoryAllocator.cpp
@@ -34,6 +34,8 @@
     mTrackedSubAllocations.resize(maxSystemSize / mMemoryBlockSize);
 }
 
+BuddyMemoryAllocator::~BuddyMemoryAllocator() = default;
+
 uint64_t BuddyMemoryAllocator::GetMemoryIndex(uint64_t offset) const {
     ASSERT(offset != BuddyAllocator::kInvalidOffset);
     return offset / mMemoryBlockSize;
diff --git a/src/dawn/native/BuddyMemoryAllocator.h b/src/dawn/native/BuddyMemoryAllocator.h
index a58cbae..adbcc96 100644
--- a/src/dawn/native/BuddyMemoryAllocator.h
+++ b/src/dawn/native/BuddyMemoryAllocator.h
@@ -42,7 +42,7 @@
     BuddyMemoryAllocator(uint64_t maxSystemSize,
                          uint64_t memoryBlockSize,
                          ResourceHeapAllocator* heapAllocator);
-    ~BuddyMemoryAllocator() = default;
+    ~BuddyMemoryAllocator();
 
     ResultOrError<ResourceMemoryAllocation> Allocate(uint64_t allocationSize, uint64_t alignment);
     void Deallocate(const ResourceMemoryAllocation& allocation);
diff --git a/src/dawn/native/CallbackTaskManager.cpp b/src/dawn/native/CallbackTaskManager.cpp
index 40146f8..51a9b86 100644
--- a/src/dawn/native/CallbackTaskManager.cpp
+++ b/src/dawn/native/CallbackTaskManager.cpp
@@ -18,6 +18,10 @@
 
 namespace dawn::native {
 
+CallbackTaskManager::CallbackTaskManager() = default;
+
+CallbackTaskManager::~CallbackTaskManager() = default;
+
 bool CallbackTaskManager::IsEmpty() {
     std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);
     return mCallbackTaskQueue.empty();
diff --git a/src/dawn/native/CallbackTaskManager.h b/src/dawn/native/CallbackTaskManager.h
index 479ba01..aceea0a 100644
--- a/src/dawn/native/CallbackTaskManager.h
+++ b/src/dawn/native/CallbackTaskManager.h
@@ -31,6 +31,9 @@
 
 class CallbackTaskManager {
   public:
+    CallbackTaskManager();
+    ~CallbackTaskManager();
+
     void AddCallbackTask(std::unique_ptr<CallbackTask> callbackTask);
     bool IsEmpty();
     std::vector<std::unique_ptr<CallbackTask>> AcquireCallbackTasks();
diff --git a/src/dawn/native/CreatePipelineAsyncTask.cpp b/src/dawn/native/CreatePipelineAsyncTask.cpp
index 9ecd048..e7319ab 100644
--- a/src/dawn/native/CreatePipelineAsyncTask.cpp
+++ b/src/dawn/native/CreatePipelineAsyncTask.cpp
@@ -30,6 +30,8 @@
                                                                          void* userdata)
     : mErrorMessage(errorMessage), mUserData(userdata) {}
 
+CreatePipelineAsyncCallbackTaskBase::~CreatePipelineAsyncCallbackTaskBase() = default;
+
 CreateComputePipelineAsyncCallbackTask::CreateComputePipelineAsyncCallbackTask(
     Ref<ComputePipelineBase> pipeline,
     std::string errorMessage,
@@ -39,6 +41,8 @@
       mPipeline(std::move(pipeline)),
       mCreateComputePipelineAsyncCallback(callback) {}
 
+CreateComputePipelineAsyncCallbackTask::~CreateComputePipelineAsyncCallbackTask() = default;
+
 void CreateComputePipelineAsyncCallbackTask::Finish() {
     ASSERT(mCreateComputePipelineAsyncCallback != nullptr);
 
@@ -74,6 +78,8 @@
       mPipeline(std::move(pipeline)),
       mCreateRenderPipelineAsyncCallback(callback) {}
 
+CreateRenderPipelineAsyncCallbackTask::~CreateRenderPipelineAsyncCallbackTask() = default;
+
 void CreateRenderPipelineAsyncCallbackTask::Finish() {
     ASSERT(mCreateRenderPipelineAsyncCallback != nullptr);
 
@@ -110,6 +116,8 @@
     ASSERT(mComputePipeline != nullptr);
 }
 
+CreateComputePipelineAsyncTask::~CreateComputePipelineAsyncTask() = default;
+
 void CreateComputePipelineAsyncTask::Run() {
     const char* eventLabel = utils::GetLabelForTrace(mComputePipeline->GetLabel().c_str());
 
@@ -160,6 +168,8 @@
     ASSERT(mRenderPipeline != nullptr);
 }
 
+CreateRenderPipelineAsyncTask::~CreateRenderPipelineAsyncTask() = default;
+
 void CreateRenderPipelineAsyncTask::Run() {
     const char* eventLabel = utils::GetLabelForTrace(mRenderPipeline->GetLabel().c_str());
 
diff --git a/src/dawn/native/CreatePipelineAsyncTask.h b/src/dawn/native/CreatePipelineAsyncTask.h
index cd98154..7b9e614 100644
--- a/src/dawn/native/CreatePipelineAsyncTask.h
+++ b/src/dawn/native/CreatePipelineAsyncTask.h
@@ -34,6 +34,7 @@
 
 struct CreatePipelineAsyncCallbackTaskBase : CallbackTask {
     CreatePipelineAsyncCallbackTaskBase(std::string errorMessage, void* userData);
+    ~CreatePipelineAsyncCallbackTaskBase();
 
   protected:
     std::string mErrorMessage;
@@ -45,6 +46,7 @@
                                            std::string errorMessage,
                                            WGPUCreateComputePipelineAsyncCallback callback,
                                            void* userdata);
+    ~CreateComputePipelineAsyncCallbackTask() override;
 
     void Finish() override;
     void HandleShutDown() final;
@@ -60,6 +62,7 @@
                                           std::string errorMessage,
                                           WGPUCreateRenderPipelineAsyncCallback callback,
                                           void* userdata);
+    ~CreateRenderPipelineAsyncCallbackTask() override;
 
     void Finish() override;
     void HandleShutDown() final;
@@ -77,6 +80,7 @@
     CreateComputePipelineAsyncTask(Ref<ComputePipelineBase> nonInitializedComputePipeline,
                                    WGPUCreateComputePipelineAsyncCallback callback,
                                    void* userdata);
+    ~CreateComputePipelineAsyncTask();
 
     void Run();
 
@@ -95,6 +99,7 @@
     CreateRenderPipelineAsyncTask(Ref<RenderPipelineBase> nonInitializedRenderPipeline,
                                   WGPUCreateRenderPipelineAsyncCallback callback,
                                   void* userdata);
+    ~CreateRenderPipelineAsyncTask();
 
     void Run();
 
diff --git a/src/dawn/native/ErrorScope.cpp b/src/dawn/native/ErrorScope.cpp
index fe40d2d..b90fb13 100644
--- a/src/dawn/native/ErrorScope.cpp
+++ b/src/dawn/native/ErrorScope.cpp
@@ -45,6 +45,10 @@
     return mErrorMessage.c_str();
 }
 
+ErrorScopeStack::ErrorScopeStack() = default;
+
+ErrorScopeStack::~ErrorScopeStack() = default;
+
 void ErrorScopeStack::Push(wgpu::ErrorFilter filter) {
     mScopes.push_back(ErrorScope(filter));
 }
diff --git a/src/dawn/native/ErrorScope.h b/src/dawn/native/ErrorScope.h
index 3ffb510..7901d18 100644
--- a/src/dawn/native/ErrorScope.h
+++ b/src/dawn/native/ErrorScope.h
@@ -38,6 +38,9 @@
 
 class ErrorScopeStack {
   public:
+    ErrorScopeStack();
+    ~ErrorScopeStack();
+
     void Push(wgpu::ErrorFilter errorFilter);
     ErrorScope Pop();
 
diff --git a/src/dawn/native/Features.cpp b/src/dawn/native/Features.cpp
index 5621b63..c33b4af 100644
--- a/src/dawn/native/Features.cpp
+++ b/src/dawn/native/Features.cpp
@@ -232,6 +232,8 @@
     }
 }
 
+FeaturesInfo::~FeaturesInfo() = default;
+
 const FeatureInfo* FeaturesInfo::GetFeatureInfo(wgpu::FeatureName feature) const {
     Feature f = FromAPIFeature(feature);
     if (f == Feature::InvalidEnum) {
diff --git a/src/dawn/native/Features.h b/src/dawn/native/Features.h
index bb1f015..c2439b2 100644
--- a/src/dawn/native/Features.h
+++ b/src/dawn/native/Features.h
@@ -68,6 +68,7 @@
 class FeaturesInfo {
   public:
     FeaturesInfo();
+    ~FeaturesInfo();
 
     // Used to query the details of an feature. Return nullptr if featureName is not a valid
     // name of an feature supported in Dawn
diff --git a/src/dawn/native/Instance.cpp b/src/dawn/native/Instance.cpp
index 34436b2..1e25a3b 100644
--- a/src/dawn/native/Instance.cpp
+++ b/src/dawn/native/Instance.cpp
@@ -122,6 +122,10 @@
     return instance;
 }
 
+InstanceBase::InstanceBase() = default;
+
+InstanceBase::~InstanceBase() = default;
+
 // TODO(crbug.com/dawn/832): make the platform an initialization parameter of the instance.
 MaybeError InstanceBase::Initialize(const InstanceDescriptor* descriptor) {
     DAWN_TRY(ValidateSingleSType(descriptor->nextInChain, wgpu::SType::DawnInstanceDescriptor));
diff --git a/src/dawn/native/Instance.h b/src/dawn/native/Instance.h
index 6f8f5d5..0f3cb18 100644
--- a/src/dawn/native/Instance.h
+++ b/src/dawn/native/Instance.h
@@ -93,8 +93,8 @@
     Surface* APICreateSurface(const SurfaceDescriptor* descriptor);
 
   private:
-    InstanceBase() = default;
-    ~InstanceBase() override = default;
+    InstanceBase();
+    ~InstanceBase() override;
 
     InstanceBase(const InstanceBase& other) = delete;
     InstanceBase& operator=(const InstanceBase& other) = delete;
diff --git a/src/dawn/native/PooledResourceMemoryAllocator.cpp b/src/dawn/native/PooledResourceMemoryAllocator.cpp
index 95bca8c..96b10c6 100644
--- a/src/dawn/native/PooledResourceMemoryAllocator.cpp
+++ b/src/dawn/native/PooledResourceMemoryAllocator.cpp
@@ -23,6 +23,8 @@
 PooledResourceMemoryAllocator::PooledResourceMemoryAllocator(ResourceHeapAllocator* heapAllocator)
     : mHeapAllocator(heapAllocator) {}
 
+PooledResourceMemoryAllocator::~PooledResourceMemoryAllocator() = default;
+
 void PooledResourceMemoryAllocator::DestroyPool() {
     for (auto& resourceHeap : mPool) {
         ASSERT(resourceHeap != nullptr);
diff --git a/src/dawn/native/PooledResourceMemoryAllocator.h b/src/dawn/native/PooledResourceMemoryAllocator.h
index e75ad55..073ea26 100644
--- a/src/dawn/native/PooledResourceMemoryAllocator.h
+++ b/src/dawn/native/PooledResourceMemoryAllocator.h
@@ -32,7 +32,7 @@
 class PooledResourceMemoryAllocator : public ResourceHeapAllocator {
   public:
     explicit PooledResourceMemoryAllocator(ResourceHeapAllocator* heapAllocator);
-    ~PooledResourceMemoryAllocator() override = default;
+    ~PooledResourceMemoryAllocator() override;
 
     ResultOrError<std::unique_ptr<ResourceHeapBase>> AllocateResourceHeap(uint64_t size) override;
     void DeallocateResourceHeap(std::unique_ptr<ResourceHeapBase> allocation) override;
diff --git a/src/dawn/native/RingBufferAllocator.cpp b/src/dawn/native/RingBufferAllocator.cpp
index d384383..01e23e7 100644
--- a/src/dawn/native/RingBufferAllocator.cpp
+++ b/src/dawn/native/RingBufferAllocator.cpp
@@ -30,8 +30,16 @@
 // used bytes.
 namespace dawn::native {
 
+RingBufferAllocator::RingBufferAllocator() = default;
+
 RingBufferAllocator::RingBufferAllocator(uint64_t maxSize) : mMaxBlockSize(maxSize) {}
 
+RingBufferAllocator::RingBufferAllocator(const RingBufferAllocator&) = default;
+
+RingBufferAllocator::~RingBufferAllocator() = default;
+
+RingBufferAllocator& RingBufferAllocator::operator=(const RingBufferAllocator&) = default;
+
 void RingBufferAllocator::Deallocate(ExecutionSerial lastCompletedSerial) {
     // Reclaim memory from previously recorded blocks.
     for (Request& request : mInflightRequests.IterateUpTo(lastCompletedSerial)) {
diff --git a/src/dawn/native/RingBufferAllocator.h b/src/dawn/native/RingBufferAllocator.h
index cbb01b7..6aeb142 100644
--- a/src/dawn/native/RingBufferAllocator.h
+++ b/src/dawn/native/RingBufferAllocator.h
@@ -26,11 +26,12 @@
 
 class RingBufferAllocator {
   public:
-    RingBufferAllocator() = default;
+    RingBufferAllocator();
     explicit RingBufferAllocator(uint64_t maxSize);
-    ~RingBufferAllocator() = default;
-    RingBufferAllocator(const RingBufferAllocator&) = default;
-    RingBufferAllocator& operator=(const RingBufferAllocator&) = default;
+    RingBufferAllocator(const RingBufferAllocator&);
+    ~RingBufferAllocator();
+
+    RingBufferAllocator& operator=(const RingBufferAllocator&);
 
     uint64_t Allocate(uint64_t allocationSize, ExecutionSerial serial);
     void Deallocate(ExecutionSerial lastCompletedSerial);
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index bc2fcbd..f98c94d 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -313,6 +313,10 @@
     return toggleNameAndInfo.info.name;
 }
 
+TogglesInfo::TogglesInfo() = default;
+
+TogglesInfo::~TogglesInfo() = default;
+
 const ToggleInfo* TogglesInfo::GetToggleInfo(const char* toggleName) {
     ASSERT(toggleName);
 
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index 2d8d286..341db79 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -91,6 +91,9 @@
 
 class TogglesInfo {
   public:
+    TogglesInfo();
+    ~TogglesInfo();
+
     // Used to query the details of a toggle. Return nullptr if toggleName is not a valid name
     // of a toggle supported in Dawn.
     const ToggleInfo* GetToggleInfo(const char* toggleName);
diff --git a/src/dawn/native/metal/BackendMTL.h b/src/dawn/native/metal/BackendMTL.h
index fe6908f..75be730 100644
--- a/src/dawn/native/metal/BackendMTL.h
+++ b/src/dawn/native/metal/BackendMTL.h
@@ -24,6 +24,7 @@
 class Backend : public BackendConnection {
   public:
     explicit Backend(InstanceBase* instance);
+    ~Backend() override;
 
     std::vector<Ref<AdapterBase>> DiscoverDefaultAdapters() override;
     ResultOrError<std::vector<Ref<AdapterBase>>> DiscoverAdapters(
diff --git a/src/dawn/native/metal/BackendMTL.mm b/src/dawn/native/metal/BackendMTL.mm
index 2545e11..11430de 100644
--- a/src/dawn/native/metal/BackendMTL.mm
+++ b/src/dawn/native/metal/BackendMTL.mm
@@ -608,6 +608,8 @@
     }
 }
 
+Backend::~Backend() = default;
+
 std::vector<Ref<AdapterBase>> Backend::DiscoverDefaultAdapters() {
     AdapterDiscoveryOptions options;
     auto result = DiscoverAdapters(&options);
diff --git a/src/dawn/native/metal/BindGroupLayoutMTL.h b/src/dawn/native/metal/BindGroupLayoutMTL.h
index 97688eb..ab2abef 100644
--- a/src/dawn/native/metal/BindGroupLayoutMTL.h
+++ b/src/dawn/native/metal/BindGroupLayoutMTL.h
@@ -36,7 +36,7 @@
     BindGroupLayout(DeviceBase* device,
                     const BindGroupLayoutDescriptor* descriptor,
                     PipelineCompatibilityToken pipelineCompatibilityToken);
-    ~BindGroupLayout() override = default;
+    ~BindGroupLayout() override;
 
     SlabAllocator<BindGroup> mBindGroupAllocator;
 };
diff --git a/src/dawn/native/metal/BindGroupLayoutMTL.mm b/src/dawn/native/metal/BindGroupLayoutMTL.mm
index 2f1012c..6c1a7ac 100644
--- a/src/dawn/native/metal/BindGroupLayoutMTL.mm
+++ b/src/dawn/native/metal/BindGroupLayoutMTL.mm
@@ -32,6 +32,8 @@
     : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
       mBindGroupAllocator(MakeFrontendBindGroupAllocator<BindGroup>(4096)) {}
 
+BindGroupLayout::~BindGroupLayout() = default;
+
 Ref<BindGroup> BindGroupLayout::AllocateBindGroup(Device* device,
                                                   const BindGroupDescriptor* descriptor) {
     return AcquireRef(mBindGroupAllocator.Allocate(device, descriptor));
diff --git a/src/dawn/native/metal/BufferMTL.h b/src/dawn/native/metal/BufferMTL.h
index 096237b..f36ebe8 100644
--- a/src/dawn/native/metal/BufferMTL.h
+++ b/src/dawn/native/metal/BufferMTL.h
@@ -29,6 +29,9 @@
 class Buffer final : public BufferBase {
   public:
     static ResultOrError<Ref<Buffer>> Create(Device* device, const BufferDescriptor* descriptor);
+
+    Buffer(DeviceBase* device, const BufferDescriptor* descriptor);
+
     id<MTLBuffer> GetMTLBuffer() const;
 
     bool EnsureDataInitialized(CommandRecordingContext* commandContext);
@@ -45,6 +48,7 @@
     MaybeError Initialize(bool mappedAtCreation);
 
     ~Buffer() override;
+
     MaybeError MapAsyncImpl(wgpu::MapMode mode, size_t offset, size_t size) override;
     void UnmapImpl() override;
     void DestroyImpl() override;
diff --git a/src/dawn/native/metal/BufferMTL.mm b/src/dawn/native/metal/BufferMTL.mm
index e8d74c1..8f703ef 100644
--- a/src/dawn/native/metal/BufferMTL.mm
+++ b/src/dawn/native/metal/BufferMTL.mm
@@ -59,6 +59,8 @@
 #endif
 }
 
+Buffer::Buffer(DeviceBase* dev, const BufferDescriptor* desc) : BufferBase(dev, desc) {}
+
 MaybeError Buffer::Initialize(bool mappedAtCreation) {
     MTLResourceOptions storageMode;
     if (GetUsage() & kMappableBufferUsages) {
diff --git a/src/dawn/native/metal/CommandBufferMTL.h b/src/dawn/native/metal/CommandBufferMTL.h
index 8f7a983..8f0c02b 100644
--- a/src/dawn/native/metal/CommandBufferMTL.h
+++ b/src/dawn/native/metal/CommandBufferMTL.h
@@ -47,6 +47,9 @@
     static Ref<CommandBuffer> Create(CommandEncoder* encoder,
                                      const CommandBufferDescriptor* descriptor);
 
+    CommandBuffer(CommandEncoder* encoder, const CommandBufferDescriptor* descriptor);
+    ~CommandBuffer();
+
     MaybeError FillCommands(CommandRecordingContext* commandContext);
 
   private:
diff --git a/src/dawn/native/metal/CommandBufferMTL.mm b/src/dawn/native/metal/CommandBufferMTL.mm
index 121198f..04dab40 100644
--- a/src/dawn/native/metal/CommandBufferMTL.mm
+++ b/src/dawn/native/metal/CommandBufferMTL.mm
@@ -577,6 +577,11 @@
     return AcquireRef(new CommandBuffer(encoder, descriptor));
 }
 
+CommandBuffer::CommandBuffer(CommandEncoder* enc, const CommandBufferDescriptor* desc)
+    : CommandBufferBase(enc, desc) {}
+
+CommandBuffer::~CommandBuffer() = default;
+
 MaybeError CommandBuffer::FillCommands(CommandRecordingContext* commandContext) {
     size_t nextComputePassNumber = 0;
     size_t nextRenderPassNumber = 0;
diff --git a/src/dawn/native/metal/ComputePipelineMTL.h b/src/dawn/native/metal/ComputePipelineMTL.h
index 22ac635..48a723d 100644
--- a/src/dawn/native/metal/ComputePipelineMTL.h
+++ b/src/dawn/native/metal/ComputePipelineMTL.h
@@ -35,6 +35,9 @@
                                 WGPUCreateComputePipelineAsyncCallback callback,
                                 void* userdata);
 
+    ComputePipeline(DeviceBase* device, const ComputePipelineDescriptor* descriptor);
+    ~ComputePipeline() override;
+
     void Encode(id<MTLComputeCommandEncoder> encoder);
     MTLSize GetLocalWorkGroupSize() const;
     bool RequiresStorageBufferLength() const;
diff --git a/src/dawn/native/metal/ComputePipelineMTL.mm b/src/dawn/native/metal/ComputePipelineMTL.mm
index f350071..855cd7b 100644
--- a/src/dawn/native/metal/ComputePipelineMTL.mm
+++ b/src/dawn/native/metal/ComputePipelineMTL.mm
@@ -29,6 +29,11 @@
     return AcquireRef(new ComputePipeline(device, descriptor));
 }
 
+ComputePipeline::ComputePipeline(DeviceBase* dev, const ComputePipelineDescriptor* desc)
+    : ComputePipelineBase(dev, desc) {}
+
+ComputePipeline::~ComputePipeline() = default;
+
 MaybeError ComputePipeline::Initialize() {
     auto mtlDevice = ToBackend(GetDevice())->GetMTLDevice();
 
diff --git a/src/dawn/native/metal/PipelineLayoutMTL.h b/src/dawn/native/metal/PipelineLayoutMTL.h
index 1651954..48711e7 100644
--- a/src/dawn/native/metal/PipelineLayoutMTL.h
+++ b/src/dawn/native/metal/PipelineLayoutMTL.h
@@ -51,7 +51,7 @@
 
   private:
     PipelineLayout(Device* device, const PipelineLayoutDescriptor* descriptor);
-    ~PipelineLayout() override = default;
+    ~PipelineLayout() override;
     PerStage<BindingIndexInfo> mIndexInfo;
     PerStage<uint32_t> mBufferBindingCount;
 };
diff --git a/src/dawn/native/metal/PipelineLayoutMTL.mm b/src/dawn/native/metal/PipelineLayoutMTL.mm
index 2dfad2e..800db51 100644
--- a/src/dawn/native/metal/PipelineLayoutMTL.mm
+++ b/src/dawn/native/metal/PipelineLayoutMTL.mm
@@ -70,6 +70,8 @@
     }
 }
 
+PipelineLayout::~PipelineLayout() = default;
+
 const PipelineLayout::BindingIndexInfo& PipelineLayout::GetBindingIndexInfo(
     SingleShaderStage stage) const {
     return mIndexInfo[stage];
diff --git a/src/dawn/native/metal/QuerySetMTL.h b/src/dawn/native/metal/QuerySetMTL.h
index 9f0e6bb..c8b4c73 100644
--- a/src/dawn/native/metal/QuerySetMTL.h
+++ b/src/dawn/native/metal/QuerySetMTL.h
@@ -30,15 +30,18 @@
     static ResultOrError<Ref<QuerySet>> Create(Device* device,
                                                const QuerySetDescriptor* descriptor);
 
+    QuerySet(DeviceBase* device, const QuerySetDescriptor* descriptor);
+
     id<MTLBuffer> GetVisibilityBuffer() const;
     id<MTLCounterSampleBuffer> GetCounterSampleBuffer() const
         API_AVAILABLE(macos(10.15), ios(14.0));
 
   private:
-    ~QuerySet() override;
     using QuerySetBase::QuerySetBase;
     MaybeError Initialize();
 
+    ~QuerySet() override;
+
     // Dawn API
     void DestroyImpl() override;
 
diff --git a/src/dawn/native/metal/QuerySetMTL.mm b/src/dawn/native/metal/QuerySetMTL.mm
index 1e19963..262ddc8 100644
--- a/src/dawn/native/metal/QuerySetMTL.mm
+++ b/src/dawn/native/metal/QuerySetMTL.mm
@@ -68,6 +68,8 @@
     return queryset;
 }
 
+QuerySet::QuerySet(DeviceBase* dev, const QuerySetDescriptor* desc) : QuerySetBase(dev, desc) {}
+
 MaybeError QuerySet::Initialize() {
     Device* device = ToBackend(GetDevice());
 
diff --git a/src/dawn/native/metal/QueueMTL.h b/src/dawn/native/metal/QueueMTL.h
index e1a37b9..5f95921 100644
--- a/src/dawn/native/metal/QueueMTL.h
+++ b/src/dawn/native/metal/QueueMTL.h
@@ -24,6 +24,7 @@
 class Queue final : public QueueBase {
   public:
     Queue(Device* device, const QueueDescriptor* descriptor);
+    ~Queue() override;
 
   private:
     MaybeError SubmitImpl(uint32_t commandCount, CommandBufferBase* const* commands) override;
diff --git a/src/dawn/native/metal/QueueMTL.mm b/src/dawn/native/metal/QueueMTL.mm
index c129c5d..f6cfa4c 100644
--- a/src/dawn/native/metal/QueueMTL.mm
+++ b/src/dawn/native/metal/QueueMTL.mm
@@ -28,6 +28,8 @@
 
 Queue::Queue(Device* device, const QueueDescriptor* descriptor) : QueueBase(device, descriptor) {}
 
+Queue::~Queue() = default;
+
 MaybeError Queue::SubmitImpl(uint32_t commandCount, CommandBufferBase* const* commands) {
     Device* device = ToBackend(GetDevice());
 
diff --git a/src/dawn/native/metal/RenderPipelineMTL.h b/src/dawn/native/metal/RenderPipelineMTL.h
index cd8111d..23268ae 100644
--- a/src/dawn/native/metal/RenderPipelineMTL.h
+++ b/src/dawn/native/metal/RenderPipelineMTL.h
@@ -33,6 +33,9 @@
                                 WGPUCreateRenderPipelineAsyncCallback callback,
                                 void* userdata);
 
+    RenderPipeline(DeviceBase* device, const RenderPipelineDescriptor* descriptor);
+    ~RenderPipeline() override;
+
     MTLPrimitiveType GetMTLPrimitiveTopology() const;
     MTLWinding GetMTLFrontFace() const;
     MTLCullMode GetMTLCullMode() const;
diff --git a/src/dawn/native/metal/RenderPipelineMTL.mm b/src/dawn/native/metal/RenderPipelineMTL.mm
index 2e10ed9..89548ae 100644
--- a/src/dawn/native/metal/RenderPipelineMTL.mm
+++ b/src/dawn/native/metal/RenderPipelineMTL.mm
@@ -310,6 +310,11 @@
     return AcquireRef(new RenderPipeline(device, descriptor));
 }
 
+RenderPipeline::RenderPipeline(DeviceBase* dev, const RenderPipelineDescriptor* desc)
+    : RenderPipelineBase(dev, desc) {}
+
+RenderPipeline::~RenderPipeline() = default;
+
 MaybeError RenderPipeline::Initialize() {
     mMtlPrimitiveTopology = MTLPrimitiveTopology(GetPrimitiveTopology());
     mMtlFrontFace = MTLFrontFace(GetFrontFace());
diff --git a/src/dawn/native/metal/SamplerMTL.h b/src/dawn/native/metal/SamplerMTL.h
index 2960817..fb7b1fc 100644
--- a/src/dawn/native/metal/SamplerMTL.h
+++ b/src/dawn/native/metal/SamplerMTL.h
@@ -29,6 +29,9 @@
   public:
     static ResultOrError<Ref<Sampler>> Create(Device* device, const SamplerDescriptor* descriptor);
 
+    Sampler(DeviceBase* device, const SamplerDescriptor* descriptor);
+    ~Sampler() override;
+
     id<MTLSamplerState> GetMTLSamplerState();
 
   private:
diff --git a/src/dawn/native/metal/SamplerMTL.mm b/src/dawn/native/metal/SamplerMTL.mm
index 329cd28..97b3046 100644
--- a/src/dawn/native/metal/SamplerMTL.mm
+++ b/src/dawn/native/metal/SamplerMTL.mm
@@ -64,6 +64,10 @@
     return sampler;
 }
 
+Sampler::Sampler(DeviceBase* dev, const SamplerDescriptor* desc) : SamplerBase(dev, desc) {}
+
+Sampler::~Sampler() = default;
+
 MaybeError Sampler::Initialize(const SamplerDescriptor* descriptor) {
     NSRef<MTLSamplerDescriptor> mtlDescRef = AcquireNSRef([MTLSamplerDescriptor new]);
     MTLSamplerDescriptor* mtlDesc = mtlDescRef.Get();
diff --git a/src/dawn/native/metal/ShaderModuleMTL.h b/src/dawn/native/metal/ShaderModuleMTL.h
index dc0ea0b..0359223 100644
--- a/src/dawn/native/metal/ShaderModuleMTL.h
+++ b/src/dawn/native/metal/ShaderModuleMTL.h
@@ -65,7 +65,7 @@
                                               bool* hasInvariantAttribute,
                                               std::vector<uint32_t>* workgroupAllocations);
     ShaderModule(Device* device, const ShaderModuleDescriptor* descriptor);
-    ~ShaderModule() override = default;
+    ~ShaderModule() override;
     MaybeError Initialize(ShaderModuleParseResult* parseResult,
                           OwnedCompilationMessages* compilationMessages);
 };
diff --git a/src/dawn/native/metal/ShaderModuleMTL.mm b/src/dawn/native/metal/ShaderModuleMTL.mm
index 7b17c56..fa8befd 100644
--- a/src/dawn/native/metal/ShaderModuleMTL.mm
+++ b/src/dawn/native/metal/ShaderModuleMTL.mm
@@ -42,6 +42,8 @@
 ShaderModule::ShaderModule(Device* device, const ShaderModuleDescriptor* descriptor)
     : ShaderModuleBase(device, descriptor) {}
 
+ShaderModule::~ShaderModule() = default;
+
 MaybeError ShaderModule::Initialize(ShaderModuleParseResult* parseResult,
                                     OwnedCompilationMessages* compilationMessages) {
     ScopedTintICEHandler scopedICEHandler(GetDevice());
diff --git a/src/dawn/native/metal/StagingBufferMTL.h b/src/dawn/native/metal/StagingBufferMTL.h
index afd2eac..bbad022 100644
--- a/src/dawn/native/metal/StagingBufferMTL.h
+++ b/src/dawn/native/metal/StagingBufferMTL.h
@@ -28,6 +28,7 @@
 class StagingBuffer : public StagingBufferBase {
   public:
     StagingBuffer(size_t size, Device* device);
+    ~StagingBuffer() override;
 
     id<MTLBuffer> GetBufferHandle() const;
 
diff --git a/src/dawn/native/metal/StagingBufferMTL.mm b/src/dawn/native/metal/StagingBufferMTL.mm
index 6bdc9e3..f4255f1 100644
--- a/src/dawn/native/metal/StagingBufferMTL.mm
+++ b/src/dawn/native/metal/StagingBufferMTL.mm
@@ -20,6 +20,8 @@
 StagingBuffer::StagingBuffer(size_t size, Device* device)
     : StagingBufferBase(size), mDevice(device) {}
 
+StagingBuffer::~StagingBuffer() = default;
+
 MaybeError StagingBuffer::Initialize() {
     const size_t bufferSize = GetSize();
     mBuffer =
diff --git a/src/dawn/native/metal/SwapChainMTL.h b/src/dawn/native/metal/SwapChainMTL.h
index 003629c..de5cd5c 100644
--- a/src/dawn/native/metal/SwapChainMTL.h
+++ b/src/dawn/native/metal/SwapChainMTL.h
@@ -44,6 +44,8 @@
                                                 Surface* surface,
                                                 NewSwapChainBase* previousSwapChain,
                                                 const SwapChainDescriptor* descriptor);
+
+    SwapChain(DeviceBase* device, Surface* surface, const SwapChainDescriptor* descriptor);
     ~SwapChain() override;
 
   private:
diff --git a/src/dawn/native/metal/SwapChainMTL.mm b/src/dawn/native/metal/SwapChainMTL.mm
index bf68884..d9435dd 100644
--- a/src/dawn/native/metal/SwapChainMTL.mm
+++ b/src/dawn/native/metal/SwapChainMTL.mm
@@ -72,6 +72,9 @@
     return swapchain;
 }
 
+SwapChain::SwapChain(DeviceBase* dev, Surface* sur, const SwapChainDescriptor* desc)
+    : NewSwapChainBase(dev, sur, desc) {}
+
 SwapChain::~SwapChain() = default;
 
 void SwapChain::DestroyImpl() {
diff --git a/src/dawn/native/metal/TextureMTL.h b/src/dawn/native/metal/TextureMTL.h
index d8b8ccd..3a9c3d8 100644
--- a/src/dawn/native/metal/TextureMTL.h
+++ b/src/dawn/native/metal/TextureMTL.h
@@ -45,6 +45,8 @@
                                        const TextureDescriptor* descriptor,
                                        NSPRef<id<MTLTexture>> wrapped);
 
+    Texture(DeviceBase* device, const TextureDescriptor* descriptor, TextureState state);
+
     id<MTLTexture> GetMTLTexture() const;
     IOSurfaceRef GetIOSurface();
     NSPRef<id<MTLTexture>> CreateFormatView(wgpu::TextureFormat format);
diff --git a/src/dawn/native/metal/TextureMTL.mm b/src/dawn/native/metal/TextureMTL.mm
index 429d60c..38db7cf 100644
--- a/src/dawn/native/metal/TextureMTL.mm
+++ b/src/dawn/native/metal/TextureMTL.mm
@@ -772,6 +772,9 @@
     return {};
 }
 
+Texture::Texture(DeviceBase* dev, const TextureDescriptor* desc, TextureState st)
+    : TextureBase(dev, desc, st) {}
+
 Texture::~Texture() {}
 
 void Texture::DestroyImpl() {
diff --git a/src/dawn/native/vulkan/AdapterVk.cpp b/src/dawn/native/vulkan/AdapterVk.cpp
index 6b0d770..c414c62 100644
--- a/src/dawn/native/vulkan/AdapterVk.cpp
+++ b/src/dawn/native/vulkan/AdapterVk.cpp
@@ -32,6 +32,8 @@
       mPhysicalDevice(physicalDevice),
       mVulkanInstance(vulkanInstance) {}
 
+Adapter::~Adapter() = default;
+
 const VulkanDeviceInfo& Adapter::GetDeviceInfo() const {
     return mDeviceInfo;
 }
diff --git a/src/dawn/native/vulkan/AdapterVk.h b/src/dawn/native/vulkan/AdapterVk.h
index 2d9ce45..9cb5234 100644
--- a/src/dawn/native/vulkan/AdapterVk.h
+++ b/src/dawn/native/vulkan/AdapterVk.h
@@ -30,7 +30,7 @@
     Adapter(InstanceBase* instance,
             VulkanInstance* vulkanInstance,
             VkPhysicalDevice physicalDevice);
-    ~Adapter() override = default;
+    ~Adapter() override;
 
     // AdapterBase Implementation
     bool SupportsExternalImages() const override;
diff --git a/src/dawn/wire/ChunkedCommandHandler.cpp b/src/dawn/wire/ChunkedCommandHandler.cpp
index 9c3dc0e..7dd1075 100644
--- a/src/dawn/wire/ChunkedCommandHandler.cpp
+++ b/src/dawn/wire/ChunkedCommandHandler.cpp
@@ -22,6 +22,8 @@
 
 namespace dawn::wire {
 
+ChunkedCommandHandler::ChunkedCommandHandler() = default;
+
 ChunkedCommandHandler::~ChunkedCommandHandler() = default;
 
 const volatile char* ChunkedCommandHandler::HandleCommands(const volatile char* commands,
diff --git a/src/dawn/wire/ChunkedCommandHandler.h b/src/dawn/wire/ChunkedCommandHandler.h
index c84c4ef..713ed38 100644
--- a/src/dawn/wire/ChunkedCommandHandler.h
+++ b/src/dawn/wire/ChunkedCommandHandler.h
@@ -27,9 +27,11 @@
 
 class ChunkedCommandHandler : public CommandHandler {
   public:
-    const volatile char* HandleCommands(const volatile char* commands, size_t size) override;
+    ChunkedCommandHandler();
     ~ChunkedCommandHandler() override;
 
+    const volatile char* HandleCommands(const volatile char* commands, size_t size) override;
+
   protected:
     enum class ChunkedCommandsResult {
         Passthrough,
diff --git a/src/dawn/wire/server/Server.cpp b/src/dawn/wire/server/Server.cpp
index 565154e..6dc8358 100644
--- a/src/dawn/wire/server/Server.cpp
+++ b/src/dawn/wire/server/Server.cpp
@@ -17,6 +17,9 @@
 
 namespace dawn::wire::server {
 
+CallbackUserdata::CallbackUserdata(Server* server, const std::shared_ptr<bool>& serverIsAlive)
+    : server(server), serverIsAlive(serverIsAlive) {}
+
 Server::Server(const DawnProcTable& procs,
                CommandSerializer* serializer,
                MemoryTransferService* memoryTransferService)
diff --git a/src/dawn/wire/server/Server.h b/src/dawn/wire/server/Server.h
index 52901b0..9bf60c8 100644
--- a/src/dawn/wire/server/Server.h
+++ b/src/dawn/wire/server/Server.h
@@ -55,8 +55,7 @@
     std::weak_ptr<bool> const serverIsAlive;
 
     CallbackUserdata() = delete;
-    CallbackUserdata(Server* server, const std::shared_ptr<bool>& serverIsAlive)
-        : server(server), serverIsAlive(serverIsAlive) {}
+    CallbackUserdata(Server* server, const std::shared_ptr<bool>& serverIsAlive);
 };
 
 template <auto F>