Enable ClangTidy flag modernize-use-override.

https://clang.llvm.org/extra/clang-tidy/checks/modernize-use-override.html

Adds override (introduced in C++11) to overridden virtual functions and
removes virtual from those functions as it is not required.

virtual on non base class implementations was used to help indicate to
the user that a function was virtual. C++ compilers did not use the
presence of this to signify an overridden function.

Change-Id: If66d8919358f72a4035190caf8d7569268037a9a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/310160
Commit-Queue: Mike Klein <mtklein@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/.clang-tidy b/.clang-tidy
index 5160dd6..7c4b363 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -1,4 +1,20 @@
-Checks: '-*,bugprone-use-after-move,bugprone-unused-raii,bugprone-undelegated-constructor,bugprone-argument-comment,bugprone-bool-pointer-implicit-conversion,performance-unnecessary-copy-initialization,performance-for-range-copy,readability-redundant-preprocessor,misc-definitions-in-headers,modernize-make-unique,llvm-namespace-comment,readability-static-accessed-through-instance,readability-const-return-type,google-build-namespaces'
+Checks: >
+    -*,
+    bugprone-argument-comment,
+    bugprone-bool-pointer-implicit-conversion,
+    bugprone-undelegated-constructor,
+    bugprone-unused-raii,
+    bugprone-use-after-move,
+    google-build-namespaces,
+    llvm-namespace-comment,
+    misc-definitions-in-headers,
+    modernize-make-unique,
+    modernize-use-override,
+    performance-for-range-copy,
+    performance-unnecessary-copy-initialization,
+    readability-const-return-type,
+    readability-redundant-preprocessor,
+    readability-static-accessed-through-instance
 CheckOptions:
   - key:             llvm-namespace-comment.SpacesBeforeComments
     value:           2
diff --git a/bench/DashBench.cpp b/bench/DashBench.cpp
index df014a8..c105cbe 100644
--- a/bench/DashBench.cpp
+++ b/bench/DashBench.cpp
@@ -104,8 +104,7 @@
     }
 
 protected:
