diff --git a/dm/DM.cpp b/dm/DM.cpp
index 043d00b..e055b83 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -888,7 +888,7 @@
         return false;
     }
 
-    for (auto image : images) {
+    for (const SkString& image : images) {
         push_codec_srcs(image);
     }
 
@@ -897,7 +897,7 @@
         return false;
     }
 
-    for (auto colorImage : colorImages) {
+    for (const SkString& colorImage : colorImages) {
         push_src("colorImage", "decode_native", new ColorCodecSrc(colorImage, false));
         push_src("colorImage", "decode_to_dst", new ColorCodecSrc(colorImage,  true));
     }
diff --git a/gm/all_bitmap_configs.cpp b/gm/all_bitmap_configs.cpp
index 0d808e2..3b3dfb2 100644
--- a/gm/all_bitmap_configs.cpp
+++ b/gm/all_bitmap_configs.cpp
@@ -242,7 +242,7 @@
         SkColorSpace::MakeSRGB(),
         nullptr,
     };
-    for (auto colorSpace : colorSpaces) {
+    for (const sk_sp<SkColorSpace>& colorSpace : colorSpaces) {
         canvas->save();
         for (auto alphaType : {kPremul_SkAlphaType, kUnpremul_SkAlphaType}) {
             canvas->save();
diff --git a/gm/color4f.cpp b/gm/color4f.cpp
index 8a99c14..3b9dfe4 100644
--- a/gm/color4f.cpp
+++ b/gm/color4f.cpp
@@ -81,7 +81,7 @@
         nullptr,
         SkColorSpace::MakeSRGB()
     };
-    for (auto colorSpace : colorSpaces) {
+    for (const sk_sp<SkColorSpace>& colorSpace : colorSpaces) {
         const SkImageInfo info = SkImageInfo::Make(1024, 100, kN32_SkColorType, kPremul_SkAlphaType,
                                                    colorSpace);
         auto surface(SkSurface::MakeRaster(info));
diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp
index 1c70e7e..2ea54bb 100644
--- a/gm/drawatlas.cpp
+++ b/gm/drawatlas.cpp
@@ -340,7 +340,7 @@
         for (float alpha : { 1.0f, 0.5f }) {
             paint.setAlphaf(alpha);
             canvas->save();
-            for (auto cf : filters) {
+            for (const sk_sp<SkColorFilter>& cf : filters) {
                 paint.setColorFilter(cf);
                 canvas->drawAtlas(image, &xform, &tex, &color, 1,
                                   mode, &tex, &paint);
diff --git a/gm/encode_srgb.cpp b/gm/encode_srgb.cpp
index 0db8dc1..380bb7f 100644
--- a/gm/encode_srgb.cpp
+++ b/gm/encode_srgb.cpp
@@ -129,7 +129,7 @@
         for (SkColorType colorType : colorTypes) {
             for (SkAlphaType alphaType : alphaTypes) {
                 canvas->save();
-                for (sk_sp<SkColorSpace> colorSpace : colorSpaces) {
+                for (const sk_sp<SkColorSpace>& colorSpace : colorSpaces) {
                     make(&bitmap, colorType, alphaType, colorSpace);
                     auto image = SkImage::MakeFromEncoded(encode_data(bitmap, fEncodedFormat));
                     canvas->drawImage(image.get(), 0.0f, 0.0f);
diff --git a/gm/image.cpp b/gm/image.cpp
index c4c417d..2d66e86 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -366,8 +366,8 @@
 
     constexpr SkScalar kPad = 5.f;
     canvas->translate(kPad, kPad);
-    for (auto factory : imageFactories) {
-        auto image(factory());
+    for (const auto& factory : imageFactories) {
+        sk_sp<SkImage> image(factory());
         if (image) {
             sk_sp<SkImage> texImage(image->makeTextureImage(direct));
             if (texImage) {
diff --git a/gm/patheffects.cpp b/gm/patheffects.cpp
index 695d5e2..7d82f85 100644
--- a/gm/patheffects.cpp
+++ b/gm/patheffects.cpp
@@ -218,9 +218,9 @@
         paint.setColor(0xFF8888FF);
         paint.setAntiAlias(true);
 
-        for (auto& path : { path0, path1 }) {
+        for (const SkPath& path : { path0, path1 }) {
             canvas->save();
-            for (auto pe : effects) {
+            for (const sk_sp<SkPathEffect>& pe : effects) {
                 paint.setPathEffect(pe);
                 canvas->drawPath(path, paint);
                 canvas->drawPath(path, wireframe);
diff --git a/gm/readpixels.cpp b/gm/readpixels.cpp
index 1fad98f..6095865 100644
--- a/gm/readpixels.cpp
+++ b/gm/readpixels.cpp
@@ -158,7 +158,7 @@
                 make_small_gamut(),
         };
 
-        for (sk_sp<SkColorSpace> dstColorSpace : colorSpaces) {
+        for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
             for (SkColorType srcColorType : colorTypes) {
                 canvas->save();
                 sk_sp<SkImage> image = make_raster_image(srcColorType);
@@ -227,7 +227,7 @@
         };
 
         sk_sp<SkImage> image = make_codec_image();
-        for (sk_sp<SkColorSpace> dstColorSpace : colorSpaces) {
+        for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
             canvas->save();
             for (SkColorType dstColorType : colorTypes) {
                 for (SkAlphaType dstAlphaType : alphaTypes) {
@@ -293,8 +293,8 @@
                 SkImage::kDisallow_CachingHint,
         };
 
-        for (sk_sp<SkImage> image : images) {
-            for (sk_sp<SkColorSpace> dstColorSpace : colorSpaces) {
+        for (const sk_sp<SkImage>& image : images) {
+            for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
                 canvas->save();
                 for (SkColorType dstColorType : colorTypes) {
                     for (SkAlphaType dstAlphaType : alphaTypes) {
diff --git a/src/gpu/GrDrawOpAtlas.cpp b/src/gpu/GrDrawOpAtlas.cpp
index ffea3e1..39bb49b 100644
--- a/src/gpu/GrDrawOpAtlas.cpp
+++ b/src/gpu/GrDrawOpAtlas.cpp
@@ -262,7 +262,7 @@
 }
 
 inline void GrDrawOpAtlas::processEviction(PlotLocator plotLocator) {
-    for (auto evictor : fEvictionCallbacks) {
+    for (EvictionCallback* evictor : fEvictionCallbacks) {
         evictor->evict(plotLocator);
     }
 
diff --git a/src/gpu/ccpr/GrCCPathCache.cpp b/src/gpu/ccpr/GrCCPathCache.cpp
index b1037bb..cb86b55 100644
--- a/src/gpu/ccpr/GrCCPathCache.cpp
+++ b/src/gpu/ccpr/GrCCPathCache.cpp
@@ -106,7 +106,7 @@
 
     // Now take all the atlas textures we just invalidated and purge them from the GrResourceCache.
     // We just purge via message bus since we don't have any access to the resource cache right now.
-    for (sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
+    for (const sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
         SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post(
                 GrUniqueKeyInvalidatedMessage(proxy->getUniqueKey(), fContextUniqueID));
     }
@@ -295,7 +295,7 @@
 }
 
 void GrCCPathCache::purgeInvalidatedAtlasTextures(GrOnFlushResourceProvider* onFlushRP) {
-    for (sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
+    for (const sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
         onFlushRP->removeUniqueKeyFromProxy(proxy.get());
     }
     fInvalidatedProxies.reset();
@@ -307,7 +307,7 @@
 }
 
 void GrCCPathCache::purgeInvalidatedAtlasTextures(GrProxyProvider* proxyProvider) {
-    for (sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
+    for (const sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) {
         proxyProvider->removeUniqueKeyFromProxy(proxy.get());
     }
     fInvalidatedProxies.reset();
diff --git a/src/gpu/dawn/GrDawnCaps.cpp b/src/gpu/dawn/GrDawnCaps.cpp
index eeea8eb..eddad52 100644
--- a/src/gpu/dawn/GrDawnCaps.cpp
+++ b/src/gpu/dawn/GrDawnCaps.cpp
@@ -214,7 +214,7 @@
     };
 
 #ifdef SK_DEBUG
-    for (auto combo : combos) {
+    for (const GrCaps::TestFormatColorTypeCombination& combo : combos) {
         SkASSERT(this->onAreColorTypeAndFormatCompatible(combo.fColorType, combo.fFormat));
     }
 #endif
diff --git a/src/gpu/mock/GrMockCaps.cpp b/src/gpu/mock/GrMockCaps.cpp
index de9e39b..cdf9d9f 100644
--- a/src/gpu/mock/GrMockCaps.cpp
+++ b/src/gpu/mock/GrMockCaps.cpp
@@ -75,7 +75,7 @@
     };
 
 #ifdef SK_DEBUG
-    for (auto combo : combos) {
+    for (const GrCaps::TestFormatColorTypeCombination& combo : combos) {
         SkASSERT(this->onAreColorTypeAndFormatCompatible(combo.fColorType, combo.fFormat));
     }
 #endif
diff --git a/src/pathops/SkPathOpsAsWinding.cpp b/src/pathops/SkPathOpsAsWinding.cpp
index 763427f..500dc35 100644
--- a/src/pathops/SkPathOpsAsWinding.cpp
+++ b/src/pathops/SkPathOpsAsWinding.cpp
@@ -325,7 +325,7 @@
         SkPathPriv::Iterate iterate(fPath);
         auto iter = iterate.begin();
         int verbCount = 0;
-        for (auto contour : contours) {
+        for (const Contour& contour : contours) {
             SkPath reverse;
             SkPath* temp = contour.fReverse ? &reverse : result;
             for (; iter != iterate.end() && verbCount < contour.fVerbEnd; ++iter, ++verbCount) {
diff --git a/src/pdf/SkPDFTag.cpp b/src/pdf/SkPDFTag.cpp
index 3b6688d..5cb7da2 100644
--- a/src/pdf/SkPDFTag.cpp
+++ b/src/pdf/SkPDFTag.cpp
@@ -184,7 +184,7 @@
     std::unique_ptr<SkPDFDict> attrDict = SkPDFMakeDict();
     attrDict->insertName("O", owner);
     std::unique_ptr<SkPDFArray> pdfArray = SkPDFMakeArray();
-    for (SkString element : values) {
+    for (const SkString& element : values) {
         pdfArray->appendString(element);
     }
     attrDict->insertObject(name, std::move(pdfArray));
diff --git a/tests/CopySurfaceTest.cpp b/tests/CopySurfaceTest.cpp
index 2780daf..58ca6cc 100644
--- a/tests/CopySurfaceTest.cpp
+++ b/tests/CopySurfaceTest.cpp
@@ -75,9 +75,9 @@
         for (auto dOrigin : {kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin}) {
             for (auto sRenderable : {GrRenderable::kYes, GrRenderable::kNo}) {
                 for (auto dRenderable : {GrRenderable::kYes, GrRenderable::kNo}) {
-                    for (auto srcRect : kSrcRects) {
-                        for (auto dstPoint : kDstPoints) {
-                            for (auto ii: kImageInfos) {
+                    for (const SkIRect& srcRect : kSrcRects) {
+                        for (const SkIPoint& dstPoint : kDstPoints) {
+                            for (const SkImageInfo& ii: kImageInfos) {
                                 auto src = sk_gpu_test::MakeTextureProxyFromData(
                                         direct, sRenderable, sOrigin, ii, srcPixels.get(),
                                         kRowBytes);
diff --git a/tests/GrSurfaceTest.cpp b/tests/GrSurfaceTest.cpp
index 216ce0e..fc9bb63 100644
--- a/tests/GrSurfaceTest.cpp
+++ b/tests/GrSurfaceTest.cpp
@@ -105,9 +105,9 @@
     static constexpr SkISize kDims = {64, 64};
 
     const std::vector<GrCaps::TestFormatColorTypeCombination>& combos =
-                                                                    caps->getTestingCombinations();
+            caps->getTestingCombinations();
 
-    for (auto combo : combos) {
+    for (const GrCaps::TestFormatColorTypeCombination& combo : combos) {
 
         SkASSERT(combo.fColorType != GrColorType::kUnknown);
         SkASSERT(combo.fFormat.isValid());
@@ -209,9 +209,9 @@
         const GrCaps* caps = context->priv().caps();
 
         const std::vector<GrCaps::TestFormatColorTypeCombination>& combos =
-                                                                    caps->getTestingCombinations();
+                caps->getTestingCombinations();
 
-        for (auto combo : combos) {
+        for (const GrCaps::TestFormatColorTypeCombination& combo : combos) {
 
             SkASSERT(combo.fColorType != GrColorType::kUnknown);
             SkASSERT(combo.fFormat.isValid());
diff --git a/tests/GradientTest.cpp b/tests/GradientTest.cpp
index 7d2b5e5..ba80793 100644
--- a/tests/GradientTest.cpp
+++ b/tests/GradientTest.cpp
@@ -456,7 +456,7 @@
 
     SkPaint paint;
 
-    for (auto colorSpace : colorSpaces) {
+    for (const SkColorSpace* colorSpace : colorSpaces) {
 
         sk_sp<SkSurface> surface = SkSurface::MakeRaster(SkImageInfo::Make(100, 100,
                                                                            kN32_SkColorType,
diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
index ef25c61..1340d64 100644
--- a/tests/ImageTest.cpp
+++ b/tests/ImageTest.cpp
@@ -393,7 +393,7 @@
                 return otherContextImage;
             }};
     for (auto mipMapped : {GrMipmapped::kNo, GrMipmapped::kYes}) {
-        for (auto factory : imageFactories) {
+        for (const auto& factory : imageFactories) {
             sk_sp<SkImage> image(factory());
             if (!image) {
                 ERRORF(reporter, "Error creating image.");
@@ -458,7 +458,7 @@
         create_picture_image,
         [context] { return create_gpu_image(context); },
     };
-    for (auto factory : imageFactories) {
+    for (const auto& factory : imageFactories) {
         sk_sp<SkImage> image = factory();
         if (!image->isTextureBacked()) {
             REPORTER_ASSERT(reporter, image->makeNonTextureImage().get() == image.get());
@@ -1064,11 +1064,12 @@
     auto createLarge = [context] {
         return create_image_large(context->priv().caps()->maxTextureSize());
     };
-    struct {
-        std::function<sk_sp<SkImage> ()>                      fImageFactory;
-        bool                                                  fExpectation;
-        bool                                                  fCanTakeDirectly;
-    } testCases[] = {
+    struct TestCase {
+        std::function<sk_sp<SkImage>()> fImageFactory;
+        bool                            fExpectation;
+        bool                            fCanTakeDirectly;
+    };
+    TestCase testCases[] = {
         { create_image, true, false },
         { create_codec_image, true, false },
         { create_data_image, true, false },
@@ -1085,7 +1086,7 @@
         { createLarge, false, false }
     };
 
-    for (auto testCase : testCases) {
+    for (const TestCase& testCase : testCases) {
         sk_sp<SkImage> image(testCase.fImageFactory());
         if (!image) {
             ERRORF(reporter, "Failed to create image!");
diff --git a/tests/PromiseImageTest.cpp b/tests/PromiseImageTest.cpp
index 3a41b62..126b44b 100644
--- a/tests/PromiseImageTest.cpp
+++ b/tests/PromiseImageTest.cpp
@@ -263,7 +263,7 @@
             continue;
         }
         DeathFn contextKillers[] = {destroy, abandon, releaseResourcesAndAbandon};
-        for (auto contextDeath : contextKillers) {
+        for (const DeathFn& contextDeath : contextKillers) {
             sk_gpu_test::GrContextFactory factory;
             auto ctx = factory.get(contextType);
             if (!ctx) {
diff --git a/tests/ReadPixelsTest.cpp b/tests/ReadPixelsTest.cpp
index 60f1e1e..490edac 100644
--- a/tests/ReadPixelsTest.cpp
+++ b/tests/ReadPixelsTest.cpp
@@ -565,11 +565,11 @@
     };
 
     for (SkColorType dstCT : kColorTypes) {
-        for (SkAlphaType dstAT: kAlphaTypes) {
-            for (sk_sp<SkColorSpace> dstCS : kColorSpaces) {
+        for (SkAlphaType dstAT : kAlphaTypes) {
+            for (const sk_sp<SkColorSpace>& dstCS : kColorSpaces) {
                 for (SkColorType srcCT : kColorTypes) {
-                    for (SkAlphaType srcAT: kAlphaTypes) {
-                        for (sk_sp<SkColorSpace> srcCS : kColorSpaces) {
+                    for (SkAlphaType srcAT : kAlphaTypes) {
+                        for (const sk_sp<SkColorSpace>& srcCS : kColorSpaces) {
                             test_conversion(reporter,
                                             SkImageInfo::Make(kNumPixels, 1, dstCT, dstAT, dstCS),
                                             SkImageInfo::Make(kNumPixels, 1, srcCT, srcAT, srcCS));
diff --git a/tests/SkColorSpaceXformStepsTest.cpp b/tests/SkColorSpaceXformStepsTest.cpp
index c3308ab..d89a8da 100644
--- a/tests/SkColorSpaceXformStepsTest.cpp
+++ b/tests/SkColorSpaceXformStepsTest.cpp
@@ -20,7 +20,7 @@
          opaque =   kOpaque_SkAlphaType,
        unpremul = kUnpremul_SkAlphaType;
 
-    struct {
+    struct Test {
         sk_sp<SkColorSpace> src, dst;
         SkAlphaType         srcAT, dstAT;
 
@@ -30,7 +30,8 @@
         bool encode;
         bool premul;
 
-    } tests[] = {
+    };
+    Test tests[] = {
         // The general case is converting between two color spaces with different gamuts
         // and different transfer functions.  There's no optimization possible here.
         { adobe, srgb, premul, premul,
@@ -130,7 +131,7 @@
     };
 
     uint32_t tested = 0x00000000;
-    for (auto t : tests) {
+    for (const Test& t : tests) {
         SkColorSpaceXformSteps steps{t.src.get(), t.srcAT,
                                      t.dst.get(), t.dstAT};
         REPORTER_ASSERT(r, steps.flags.unpremul        == t.unpremul);
diff --git a/tests/StreamBufferTest.cpp b/tests/StreamBufferTest.cpp
index ce3c5f9..a6b71f6 100644
--- a/tests/StreamBufferTest.cpp
+++ b/tests/StreamBufferTest.cpp
@@ -90,10 +90,12 @@
         writer.write(gText, size);
     }
 
-    struct {
+    struct Factory {
         std::function<std::unique_ptr<SkStream>()>  createStream;
         bool                                        skipIfNoTmpDir;
-    } factories[] = {
+    };
+
+    Factory factories[] = {
         { [&data]() { return std::make_unique<SkMemoryStream>(data); },       false  },
         { [&data]() { return std::make_unique<NotAssetMemStream>(data); },    false  },
         { [&path]() { return path.isEmpty()
@@ -101,7 +103,7 @@
                              : std::make_unique<SkFILEStream>(path.c_str()); }, true },
     };
 
-    for (auto f : factories) {
+    for (const Factory& f : factories) {
         if (tmpDir.isEmpty() && f.skipIfNoTmpDir) {
             continue;
         }
diff --git a/tools/viewer/SkSLSlide.cpp b/tools/viewer/SkSLSlide.cpp
index 00f0a14..94edbbe 100644
--- a/tools/viewer/SkSLSlide.cpp
+++ b/tools/viewer/SkSLSlide.cpp
@@ -162,7 +162,7 @@
         }
     }
 
-    for (const auto [i, name] : SkMakeEnumerate(fEffect->children())) {
+    for (const auto& [i, name] : SkMakeEnumerate(fEffect->children())) {
         auto curShader = std::find_if(fShaders.begin(), fShaders.end(),
                                       [tgt = fChildren[i]](auto p) { return p.second == tgt; });
         SkASSERT(curShader!= fShaders.end());
