diff --git a/src/common/ConcurrentCache.h b/src/common/ConcurrentCache.h
index 0e93ddd..a1cab8d 100644
--- a/src/common/ConcurrentCache.h
+++ b/src/common/ConcurrentCache.h
@@ -37,8 +37,8 @@
 
     std::pair<T*, bool> Insert(T* object) {
         std::lock_guard<std::mutex> lock(mMutex);
-        auto insertion = mCache.insert(object);
-        return std::make_pair(*(insertion.first), insertion.second);
+        auto [value, inserted] = mCache.insert(object);
+        return {*value, inserted};
     }
 
     size_t Erase(T* object) {
diff --git a/src/dawn_native/AsyncTask.cpp b/src/dawn_native/AsyncTask.cpp
index 84f8764..c00d16e 100644
--- a/src/dawn_native/AsyncTask.cpp
+++ b/src/dawn_native/AsyncTask.cpp
@@ -46,8 +46,8 @@
             allPendingTasks.swap(mPendingTasks);
         }
 
-        for (auto& keyValue : allPendingTasks) {
-            keyValue.second->waitableEvent->Wait();
+        for (auto& [_, task] : allPendingTasks) {
+            task->waitableEvent->Wait();
         }
     }
 
diff --git a/src/dawn_native/BindGroupLayout.cpp b/src/dawn_native/BindGroupLayout.cpp
index 0e6d15f..c56f0ac 100644
--- a/src/dawn_native/BindGroupLayout.cpp
+++ b/src/dawn_native/BindGroupLayout.cpp
@@ -382,8 +382,8 @@
             }
             IncrementBindingCounts(&mBindingCounts, binding);
 
-            const auto& it = mBindingMap.emplace(BindingNumber(binding.binding), i);
-            ASSERT(it.second);
+            const auto& [_, inserted] = mBindingMap.emplace(BindingNumber(binding.binding), i);
+            ASSERT(inserted);
         }
         ASSERT(CheckBufferBindingsFirst({mBindingInfo.data(), GetBindingCount()}));
         ASSERT(mBindingInfo.size() <= kMaxBindingsPerPipelineLayoutTyped);
@@ -445,11 +445,10 @@
 
         // std::map is sorted by key, so two BGLs constructed in different orders
         // will still record the same.