-    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
-                            const SkPaint& paint, int N) override {
+    void handlePath(SkCanvas* canvas, const SkPath& path, const SkPaint& paint, int N) override {
         SkPoint pts[2];
         if (!path.isLine(pts) || pts[0].fY != pts[1].fY) {
             this->INHERITED::handlePath(canvas, path, paint, N);
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 030d7b9..95f23bb 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -129,7 +129,7 @@
         path->transform(rotateMatrix);
     }
 
-    virtual void setupPaint(SkPaint* paint) override {
+    void setupPaint(SkPaint* paint) override {
         PathBench::setupPaint(paint);
         paint->setAntiAlias(fAA);
     }
diff --git a/gm/croppedrects.cpp b/gm/croppedrects.cpp
index 96950fe..94835ee 100644
--- a/gm/croppedrects.cpp
+++ b/gm/croppedrects.cpp
@@ -35,7 +35,7 @@
  */
 class CroppedRectsGM : public GM {
 private:
-    SkString onShortName() override final { return SkString("croppedrects"); }
+    SkString onShortName() final { return SkString("croppedrects"); }
     SkISize onISize() override { return SkISize::Make(500, 500); }
 
     void onOnceBeforeDraw() override {
diff --git a/gm/cubicpaths.cpp b/gm/cubicpaths.cpp
index a09d612..0ca5552 100644
--- a/gm/cubicpaths.cpp
+++ b/gm/cubicpaths.cpp
@@ -29,7 +29,7 @@
 
     SkISize onISize() override { return {1240, 390}; }
 
-    virtual void onDraw(SkCanvas* canvas) override {
+    void onDraw(SkCanvas* canvas) override {
         SkPath path;
         path.moveTo(0, 0);
         path.cubicTo(140, 150, 40, 10, 170, 150);
@@ -259,7 +259,7 @@
         canvas->restore();
     }
 
-    virtual void onDraw(SkCanvas* canvas) override {
+    void onDraw(SkCanvas* canvas) override {
         struct FillAndName {
             SkPathFillType fFill;
             const char*      fName;
diff --git a/gm/dftext.cpp b/gm/dftext.cpp
index c8673a8..559c4f6 100644
--- a/gm/dftext.cpp
+++ b/gm/dftext.cpp
@@ -52,7 +52,7 @@
         return SkISize::Make(1024, 768);
     }
 
-    virtual void onDraw(SkCanvas* inputCanvas) override {
+    void onDraw(SkCanvas* inputCanvas) override {
         SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f };
         SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f };
 
diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp
index 80a2098..92b1ae2 100644
--- a/gm/hairmodes.cpp
+++ b/gm/hairmodes.cpp
@@ -88,7 +88,7 @@
             return SkString("hairmodes");
         }
 
-        virtual SkISize onISize() override { return SkISize::Make(640, 480); }
+        SkISize onISize() override { return SkISize::Make(640, 480); }
 
         void onOnceBeforeDraw() override {
             fBGPaint.setShader(make_bg_shader());
diff --git a/gm/shapes.cpp b/gm/shapes.cpp
index ddeb842..f8300b5 100644
--- a/gm/shapes.cpp
+++ b/gm/shapes.cpp
@@ -36,7 +36,7 @@
         }
     }
 
-    SkString onShortName() override final { return fName; }
+    SkString onShortName() final { return fName; }
     SkISize onISize() override { return SkISize::Make(500, 500); }
 
     void onOnceBeforeDraw() override {
diff --git a/gm/tinybitmap.cpp b/gm/tinybitmap.cpp
index c708da2..b20d8de 100644
--- a/gm/tinybitmap.cpp
+++ b/gm/tinybitmap.cpp
@@ -21,7 +21,7 @@
 
     SkString onShortName() override { return SkString("tinybitmap"); }
 
-    virtual SkISize onISize() override { return SkISize::Make(100, 100); }
+    SkISize onISize() override { return SkISize::Make(100, 100); }
 
     void onDraw(SkCanvas* canvas) override {
         SkBitmap bm;
diff --git a/include/utils/SkLuaCanvas.h b/include/utils/SkLuaCanvas.h
index 49d0142..ab01946 100644
--- a/include/utils/SkLuaCanvas.h
+++ b/include/utils/SkLuaCanvas.h
@@ -33,7 +33,7 @@
     void didTranslate(SkScalar, SkScalar) override;
 
     void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
-    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
+    void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
                                 const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
diff --git a/include/utils/SkNWayCanvas.h b/include/utils/SkNWayCanvas.h
index 5c85c02..022aacc 100644
--- a/include/utils/SkNWayCanvas.h
+++ b/include/utils/SkNWayCanvas.h
@@ -38,11 +38,10 @@
     void didTranslate(SkScalar, SkScalar) override;
 
     void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
-    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
-                                const SkPaint& paint) override;
-    virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
-                             const SkPoint texCoords[4], SkBlendMode,
-                             const SkPaint& paint) override;
+    void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
+                        const SkPaint& paint) override;
+    void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
+                     const SkPoint texCoords[4], SkBlendMode, const SkPaint& paint) override;
 
     void onDrawPaint(const SkPaint&) override;
     void onDrawBehind(const SkPaint&) override;
diff --git a/modules/skottie/src/animator/KeyframeAnimator.h b/modules/skottie/src/animator/KeyframeAnimator.h
index d9955e4..cbadabf 100644
--- a/modules/skottie/src/animator/KeyframeAnimator.h
+++ b/modules/skottie/src/animator/KeyframeAnimator.h
@@ -55,7 +55,7 @@
 
 class KeyframeAnimator : public Animator {
 public:
-    virtual ~KeyframeAnimator() override;
+    ~KeyframeAnimator() override;
 
     bool isConstant() const {
         SkASSERT(!fKFs.empty());
diff --git a/modules/skottie/tests/AudioLayer.cpp b/modules/skottie/tests/AudioLayer.cpp
index c611dc8..080f37b 100644
--- a/modules/skottie/tests/AudioLayer.cpp
+++ b/modules/skottie/tests/AudioLayer.cpp
@@ -76,7 +76,7 @@
     private:
         sk_sp<ExternalTrackAsset> loadAudioAsset(const char path[],
                                                  const char name[],
-                                                 const char id[]) {
+                                                 const char id[]) override {
             REPORTER_ASSERT(fReporter, !strcmp(path, "assets/"));
             REPORTER_ASSERT(fReporter, !strcmp(name, "audio.mp3"));
             REPORTER_ASSERT(fReporter, !strcmp(id  , "audio_0"));
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index 3ac60c1..584589f 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -1519,7 +1519,7 @@
         return -1;
     }
 
-    virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
+    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         SkPoint pt = {x, y};
         int ptHit = hittest_pt(pt);
         if (ptHit >= 0) {
diff --git a/samplecode/SampleLua.cpp b/samplecode/SampleLua.cpp
index 1a094bb..ee36774 100644
--- a/samplecode/SampleLua.cpp
+++ b/samplecode/SampleLua.cpp
@@ -108,8 +108,7 @@
         }
     }
 
-    virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y,
-                                              skui::ModifierKey modi) override {
+    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         lua_State* L = this->ensureLua();
         lua_getglobal(L, gClickName);
         if (lua_isfunction(L, -1)) {
diff --git a/samplecode/SampleMixer.cpp b/samplecode/SampleMixer.cpp
index cde0155..8a10d72 100644
--- a/samplecode/SampleMixer.cpp
+++ b/samplecode/SampleMixer.cpp
@@ -71,7 +71,7 @@
         }
     }
 
-    virtual Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override {
+    Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey) override {
         return fRect.contains(SkScalarRoundToInt(x),
                               SkScalarRoundToInt(y)) ? new Click() : nullptr;
     }
diff --git a/samplecode/SampleQuadStroker.cpp b/samplecode/SampleQuadStroker.cpp
index 37f0e4b..a4dce80 100644
--- a/samplecode/SampleQuadStroker.cpp
+++ b/samplecode/SampleQuadStroker.cpp
@@ -714,8 +714,7 @@
         MyClick(int index) : fIndex(index) {}
     };
 
-    virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y,
-                                              skui::ModifierKey modi) override {
+    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         for (size_t i = 0; i < SK_ARRAY_COUNT(fPts); ++i) {
             if (hittest(fPts[i], x, y)) {
                 return new MyClick((int)i);
diff --git a/samplecode/SampleRegion.cpp b/samplecode/SampleRegion.cpp
index 2b898cc..160c1a3 100644
--- a/samplecode/SampleRegion.cpp
+++ b/samplecode/SampleRegion.cpp
@@ -324,8 +324,7 @@
         }
     }
 
-    virtual Sample::Click* onFindClickHandler(SkScalar x, SkScalar y,
-                                              skui::ModifierKey modi) override {
+    Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
         return fRect.contains(SkScalarRoundToInt(x),
                               SkScalarRoundToInt(y)) ? new Click() : nullptr;
     }
diff --git a/samplecode/SampleTextEffects.cpp b/samplecode/SampleTextEffects.cpp
index 0d6d5ca..602d39b 100644
--- a/samplecode/SampleTextEffects.cpp
+++ b/samplecode/SampleTextEffects.cpp
@@ -38,8 +38,7 @@
         this->INHERITED::begin(uvBounds, dst);
     }
 
-    virtual void next(const SkPoint& loc, int u, int v,
-                      SkPath* dst) const override {
+    void next(const SkPoint& loc, int u, int v, SkPath* dst) const override {
         if (fPts) {
             *fPts->append() = loc;
         }
@@ -78,8 +77,7 @@
 class InverseFillPE : public SkPathEffect {
 public:
     InverseFillPE() {}
-    virtual bool onFilterPath(SkPath* dst, const SkPath& src,
-                              SkStrokeRec*, const SkRect*) const override {
+    bool onFilterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*) const override {
         *dst = src;
         dst->setFillType(SkPathFillType::kInverseWinding);
         return true;
diff --git a/src/core/SkAAClip.cpp b/src/core/SkAAClip.cpp
index b010e88..e33e130 100644
--- a/src/core/SkAAClip.cpp
+++ b/src/core/SkAAClip.cpp
@@ -1217,8 +1217,8 @@
         fLastY = y + height - 1;
     }
 
-    virtual void blitAntiRect(int x, int y, int width, int height,
-                     SkAlpha leftAlpha, SkAlpha rightAlpha) override {
+    void blitAntiRect(int x, int y, int width, int height,
+                      SkAlpha leftAlpha, SkAlpha rightAlpha) override {
         this->recordMinY(y);
         this->checkForYGap(y);
         fBuilder->addAntiRectRun(x, y, width, height, leftAlpha, rightAlpha);
@@ -1238,8 +1238,8 @@
         fBuilder->addRun(x, y, 0xFF, width);
     }
 
-    virtual void blitAntiH(int x, int y, const SkAlpha alpha[],
-                           const int16_t runs[]) override {
+    void blitAntiH(int x, int y, const SkAlpha alpha[],
+                   const int16_t runs[]) override {
         this->recordMinY(y);
         this->checkForYGap(y);
         for (;;) {
diff --git a/src/core/SkBlitter.h b/src/core/SkBlitter.h
index 4f050a9..46150db 100644
--- a/src/core/SkBlitter.h
+++ b/src/core/SkBlitter.h
@@ -189,8 +189,8 @@
     void blitAntiH(int x, int y, const SkAlpha[], const int16_t runs[]) override;
     void blitV(int x, int y, int height, SkAlpha alpha) override;
     void blitRect(int x, int y, int width, int height) override;
-    virtual void blitAntiRect(int x, int y, int width, int height,
-                     SkAlpha leftAlpha, SkAlpha rightAlpha) override;
+    void blitAntiRect(int x, int y, int width, int height,
+                      SkAlpha leftAlpha, SkAlpha rightAlpha) override;
     void blitMask(const SkMask&, const SkIRect& clip) override;
     const SkPixmap* justAnOpaqueColor(uint32_t* value) override;
 
diff --git a/src/core/SkExecutor.cpp b/src/core/SkExecutor.cpp
index f4aa65c..6ed366f 100644
--- a/src/core/SkExecutor.cpp
+++ b/src/core/SkExecutor.cpp
@@ -89,7 +89,7 @@
         }
     }
 
-    virtual void add(std::function<void(void)> work) override {
+    void add(std::function<void(void)> work) override {
         // Add some work to our pile of work to do.
         {
             SkAutoMutexExclusive lock(fWorkLock);
@@ -99,7 +99,7 @@
         fWorkAvailable.signal(1);
     }
 
-    virtual void borrow() override {
+    void borrow() override {
         // If there is work waiting and we're allowed to borrow work, do it.
         if (fAllowBorrowing && fWorkAvailable.try_wait()) {
             SkAssertResult(this->do_work());
diff --git a/src/core/SkPtrRecorder.h b/src/core/SkPtrRecorder.h
index 389751d..1f94105 100644
--- a/src/core/SkPtrRecorder.h
+++ b/src/core/SkPtrRecorder.h
@@ -131,8 +131,8 @@
 
 protected:
     // overrides
-    virtual void incPtr(void*) override ;
-    virtual void decPtr(void*) override ;
+    void incPtr(void*) override;
+    void decPtr(void*) override;
 };
 
 class SkFactorySet : public SkTPtrSet<SkFlattenable::Factory> {};
diff --git a/src/core/SkScan_AntiPath.cpp b/src/core/SkScan_AntiPath.cpp
index be5d19f..82d4304 100644
--- a/src/core/SkScan_AntiPath.cpp
+++ b/src/core/SkScan_AntiPath.cpp
@@ -44,8 +44,7 @@
                      const SkIRect& clipBounds, bool isInverse);
 
     /// Must be explicitly defined on subclasses.
-    virtual void blitAntiH(int x, int y, const SkAlpha antialias[],
-                           const int16_t runs[]) override {
+    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
         SkDEBUGFAIL("How did I get here?");
     }
     /// May not be called on BaseSuperBlitter because it blits out of order.
diff --git a/src/core/SkScan_Antihair.cpp b/src/core/SkScan_Antihair.cpp
index 2d606fb..02ad8b7 100644
--- a/src/core/SkScan_Antihair.cpp
+++ b/src/core/SkScan_Antihair.cpp
@@ -135,8 +135,7 @@
         return fy - SK_Fixed1/2;
     }
 
-    virtual SkFixed drawLine(int x, int stopx, SkFixed fy,
-                             SkFixed slope) override {
+    SkFixed drawLine(int x, int stopx, SkFixed fy, SkFixed slope) override {
         SkASSERT(x < stopx);
         int count = stopx - x;
         fy += SK_Fixed1/2;
diff --git a/src/effects/imagefilters/SkDisplacementMapEffect.cpp b/src/effects/imagefilters/SkDisplacementMapEffect.cpp
index b33a0d4..dae4f7e 100644
--- a/src/effects/imagefilters/SkDisplacementMapEffect.cpp
+++ b/src/effects/imagefilters/SkDisplacementMapEffect.cpp
@@ -43,8 +43,8 @@
 
     SkRect computeFastBounds(const SkRect& src) const override;
 
-    virtual SkIRect onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
-                                   MapDirection, const SkIRect* inputRect) const override;
+    SkIRect onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
+                           MapDirection, const SkIRect* inputRect) const override;
     SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix& ctm,
                                MapDirection, const SkIRect* inputRect) const override;
 
diff --git a/src/gpu/GrPathProcessor.h b/src/gpu/GrPathProcessor.h
index aeb9252..179af1c 100644
--- a/src/gpu/GrPathProcessor.h
+++ b/src/gpu/GrPathProcessor.h
@@ -28,12 +28,11 @@
     const SkMatrix& viewMatrix() const { return fViewMatrix; }
     const SkMatrix& localMatrix() const { return fLocalMatrix; }
 
-    virtual void getGLSLProcessorKey(const GrShaderCaps& caps,
-                                     GrProcessorKeyBuilder* b) const override;
+    void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override;
 
-    virtual GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override;
+    GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps& caps) const override;
 
-    virtual bool isPathRendering() const override { return true; }
+    bool isPathRendering() const override { return true; }
 
 private:
     GrPathProcessor(const SkPMColor4f&, const SkMatrix& viewMatrix, const SkMatrix& localMatrix);
diff --git a/src/gpu/effects/GrRRectEffect.cpp b/src/gpu/effects/GrRRectEffect.cpp
index bfff3d5..f1cd107 100644
--- a/src/gpu/effects/GrRRectEffect.cpp
+++ b/src/gpu/effects/GrRRectEffect.cpp
@@ -150,7 +150,7 @@
 public:
     GLCircularRRectEffect() = default;
 
-    virtual void emitCode(EmitArgs&) override;
+    void emitCode(EmitArgs&) override;
 
     static inline void GenKey(const GrProcessor&, const GrShaderCaps&, GrProcessorKeyBuilder*);
 
diff --git a/src/image/SkImage_GpuYUVA.h b/src/image/SkImage_GpuYUVA.h
index b84dac7..225c8ad 100644
--- a/src/image/SkImage_GpuYUVA.h
+++ b/src/image/SkImage_GpuYUVA.h
@@ -52,7 +52,7 @@
 
     sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const final;
 
-    virtual bool isYUVA() const override { return true; }
+    bool isYUVA() const override { return true; }
 
     bool setupMipmapsForPlanes(GrRecordingContext*) const;
 
diff --git a/src/ports/SkFontMgr_android.cpp b/src/ports/SkFontMgr_android.cpp
index 0931fbf..8a2ebd8 100644
--- a/src/ports/SkFontMgr_android.cpp
+++ b/src/ports/SkFontMgr_android.cpp
@@ -82,7 +82,7 @@
         return SkStream::MakeFromFile(fPathName.c_str());
     }
 
-    virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override {
+    void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override {
         SkASSERT(desc);
         SkASSERT(serialize);
         desc->setFamilyName(fFamilyName.c_str());
@@ -134,8 +134,7 @@
         , fData(std::move(data))
     { }
 
-    virtual void onGetFontDescriptor(SkFontDescriptor* desc,
-                                     bool* serialize) const override {
+    void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) const override {
         SkASSERT(desc);
         SkASSERT(serialize);
         desc->setFamilyName(fFamilyName.c_str());
@@ -353,14 +352,14 @@
         return nullptr;
     }
 
-    virtual SkTypeface* onMatchFamilyStyle(const char familyName[],
-                                           const SkFontStyle& style) const override {
+    SkTypeface* onMatchFamilyStyle(const char familyName[],
+                                   const SkFontStyle& style) const override {
         sk_sp<SkFontStyleSet> sset(this->matchFamily(familyName));
         return sset->matchStyle(style);
     }
 
-    virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface,
-                                         const SkFontStyle& style) const override {
+    SkTypeface* onMatchFaceStyle(const SkTypeface* typeface,
+                                 const SkFontStyle& style) const override {
         for (int i = 0; i < fStyleSets.count(); ++i) {
             for (int j = 0; j < fStyleSets[i]->fStyles.count(); ++j) {
                 if (fStyleSets[i]->fStyles[j].get() == typeface) {
@@ -403,12 +402,11 @@
         return nullptr;
     }
 
-    virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
-                                                    const SkFontStyle& style,
-                                                    const char* bcp47[],
-                                                    int bcp47Count,
-                                                    SkUnichar character) const override
-    {
+    SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
+                                            const SkFontStyle& style,
+                                            const char* bcp47[],
+                                            int bcp47Count,
+                                            SkUnichar character) const override {
         // The variant 'elegant' is 'not squashed', 'compact' is 'stays in ascent/descent'.
         // The variant 'default' means 'compact and elegant'.
         // As a result, it is not possible to know the variant context from the font alone.
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index c16d99f..098f781 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -760,8 +760,7 @@
         return new GrGLPerlinNoise;
     }
 
-    virtual void onGetGLSLProcessorKey(const GrShaderCaps& caps,
-                                       GrProcessorKeyBuilder* b) const override {
+    void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
         GrGLPerlinNoise::GenKey(*this, caps, b);
     }
 
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
index 663a13e..9436e02 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
@@ -1589,18 +1589,18 @@
     , fType(type)
     , fPrecision(precision) {}
 
-    virtual SpvId getPointer() override {
+    SpvId getPointer() override {
         return fPointer;
     }
 
-    virtual SpvId load(OutputStream& out) override {
+    SpvId load(OutputStream& out) override {
         SpvId result = fGen.nextId();
         fGen.writeInstruction(SpvOpLoad, fType, result, fPointer, out);
         fGen.writePrecisionModifier(fPrecision, result);
         return result;
     }
 
-    virtual void store(SpvId value, OutputStream& out) override {
+    void store(SpvId value, OutputStream& out) override {
         fGen.writeInstruction(SpvOpStore, fPointer, value, out);
     }
 
@@ -1623,11 +1623,11 @@
     , fSwizzleType(swizzleType)
     , fPrecision(precision) {}
 
-    virtual SpvId getPointer() override {
+    SpvId getPointer() override {
         return 0;
     }
 
-    virtual SpvId load(OutputStream& out) override {
+    SpvId load(OutputStream& out) override {
         SpvId base = fGen.nextId();
         fGen.writeInstruction(SpvOpLoad, fGen.getType(fBaseType), base, fVecPointer, out);
         fGen.writePrecisionModifier(fPrecision, base);
@@ -1644,7 +1644,7 @@
         return result;
     }
 
-    virtual void store(SpvId value, OutputStream& out) override {
+    void store(SpvId value, OutputStream& out) override {
         // use OpVectorShuffle to mix and match the vector components. We effectively create
         // a virtual vector out of the concatenation of the left and right vectors, and then
         // select components from this virtual vector to make the result vector. For
diff --git a/src/sksl/ir/SkSLField.h b/src/sksl/ir/SkSLField.h
index d187a80..3dfc87e 100644
--- a/src/sksl/ir/SkSLField.h
+++ b/src/sksl/ir/SkSLField.h
@@ -27,7 +27,7 @@
     , fOwner(owner)
     , fFieldIndex(fieldIndex) {}
 
-    virtual String description() const override {
+    String description() const override {
         return fOwner.description() + "." + fOwner.fType.fields()[fFieldIndex].fName;
     }
 
diff --git a/src/sksl/ir/SkSLNop.h b/src/sksl/ir/SkSLNop.h
index 8316dc3..da2462e 100644
--- a/src/sksl/ir/SkSLNop.h
+++ b/src/sksl/ir/SkSLNop.h
@@ -20,7 +20,7 @@
     Nop()
     : INHERITED(-1, kNop_Kind) {}
 
-    virtual bool isEmpty() const override {
+    bool isEmpty() const override {
         return true;
     }
 
diff --git a/src/sksl/ir/SkSLSymbol.h b/src/sksl/ir/SkSLSymbol.h
index f7e4222..b0ae69b 100644
--- a/src/sksl/ir/SkSLSymbol.h
+++ b/src/sksl/ir/SkSLSymbol.h
@@ -30,7 +30,7 @@
     , fKind(kind)
     , fName(name) {}
 
-    virtual ~Symbol() override {}
+    ~Symbol() override {}
 
     Kind fKind;
     StringFragment fName;
diff --git a/src/sksl/ir/SkSLVariable.h b/src/sksl/ir/SkSLVariable.h
index a835518..7fff387 100644
--- a/src/sksl/ir/SkSLVariable.h
+++ b/src/sksl/ir/SkSLVariable.h
@@ -48,7 +48,7 @@
         SkASSERT(!fReadCount && !fWriteCount);
     }
 
-    virtual String description() const override {
+    String description() const override {
         return fModifiers.description() + fType.fName + " " + fName;
     }
 
diff --git a/tests/DrawOpAtlasTest.cpp b/tests/DrawOpAtlasTest.cpp
index de92388..da7f315 100644
--- a/tests/DrawOpAtlasTest.cpp
+++ b/tests/DrawOpAtlasTest.cpp
@@ -98,7 +98,7 @@
         return fTokenTracker.nextDrawToken();
     }
 
-    virtual GrDeferredUploadToken addASAPUpload(GrDeferredTextureUploadFn&& upload) final {
+    GrDeferredUploadToken addASAPUpload(GrDeferredTextureUploadFn&& upload) final {
         return fTokenTracker.nextTokenToFlush();
     }
 
diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp
index c2c2cef..e4d9300 100644
--- a/tests/PictureTest.cpp
+++ b/tests/PictureTest.cpp
@@ -661,7 +661,7 @@
     }
 
     void insert(const SkRect[], int) override {}
-    virtual size_t bytesUsed() const override { return 0; }
+    size_t bytesUsed() const override { return 0; }
 };
 
 class SpoonFedBBHFactory : public SkBBHFactory {
diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp
index 4304c6d..e42864c 100644
--- a/tests/ProcessorTest.cpp
+++ b/tests/ProcessorTest.cpp
@@ -123,7 +123,7 @@
         this->cloneAndRegisterAllChildProcessors(that);
     }
 
-    virtual GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
+    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
         class TestGLSLFP : public GrGLSLFragmentProcessor {
         public:
             TestGLSLFP() {}
diff --git a/tests/ProgramsTest.cpp b/tests/ProgramsTest.cpp
index 35184af..62b32b8 100644
--- a/tests/ProgramsTest.cpp
+++ b/tests/ProgramsTest.cpp
@@ -78,8 +78,7 @@
 
 private:
     BigKeyProcessor() : INHERITED(kBigKeyProcessor_ClassID, kNone_OptimizationFlags) { }
-    virtual void onGetGLSLProcessorKey(const GrShaderCaps& caps,
-                                       GrProcessorKeyBuilder* b) const override {
+    void onGetGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
         GLBigKeyProcessor::GenKey(*this, caps, b);
     }
     bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
diff --git a/tools/gpu/gl/GLTestContext.h b/tools/gpu/gl/GLTestContext.h
index b3c7b36..01bd081 100644
--- a/tools/gpu/gl/GLTestContext.h
+++ b/tools/gpu/gl/GLTestContext.h
@@ -21,7 +21,7 @@
 public:
     ~GLTestContext() override;
 
-    virtual GrBackendApi backend() override { return GrBackendApi::kOpenGL; }
+    GrBackendApi backend() override { return GrBackendApi::kOpenGL; }
 
     /** Does this represent a successfully created GL context? */
     bool isValid() const;
diff --git a/tools/gpu/mock/MockTestContext.cpp b/tools/gpu/mock/MockTestContext.cpp
index c413efb..06bd974 100644
--- a/tools/gpu/mock/MockTestContext.cpp
+++ b/tools/gpu/mock/MockTestContext.cpp
@@ -19,7 +19,7 @@
     MockTestContext() {}
     ~MockTestContext() override {}
 
-    virtual GrBackendApi backend() override { return GrBackendApi::kMock; }
+    GrBackendApi backend() override { return GrBackendApi::kMock; }
 
     void testAbandon() override {}
     void finish() override {}
diff --git a/tools/gpu/vk/VkTestContext.h b/tools/gpu/vk/VkTestContext.h
index fd4d8d2..5935783 100644
--- a/tools/gpu/vk/VkTestContext.h
+++ b/tools/gpu/vk/VkTestContext.h
@@ -20,7 +20,7 @@
 namespace sk_gpu_test {
 class VkTestContext : public TestContext {
 public:
-    virtual GrBackendApi backend() override { return GrBackendApi::kVulkan; }
+    GrBackendApi backend() override { return GrBackendApi::kVulkan; }
 
     const GrVkBackendContext& getVkBackendContext() const {
         return fVk;