-        for (const auto& it : mBindingMap) {
-            recorder.Record(it.first, it.second);
+        for (const auto [id, index] : mBindingMap) {
+            recorder.Record(id, index);
 
-            const BindingInfo& info = mBindingInfo[it.second];
-
+            const BindingInfo& info = mBindingInfo[index];
             recorder.Record(info.buffer.hasDynamicOffset, info.visibility, info.bindingType,
                             info.buffer.type, info.buffer.minBindingSize, info.sampler.type,
                             info.texture.sampleType, info.texture.viewDimension,
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index 90af4cf..cdaaaa7 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -748,23 +748,23 @@
 
     Ref<ComputePipelineBase> DeviceBase::AddOrGetCachedComputePipeline(
         Ref<ComputePipelineBase> computePipeline) {
-        auto insertion = mCaches->computePipelines.insert(computePipeline.Get());
-        if (insertion.second) {
+        auto [cachedPipeline, inserted] = mCaches->computePipelines.insert(computePipeline.Get());
+        if (inserted) {
             computePipeline->SetIsCachedReference();
             return computePipeline;
         } else {
-            return *(insertion.first);
+            return *cachedPipeline;
         }
     }
 
     Ref<RenderPipelineBase> DeviceBase::AddOrGetCachedRenderPipeline(
         Ref<RenderPipelineBase> renderPipeline) {
-        auto insertion = mCaches->renderPipelines.insert(renderPipeline.Get());
-        if (insertion.second) {
+        auto [cachedPipeline, inserted] = mCaches->renderPipelines.insert(renderPipeline.Get());
+        if (inserted) {
             renderPipeline->SetIsCachedReference();
             return renderPipeline;
         } else {
-            return *(insertion.first);
+            return *cachedPipeline;
         }
     }
 
diff --git a/src/dawn_native/Features.cpp b/src/dawn_native/Features.cpp
index 913706c..75b2266 100644
--- a/src/dawn_native/Features.cpp
+++ b/src/dawn_native/Features.cpp
@@ -256,9 +256,9 @@
                 {"timestamp_query", "timestamp-query"},
                 {"multiplanar_formats", "multiplanar-formats"},
             }};
-        for (const auto& replacement : kReplacementsForDeprecatedNames) {
-            if (strcmp(featureName, replacement.first) == 0) {
-                return FeatureNameToEnum(replacement.second);
+        for (const auto& [name, replacement] : kReplacementsForDeprecatedNames) {
+            if (strcmp(featureName, name) == 0) {
+                return FeatureNameToEnum(replacement);
             }
         }
 
diff --git a/src/dawn_native/IndirectDrawMetadata.cpp b/src/dawn_native/IndirectDrawMetadata.cpp
index 9d514f3..40f144b 100644
--- a/src/dawn_native/IndirectDrawMetadata.cpp
+++ b/src/dawn_native/IndirectDrawMetadata.cpp
@@ -139,22 +139,21 @@
     }
 
     void IndirectDrawMetadata::AddBundle(RenderBundleBase* bundle) {
-        auto result = mAddedBundles.insert(bundle);
-        if (!result.second) {
+        auto [_, inserted] = mAddedBundles.insert(bundle);
+        if (!inserted) {
             return;
         }
 
-        for (const auto& entry :
+        for (const auto& [config, validationInfo] :
              bundle->GetIndirectDrawMetadata().mIndexedIndirectBufferValidationInfo) {
-            const IndexedIndirectConfig& config = entry.first;
             auto it = mIndexedIndirectBufferValidationInfo.lower_bound(config);
             if (it != mIndexedIndirectBufferValidationInfo.end() && it->first == config) {
                 // We already have batches for the same config. Merge the new ones in.
-                for (const IndexedIndirectValidationBatch& batch : entry.second.GetBatches()) {
+                for (const IndexedIndirectValidationBatch& batch : validationInfo.GetBatches()) {
                     it->second.AddBatch(mMaxDrawCallsPerBatch, mMaxBatchOffsetRange, batch);
                 }
             } else {
-                mIndexedIndirectBufferValidationInfo.emplace_hint(it, config, entry.second);
+                mIndexedIndirectBufferValidationInfo.emplace_hint(it, config, validationInfo);
             }
         }
     }
diff --git a/src/dawn_native/IndirectDrawValidationEncoder.cpp b/src/dawn_native/IndirectDrawValidationEncoder.cpp
index 36c8d0a..5e63094 100644
--- a/src/dawn_native/IndirectDrawValidationEncoder.cpp
+++ b/src/dawn_native/IndirectDrawValidationEncoder.cpp
@@ -230,11 +230,10 @@
         const uint32_t minStorageBufferOffsetAlignment =
             device->GetLimits().v1.minStorageBufferOffsetAlignment;
 
-        for (auto& entry : bufferInfoMap) {
-            const IndirectDrawMetadata::IndexedIndirectConfig& config = entry.first;
+        for (auto& [config, validationInfo] : bufferInfoMap) {
             BufferBase* clientIndirectBuffer = config.first;
             for (const IndirectDrawMetadata::IndexedIndirectValidationBatch& batch :
-                 entry.second.GetBatches()) {
+                 validationInfo.GetBatches()) {
                 const uint64_t minOffsetFromAlignedBoundary =
                     batch.minOffset % minStorageBufferOffsetAlignment;
                 const uint64_t minOffsetAlignedDown =
diff --git a/src/dawn_native/PassResourceUsageTracker.cpp b/src/dawn_native/PassResourceUsageTracker.cpp
index 470eee17..46ceda7 100644
--- a/src/dawn_native/PassResourceUsageTracker.cpp
+++ b/src/dawn_native/PassResourceUsageTracker.cpp
@@ -154,14 +154,14 @@
         result.textures.reserve(mTextureUsages.size());
         result.textureUsages.reserve(mTextureUsages.size());
 
-        for (auto& it : mBufferUsages) {
-            result.buffers.push_back(it.first);
-            result.bufferUsages.push_back(it.second);
+        for (auto& [buffer, usage] : mBufferUsages) {
+            result.buffers.push_back(buffer);
+            result.bufferUsages.push_back(usage);
         }
 
-        for (auto& it : mTextureUsages) {
-            result.textures.push_back(it.first);
-            result.textureUsages.push_back(std::move(it.second));
+        for (auto& [texture, usage] : mTextureUsages) {
+            result.textures.push_back(texture);
+            result.textureUsages.push_back(std::move(usage));
         }
 
         for (auto& it : mExternalTextureUsages) {
diff --git a/src/dawn_native/PipelineLayout.cpp b/src/dawn_native/PipelineLayout.cpp
index 2851695..27e3801 100644
--- a/src/dawn_native/PipelineLayout.cpp
+++ b/src/dawn_native/PipelineLayout.cpp
@@ -235,8 +235,8 @@
             -> ResultOrError<Ref<BindGroupLayoutBase>> {
             std::vector<BindGroupLayoutEntry> entryVec;
             entryVec.reserve(entries.size());
-            for (auto& it : entries) {
-                entryVec.push_back(it.second);
+            for (auto& [_, entry] : entries) {
+                entryVec.push_back(entry);
             }
 
             BindGroupLayoutDescriptor desc = {};
@@ -268,10 +268,7 @@
             const EntryPointMetadata& metadata = stage.module->GetEntryPoint(stage.entryPoint);
 
             for (BindGroupIndex group(0); group < metadata.bindings.size(); ++group) {
-                for (const auto& bindingIt : metadata.bindings[group]) {
-                    BindingNumber bindingNumber = bindingIt.first;
-                    const ShaderBindingInfo& shaderBinding = bindingIt.second;
-
+                for (const auto& [bindingNumber, shaderBinding] : metadata.bindings[group]) {
                     // Create the BindGroupLayoutEntry
                     BindGroupLayoutEntry entry =
                         ConvertMetadataToEntry(shaderBinding, &externalTextureBindingLayout);
@@ -280,9 +277,10 @@
 
                     // Add it to our map of all entries, if there is an existing entry, then we
                     // need to merge, if we can.
-                    const auto& insertion = entryData[group].insert({bindingNumber, entry});
-                    if (!insertion.second) {
-                        DAWN_TRY(MergeEntries(&insertion.first->second, entry));
+                    const auto& [existingEntry, inserted] =
+                        entryData[group].insert({bindingNumber, entry});
+                    if (!inserted) {
+                        DAWN_TRY(MergeEntries(&existingEntry->second, entry));
                     }
                 }
             }
diff --git a/src/dawn_native/QuerySet.cpp b/src/dawn_native/QuerySet.cpp
index fbe3856..37d8a99 100644
--- a/src/dawn_native/QuerySet.cpp
+++ b/src/dawn_native/QuerySet.cpp
@@ -73,9 +73,9 @@
                 for (uint32_t i = 0; i < descriptor->pipelineStatisticsCount; i++) {
                     DAWN_TRY(ValidatePipelineStatisticName(descriptor->pipelineStatistics[i]));
 
-                    std::pair<std::set<wgpu::PipelineStatisticName>::iterator, bool> res =
+                    auto [_, inserted] =
                         pipelineStatisticsSet.insert((descriptor->pipelineStatistics[i]));
-                    DAWN_INVALID_IF(!res.second, "Statistic %s is specified more than once.",
+                    DAWN_INVALID_IF(!inserted, "Statistic %s is specified more than once.",
                                     descriptor->pipelineStatistics[i]);
                 }
             } break;
diff --git a/src/dawn_native/ShaderModule.cpp b/src/dawn_native/ShaderModule.cpp
index c0e29e8..42f10c2 100644
--- a/src/dawn_native/ShaderModule.cpp
+++ b/src/dawn_native/ShaderModule.cpp
@@ -596,12 +596,12 @@
                                                             const BindGroupLayoutBase* layout) {
             // Iterate over all bindings used by this group in the shader, and find the
             // corresponding binding in the BindGroupLayout, if it exists.
-            for (const auto& it : entryPoint.bindings[group]) {
+            for (const auto& [bindingId, bindingInfo] : entryPoint.bindings[group]) {
                 DAWN_TRY_CONTEXT(ValidateCompatibilityOfSingleBindingWithLayout(
-                                     device, layout, entryPoint.stage, it.first, it.second),
+                                     device, layout, entryPoint.stage, bindingId, bindingInfo),
                                  "validating that the entry-point's declaration for [[group(%u), "
                                  "binding(%u)]] matches %s",
-                                 static_cast<uint32_t>(group), static_cast<uint32_t>(it.first),
+                                 static_cast<uint32_t>(group), static_cast<uint32_t>(bindingId),
                                  layout);
             }
 
@@ -665,15 +665,16 @@
                         metadata->overridableConstants[identifier] = constant;
 
                         if (!c.is_initialized) {
-                            auto it = metadata->uninitializedOverridableConstants.emplace(
-                                std::move(identifier));
+                            auto [_, inserted] =
+                                metadata->uninitializedOverridableConstants.emplace(
+                                    std::move(identifier));
                             // The insertion should have taken place
-                            ASSERT(it.second);
+                            ASSERT(inserted);
                         } else {
-                            auto it = metadata->initializedOverridableConstants.emplace(
+                            auto [_, inserted] = metadata->initializedOverridableConstants.emplace(
                                 std::move(identifier));
                             // The insertion should have taken place
-                            ASSERT(it.second);
+                            ASSERT(inserted);
                         }
                     }
                 }
@@ -866,14 +867,14 @@
                     BindingNumber bindingNumber(resource.binding);
                     BindGroupIndex bindGroupIndex(resource.bind_group);
 
-                    const auto& it = metadata->bindings[bindGroupIndex].emplace(
+                    const auto& [binding, inserted] = metadata->bindings[bindGroupIndex].emplace(
                         bindingNumber, ShaderBindingInfo{});
                     DAWN_INVALID_IF(
-                        !it.second,
+                        !inserted,
                         "Entry-point has a duplicate binding for (group:%u, binding:%u).",
                         resource.binding, resource.bind_group);
 
-                    ShaderBindingInfo* info = &it.first->second;
+                    ShaderBindingInfo* info = &binding->second;
                     info->bindingType = TintResourceTypeToBindingInfoType(resource.resource_type);
 
                     switch (info->bindingType) {
diff --git a/src/dawn_native/d3d12/ShaderModuleD3D12.cpp b/src/dawn_native/d3d12/ShaderModuleD3D12.cpp
index 3001c6c..4515d12 100644
--- a/src/dawn_native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn_native/d3d12/ShaderModuleD3D12.cpp
@@ -90,11 +90,11 @@
 
             std::map<tint::transform::BindingPoint, T, CompareBindingPoint> sorted(map.begin(),
                                                                                    map.end());
-            for (auto& entry : sorted) {
+            for (auto& [bindingPoint, value] : sorted) {
                 output << " ";
-                Serialize(output, entry.first);
+                Serialize(output, bindingPoint);
                 output << "=";
-                Serialize(output, entry.second);
+                Serialize(output, value);
             }
             output << ")";
         }
@@ -144,10 +144,7 @@
             std::unordered_set<std::string> overriddenConstants;
 
             // Set pipeline overridden values
-            for (const auto& pipelineConstant : *pipelineConstantEntries) {
-                const std::string& name = pipelineConstant.first;
-                double value = pipelineConstant.second;
-
+            for (const auto& [name, value] : *pipelineConstantEntries) {
                 overriddenConstants.insert(name);
 
                 // This is already validated so `name` must exist
@@ -246,9 +243,7 @@
                     // the Tint AST to make the "bindings" decoration match the offset chosen by
                     // d3d12::BindGroupLayout so that Tint produces HLSL with the correct registers
                     // assigned to each interface variable.
-                    for (const auto& it : groupBindingInfo) {
-                        BindingNumber binding = it.first;
-                        auto const& bindingInfo = it.second;
+                    for (const auto& [binding, bindingInfo] : groupBindingInfo) {
                         BindingIndex bindingIndex = bgl->GetBindingIndex(binding);
                         BindingPoint srcBindingPoint{static_cast<uint32_t>(group),
                                                      static_cast<uint32_t>(binding)};
@@ -379,8 +374,8 @@
                 stream << " hasShaderFloat16Feature=" << hasShaderFloat16Feature;
 
                 stream << " defines={";
-                for (const auto& it : defineStrings) {
-                    stream << " <" << it.first << "," << it.second << ">";
+                for (const auto& [name, value] : defineStrings) {
+                    stream << " <" << name << "," << value << ">";
                 }
                 stream << " }";
 
@@ -463,15 +458,14 @@
             // Build defines for overridable constants
             std::vector<std::pair<std::wstring, std::wstring>> defineStrings;
             defineStrings.reserve(request.defineStrings.size());
-            for (const auto& it : request.defineStrings) {
-                defineStrings.emplace_back(UTF8ToWStr(it.first.c_str()),
-                                           UTF8ToWStr(it.second.c_str()));
+            for (const auto& [name, value] : request.defineStrings) {
+                defineStrings.emplace_back(UTF8ToWStr(name.c_str()), UTF8ToWStr(value.c_str()));
             }
 
             std::vector<DxcDefine> dxcDefines;
             dxcDefines.reserve(defineStrings.size());
-            for (const auto& d : defineStrings) {
-                dxcDefines.push_back({d.first.c_str(), d.second.c_str()});
+            for (const auto& [name, value] : defineStrings) {
+                dxcDefines.push_back({name.c_str(), value.c_str()});
             }
 
             ComPtr<IDxcOperationResult> result;
@@ -584,8 +578,8 @@
             std::vector<D3D_SHADER_MACRO> fxcDefines;
             if (request.defineStrings.size() > 0) {
                 fxcDefines.reserve(request.defineStrings.size() + 1);
-                for (const auto& d : request.defineStrings) {
-                    fxcDefines.push_back({d.first.c_str(), d.second.c_str()});
+                for (const auto& [name, value] : request.defineStrings) {
+                    fxcDefines.push_back({name.c_str(), value.c_str()});
                 }
                 // d3dCompile D3D_SHADER_MACRO* pDefines is a nullptr terminated array
                 fxcDefines.push_back({nullptr, nullptr});
diff --git a/src/dawn_native/metal/ShaderModuleMTL.mm b/src/dawn_native/metal/ShaderModuleMTL.mm
index 9189cf8..2c2c0f1 100644
--- a/src/dawn_native/metal/ShaderModuleMTL.mm
+++ b/src/dawn_native/metal/ShaderModuleMTL.mm
@@ -68,10 +68,7 @@
         for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
             const BindGroupLayoutBase::BindingMap& bindingMap =
                 layout->GetBindGroupLayout(group)->GetBindingMap();
-            for (const auto& it : bindingMap) {
-                BindingNumber bindingNumber = it.first;
-                BindingIndex bindingIndex = it.second;
-
+            for (const auto [bindingNumber, bindingIndex] : bindingMap) {
                 const BindingInfo& bindingInfo =
                     layout->GetBindGroupLayout(group)->GetBindingInfo(bindingIndex);
 
diff --git a/src/dawn_native/metal/UtilsMetal.mm b/src/dawn_native/metal/UtilsMetal.mm
index 1a7962a..7fc2429 100644
--- a/src/dawn_native/metal/UtilsMetal.mm
+++ b/src/dawn_native/metal/UtilsMetal.mm
@@ -244,10 +244,7 @@
                 }
             };
 
-            for (const auto& pipelineConstant : programmableStage.constants) {
-                const std::string& name = pipelineConstant.first;
-                double value = pipelineConstant.second;
-
+            for (const auto& [name, value] : programmableStage.constants) {
                 overriddenConstants.insert(name);
 
                 // This is already validated so `name` must exist
diff --git a/src/dawn_native/opengl/DeviceGL.cpp b/src/dawn_native/opengl/DeviceGL.cpp
index 0240e06..ffaed2b 100644
--- a/src/dawn_native/opengl/DeviceGL.cpp
+++ b/src/dawn_native/opengl/DeviceGL.cpp
@@ -244,8 +244,7 @@
     ResultOrError<ExecutionSerial> Device::CheckAndUpdateCompletedSerials() {
         ExecutionSerial fenceSerial{0};
         while (!mFencesInFlight.empty()) {
-            GLsync sync = mFencesInFlight.front().first;
-            ExecutionSerial tentativeSerial = mFencesInFlight.front().second;
+            auto [sync, tentativeSerial] = mFencesInFlight.front();
 
             // Fence are added in order, so we can stop searching as soon
             // as we see one that's not ready.
diff --git a/src/dawn_native/opengl/ShaderModuleGL.cpp b/src/dawn_native/opengl/ShaderModuleGL.cpp
index dba7b33..a959819 100644
--- a/src/dawn_native/opengl/ShaderModuleGL.cpp
+++ b/src/dawn_native/opengl/ShaderModuleGL.cpp
@@ -96,11 +96,11 @@
                 DAWN_INVALID_IF(bindGroupIndex >= kMaxBindGroupsTyped,
                                 "Bind group index over limits in the SPIRV");
 
-                const auto& it =
+                const auto& [entry, inserted] =
                     (*bindings)[bindGroupIndex].emplace(bindingNumber, ShaderBindingInfo{});
-                DAWN_INVALID_IF(!it.second, "Shader has duplicate bindings");
+                DAWN_INVALID_IF(!inserted, "Shader has duplicate bindings");
 
-                ShaderBindingInfo* info = &it.first->second;
+                ShaderBindingInfo* info = &entry->second;
                 info->id = resource.id;
                 info->base_type_id = resource.base_type_id;
                 info->bindingType = bindingType;
diff --git a/src/dawn_native/vulkan/BindGroupLayoutVk.cpp b/src/dawn_native/vulkan/BindGroupLayoutVk.cpp
index dc61c03..52038e1 100644
--- a/src/dawn_native/vulkan/BindGroupLayoutVk.cpp
+++ b/src/dawn_native/vulkan/BindGroupLayoutVk.cpp
@@ -95,8 +95,7 @@
         ityp::vector<BindingIndex, VkDescriptorSetLayoutBinding> bindings;
         bindings.reserve(GetBindingCount());
 
-        for (const auto& it : GetBindingMap()) {
-            BindingIndex bindingIndex = it.second;
+        for (const auto& [_, bindingIndex] : GetBindingMap()) {
             const BindingInfo& bindingInfo = GetBindingInfo(bindingIndex);
 
             VkDescriptorSetLayoutBinding vkBinding;
diff --git a/src/dawn_native/vulkan/BindGroupVk.cpp b/src/dawn_native/vulkan/BindGroupVk.cpp
index dcfae8f..dc056a7 100644
--- a/src/dawn_native/vulkan/BindGroupVk.cpp
+++ b/src/dawn_native/vulkan/BindGroupVk.cpp
@@ -50,8 +50,7 @@
             writeImageInfo(bindingCount);
 
         uint32_t numWrites = 0;
-        for (const auto& it : GetLayout()->GetBindingMap()) {
-            BindingIndex bindingIndex = it.second;
+        for (const auto [_, bindingIndex] : GetLayout()->GetBindingMap()) {
             const BindingInfo& bindingInfo = GetLayout()->GetBindingInfo(bindingIndex);
 
             auto& write = writes[numWrites];
diff --git a/src/dawn_native/vulkan/DescriptorSetAllocator.cpp b/src/dawn_native/vulkan/DescriptorSetAllocator.cpp
index 3f43f67..936a9ba 100644
--- a/src/dawn_native/vulkan/DescriptorSetAllocator.cpp
+++ b/src/dawn_native/vulkan/DescriptorSetAllocator.cpp
@@ -40,10 +40,10 @@
         // Compute the total number of descriptors for this layout.
         uint32_t totalDescriptorCount = 0;
         mPoolSizes.reserve(descriptorCountPerType.size());
-        for (const auto& it : descriptorCountPerType) {
-            ASSERT(it.second > 0);
-            totalDescriptorCount += it.second;
-            mPoolSizes.push_back(VkDescriptorPoolSize{it.first, it.second});
+        for (const auto& [type, count] : descriptorCountPerType) {
+            ASSERT(count > 0);
+            totalDescriptorCount += count;
+            mPoolSizes.push_back(VkDescriptorPoolSize{type, count});
         }
 
         if (totalDescriptorCount == 0) {
diff --git a/src/dawn_native/vulkan/RenderPassCache.cpp b/src/dawn_native/vulkan/RenderPassCache.cpp
index 2cc815b..120cc0f 100644
--- a/src/dawn_native/vulkan/RenderPassCache.cpp
+++ b/src/dawn_native/vulkan/RenderPassCache.cpp
@@ -86,8 +86,8 @@
 
     RenderPassCache::~RenderPassCache() {
         std::lock_guard<std::mutex> lock(mMutex);
-        for (auto it : mCache) {
-            mDevice->fn.DestroyRenderPass(mDevice->GetVkDevice(), it.second, nullptr);
+        for (auto [_, renderPass] : mCache) {
+            mDevice->fn.DestroyRenderPass(mDevice->GetVkDevice(), renderPass, nullptr);
         }
 
         mCache.clear();
diff --git a/src/dawn_native/vulkan/ShaderModuleVk.cpp b/src/dawn_native/vulkan/ShaderModuleVk.cpp
index 45ee439..81f84ab 100644
--- a/src/dawn_native/vulkan/ShaderModuleVk.cpp
+++ b/src/dawn_native/vulkan/ShaderModuleVk.cpp
@@ -36,8 +36,8 @@
     ShaderModule::ConcurrentTransformedShaderModuleCache::
         ~ConcurrentTransformedShaderModuleCache() {
         std::lock_guard<std::mutex> lock(mMutex);
-        for (const auto& iter : mTransformedShaderModuleCache) {
-            mDevice->GetFencedDeleter()->DeleteWhenUnused(iter.second);
+        for (const auto& [_, module] : mTransformedShaderModuleCache) {
+            mDevice->GetFencedDeleter()->DeleteWhenUnused(module);
         }
     }
 
diff --git a/src/dawn_node/binding/Converter.h b/src/dawn_node/binding/Converter.h
index 7169cb1..e6b20e8 100644
--- a/src/dawn_node/binding/Converter.h
+++ b/src/dawn_node/binding/Converter.h
@@ -359,8 +359,8 @@
             }
             auto* els = Allocate<std::remove_const_t<OUT>>(in.size());
             size_t i = 0;
-            for (auto& it : in) {
-                if (!Convert(els[i++], it.first, it.second)) {
+            for (auto& [key, value] : in) {
+                if (!Convert(els[i++], key, value)) {
                     return false;
                 }
             }
diff --git a/src/dawn_node/utils/Debug.h b/src/dawn_node/utils/Debug.h
index 3873540..3636df0 100644
--- a/src/dawn_node/utils/Debug.h
+++ b/src/dawn_node/utils/Debug.h
@@ -71,14 +71,14 @@
     std::ostream& Write(std::ostream& out, const std::unordered_map<K, V>& value) {
         out << "{";
         bool first = true;
-        for (auto it : value) {
+        for (auto& [key, value] : value) {
             if (!first) {
                 out << ", ";
             }
             first = false;
-            Write(out, it.first);
+            Write(out, key);
             out << ": ";
-            Write(out, it.second);
+            Write(out, value);
         }
         return out << "}";
     }
diff --git a/src/dawn_wire/client/RequestTracker.h b/src/dawn_wire/client/RequestTracker.h
index 7ce2d00..56691c2 100644
--- a/src/dawn_wire/client/RequestTracker.h
+++ b/src/dawn_wire/client/RequestTracker.h
@@ -59,16 +59,16 @@
                 // Move mRequests to a local variable so that further reentrant modifications of
                 // mRequests don't invalidate the iterators.
                 auto allRequests = std::move(mRequests);
-                for (auto& it : allRequests) {
-                    closeFunc(&it.second);
+                for (auto& [_, request] : allRequests) {
+                    closeFunc(&request);
                 }
             }
         }
 
         template <typename F>
         void ForAll(F&& f) {
-            for (auto& it : mRequests) {
-                f(&it.second);
+            for (auto& [_, request] : mRequests) {
+                f(&request);
             }
         }
 
diff --git a/src/dawn_wire/server/Server.cpp b/src/dawn_wire/server/Server.cpp
index 6fea9fc..13ac756 100644
--- a/src/dawn_wire/server/Server.cpp
+++ b/src/dawn_wire/server/Server.cpp
@@ -191,8 +191,8 @@
     }
 
     bool TrackDeviceChild(DeviceInfo* info, ObjectType type, ObjectId id) {
-        auto it = info->childObjectTypesAndIds.insert(PackObjectTypeAndId(type, id));
-        if (!it.second) {
+        auto [_, inserted] = info->childObjectTypesAndIds.insert(PackObjectTypeAndId(type, id));
+        if (!inserted) {
             // An object of this type and id already exists.
             return false;
         }
diff --git a/src/tests/MockCallback.h b/src/tests/MockCallback.h
index c3dfb4a..4acb904 100644
--- a/src/tests/MockCallback.h
+++ b/src/tests/MockCallback.h
@@ -53,9 +53,9 @@
             // remove from this set even if a callback should only be called once so that
             // repeated calls to the callback still forward the userdata correctly.
             // Userdata will be destroyed when the mock is destroyed.
-            auto it = mUserdatas.insert(std::move(mockAndUserdata));
-            ASSERT(it.second);
-            return it.first->get();
+            auto [result, inserted] = mUserdatas.insert(std::move(mockAndUserdata));
+            ASSERT(inserted);
+            return result->get();
         }
 
       private:
diff --git a/src/tests/end2end/ColorStateTests.cpp b/src/tests/end2end/ColorStateTests.cpp
index 1fd3845..4cd13f9 100644
--- a/src/tests/end2end/ColorStateTests.cpp
+++ b/src/tests/end2end/ColorStateTests.cpp
@@ -157,8 +157,8 @@
 
         SetupSingleSourcePipelines(descriptor);
 
-        for (const auto& test : tests) {
-            DoSingleSourceTest(base, {test.first}, test.second);
+        for (const auto& [triangleColor, expectedColor] : tests) {
+            DoSingleSourceTest(base, {triangleColor}, expectedColor);
         }
     }
 
@@ -190,8 +190,8 @@
 
         SetupSingleSourcePipelines(descriptor);
 
-        for (const auto& test : tests) {
-            DoSingleSourceTest(base, test.first, test.second);
+        for (const auto& [triangles, expectedColor] : tests) {
+            DoSingleSourceTest(base, triangles, expectedColor);
         }
     }
 
diff --git a/src/tests/end2end/DepthStencilStateTests.cpp b/src/tests/end2end/DepthStencilStateTests.cpp
index 73e9aad..bd4672a 100644
--- a/src/tests/end2end/DepthStencilStateTests.cpp
+++ b/src/tests/end2end/DepthStencilStateTests.cpp
@@ -811,9 +811,7 @@
             {stencilEqualKeepState, RGBA8::kGreen, 0.f, 0x0, wgpu::FrontFace::CCW, false}};
 
         // Since the stencil reference is not inherited, second draw won't pass the stencil test
-        std::pair<RGBA8, RGBA8> expectation = {RGBA8::kZero, RGBA8::kZero};
-
-        DoTest(testParams, expectation.first, expectation.second, true);
+        DoTest(testParams, RGBA8::kZero, RGBA8::kZero, true);
     }
 
     // Test that stencil reference is initialized as zero for new render pass
@@ -826,9 +824,7 @@
             {stencilEqualKeepState, RGBA8::kBlue, 0.f, 0x0, wgpu::FrontFace::CCW, true}};
 
         // The third draw should pass the stencil test since the second pass set it to default zero
-        std::pair<RGBA8, RGBA8> expectation = {RGBA8::kBlue, RGBA8::kBlue};
-
-        DoTest(testParams, expectation.first, expectation.second, true);
+        DoTest(testParams, RGBA8::kBlue, RGBA8::kBlue, true);
     }
 }
 
