[01/10] Add 'final' and 'override' to opt_pass vfunc impls

Message ID 20220523192834.3785673-2-dmalcolm@redhat.com
State New
Headers
Series Add 'final' and 'override' where missing |

Commit Message

David Malcolm May 23, 2022, 7:28 p.m. UTC
  gcc/ChangeLog:
	* adjust-alignment.cc: Add "final" and "override" to opt_pass
	vfunc implementations, removing redundant "virtual" as
	appropriate.
	* asan.cc: Likewise.
	* auto-inc-dec.cc: Likewise.
	* auto-profile.cc: Likewise.
	* bb-reorder.cc: Likewise.
	* cfgcleanup.cc: Likewise.
	* cfgexpand.cc: Likewise.
	* cfgrtl.cc: Likewise.
	* cgraphbuild.cc: Likewise.
	* combine-stack-adj.cc: Likewise.
	* combine.cc: Likewise.
	* compare-elim.cc: Likewise.
	* config/i386/i386-features.cc: Likewise.
	* coroutine-passes.cc: Likewise.
	* cprop.cc: Likewise.
	* cse.cc: Likewise.
	* dce.cc: Likewise.
	* df-core.cc: Likewise.
	* dse.cc: Likewise.
	* dwarf2cfi.cc: Likewise.
	* early-remat.cc: Likewise.
	* except.cc: Likewise.
	* final.cc: Likewise.
	* function.cc: Likewise.
	* fwprop.cc: Likewise.
	* gcse.cc: Likewise.
	* gimple-harden-conditionals.cc: Likewise.
	* gimple-if-to-switch.cc: Likewise.
	* gimple-isel.cc: Likewise.
	* gimple-laddress.cc: Likewise.
	* gimple-loop-interchange.cc: Likewise.
	* gimple-loop-jam.cc: Likewise.
	* gimple-loop-versioning.cc: Likewise.
	* gimple-low.cc: Likewise.
	* gimple-ssa-backprop.cc: Likewise.
	* gimple-ssa-evrp.cc: Likewise.
	* gimple-ssa-isolate-paths.cc: Likewise.
	* gimple-ssa-nonnull-compare.cc: Likewise.
	* gimple-ssa-split-paths.cc: Likewise.
	* gimple-ssa-store-merging.cc: Likewise.
	* gimple-ssa-strength-reduction.cc: Likewise.
	* gimple-ssa-warn-access.cc: Likewise.
	* gimple-ssa-warn-alloca.cc: Likewise.
	* gimple-ssa-warn-restrict.cc: Likewise.
	* gimple-warn-recursion.cc: Likewise.
	* graphite.cc: Likewise.
	* ifcvt.cc: Likewise.
	* init-regs.cc: Likewise.
	* ipa-comdats.cc: Likewise.
	* ipa-cp.cc: Likewise.
	* ipa-devirt.cc: Likewise.
	* ipa-fnsummary.cc: Likewise.
	* ipa-free-lang-data.cc: Likewise.
	* ipa-icf.cc: Likewise.
	* ipa-inline.cc: Likewise.
	* ipa-modref.cc: Likewise.
	* ipa-profile.cc: Likewise.
	* ipa-pure-const.cc: Likewise.
	* ipa-reference.cc: Likewise.
	* ipa-split.cc: Likewise.
	* ipa-sra.cc: Likewise.
	* ipa-visibility.cc: Likewise.
	* ipa.cc: Likewise.
	* ira.cc: Likewise.
	* jump.cc: Likewise.
	* loop-init.cc: Likewise.
	* lower-subreg.cc: Likewise.
	* mode-switching.cc: Likewise.
	* modulo-sched.cc: Likewise.
	* multiple_target.cc: Likewise.
	* omp-expand.cc: Likewise.
	* omp-low.cc: Likewise.
	* omp-oacc-kernels-decompose.cc: Likewise.
	* omp-oacc-neuter-broadcast.cc: Likewise.
	* omp-offload.cc: Likewise.
	* omp-simd-clone.cc: Likewise.
	* passes.cc: Likewise.
	* postreload-gcse.cc: Likewise.
	* postreload.cc: Likewise.
	* predict.cc: Likewise.
	* recog.cc: Likewise.
	* ree.cc: Likewise.
	* reg-stack.cc: Likewise.
	* regcprop.cc: Likewise.
	* reginfo.cc: Likewise.
	* regrename.cc: Likewise.
	* reorg.cc: Likewise.
	* sancov.cc: Likewise.
	* sanopt.cc: Likewise.
	* sched-rgn.cc: Likewise.
	* stack-ptr-mod.cc: Likewise.
	* store-motion.cc: Likewise.
	* tracer.cc: Likewise.
	* trans-mem.cc: Likewise.
	* tree-call-cdce.cc: Likewise.
	* tree-cfg.cc: Likewise.
	* tree-cfgcleanup.cc: Likewise.
	* tree-complex.cc: Likewise.
	* tree-eh.cc: Likewise.
	* tree-emutls.cc: Likewise.
	* tree-if-conv.cc: Likewise.
	* tree-into-ssa.cc: Likewise.
	* tree-loop-distribution.cc: Likewise.
	* tree-nrv.cc: Likewise.
	* tree-object-size.cc: Likewise.
	* tree-parloops.cc: Likewise.
	* tree-predcom.cc: Likewise.
	* tree-profile.cc: Likewise.
	* tree-sra.cc: Likewise.
	* tree-ssa-ccp.cc: Likewise.
	* tree-ssa-copy.cc: Likewise.
	* tree-ssa-dce.cc: Likewise.
	* tree-ssa-dom.cc: Likewise.
	* tree-ssa-dse.cc: Likewise.
	* tree-ssa-forwprop.cc: Likewise.
	* tree-ssa-ifcombine.cc: Likewise.
	* tree-ssa-loop-ch.cc: Likewise.
	* tree-ssa-loop-im.cc: Likewise.
	* tree-ssa-loop-ivcanon.cc: Likewise.
	* tree-ssa-loop-prefetch.cc: Likewise.
	* tree-ssa-loop-split.cc: Likewise.
	* tree-ssa-loop-unswitch.cc: Likewise.
	* tree-ssa-loop.cc: Likewise.
	* tree-ssa-math-opts.cc: Likewise.
	* tree-ssa-phiopt.cc: Likewise.
	* tree-ssa-phiprop.cc: Likewise.
	* tree-ssa-pre.cc: Likewise.
	* tree-ssa-reassoc.cc: Likewise.
	* tree-ssa-sccvn.cc: Likewise.
	* tree-ssa-sink.cc: Likewise.
	* tree-ssa-strlen.cc: Likewise.
	* tree-ssa-structalias.cc: Likewise.
	* tree-ssa-uncprop.cc: Likewise.
	* tree-ssa-uninit.cc: Likewise.
	* tree-ssanames.cc: Likewise.
	* tree-stdarg.cc: Likewise.
	* tree-switch-conversion.cc: Likewise.
	* tree-tailcall.cc: Likewise.
	* tree-vect-generic.cc: Likewise.
	* tree-vectorizer.cc: Likewise.
	* tree-vrp.cc: Likewise.
	* tsan.cc: Likewise.
	* ubsan.cc: Likewise.
	* var-tracking.cc: Likewise.
	* vtable-verify.cc: Likewise.
	* web.cc: Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
---
 gcc/adjust-alignment.cc              |  2 +-
 gcc/asan.cc                          | 19 ++++++++++++----
 gcc/auto-inc-dec.cc                  |  4 ++--
 gcc/auto-profile.cc                  |  8 +++----
 gcc/bb-reorder.cc                    | 12 +++++-----
 gcc/cfgcleanup.cc                    |  8 +++----
 gcc/cfgexpand.cc                     |  2 +-
 gcc/cfgrtl.cc                        |  6 ++---
 gcc/cgraphbuild.cc                   | 13 +++++++----
 gcc/combine-stack-adj.cc             |  4 ++--
 gcc/combine.cc                       |  4 ++--
 gcc/compare-elim.cc                  |  4 ++--
 gcc/config/i386/i386-features.cc     | 20 ++++++++--------
 gcc/coroutine-passes.cc              |  8 +++----
 gcc/cprop.cc                         |  9 +++++---
 gcc/cse.cc                           | 18 ++++++++++-----
 gcc/dce.cc                           |  8 +++----
 gcc/df-core.cc                       | 10 ++++----
 gcc/dse.cc                           | 14 ++++++++----
 gcc/dwarf2cfi.cc                     |  7 ++++--
 gcc/early-remat.cc                   |  4 ++--
 gcc/except.cc                        |  6 ++---
 gcc/final.cc                         | 14 ++++++++----
 gcc/function.cc                      | 10 ++++----
 gcc/fwprop.cc                        |  8 +++----
 gcc/gcse.cc                          | 14 ++++++++----
 gcc/gimple-harden-conditionals.cc    | 20 +++++++++++-----
 gcc/gimple-if-to-switch.cc           |  4 ++--
 gcc/gimple-isel.cc                   |  4 ++--
 gcc/gimple-laddress.cc               |  6 ++---
 gcc/gimple-loop-interchange.cc       |  6 ++---
 gcc/gimple-loop-jam.cc               |  4 ++--
 gcc/gimple-loop-versioning.cc        |  7 ++++--
 gcc/gimple-low.cc                    |  5 +++-
 gcc/gimple-ssa-backprop.cc           |  6 ++---
 gcc/gimple-ssa-evrp.cc               |  6 ++---
 gcc/gimple-ssa-isolate-paths.cc      |  9 +++++---
 gcc/gimple-ssa-nonnull-compare.cc    |  4 ++--
 gcc/gimple-ssa-split-paths.cc        |  9 +++++---
 gcc/gimple-ssa-store-merging.cc      | 10 ++++----
 gcc/gimple-ssa-strength-reduction.cc |  4 ++--
 gcc/gimple-ssa-warn-access.cc        |  8 +++----
 gcc/gimple-ssa-warn-alloca.cc        |  8 +++----
 gcc/gimple-ssa-warn-restrict.cc      |  4 ++--
 gcc/gimple-warn-recursion.cc         |  4 ++--
 gcc/graphite.cc                      |  9 +++++---
 gcc/ifcvt.cc                         | 12 +++++-----
 gcc/init-regs.cc                     |  4 ++--
 gcc/ipa-comdats.cc                   |  4 ++--
 gcc/ipa-cp.cc                        |  4 ++--
 gcc/ipa-devirt.cc                    |  8 +++----
 gcc/ipa-fnsummary.cc                 | 20 ++++++++++------
 gcc/ipa-free-lang-data.cc            |  2 +-
 gcc/ipa-icf.cc                       |  4 ++--
 gcc/ipa-inline.cc                    |  4 ++--
 gcc/ipa-modref.cc                    | 12 +++++-----
 gcc/ipa-profile.cc                   |  4 ++--
 gcc/ipa-pure-const.cc                | 26 +++++++++++++--------
 gcc/ipa-reference.cc                 |  4 ++--
 gcc/ipa-split.cc                     |  8 +++----
 gcc/ipa-sra.cc                       |  7 ++++--
 gcc/ipa-visibility.cc                |  6 ++---
 gcc/ipa.cc                           |  9 +++++---
 gcc/ira.cc                           |  8 +++----
 gcc/jump.cc                          |  5 +++-
 gcc/loop-init.cc                     | 18 +++++++--------
 gcc/lower-subreg.cc                  | 16 +++++++------
 gcc/mode-switching.cc                |  6 ++---
 gcc/modulo-sched.cc                  |  4 ++--
 gcc/multiple_target.cc               |  7 ++++--
 gcc/omp-expand.cc                    | 14 ++++++++----
 gcc/omp-low.cc                       |  9 +++++---
 gcc/omp-oacc-kernels-decompose.cc    |  4 ++--
 gcc/omp-oacc-neuter-broadcast.cc     |  4 ++--
 gcc/omp-offload.cc                   | 16 ++++++-------
 gcc/omp-simd-clone.cc                |  7 ++++--
 gcc/passes.cc                        | 34 ++++++++++++++++------------
 gcc/postreload-gcse.cc               |  7 ++++--
 gcc/postreload.cc                    |  7 ++++--
 gcc/predict.cc                       | 13 +++++++----
 gcc/recog.cc                         | 32 +++++++++++++++-----------
 gcc/ree.cc                           |  7 ++++--
 gcc/reg-stack.cc                     |  4 ++--
 gcc/regcprop.cc                      |  4 ++--
 gcc/reginfo.cc                       |  2 +-
 gcc/regrename.cc                     |  7 ++++--
 gcc/reorg.cc                         |  8 +++----
 gcc/sancov.cc                        | 10 ++++----
 gcc/sanopt.cc                        |  4 ++--
 gcc/sched-rgn.cc                     | 19 +++++++++-------
 gcc/stack-ptr-mod.cc                 |  2 +-
 gcc/store-motion.cc                  |  4 ++--
 gcc/tracer.cc                        |  4 ++--
 gcc/trans-mem.cc                     | 34 +++++++++++++++++++---------
 gcc/tree-call-cdce.cc                |  4 ++--
 gcc/tree-cfg.cc                      | 28 ++++++++++++++++-------
 gcc/tree-cfgcleanup.cc               |  6 ++---
 gcc/tree-complex.cc                  | 14 ++++++++----
 gcc/tree-eh.cc                       | 23 +++++++++++--------
 gcc/tree-emutls.cc                   |  7 ++++--
 gcc/tree-if-conv.cc                  |  4 ++--
 gcc/tree-into-ssa.cc                 |  4 ++--
 gcc/tree-loop-distribution.cc        |  4 ++--
 gcc/tree-nrv.cc                      |  6 ++---
 gcc/tree-object-size.cc              |  6 ++---
 gcc/tree-parloops.cc                 | 11 +++++----
 gcc/tree-predcom.cc                  |  8 +++----
 gcc/tree-profile.cc                  |  4 ++--
 gcc/tree-sra.cc                      | 11 +++++----
 gcc/tree-ssa-ccp.cc                  | 21 +++++++++--------
 gcc/tree-ssa-copy.cc                 |  9 +++++---
 gcc/tree-ssa-dce.cc                  | 14 ++++++------
 gcc/tree-ssa-dom.cc                  |  8 +++----
 gcc/tree-ssa-dse.cc                  |  6 ++---
 gcc/tree-ssa-forwprop.cc             |  6 ++---
 gcc/tree-ssa-ifcombine.cc            |  2 +-
 gcc/tree-ssa-loop-ch.cc              | 10 ++++----
 gcc/tree-ssa-loop-im.cc              |  6 ++---
 gcc/tree-ssa-loop-ivcanon.cc         | 10 ++++----
 gcc/tree-ssa-loop-prefetch.cc        |  7 ++++--
 gcc/tree-ssa-loop-split.cc           |  4 ++--
 gcc/tree-ssa-loop-unswitch.cc        |  4 ++--
 gcc/tree-ssa-loop.cc                 | 27 ++++++++++++----------
 gcc/tree-ssa-math-opts.cc            | 15 +++++++-----
 gcc/tree-ssa-phiopt.cc               | 15 +++++++-----
 gcc/tree-ssa-phiprop.cc              |  4 ++--
 gcc/tree-ssa-pre.cc                  |  4 ++--
 gcc/tree-ssa-reassoc.cc              |  8 +++----
 gcc/tree-ssa-sccvn.cc                |  8 +++----
 gcc/tree-ssa-sink.cc                 |  8 +++----
 gcc/tree-ssa-strlen.cc               | 10 ++++----
 gcc/tree-ssa-structalias.cc          | 13 +++++++----
 gcc/tree-ssa-uncprop.cc              |  6 ++---
 gcc/tree-ssa-uninit.cc               | 13 +++++++----
 gcc/tree-ssanames.cc                 |  2 +-
 gcc/tree-stdarg.cc                   |  8 +++----
 gcc/tree-switch-conversion.cc        | 15 +++++++-----
 gcc/tree-tailcall.cc                 | 16 +++++++++----
 gcc/tree-vect-generic.cc             | 11 +++++----
 gcc/tree-vectorizer.cc               | 26 +++++++++++++--------
 gcc/tree-vrp.cc                      |  8 +++----
 gcc/tsan.cc                          | 10 ++++----
 gcc/ubsan.cc                         |  4 ++--
 gcc/var-tracking.cc                  |  4 ++--
 gcc/vtable-verify.cc                 |  4 ++--
 gcc/web.cc                           |  4 ++--
 146 files changed, 769 insertions(+), 552 deletions(-)
  

Comments

David Malcolm June 13, 2022, 6:22 p.m. UTC | #1
Ping for this patch:
  https://gcc.gnu.org/pipermail/gcc-patches/2022-May/595444.html

OK for trunk?

Thanks
Dave

On Mon, 2022-05-23 at 15:28 -0400, David Malcolm wrote:
> gcc/ChangeLog:
>         * adjust-alignment.cc: Add "final" and "override" to opt_pass
>         vfunc implementations, removing redundant "virtual" as
>         appropriate.
>         * asan.cc: Likewise.
>         * auto-inc-dec.cc: Likewise.
>         * auto-profile.cc: Likewise.
>         * bb-reorder.cc: Likewise.
>         * cfgcleanup.cc: Likewise.
>         * cfgexpand.cc: Likewise.
>         * cfgrtl.cc: Likewise.
>         * cgraphbuild.cc: Likewise.
>         * combine-stack-adj.cc: Likewise.
>         * combine.cc: Likewise.
>         * compare-elim.cc: Likewise.
>         * config/i386/i386-features.cc: Likewise.
>         * coroutine-passes.cc: Likewise.
>         * cprop.cc: Likewise.
>         * cse.cc: Likewise.
>         * dce.cc: Likewise.
>         * df-core.cc: Likewise.
>         * dse.cc: Likewise.
>         * dwarf2cfi.cc: Likewise.
>         * early-remat.cc: Likewise.
>         * except.cc: Likewise.
>         * final.cc: Likewise.
>         * function.cc: Likewise.
>         * fwprop.cc: Likewise.
>         * gcse.cc: Likewise.
>         * gimple-harden-conditionals.cc: Likewise.
>         * gimple-if-to-switch.cc: Likewise.
>         * gimple-isel.cc: Likewise.
>         * gimple-laddress.cc: Likewise.
>         * gimple-loop-interchange.cc: Likewise.
>         * gimple-loop-jam.cc: Likewise.
>         * gimple-loop-versioning.cc: Likewise.
>         * gimple-low.cc: Likewise.
>         * gimple-ssa-backprop.cc: Likewise.
>         * gimple-ssa-evrp.cc: Likewise.
>         * gimple-ssa-isolate-paths.cc: Likewise.
>         * gimple-ssa-nonnull-compare.cc: Likewise.
>         * gimple-ssa-split-paths.cc: Likewise.
>         * gimple-ssa-store-merging.cc: Likewise.
>         * gimple-ssa-strength-reduction.cc: Likewise.
>         * gimple-ssa-warn-access.cc: Likewise.
>         * gimple-ssa-warn-alloca.cc: Likewise.
>         * gimple-ssa-warn-restrict.cc: Likewise.
>         * gimple-warn-recursion.cc: Likewise.
>         * graphite.cc: Likewise.
>         * ifcvt.cc: Likewise.
>         * init-regs.cc: Likewise.
>         * ipa-comdats.cc: Likewise.
>         * ipa-cp.cc: Likewise.
>         * ipa-devirt.cc: Likewise.
>         * ipa-fnsummary.cc: Likewise.
>         * ipa-free-lang-data.cc: Likewise.
>         * ipa-icf.cc: Likewise.
>         * ipa-inline.cc: Likewise.
>         * ipa-modref.cc: Likewise.
>         * ipa-profile.cc: Likewise.
>         * ipa-pure-const.cc: Likewise.
>         * ipa-reference.cc: Likewise.
>         * ipa-split.cc: Likewise.
>         * ipa-sra.cc: Likewise.
>         * ipa-visibility.cc: Likewise.
>         * ipa.cc: Likewise.
>         * ira.cc: Likewise.
>         * jump.cc: Likewise.
>         * loop-init.cc: Likewise.
>         * lower-subreg.cc: Likewise.
>         * mode-switching.cc: Likewise.
>         * modulo-sched.cc: Likewise.
>         * multiple_target.cc: Likewise.
>         * omp-expand.cc: Likewise.
>         * omp-low.cc: Likewise.
>         * omp-oacc-kernels-decompose.cc: Likewise.
>         * omp-oacc-neuter-broadcast.cc: Likewise.
>         * omp-offload.cc: Likewise.
>         * omp-simd-clone.cc: Likewise.
>         * passes.cc: Likewise.
>         * postreload-gcse.cc: Likewise.
>         * postreload.cc: Likewise.
>         * predict.cc: Likewise.
>         * recog.cc: Likewise.
>         * ree.cc: Likewise.
>         * reg-stack.cc: Likewise.
>         * regcprop.cc: Likewise.
>         * reginfo.cc: Likewise.
>         * regrename.cc: Likewise.
>         * reorg.cc: Likewise.
>         * sancov.cc: Likewise.
>         * sanopt.cc: Likewise.
>         * sched-rgn.cc: Likewise.
>         * stack-ptr-mod.cc: Likewise.
>         * store-motion.cc: Likewise.
>         * tracer.cc: Likewise.
>         * trans-mem.cc: Likewise.
>         * tree-call-cdce.cc: Likewise.
>         * tree-cfg.cc: Likewise.
>         * tree-cfgcleanup.cc: Likewise.
>         * tree-complex.cc: Likewise.
>         * tree-eh.cc: Likewise.
>         * tree-emutls.cc: Likewise.
>         * tree-if-conv.cc: Likewise.
>         * tree-into-ssa.cc: Likewise.
>         * tree-loop-distribution.cc: Likewise.
>         * tree-nrv.cc: Likewise.
>         * tree-object-size.cc: Likewise.
>         * tree-parloops.cc: Likewise.
>         * tree-predcom.cc: Likewise.
>         * tree-profile.cc: Likewise.
>         * tree-sra.cc: Likewise.
>         * tree-ssa-ccp.cc: Likewise.
>         * tree-ssa-copy.cc: Likewise.
>         * tree-ssa-dce.cc: Likewise.
>         * tree-ssa-dom.cc: Likewise.
>         * tree-ssa-dse.cc: Likewise.
>         * tree-ssa-forwprop.cc: Likewise.
>         * tree-ssa-ifcombine.cc: Likewise.
>         * tree-ssa-loop-ch.cc: Likewise.
>         * tree-ssa-loop-im.cc: Likewise.
>         * tree-ssa-loop-ivcanon.cc: Likewise.
>         * tree-ssa-loop-prefetch.cc: Likewise.
>         * tree-ssa-loop-split.cc: Likewise.
>         * tree-ssa-loop-unswitch.cc: Likewise.
>         * tree-ssa-loop.cc: Likewise.
>         * tree-ssa-math-opts.cc: Likewise.
>         * tree-ssa-phiopt.cc: Likewise.
>         * tree-ssa-phiprop.cc: Likewise.
>         * tree-ssa-pre.cc: Likewise.
>         * tree-ssa-reassoc.cc: Likewise.
>         * tree-ssa-sccvn.cc: Likewise.
>         * tree-ssa-sink.cc: Likewise.
>         * tree-ssa-strlen.cc: Likewise.
>         * tree-ssa-structalias.cc: Likewise.
>         * tree-ssa-uncprop.cc: Likewise.
>         * tree-ssa-uninit.cc: Likewise.
>         * tree-ssanames.cc: Likewise.
>         * tree-stdarg.cc: Likewise.
>         * tree-switch-conversion.cc: Likewise.
>         * tree-tailcall.cc: Likewise.
>         * tree-vect-generic.cc: Likewise.
>         * tree-vectorizer.cc: Likewise.
>         * tree-vrp.cc: Likewise.
>         * tsan.cc: Likewise.
>         * ubsan.cc: Likewise.
>         * var-tracking.cc: Likewise.
>         * vtable-verify.cc: Likewise.
>         * web.cc: Likewise.
> 
> Signed-off-by: David Malcolm <dmalcolm@redhat.com>
> ---
>  gcc/adjust-alignment.cc              |  2 +-
>  gcc/asan.cc                          | 19 ++++++++++++----
>  gcc/auto-inc-dec.cc                  |  4 ++--
>  gcc/auto-profile.cc                  |  8 +++----
>  gcc/bb-reorder.cc                    | 12 +++++-----
>  gcc/cfgcleanup.cc                    |  8 +++----
>  gcc/cfgexpand.cc                     |  2 +-
>  gcc/cfgrtl.cc                        |  6 ++---
>  gcc/cgraphbuild.cc                   | 13 +++++++----
>  gcc/combine-stack-adj.cc             |  4 ++--
>  gcc/combine.cc                       |  4 ++--
>  gcc/compare-elim.cc                  |  4 ++--
>  gcc/config/i386/i386-features.cc     | 20 ++++++++--------
>  gcc/coroutine-passes.cc              |  8 +++----
>  gcc/cprop.cc                         |  9 +++++---
>  gcc/cse.cc                           | 18 ++++++++++-----
>  gcc/dce.cc                           |  8 +++----
>  gcc/df-core.cc                       | 10 ++++----
>  gcc/dse.cc                           | 14 ++++++++----
>  gcc/dwarf2cfi.cc                     |  7 ++++--
>  gcc/early-remat.cc                   |  4 ++--
>  gcc/except.cc                        |  6 ++---
>  gcc/final.cc                         | 14 ++++++++----
>  gcc/function.cc                      | 10 ++++----
>  gcc/fwprop.cc                        |  8 +++----
>  gcc/gcse.cc                          | 14 ++++++++----
>  gcc/gimple-harden-conditionals.cc    | 20 +++++++++++-----
>  gcc/gimple-if-to-switch.cc           |  4 ++--
>  gcc/gimple-isel.cc                   |  4 ++--
>  gcc/gimple-laddress.cc               |  6 ++---
>  gcc/gimple-loop-interchange.cc       |  6 ++---
>  gcc/gimple-loop-jam.cc               |  4 ++--
>  gcc/gimple-loop-versioning.cc        |  7 ++++--
>  gcc/gimple-low.cc                    |  5 +++-
>  gcc/gimple-ssa-backprop.cc           |  6 ++---
>  gcc/gimple-ssa-evrp.cc               |  6 ++---
>  gcc/gimple-ssa-isolate-paths.cc      |  9 +++++---
>  gcc/gimple-ssa-nonnull-compare.cc    |  4 ++--
>  gcc/gimple-ssa-split-paths.cc        |  9 +++++---
>  gcc/gimple-ssa-store-merging.cc      | 10 ++++----
>  gcc/gimple-ssa-strength-reduction.cc |  4 ++--
>  gcc/gimple-ssa-warn-access.cc        |  8 +++----
>  gcc/gimple-ssa-warn-alloca.cc        |  8 +++----
>  gcc/gimple-ssa-warn-restrict.cc      |  4 ++--
>  gcc/gimple-warn-recursion.cc         |  4 ++--
>  gcc/graphite.cc                      |  9 +++++---
>  gcc/ifcvt.cc                         | 12 +++++-----
>  gcc/init-regs.cc                     |  4 ++--
>  gcc/ipa-comdats.cc                   |  4 ++--
>  gcc/ipa-cp.cc                        |  4 ++--
>  gcc/ipa-devirt.cc                    |  8 +++----
>  gcc/ipa-fnsummary.cc                 | 20 ++++++++++------
>  gcc/ipa-free-lang-data.cc            |  2 +-
>  gcc/ipa-icf.cc                       |  4 ++--
>  gcc/ipa-inline.cc                    |  4 ++--
>  gcc/ipa-modref.cc                    | 12 +++++-----
>  gcc/ipa-profile.cc                   |  4 ++--
>  gcc/ipa-pure-const.cc                | 26 +++++++++++++--------
>  gcc/ipa-reference.cc                 |  4 ++--
>  gcc/ipa-split.cc                     |  8 +++----
>  gcc/ipa-sra.cc                       |  7 ++++--
>  gcc/ipa-visibility.cc                |  6 ++---
>  gcc/ipa.cc                           |  9 +++++---
>  gcc/ira.cc                           |  8 +++----
>  gcc/jump.cc                          |  5 +++-
>  gcc/loop-init.cc                     | 18 +++++++--------
>  gcc/lower-subreg.cc                  | 16 +++++++------
>  gcc/mode-switching.cc                |  6 ++---
>  gcc/modulo-sched.cc                  |  4 ++--
>  gcc/multiple_target.cc               |  7 ++++--
>  gcc/omp-expand.cc                    | 14 ++++++++----
>  gcc/omp-low.cc                       |  9 +++++---
>  gcc/omp-oacc-kernels-decompose.cc    |  4 ++--
>  gcc/omp-oacc-neuter-broadcast.cc     |  4 ++--
>  gcc/omp-offload.cc                   | 16 ++++++-------
>  gcc/omp-simd-clone.cc                |  7 ++++--
>  gcc/passes.cc                        | 34 ++++++++++++++++------------
>  gcc/postreload-gcse.cc               |  7 ++++--
>  gcc/postreload.cc                    |  7 ++++--
>  gcc/predict.cc                       | 13 +++++++----
>  gcc/recog.cc                         | 32 +++++++++++++++-----------
>  gcc/ree.cc                           |  7 ++++--
>  gcc/reg-stack.cc                     |  4 ++--
>  gcc/regcprop.cc                      |  4 ++--
>  gcc/reginfo.cc                       |  2 +-
>  gcc/regrename.cc                     |  7 ++++--
>  gcc/reorg.cc                         |  8 +++----
>  gcc/sancov.cc                        | 10 ++++----
>  gcc/sanopt.cc                        |  4 ++--
>  gcc/sched-rgn.cc                     | 19 +++++++++-------
>  gcc/stack-ptr-mod.cc                 |  2 +-
>  gcc/store-motion.cc                  |  4 ++--
>  gcc/tracer.cc                        |  4 ++--
>  gcc/trans-mem.cc                     | 34 +++++++++++++++++++---------
>  gcc/tree-call-cdce.cc                |  4 ++--
>  gcc/tree-cfg.cc                      | 28 ++++++++++++++++-------
>  gcc/tree-cfgcleanup.cc               |  6 ++---
>  gcc/tree-complex.cc                  | 14 ++++++++----
>  gcc/tree-eh.cc                       | 23 +++++++++++--------
>  gcc/tree-emutls.cc                   |  7 ++++--
>  gcc/tree-if-conv.cc                  |  4 ++--
>  gcc/tree-into-ssa.cc                 |  4 ++--
>  gcc/tree-loop-distribution.cc        |  4 ++--
>  gcc/tree-nrv.cc                      |  6 ++---
>  gcc/tree-object-size.cc              |  6 ++---
>  gcc/tree-parloops.cc                 | 11 +++++----
>  gcc/tree-predcom.cc                  |  8 +++----
>  gcc/tree-profile.cc                  |  4 ++--
>  gcc/tree-sra.cc                      | 11 +++++----
>  gcc/tree-ssa-ccp.cc                  | 21 +++++++++--------
>  gcc/tree-ssa-copy.cc                 |  9 +++++---
>  gcc/tree-ssa-dce.cc                  | 14 ++++++------
>  gcc/tree-ssa-dom.cc                  |  8 +++----
>  gcc/tree-ssa-dse.cc                  |  6 ++---
>  gcc/tree-ssa-forwprop.cc             |  6 ++---
>  gcc/tree-ssa-ifcombine.cc            |  2 +-
>  gcc/tree-ssa-loop-ch.cc              | 10 ++++----
>  gcc/tree-ssa-loop-im.cc              |  6 ++---
>  gcc/tree-ssa-loop-ivcanon.cc         | 10 ++++----
>  gcc/tree-ssa-loop-prefetch.cc        |  7 ++++--
>  gcc/tree-ssa-loop-split.cc           |  4 ++--
>  gcc/tree-ssa-loop-unswitch.cc        |  4 ++--
>  gcc/tree-ssa-loop.cc                 | 27 ++++++++++++----------
>  gcc/tree-ssa-math-opts.cc            | 15 +++++++-----
>  gcc/tree-ssa-phiopt.cc               | 15 +++++++-----
>  gcc/tree-ssa-phiprop.cc              |  4 ++--
>  gcc/tree-ssa-pre.cc                  |  4 ++--
>  gcc/tree-ssa-reassoc.cc              |  8 +++----
>  gcc/tree-ssa-sccvn.cc                |  8 +++----
>  gcc/tree-ssa-sink.cc                 |  8 +++----
>  gcc/tree-ssa-strlen.cc               | 10 ++++----
>  gcc/tree-ssa-structalias.cc          | 13 +++++++----
>  gcc/tree-ssa-uncprop.cc              |  6 ++---
>  gcc/tree-ssa-uninit.cc               | 13 +++++++----
>  gcc/tree-ssanames.cc                 |  2 +-
>  gcc/tree-stdarg.cc                   |  8 +++----
>  gcc/tree-switch-conversion.cc        | 15 +++++++-----
>  gcc/tree-tailcall.cc                 | 16 +++++++++----
>  gcc/tree-vect-generic.cc             | 11 +++++----
>  gcc/tree-vectorizer.cc               | 26 +++++++++++++--------
>  gcc/tree-vrp.cc                      |  8 +++----
>  gcc/tsan.cc                          | 10 ++++----
>  gcc/ubsan.cc                         |  4 ++--
>  gcc/var-tracking.cc                  |  4 ++--
>  gcc/vtable-verify.cc                 |  4 ++--
>  gcc/web.cc                           |  4 ++--
>  146 files changed, 769 insertions(+), 552 deletions(-)
> 
> diff --git a/gcc/adjust-alignment.cc b/gcc/adjust-alignment.cc
> index 2db41e8b4c8..5c5f8f4e5c0 100644
> --- a/gcc/adjust-alignment.cc
> +++ b/gcc/adjust-alignment.cc
> @@ -50,7 +50,7 @@ public:
>      : gimple_opt_pass (pass_data_adjust_alignment, ctxt)
>    {}
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  }; // class pass_adjust_alignment
>  
>  } // anon namespace
> diff --git a/gcc/asan.cc b/gcc/asan.cc
> index 4b583e54efd..5df333555ea 100644
> --- a/gcc/asan.cc
> +++ b/gcc/asan.cc
> @@ -4209,9 +4209,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_asan (m_ctxt); }
> -  virtual bool gate (function *) { return gate_asan () || gate_hwasan
> (); }
> -  virtual unsigned int execute (function *) { return asan_instrument
> (); }
> +  opt_pass * clone () final override { return new pass_asan (m_ctxt);
> }
> +  bool gate (function *) final override
> +  {
> +    return gate_asan () || gate_hwasan ();
> +  }
> +  unsigned int execute (function *) final override
> +  {
> +    return asan_instrument ();
> +  }
>  
>  }; // class pass_asan
>  
> @@ -4246,11 +4252,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return !optimize && (gate_asan () || gate_hwasan ());
>      }
> -  virtual unsigned int execute (function *) { return asan_instrument
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return asan_instrument ();
> +  }
>  
>  }; // class pass_asan_O0
>  
> diff --git a/gcc/auto-inc-dec.cc b/gcc/auto-inc-dec.cc
> index 85fe9d14950..481e7af6895 100644
> --- a/gcc/auto-inc-dec.cc
> +++ b/gcc/auto-inc-dec.cc
> @@ -1692,7 +1692,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        if (!AUTO_INC_DEC)
>         return false;
> @@ -1701,7 +1701,7 @@ public:
>      }
>  
>  
> -  unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_inc_dec
>  
> diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
> index 2b34b80b82d..6533722817f 100644
> --- a/gcc/auto-profile.cc
> +++ b/gcc/auto-profile.cc
> @@ -1752,13 +1752,13 @@ public:
>    }
>  
>    /* opt_pass methods: */
> -  virtual bool
> -  gate (function *)
> +  bool
> +  gate (function *) final override
>    {
>      return flag_auto_profile;
>    }
> -  virtual unsigned int
> -  execute (function *)
> +  unsigned int
> +  execute (function *) final override
>    {
>      return autofdo::auto_profile ();
>    }
> diff --git a/gcc/bb-reorder.cc b/gcc/bb-reorder.cc
> index d20ccb83aa6..bdbe2e9ea7a 100644
> --- a/gcc/bb-reorder.cc
> +++ b/gcc/bb-reorder.cc
> @@ -2633,7 +2633,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        if (targetm.cannot_modify_jumps_p ())
>         return false;
> @@ -2641,7 +2641,7 @@ public:
>               && (flag_reorder_blocks ||
> flag_reorder_blocks_and_partition));
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_reorder_blocks
>  
> @@ -2794,8 +2794,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_duplicate_computed_gotos
>  
> @@ -2937,8 +2937,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_partition_blocks
>  
> diff --git a/gcc/cfgcleanup.cc b/gcc/cfgcleanup.cc
> index 335af4911bb..18047da7b24 100644
> --- a/gcc/cfgcleanup.cc
> +++ b/gcc/cfgcleanup.cc
> @@ -3227,7 +3227,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_jump
>  
> @@ -3274,11 +3274,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return flag_thread_jumps && flag_expensive_optimizations;
>    }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_jump_after_combine
>  
> @@ -3322,7 +3322,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
>        return 0;
> diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
> index bb33c1b939e..1d7f6b260d0 100644
> --- a/gcc/cfgexpand.cc
> +++ b/gcc/cfgexpand.cc
> @@ -6573,7 +6573,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_expand
>  
> diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
> index 06be46d75df..9a4651f61a3 100644
> --- a/gcc/cfgrtl.cc
> +++ b/gcc/cfgrtl.cc
> @@ -483,7 +483,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_free_cfg
>  
> @@ -3698,7 +3698,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        cfg_layout_initialize (0);
>        return 0;
> @@ -3737,7 +3737,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_outof_cfg_layout_mode
>  
> diff --git a/gcc/cgraphbuild.cc b/gcc/cgraphbuild.cc
> index fdd17aa5a2d..bae44591a29 100644
> --- a/gcc/cgraphbuild.cc
> +++ b/gcc/cgraphbuild.cc
> @@ -290,7 +290,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_build_cgraph_edges
>  
> @@ -484,8 +484,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_rebuild_cgraph_edges (m_ctxt);
> }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_rebuild_cgraph_edges (m_ctxt);
> +  }
> +  unsigned int execute (function *) final override
>    {
>      return cgraph_edge::rebuild_edges ();
>    }
> @@ -524,10 +527,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () {
> +  opt_pass * clone () final override {
>      return new pass_remove_cgraph_callee_edges (m_ctxt);
>    }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_remove_cgraph_callee_edges
>  
> diff --git a/gcc/combine-stack-adj.cc b/gcc/combine-stack-adj.cc
> index e8ba2717063..e76d60a8f7e 100644
> --- a/gcc/combine-stack-adj.cc
> +++ b/gcc/combine-stack-adj.cc
> @@ -823,8 +823,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_stack_adjustments ();
>      }
> diff --git a/gcc/combine.cc b/gcc/combine.cc
> index 9a34ef847aa..a8305273e44 100644
> --- a/gcc/combine.cc
> +++ b/gcc/combine.cc
> @@ -15015,8 +15015,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return (optimize > 0); }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return (optimize > 0); }
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_combine ();
>      }
> diff --git a/gcc/compare-elim.cc b/gcc/compare-elim.cc
> index 985c0c92182..e869d9d3249 100644
> --- a/gcc/compare-elim.cc
> +++ b/gcc/compare-elim.cc
> @@ -954,7 +954,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Setting this target hook value is how a backend indicates the
> need.  */
>        if (targetm.flags_regnum == INVALID_REGNUM)
> @@ -962,7 +962,7 @@ public:
>        return flag_compare_elim_after_reload;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_compare_elim_after_reload ();
>      }
> diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-
> features.cc
> index 6fe41c3c24f..24e8336689c 100644
> --- a/gcc/config/i386/i386-features.cc
> +++ b/gcc/config/i386/i386-features.cc
> @@ -1873,13 +1873,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return TARGET_AVX && TARGET_VZEROUPPER
>         && flag_expensive_optimizations && !optimize_size;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_insert_vzeroupper ();
>      }
> @@ -1908,23 +1908,23 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return ((!timode_p || TARGET_64BIT)
>               && TARGET_STV && TARGET_SSE2 && optimize > 1);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return convert_scalars_to_vector (timode_p);
>      }
>  
> -  opt_pass *clone ()
> +  opt_pass *clone () final override
>      {
>        return new pass_stv (m_ctxt);
>      }
>  
> -  void set_pass_param (unsigned int n, bool param)
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        timode_p = param;
> @@ -2135,14 +2135,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        need_endbr = (flag_cf_protection & CF_BRANCH) != 0;
>        patchable_area_size = crtl->patch_area_size - crtl-
> >patch_area_entry;
>        return need_endbr || patchable_area_size;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        timevar_push (TV_MACH_DEP);
>        rest_of_insert_endbr_and_patchable_area (need_endbr,
> @@ -2399,7 +2399,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (TARGET_AVX
>               && TARGET_SSE_PARTIAL_REG_DEPENDENCY
> @@ -2408,7 +2408,7 @@ public:
>               && optimize_function_for_speed_p (cfun));
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return remove_partial_avx_dependency ();
>      }
> diff --git a/gcc/coroutine-passes.cc b/gcc/coroutine-passes.cc
> index 7b9a97af5a2..21ac9469805 100644
> --- a/gcc/coroutine-passes.cc
> +++ b/gcc/coroutine-passes.cc
> @@ -213,9 +213,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_coroutines; };
> +  bool gate (function *) final override { return flag_coroutines; };
>  
> -  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
> +  unsigned int execute (function *f ATTRIBUTE_UNUSED) final override
>    {
>      return execute_lower_coro_builtins ();
>    }
> @@ -511,12 +511,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *f)
> +  bool gate (function *f) final override
>      {
>        return flag_coroutines && f->coroutine_component;
>      }
>  
> -  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
> +  unsigned int execute (function *f ATTRIBUTE_UNUSED) final override
>    {
>      return execute_early_expand_coro_ifns ();
>    }
> diff --git a/gcc/cprop.cc b/gcc/cprop.cc
> index cf01c2d79a9..580f811545d 100644
> --- a/gcc/cprop.cc
> +++ b/gcc/cprop.cc
> @@ -1953,15 +1953,18 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_rtl_cprop (m_ctxt); }
> -  virtual bool gate (function *fun)
> +  opt_pass * clone () final override { return new pass_rtl_cprop
> (m_ctxt); }
> +  bool gate (function *fun) final override
>      {
>        return optimize > 0 && flag_gcse
>         && !fun->calls_setjmp
>         && dbg_cnt (cprop);
>      }
>  
> -  virtual unsigned int execute (function *) { return execute_rtl_cprop
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_rtl_cprop ();
> +  }
>  
>  }; // class pass_rtl_cprop
>  
> diff --git a/gcc/cse.cc b/gcc/cse.cc
> index a18b599d324..b13afd4ba72 100644
> --- a/gcc/cse.cc
> +++ b/gcc/cse.cc
> @@ -7571,8 +7571,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize > 0; }
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_cse (); }
> +  bool gate (function *) final override { return optimize > 0; }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_cse ();
> +  }
>  
>  }; // class pass_cse
>  
> @@ -7642,12 +7645,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_rerun_cse_after_loop;
>      }
>  
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_cse2 (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_cse2 ();
> +  }
>  
>  }; // class pass_cse2
>  
> @@ -7715,12 +7721,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_rerun_cse_after_global_opts;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_cse_after_global_opts ();
>      }
> diff --git a/gcc/dce.cc b/gcc/dce.cc
> index 6676cbcd429..64aa0aa471d 100644
> --- a/gcc/dce.cc
> +++ b/gcc/dce.cc
> @@ -849,12 +849,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 1 && flag_dce && dbg_cnt (dce_ud);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_ud_dce ();
>      }
> @@ -1280,12 +1280,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_dce && dbg_cnt (dce_fast);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_fast_dce ();
>      }
> diff --git a/gcc/df-core.cc b/gcc/df-core.cc
> index a901b84878f..97b2bbf6d2b 100644
> --- a/gcc/df-core.cc
> +++ b/gcc/df-core.cc
> @@ -741,8 +741,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize > 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return optimize > 0; }
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_df_initialize ();
>      }
> @@ -781,8 +781,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize == 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return optimize == 0; }
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_df_initialize ();
>      }
> @@ -848,7 +848,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_df_finish ();
>      }
> diff --git a/gcc/dse.cc b/gcc/dse.cc
> index 30c11cee034..83c572f6220 100644
> --- a/gcc/dse.cc
> +++ b/gcc/dse.cc
> @@ -3747,12 +3747,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_dse && dbg_cnt (dse1);
>      }
>  
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_dse (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_dse ();
> +  }
>  
>  }; // class pass_rtl_dse1
>  
> @@ -3787,12 +3790,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_dse && dbg_cnt (dse2);
>      }
>  
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_dse (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_dse ();
> +  }
>  
>  }; // class pass_rtl_dse2
>  
> diff --git a/gcc/dwarf2cfi.cc b/gcc/dwarf2cfi.cc
> index ab7c5cc5b27..bef3165e691 100644
> --- a/gcc/dwarf2cfi.cc
> +++ b/gcc/dwarf2cfi.cc
> @@ -3788,8 +3788,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return
> execute_dwarf2_frame (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_dwarf2_frame ();
> +  }
>  
>  }; // class pass_dwarf2_frame
>  
> diff --git a/gcc/early-remat.cc b/gcc/early-remat.cc
> index 2738892b4e7..5c368293c35 100644
> --- a/gcc/early-remat.cc
> +++ b/gcc/early-remat.cc
> @@ -2615,12 +2615,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return optimize > 1 && NUM_POLY_INT_COEFFS > 1;
>    }
>  
> -  virtual unsigned int execute (function *f)
> +  unsigned int execute (function *f) final override
>    {
>      auto_sbitmap selected_modes (NUM_MACHINE_MODES);
>      bitmap_clear (selected_modes);
> diff --git a/gcc/except.cc b/gcc/except.cc
> index b94de425557..7d7ce40c846 100644
> --- a/gcc/except.cc
> +++ b/gcc/except.cc
> @@ -2047,7 +2047,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return set_nothrow_function_flags ();
>      }
> @@ -2722,8 +2722,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        int ret = convert_to_eh_region_ranges ();
>        maybe_add_nop_after_section_switch ();
> diff --git a/gcc/final.cc b/gcc/final.cc
> index a9868861bd2..81e21cb8db6 100644
> --- a/gcc/final.cc
> +++ b/gcc/final.cc
> @@ -808,7 +808,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return
> compute_alignments (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return compute_alignments ();
> +  }
>  
>  }; // class pass_compute_alignments
>  
> @@ -4360,7 +4363,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_final (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_final ();
> +  }
>  
>  }; // class pass_final
>  
> @@ -4404,7 +4410,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_shorten_branches ();
>      }
> @@ -4579,7 +4585,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_clean_state ();
>      }
> diff --git a/gcc/function.cc b/gcc/function.cc
> index ad0096a43ef..0c3e4fffb05 100644
> --- a/gcc/function.cc
> +++ b/gcc/function.cc
> @@ -2029,7 +2029,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return instantiate_virtual_regs ();
>      }
> @@ -6516,7 +6516,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_check_leaf_regs ();
>      }
> @@ -6617,7 +6617,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_thread_prologue_and_epilogue ();
>      }
> @@ -6655,7 +6655,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_zero_call_used_regs
>  
> @@ -6926,7 +6926,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_match_asm_constraints
>  
> diff --git a/gcc/fwprop.cc b/gcc/fwprop.cc
> index d12fc2f34ac..fc652ab9a1f 100644
> --- a/gcc/fwprop.cc
> +++ b/gcc/fwprop.cc
> @@ -1029,8 +1029,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_fwprop (); }
> -  virtual unsigned int execute (function *) { return fwprop (false); }
> +  bool gate (function *) final override { return gate_fwprop (); }
> +  unsigned int execute (function *) final override { return fwprop
> (false); }
>  
>  }; // class pass_rtl_fwprop
>  
> @@ -1065,8 +1065,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_fwprop (); }
> -  virtual unsigned int execute (function *) { return fwprop (true); }
> +  bool gate (function *) final override { return gate_fwprop (); }
> +  unsigned int execute (function *) final override { return fwprop
> (true); }
>  
>  }; // class pass_rtl_fwprop_addr
>  
> diff --git a/gcc/gcse.cc b/gcc/gcse.cc
> index b67353143a2..f06278a5534 100644
> --- a/gcc/gcse.cc
> +++ b/gcc/gcse.cc
> @@ -4049,8 +4049,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return execute_rtl_pre
> (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *)  final override
> +  {
> +    return execute_rtl_pre ();
> +  }
>  
>  }; // class pass_rtl_pre
>  
> @@ -4099,8 +4102,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return execute_rtl_hoist
> (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_rtl_hoist ();
> +  }
>  
>  }; // class pass_rtl_hoist
>  
> diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-
> conditionals.cc
> index 79c0a5784ba..4ca6776fca7 100644
> --- a/gcc/gimple-harden-conditionals.cc
> +++ b/gcc/gimple-harden-conditionals.cc
> @@ -71,11 +71,15 @@ public:
>    pass_harden_compares (gcc::context *ctxt)
>      : gimple_opt_pass (pass_data_harden_compares, ctxt)
>    {}
> -  opt_pass *clone () { return new pass_harden_compares (m_ctxt); }
> -  virtual bool gate (function *) {
> +  opt_pass *clone ()  final override
> +  {
> +    return new pass_harden_compares (m_ctxt);
> +  }
> +  bool gate (function *) final override
> +  {
>      return flag_harden_compares;
>    }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  };
>  
>  /* Define a pass to harden conditionals in branches.  This pass must
> @@ -102,11 +106,15 @@ public:
>    pass_harden_conditional_branches (gcc::context *ctxt)
>      : gimple_opt_pass (pass_data_harden_conditional_branches, ctxt)
>    {}
> -  opt_pass *clone () { return new pass_harden_conditional_branches
> (m_ctxt); }
> -  virtual bool gate (function *) {
> +  opt_pass *clone () final override
> +  {
> +    return new pass_harden_conditional_branches (m_ctxt);
> +  }
> +  bool gate (function *) final override
> +  {
>      return flag_harden_conditional_branches;
>    }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  };
>  
>  }
> diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
> index 5dcfe5b77e0..c89aef34381 100644
> --- a/gcc/gimple-if-to-switch.cc
> +++ b/gcc/gimple-if-to-switch.cc
> @@ -478,13 +478,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return (jump_table_cluster::is_enabled ()
>             || bit_test_cluster::is_enabled ());
>    }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_if_to_switch
>  
> diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
> index 44d086d8b28..aa9c1290735 100644
> --- a/gcc/gimple-isel.cc
> +++ b/gcc/gimple-isel.cc
> @@ -355,12 +355,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return true;
>      }
>  
> -  virtual unsigned int execute (function *fun)
> +  unsigned int execute (function *fun) final override
>      {
>        return gimple_expand_vec_exprs (fun);
>      }
> diff --git a/gcc/gimple-laddress.cc b/gcc/gimple-laddress.cc
> index 13c7858e161..11754dac5c3 100644
> --- a/gcc/gimple-laddress.cc
> +++ b/gcc/gimple-laddress.cc
> @@ -66,9 +66,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_laddress (m_ctxt); }
> -  virtual bool gate (function *) { return optimize != 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_laddress
> (m_ctxt); }
> +  bool gate (function *) final override { return optimize != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_laddress
>  
> diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-
> interchange.cc
> index 53adc02acc2..5f59730be4c 100644
> --- a/gcc/gimple-loop-interchange.cc
> +++ b/gcc/gimple-loop-interchange.cc
> @@ -1703,9 +1703,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_linterchange (m_ctxt); }
> -  virtual bool gate (function *) { return flag_loop_interchange; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_linterchange
> (m_ctxt); }
> +  bool gate (function *) final override { return
> flag_loop_interchange; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_linterchange
>  
> diff --git a/gcc/gimple-loop-jam.cc b/gcc/gimple-loop-jam.cc
> index e33dd9091df..9b18b52a54c 100644
> --- a/gcc/gimple-loop-jam.cc
> +++ b/gcc/gimple-loop-jam.cc
> @@ -641,8 +641,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_unroll_jam != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_unroll_jam != 0;
> }
> +  unsigned int execute (function *) final override;
>  
>  };
>  
> diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-
> versioning.cc
> index ab02bdd4b15..6bcf6eba691 100644
> --- a/gcc/gimple-loop-versioning.cc
> +++ b/gcc/gimple-loop-versioning.cc
> @@ -1782,8 +1782,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return
> flag_version_loops_for_strides; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override
> +  {
> +    return flag_version_loops_for_strides;
> +  }
> +  unsigned int execute (function *) final override;
>  };
>  
>  unsigned int
> diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc
> index 2ec19d5657d..4cd27dd19b0 100644
> --- a/gcc/gimple-low.cc
> +++ b/gcc/gimple-low.cc
> @@ -192,7 +192,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return
> lower_function_body (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return lower_function_body ();
> +  }
>  
>  }; // class pass_lower_cf
>  
> diff --git a/gcc/gimple-ssa-backprop.cc b/gcc/gimple-ssa-backprop.cc
> index 74f98111256..55986ddbfe3 100644
> --- a/gcc/gimple-ssa-backprop.cc
> +++ b/gcc/gimple-ssa-backprop.cc
> @@ -945,9 +945,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_backprop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_ssa_backprop; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_backprop
> (m_ctxt); }
> +  bool gate (function *) final override { return flag_ssa_backprop; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_backprop
>  
> diff --git a/gcc/gimple-ssa-evrp.cc b/gcc/gimple-ssa-evrp.cc
> index 20388ed5431..793a3ea1f19 100644
> --- a/gcc/gimple-ssa-evrp.cc
> +++ b/gcc/gimple-ssa-evrp.cc
> @@ -377,12 +377,12 @@ public:
>      {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_early_vrp (m_ctxt); }
> -  virtual bool gate (function *)
> +  opt_pass * clone () final override { return new pass_early_vrp
> (m_ctxt); }
> +  bool gate (function *) final override
>      {
>        return flag_tree_vrp != 0;
>      }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      { return execute_early_vrp (); }
>  
>  }; // class pass_vrp
> diff --git a/gcc/gimple-ssa-isolate-paths.cc b/gcc/gimple-ssa-isolate-
> paths.cc
> index cc0ed9760a0..87ecd19ef4a 100644
> --- a/gcc/gimple-ssa-isolate-paths.cc
> +++ b/gcc/gimple-ssa-isolate-paths.cc
> @@ -969,8 +969,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_isolate_erroneous_paths
> (m_ctxt); }
> -  virtual bool gate (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_isolate_erroneous_paths (m_ctxt);
> +  }
> +  bool gate (function *) final override
>      {
>        /* If we do not have a suitable builtin function for the trap
> statement,
>          then do not perform the optimization.  */
> @@ -979,7 +982,7 @@ public:
>               || warn_null_dereference);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return gimple_ssa_isolate_erroneous_paths ();
>      }
> diff --git a/gcc/gimple-ssa-nonnull-compare.cc b/gcc/gimple-ssa-
> nonnull-compare.cc
> index cc52b914258..f9ce8c7a083 100644
> --- a/gcc/gimple-ssa-nonnull-compare.cc
> +++ b/gcc/gimple-ssa-nonnull-compare.cc
> @@ -126,9 +126,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return warn_nonnull_compare; }
> +  bool gate (function *) final override { return warn_nonnull_compare;
> }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_warn_nonnull_compare
>  
> diff --git a/gcc/gimple-ssa-split-paths.cc b/gcc/gimple-ssa-split-
> paths.cc
> index 6abe1d51400..f2e43e52c95 100644
> --- a/gcc/gimple-ssa-split-paths.cc
> +++ b/gcc/gimple-ssa-split-paths.cc
> @@ -579,9 +579,12 @@ class pass_split_paths : public gimple_opt_pass
>        : gimple_opt_pass (pass_data_split_paths, ctxt)
>      {}
>     /* opt_pass methods: */
> -   opt_pass * clone () { return new pass_split_paths (m_ctxt); }
> -   virtual bool gate (function *) { return gate_split_paths (); }
> -   virtual unsigned int execute (function *) { return
> execute_split_paths (); }
> +  opt_pass * clone () final override { return new pass_split_paths
> (m_ctxt); }
> +  bool gate (function *) final override { return gate_split_paths ();
> }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_split_paths ();
> +  }
>  
>  }; // class pass_split_paths
>  
> diff --git a/gcc/gimple-ssa-store-merging.cc b/gcc/gimple-ssa-store-
> merging.cc
> index b952ce57917..0640168bcc4 100644
> --- a/gcc/gimple-ssa-store-merging.cc
> +++ b/gcc/gimple-ssa-store-merging.cc
> @@ -1037,12 +1037,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return flag_expensive_optimizations && optimize && BITS_PER_UNIT
> == 8;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_optimize_bswap
>  
> @@ -2433,8 +2433,8 @@ public:
>    /* Pass not supported for PDP-endian, nor for insane hosts or
>       target character sizes where native_{encode,interpret}_expr
>       doesn't work properly.  */
> -  virtual bool
> -  gate (function *)
> +  bool
> +  gate (function *) final override
>    {
>      return flag_store_merging
>            && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN
> @@ -2442,7 +2442,7 @@ public:
>            && BITS_PER_UNIT == 8;
>    }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  private:
>    hash_map<tree_operand_hash, class imm_store_chain_info *> m_stores;
> diff --git a/gcc/gimple-ssa-strength-reduction.cc b/gcc/gimple-ssa-
> strength-reduction.cc
> index dad73d31874..2b559e96fc8 100644
> --- a/gcc/gimple-ssa-strength-reduction.cc
> +++ b/gcc/gimple-ssa-strength-reduction.cc
> @@ -4002,8 +4002,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_slsr; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_tree_slsr; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_strength_reduction
>  
> diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-
> access.cc
> index 9357a4e576a..1f70cbdb884 100644
> --- a/gcc/gimple-ssa-warn-access.cc
> +++ b/gcc/gimple-ssa-warn-access.cc
> @@ -2069,13 +2069,13 @@ class pass_waccess : public gimple_opt_pass
>  
>    ~pass_waccess ();
>  
> -  opt_pass *clone ();
> +  opt_pass *clone () final override;
>  
> -  virtual bool gate (function *);
> +  bool gate (function *) final override;
>  
> -  void set_pass_param (unsigned, bool);
> +  void set_pass_param (unsigned, bool) final override;
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  private:
>    /* Not copyable or assignable.  */
> diff --git a/gcc/gimple-ssa-warn-alloca.cc b/gcc/gimple-ssa-warn-
> alloca.cc
> index 273b88ec141..83a241a3a4b 100644
> --- a/gcc/gimple-ssa-warn-alloca.cc
> +++ b/gcc/gimple-ssa-warn-alloca.cc
> @@ -58,8 +58,8 @@ public:
>    pass_walloca (gcc::context *ctxt)
>      : gimple_opt_pass(pass_data_walloca, ctxt), xlimit_certain_p
> (false)
>    {}
> -  opt_pass *clone () { return new pass_walloca (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass *clone () final override { return new pass_walloca
> (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        // Set to true to enable only warnings for alloca calls that
> @@ -69,8 +69,8 @@ public:
>        // the "may be too large" kind.
>        xlimit_certain_p = param;
>      }
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>   private:
>    // Set to TRUE the first time we run this pass on a function.
> diff --git a/gcc/gimple-ssa-warn-restrict.cc b/gcc/gimple-ssa-warn-
> restrict.cc
> index b678e806da3..2a1afcbb0fc 100644
> --- a/gcc/gimple-ssa-warn-restrict.cc
> +++ b/gcc/gimple-ssa-warn-restrict.cc
> @@ -64,8 +64,8 @@ class pass_wrestrict : public gimple_opt_pass
>   public:
>    pass_wrestrict (gcc::context *);
>  
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>    void check_call (gimple *);
>  
> diff --git a/gcc/gimple-warn-recursion.cc b/gcc/gimple-warn-
> recursion.cc
> index 91a3cdbacd4..9b04899cf78 100644
> --- a/gcc/gimple-warn-recursion.cc
> +++ b/gcc/gimple-warn-recursion.cc
> @@ -52,9 +52,9 @@ public:
>    pass_warn_recursion (gcc::context *);
>  
>  private:
> -  virtual bool gate (function *) { return warn_infinite_recursion; }
> +  bool gate (function *) final override { return
> warn_infinite_recursion; }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>    bool find_function_exit (basic_block);
>  
> diff --git a/gcc/graphite.cc b/gcc/graphite.cc
> index ab8683b5b41..a88b13c0219 100644
> --- a/gcc/graphite.cc
> +++ b/gcc/graphite.cc
> @@ -574,7 +574,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_graphite_transforms ();
> }
> +  bool gate (function *) final override { return
> gate_graphite_transforms (); }
>  
>  }; // class pass_graphite
>  
> @@ -609,8 +609,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_graphite_transforms ();
> }
> -  virtual unsigned int execute (function *fun) { return
> graphite_transforms (fun); }
> +  bool gate (function *) final override { return
> gate_graphite_transforms (); }
> +  unsigned int execute (function *fun) final override
> +  {
> +    return graphite_transforms (fun);
> +  }
>  
>  }; // class pass_graphite_transforms
>  
> diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
> index b983e87389f..28b153cf2ae 100644
> --- a/gcc/ifcvt.cc
> +++ b/gcc/ifcvt.cc
> @@ -5933,12 +5933,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize > 0) && dbg_cnt (if_conversion);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_if_conversion ();
>      }
> @@ -5980,13 +5980,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_if_conversion
>         && dbg_cnt (if_after_combine);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        if_convert (true);
>        return 0;
> @@ -6026,13 +6026,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return optimize > 0 && flag_if_conversion2
>         && dbg_cnt (if_after_reload);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        if_convert (true);
>        return 0;
> diff --git a/gcc/init-regs.cc b/gcc/init-regs.cc
> index 220ef705997..652befefdaa 100644
> --- a/gcc/init-regs.cc
> +++ b/gcc/init-regs.cc
> @@ -153,8 +153,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize > 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return optimize > 0; }
> +  unsigned int execute (function *) final override
>      {
>        initialize_uninitialized_regs ();
>        return 0;
> diff --git a/gcc/ipa-comdats.cc b/gcc/ipa-comdats.cc
> index 566faf3cc1f..da792065ed3 100644
> --- a/gcc/ipa-comdats.cc
> +++ b/gcc/ipa-comdats.cc
> @@ -420,8 +420,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return ipa_comdats (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override { return
> ipa_comdats (); }
>  
>  }; // class pass_ipa_comdats
>  
> diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
> index 152fe7244f7..38a21b17e39 100644
> --- a/gcc/ipa-cp.cc
> +++ b/gcc/ipa-cp.cc
> @@ -6659,14 +6659,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* FIXME: We should remove the optimize check after we ensure we
> never run
>          IPA passes when not optimizing.  */
>        return (flag_ipa_cp && optimize) || in_lto_p;
>      }
>  
> -  virtual unsigned int execute (function *) { return ipcp_driver (); }
> +  unsigned int execute (function *) final override { return
> ipcp_driver (); }
>  
>  }; // class pass_ipa_cp
>  
> diff --git a/gcc/ipa-devirt.cc b/gcc/ipa-devirt.cc
> index 9f1442dc3cc..412ca14f66b 100644
> --- a/gcc/ipa-devirt.cc
> +++ b/gcc/ipa-devirt.cc
> @@ -3969,7 +3969,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* In LTO, always run the IPA passes and decide on function
> basis if the
>          pass is enabled.  */
> @@ -3982,7 +3982,7 @@ public:
>               && optimize);
>      }
>  
> -  virtual unsigned int execute (function *) { return ipa_devirt (); }
> +  unsigned int execute (function *) final override { return ipa_devirt
> (); }
>  
>  }; // class pass_ipa_devirt
>  
> @@ -4361,12 +4361,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (in_lto_p || flag_lto);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return 0;
>      }
> diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
> index b12e7a1124d..832794fd5dc 100644
> --- a/gcc/ipa-fnsummary.cc
> +++ b/gcc/ipa-fnsummary.cc
> @@ -4846,8 +4846,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_local_fn_summary (m_ctxt);
> +  }
> +  unsigned int execute (function *) final override
>      {
>        return compute_fn_summary_for_current ();
>      }
> @@ -4889,14 +4892,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass *clone () { return new pass_ipa_free_fn_summary (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass *clone () final override
> +  {
> +    return new pass_ipa_free_fn_summary (m_ctxt);
> +  }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        small_p = param;
>      }
> -  virtual bool gate (function *) { return true; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return true; }
> +  unsigned int execute (function *) final override
>      {
>        ipa_free_fn_summary ();
>        /* Free ipa-prop structures if they are no longer needed.  */
> @@ -4950,7 +4956,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return 0; }
> +  unsigned int execute (function *) final override { return 0; }
>  
>  }; // class pass_ipa_fn_summary
>  
> diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc
> index f99f7be1c58..ccdbf849c25 100644
> --- a/gcc/ipa-free-lang-data.cc
> +++ b/gcc/ipa-free-lang-data.cc
> @@ -1173,7 +1173,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return free_lang_data
> (); }
> +  unsigned int execute (function *) final override { return
> free_lang_data (); }
>  
>  }; // class pass_ipa_free_lang_data
>  
> diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
> index 765ae746745..a8a162268ee 100644
> --- a/gcc/ipa-icf.cc
> +++ b/gcc/ipa-icf.cc
> @@ -3637,12 +3637,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return in_lto_p || flag_ipa_icf_variables ||
> flag_ipa_icf_functions;
>    }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>    {
>      return ipa_icf_driver();
>    }
> diff --git a/gcc/ipa-inline.cc b/gcc/ipa-inline.cc
> index 22a009b7435..14969198cde 100644
> --- a/gcc/ipa-inline.cc
> +++ b/gcc/ipa-inline.cc
> @@ -3100,7 +3100,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_early_inline
>  
> @@ -3150,7 +3150,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return ipa_inline (); }
> +  unsigned int execute (function *) final override { return ipa_inline
> (); }
>  
>  }; // class pass_ipa_inline
>  
> diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
> index 556816ab429..7c1f974bc7a 100644
> --- a/gcc/ipa-modref.cc
> +++ b/gcc/ipa-modref.cc
> @@ -3508,15 +3508,15 @@ class pass_modref : public gimple_opt_pass
>         : gimple_opt_pass (pass_data_modref, ctxt) {}
>  
>      /* opt_pass methods: */
> -    opt_pass *clone ()
> +    opt_pass *clone () final override
>      {
>        return new pass_modref (m_ctxt);
>      }
> -    virtual bool gate (function *)
> +    bool gate (function *) final override
>      {
>        return flag_ipa_modref;
>      }
> -    virtual unsigned int execute (function *);
> +    unsigned int execute (function *) final override;
>  };
>  
>  /* Encode TT to the output block OB using the summary streaming API. 
> */
> @@ -4170,12 +4170,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass *clone () { return new pass_ipa_modref (m_ctxt); }
> -  virtual bool gate (function *)
> +  opt_pass *clone () final override { return new pass_ipa_modref
> (m_ctxt); }
> +  bool gate (function *) final override
>    {
>      return true;
>    }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  };
>  
> diff --git a/gcc/ipa-profile.cc b/gcc/ipa-profile.cc
> index b74d77f2c95..496f292acba 100644
> --- a/gcc/ipa-profile.cc
> +++ b/gcc/ipa-profile.cc
> @@ -1053,8 +1053,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_ipa_profile ||
> in_lto_p; }
> -  virtual unsigned int execute (function *) { return ipa_profile (); }
> +  bool gate (function *) final override { return flag_ipa_profile ||
> in_lto_p; }
> +  unsigned int execute (function *) final override { return
> ipa_profile (); }
>  
>  }; // class pass_ipa_profile
>  
> diff --git a/gcc/ipa-pure-const.cc b/gcc/ipa-pure-const.cc
> index 2b4950a5969..0e55fc4bfc5 100644
> --- a/gcc/ipa-pure-const.cc
> +++ b/gcc/ipa-pure-const.cc
> @@ -168,8 +168,8 @@ public:
>    pass_ipa_pure_const(gcc::context *ctxt);
>  
>    /* opt_pass methods: */
> -  bool gate (function *) { return gate_pure_const (); }
> -  unsigned int execute (function *fun);
> +  bool gate (function *) final override { return gate_pure_const (); }
> +  unsigned int execute (function *fun) final override;
>  
>    void register_hooks (void);
>  
> @@ -2154,9 +2154,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_local_pure_const (m_ctxt); }
> -  virtual bool gate (function *) { return gate_pure_const (); }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override
> +  {
> +    return new pass_local_pure_const (m_ctxt);
> +  }
> +  bool gate (function *) final override { return gate_pure_const (); }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_local_pure_const
>  
> @@ -2270,8 +2273,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return
> warn_suggest_attribute_noreturn; }
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override
> +  {
> +    return warn_suggest_attribute_noreturn;
> +  }
> +  unsigned int execute (function *fun) final override
>      {
>        if (!TREE_THIS_VOLATILE (current_function_decl)
>           && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0)
> @@ -2316,9 +2322,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_nothrow (m_ctxt); }
> -  virtual bool gate (function *) { return optimize; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_nothrow
> (m_ctxt); }
> +  bool gate (function *) final override { return optimize; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_nothrow
>  
> diff --git a/gcc/ipa-reference.cc b/gcc/ipa-reference.cc
> index 67e0c85a95e..b5a2350ce72 100644
> --- a/gcc/ipa-reference.cc
> +++ b/gcc/ipa-reference.cc
> @@ -1299,14 +1299,14 @@ public:
>      {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return ((in_lto_p || flag_ipa_reference)
>               /* Don't bother doing anything if the program has
> errors.  */
>               && !seen_error ());
>      }
>  
> -  virtual unsigned int execute (function *) { return propagate (); }
> +  unsigned int execute (function *) final override { return propagate
> (); }
>  
>  }; // class pass_ipa_reference
>  
> diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc
> index 60021bad13c..16734617d03 100644
> --- a/gcc/ipa-split.cc
> +++ b/gcc/ipa-split.cc
> @@ -1915,8 +1915,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return execute_split_functions ();
>      }
> @@ -1974,8 +1974,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return execute_feedback_split_functions ();
>      }
> diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
> index 261a720858f..4f705a3febf 100644
> --- a/gcc/ipa-sra.cc
> +++ b/gcc/ipa-sra.cc
> @@ -4049,14 +4049,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* TODO: We should remove the optimize check after we ensure we
> never run
>          IPA passes when not optimizing.  */
>        return (flag_ipa_sra && optimize);
>      }
>  
> -  virtual unsigned int execute (function *) { return ipa_sra_analysis
> (); }
> +  unsigned int execute (function *)  final override
> +  {
> +    return ipa_sra_analysis ();
> +  }
>  
>  }; // class pass_ipa_sra
>  
> diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc
> index e95a0dd252f..8a27e7bcdfd 100644
> --- a/gcc/ipa-visibility.cc
> +++ b/gcc/ipa-visibility.cc
> @@ -959,12 +959,12 @@ public:
>  
>    /* opt_pass methods: */
>  
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Do not re-run on ltrans stage.  */
>        return !flag_ltrans;
>      }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return whole_program_function_and_variable_visibility ();
>      }
> @@ -988,7 +988,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return function_and_variable_visibility (flag_whole_program &&
> !flag_lto);
>      }
> diff --git a/gcc/ipa.cc b/gcc/ipa.cc
> index f53f15f5f0a..c01dca17bec 100644
> --- a/gcc/ipa.cc
> +++ b/gcc/ipa.cc
> @@ -1343,8 +1343,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return ipa_cdtor_merge
> (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return ipa_cdtor_merge ();
> +  }
>  
>  }; // class pass_ipa_cdtor_merge
>  
> @@ -1566,7 +1569,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return ipa_single_use
> (); }
> +  unsigned int execute (function *) final override { return
> ipa_single_use (); }
>  
>  }; // class pass_ipa_single_use
>  
> diff --git a/gcc/ira.cc b/gcc/ira.cc
> index e3b3c549120..42c9cead9f8 100644
> --- a/gcc/ira.cc
> +++ b/gcc/ira.cc
> @@ -6074,11 +6074,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return !targetm.no_register_allocation;
>      }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        ira (dump_file);
>        return 0;
> @@ -6117,11 +6117,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return !targetm.no_register_allocation;
>      }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        do_reload ();
>        return 0;
> diff --git a/gcc/jump.cc b/gcc/jump.cc
> index 332f86878e1..e6207169be0 100644
> --- a/gcc/jump.cc
> +++ b/gcc/jump.cc
> @@ -182,7 +182,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return cleanup_barriers
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return cleanup_barriers ();
> +  }
>  
>  }; // class pass_cleanup_barriers
>  
> diff --git a/gcc/loop-init.cc b/gcc/loop-init.cc
> index 1e4f6cfd7fb..648aa290916 100644
> --- a/gcc/loop-init.cc
> +++ b/gcc/loop-init.cc
> @@ -357,7 +357,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> +  bool gate (function *) final override;
>  
>  }; // class pass_loop2
>  
> @@ -429,7 +429,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return rtl_loop_init ();
> }
> +  unsigned int execute (function *) final override { return
> rtl_loop_init (); }
>  
>  }; // class pass_rtl_loop_init
>  
> @@ -467,7 +467,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_rtl_loop_done
>  
> @@ -523,8 +523,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_move_loop_invariants; }
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override { return
> flag_move_loop_invariants; }
> +  unsigned int execute (function *fun) final override
>      {
>        if (number_of_loops (fun) > 1)
>         move_loop_invariants ();
> @@ -565,12 +565,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (flag_unroll_loops || flag_unroll_all_loops || cfun-
> >has_unroll);
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_rtl_unroll_loops
>  
> @@ -625,8 +625,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_rtl_doloop
>  
> diff --git a/gcc/lower-subreg.cc b/gcc/lower-subreg.cc
> index d30bbeeabda..03e9326c663 100644
> --- a/gcc/lower-subreg.cc
> +++ b/gcc/lower-subreg.cc
> @@ -1769,8 +1769,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_split_wide_types != 0;
> }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return flag_split_wide_types
> != 0; }
> +  unsigned int execute (function *) final override
>      {
>        decompose_multiword_subregs (false);
>        return 0;
> @@ -1811,9 +1811,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_split_wide_types
> -                                         &&
> flag_split_wide_types_early; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override
> +  {
> +    return flag_split_wide_types && flag_split_wide_types_early;
> +  }
> +  unsigned int execute (function *) final override
>      {
>        decompose_multiword_subregs (true);
>        return 0;
> @@ -1854,8 +1856,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_split_wide_types; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return
> flag_split_wide_types; }
> +  unsigned int execute (function *) final override
>      {
>        decompose_multiword_subregs (true);
>        return 0;
> diff --git a/gcc/mode-switching.cc b/gcc/mode-switching.cc
> index 6e3f1dc65e2..b0f6e7cedd4 100644
> --- a/gcc/mode-switching.cc
> +++ b/gcc/mode-switching.cc
> @@ -893,8 +893,8 @@ public:
>    /* opt_pass methods: */
>    /* The epiphany backend creates a second instance of this pass, so
> we need
>       a clone method.  */
> -  opt_pass * clone () { return new pass_mode_switching (m_ctxt); }
> -  virtual bool gate (function *)
> +  opt_pass * clone () final override { return new pass_mode_switching
> (m_ctxt); }
> +  bool gate (function *) final override
>      {
>  #ifdef OPTIMIZE_MODE_SWITCHING
>        return true;
> @@ -903,7 +903,7 @@ public:
>  #endif
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>  #ifdef OPTIMIZE_MODE_SWITCHING
>        optimize_mode_switching ();
> diff --git a/gcc/modulo-sched.cc b/gcc/modulo-sched.cc
> index 1e1fa7055a2..f78d791cb01 100644
> --- a/gcc/modulo-sched.cc
> +++ b/gcc/modulo-sched.cc
> @@ -3338,12 +3338,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>  {
>    return (optimize > 0 && flag_modulo_sched);
>  }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_sms
>  
> diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
> index 7fe02fb55c8..3e2d26882c8 100644
> --- a/gcc/multiple_target.cc
> +++ b/gcc/multiple_target.cc
> @@ -526,8 +526,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return ipa_target_clone
> (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return ipa_target_clone ();
> +  }
>  };
>  
>  bool
> diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc
> index 9fcc67a3448..3d48e1df175 100644
> --- a/gcc/omp-expand.cc
> +++ b/gcc/omp-expand.cc
> @@ -10574,7 +10574,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        bool gate = ((flag_openacc != 0 || flag_openmp != 0
>                     || flag_openmp_simd != 0)
> @@ -10621,12 +10621,18 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        return !(fun->curr_properties & PROP_gimple_eomp);
>      }
> -  virtual unsigned int execute (function *) { return
> execute_expand_omp (); }
> -  opt_pass * clone () { return new pass_expand_omp_ssa (m_ctxt); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_expand_omp ();
> +  }
> +  opt_pass * clone () final override
> +  {
> +    return new pass_expand_omp_ssa (m_ctxt);
> +  }
>  
>  }; // class pass_expand_omp_ssa
>  
> diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
> index c83af6c3865..e00788f0ea1 100644
> --- a/gcc/omp-low.cc
> +++ b/gcc/omp-low.cc
> @@ -14594,7 +14594,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return execute_lower_omp
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_lower_omp ();
> +  }
>  
>  }; // class pass_lower_omp
>  
> @@ -14902,11 +14905,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return flag_openacc || flag_openmp || flag_openmp_simd;
>    }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return diagnose_omp_structured_block_errors ();
>      }
> diff --git a/gcc/omp-oacc-kernels-decompose.cc b/gcc/omp-oacc-kernels-
> decompose.cc
> index ec9b0faab0a..524060e2fca 100644
> --- a/gcc/omp-oacc-kernels-decompose.cc
> +++ b/gcc/omp-oacc-kernels-decompose.cc
> @@ -1615,12 +1615,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return (flag_openacc
>             && param_openacc_kernels == OPENACC_KERNELS_DECOMPOSE);
>    }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>    {
>      return omp_oacc_kernels_decompose ();
>    }
> diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-
> broadcast.cc
> index 81e3223a94c..b6177794cde 100644
> --- a/gcc/omp-oacc-neuter-broadcast.cc
> +++ b/gcc/omp-oacc-neuter-broadcast.cc
> @@ -1945,7 +1945,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>    {
>      if (!flag_openacc)
>        return false;
> @@ -1961,7 +1961,7 @@ public:
>      return true;
>    }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_omp_oacc_neuter_broadcast ();
>      }
> diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
> index ad4e772015e..9de04fc520c 100644
> --- a/gcc/omp-offload.cc
> +++ b/gcc/omp-offload.cc
> @@ -2449,9 +2449,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_openacc; };
> +  bool gate (function *) final override { return flag_openacc; };
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_oacc_loop_designation ();
>      }
> @@ -2479,9 +2479,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_openacc; };
> +  bool gate (function *) final override { return flag_openacc; };
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_oacc_device_lower ();
>      }
> @@ -2713,13 +2713,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        return (!(fun->curr_properties & PROP_gimple_lomp_dev)
>               || (flag_openmp
>                   && cgraph_node::get (fun->decl)-
> >calls_declare_variant_alt));
>      }
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_omp_device_lower ();
>      }
> @@ -2759,7 +2759,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>  #ifdef ACCEL_COMPILER
>        return offloading_function_p (fun->decl);
> @@ -2769,7 +2769,7 @@ public:
>  #endif
>      }
>  
> -  virtual unsigned execute (function *);
> +  unsigned execute (function *) final override;
>  };
>  
>  /* Callback for walk_gimple_stmt used to scan for link var operands. 
> */
> diff --git a/gcc/omp-simd-clone.cc b/gcc/omp-simd-clone.cc
> index 04fe03cde5f..32649bc3f9a 100644
> --- a/gcc/omp-simd-clone.cc
> +++ b/gcc/omp-simd-clone.cc
> @@ -1819,8 +1819,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return
> ipa_omp_simd_clone (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return ipa_omp_simd_clone ();
> +  }
>  };
>  
>  bool
> diff --git a/gcc/passes.cc b/gcc/passes.cc
> index 36e5b4ac45f..78a07f8691a 100644
> --- a/gcc/passes.cc
> +++ b/gcc/passes.cc
> @@ -417,13 +417,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Don't bother doing anything if the program has errors.  */
>        return (!seen_error () && !in_lto_p);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_build_ssa_passes ();
>      }
> @@ -451,7 +451,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Don't bother doing anything if the program has errors.  */
>        return (!seen_error () && !in_lto_p);
> @@ -480,7 +480,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Don't bother doing anything if the program has errors.  */
>        return (!seen_error () && !in_lto_p);
> @@ -531,7 +531,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize >= 1
>               /* Don't bother doing anything if the program has
> errors.  */
> @@ -571,7 +571,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize >= 1 &&
> !optimize_debug; }
> +  bool gate (function *) final override
> +  {
> +    return optimize >= 1 && !optimize_debug;
> +  }
>  
>  }; // class pass_all_optimizations
>  
> @@ -606,7 +609,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize >= 1 &&
> optimize_debug; }
> +  bool gate (function *) final override
> +  {
> +    return optimize >= 1 && optimize_debug;
> +  }
>  
>  }; // class pass_all_optimizations_g
>  
> @@ -641,7 +647,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Early return if there were errors.  We can run afoul of our
>          consistency checks, and there's not really much point in
> fixing them.  */
> @@ -681,7 +687,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return reload_completed; }
> +  bool gate (function *) final override { return reload_completed; }
>  
>  }; // class pass_postreload
>  
> @@ -716,7 +722,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return reload_completed || targetm.no_register_allocation;
>    }
> @@ -756,15 +762,15 @@ public:
>    {
>    }
>  
> -  virtual bool
> -  gate (function *fun)
> +  bool
> +  gate (function *fun) final override
>    {
>      return flag_tree_slp_vectorize
>            && (fun->pending_TODOs &
> PENDING_TODO_force_next_scalar_cleanup);
>    }
>  
> -  virtual unsigned int
> -  execute (function *fun)
> +  unsigned int
> +  execute (function *fun) final override
>    {
>      fun->pending_TODOs &= ~PENDING_TODO_force_next_scalar_cleanup;
>      return 0;
> diff --git a/gcc/postreload-gcse.cc b/gcc/postreload-gcse.cc
> index fc63f0b5c77..1c795b43ca3 100644
> --- a/gcc/postreload-gcse.cc
> +++ b/gcc/postreload-gcse.cc
> @@ -1447,13 +1447,16 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        return (optimize > 0 && flag_gcse_after_reload
>               && optimize_function_for_speed_p (fun));
>      }
>  
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_gcse2 (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_gcse2 ();
> +  }
>  
>  }; // class pass_gcse2
>  
> diff --git a/gcc/postreload.cc b/gcc/postreload.cc
> index 4a67d0d437a..d1c99fe6dc9 100644
> --- a/gcc/postreload.cc
> +++ b/gcc/postreload.cc
> @@ -2339,9 +2339,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return (optimize > 0 &&
> reload_completed); }
> +  bool gate (function *) final override
> +  {
> +    return (optimize > 0 && reload_completed);
> +  }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_postreload_cse
>  
> diff --git a/gcc/predict.cc b/gcc/predict.cc
> index 5734e4c8516..fb9fa514fbc 100644
> --- a/gcc/predict.cc
> +++ b/gcc/predict.cc
> @@ -4079,8 +4079,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_guess_branch_prob; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return
> flag_guess_branch_prob; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_profile
>  
> @@ -4233,14 +4233,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_strip_predict_hints (m_ctxt);
> }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_strip_predict_hints (m_ctxt);
> +  }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        early_p = param;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  private:
>    bool early_p;
> diff --git a/gcc/recog.cc b/gcc/recog.cc
> index cd2410ab2ae..dac172bc7c0 100644
> --- a/gcc/recog.cc
> +++ b/gcc/recog.cc
> @@ -4358,9 +4358,12 @@ public:
>    /* opt_pass methods: */
>    /* The epiphany backend creates a second instance of this pass, so
> we need
>       a clone method.  */
> -  opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
> -  virtual bool gate (function *) { return (optimize > 0 &&
> flag_peephole2); }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override { return new pass_peephole2
> (m_ctxt); }
> +  bool gate (function *) final override
> +  {
> +    return (optimize > 0 && flag_peephole2);
> +  }
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_peephole2 ();
>      }
> @@ -4400,8 +4403,11 @@ public:
>    /* opt_pass methods: */
>    /* The epiphany backend creates a second instance of this pass, so
>       we need a clone method.  */
> -  opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_split_all_insns (m_ctxt);
> +  }
> +  unsigned int execute (function *) final override
>      {
>        split_all_insns ();
>        return 0;
> @@ -4440,13 +4446,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* If optimizing, then go ahead and split insns now.  */
>        return optimize > 0;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        split_all_insns ();
>        return 0;
> @@ -4495,12 +4501,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return enable_split_before_sched2 ();
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        split_all_insns ();
>        return 0;
> @@ -4539,8 +4545,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        split_all_insns ();
>        return 0;
> @@ -4598,7 +4604,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* The placement of the splitting that we do for
> shorten_branches
>          depends on whether regstack is used by the target or not.  */
> @@ -4609,7 +4615,7 @@ public:
>  #endif
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return split_all_insns_noflow ();
>      }
> diff --git a/gcc/ree.cc b/gcc/ree.cc
> index de4f18e8a4d..da64ef679b7 100644
> --- a/gcc/ree.cc
> +++ b/gcc/ree.cc
> @@ -1403,8 +1403,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return (optimize > 0 && flag_ree);
> }
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_ree (); }
> +  bool gate (function *) final override { return (optimize > 0 &&
> flag_ree); }
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_ree ();
> +  }
>  
>  }; // class pass_ree
>  
> diff --git a/gcc/reg-stack.cc b/gcc/reg-stack.cc
> index 5afeadf8c49..fd032501ad9 100644
> --- a/gcc/reg-stack.cc
> +++ b/gcc/reg-stack.cc
> @@ -3413,7 +3413,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>  #ifdef STACK_REGS
>        return true;
> @@ -3468,7 +3468,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_stack_regs ();
>      }
> diff --git a/gcc/regcprop.cc b/gcc/regcprop.cc
> index 1fdc36713cd..8fcf9d529dd 100644
> --- a/gcc/regcprop.cc
> +++ b/gcc/regcprop.cc
> @@ -1293,12 +1293,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize > 0 && (flag_cprop_registers));
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_cprop_hardreg
>  
> diff --git a/gcc/reginfo.cc b/gcc/reginfo.cc
> index 2ab7bbb7353..705779d5c18 100644
> --- a/gcc/reginfo.cc
> +++ b/gcc/reginfo.cc
> @@ -953,7 +953,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return reginfo_init ();
> }
> +  unsigned int execute (function *) final override { return
> reginfo_init (); }
>  
>  }; // class pass_reginfo_init
>  
> diff --git a/gcc/regrename.cc b/gcc/regrename.cc
> index 10271e1b17d..021a822cb79 100644
> --- a/gcc/regrename.cc
> +++ b/gcc/regrename.cc
> @@ -2013,12 +2013,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize > 0 && (flag_rename_registers));
>      }
>  
> -  virtual unsigned int execute (function *) { return
> regrename_optimize (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return regrename_optimize ();
> +  }
>  
>  }; // class pass_regrename
>  
> diff --git a/gcc/reorg.cc b/gcc/reorg.cc
> index 7624f514906..07b2045986c 100644
> --- a/gcc/reorg.cc
> +++ b/gcc/reorg.cc
> @@ -3866,8 +3866,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_delay_slots ();
>      }
> @@ -3917,12 +3917,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return targetm.machine_dependent_reorg != 0;
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        targetm.machine_dependent_reorg ();
>        return 0;
> diff --git a/gcc/sancov.cc b/gcc/sancov.cc
> index 9c1025200b4..052fa4ef881 100644
> --- a/gcc/sancov.cc
> +++ b/gcc/sancov.cc
> @@ -308,17 +308,17 @@ public:
>  
>    static const pass_data data;
>    opt_pass *
> -  clone ()
> +  clone () final override
>    {
>      return new pass_sancov<O0> (m_ctxt);
>    }
> -  virtual bool
> -  gate (function *fun)
> +  bool
> +  gate (function *fun) final override
>    {
>      return sanitize_coverage_p (fun->decl) && (!O0 || !optimize);
>    }
> -  virtual unsigned int
> -  execute (function *fun)
> +  unsigned int
> +  execute (function *fun) final override
>    {
>      return sancov_pass (fun);
>    }
> diff --git a/gcc/sanopt.cc b/gcc/sanopt.cc
> index 125e0c936e7..7aebc6f39dc 100644
> --- a/gcc/sanopt.cc
> +++ b/gcc/sanopt.cc
> @@ -942,8 +942,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_sanitize; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_sanitize; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_sanopt
>  
> diff --git a/gcc/sched-rgn.cc b/gcc/sched-rgn.cc
> index a0dfdb7881f..0dc2a8f2851 100644
> --- a/gcc/sched-rgn.cc
> +++ b/gcc/sched-rgn.cc
> @@ -3779,7 +3779,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>  #ifdef INSN_SCHEDULING
>        return flag_live_range_shrinkage;
> @@ -3788,7 +3788,7 @@ public:
>  #endif
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_live_range_shrinkage ();
>      }
> @@ -3826,8 +3826,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return
> rest_of_handle_sched (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
> +  {
> +    return rest_of_handle_sched ();
> +  }
>  
>  }; // class pass_sched
>  
> @@ -3872,8 +3875,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_sched2 ();
>      }
> @@ -3922,8 +3925,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return rest_of_handle_sched_fusion ();
>      }
> diff --git a/gcc/stack-ptr-mod.cc b/gcc/stack-ptr-mod.cc
> index b14bef98c49..4ccbb1cace3 100644
> --- a/gcc/stack-ptr-mod.cc
> +++ b/gcc/stack-ptr-mod.cc
> @@ -71,7 +71,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_stack_ptr_mod
>  
> diff --git a/gcc/store-motion.cc b/gcc/store-motion.cc
> index 0f708700a14..b61c0686844 100644
> --- a/gcc/store-motion.cc
> +++ b/gcc/store-motion.cc
> @@ -1243,8 +1243,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override
>      {
>        return execute_rtl_store_motion ();
>      }
> diff --git a/gcc/tracer.cc b/gcc/tracer.cc
> index 4d054fe8fc8..64517846dc4 100644
> --- a/gcc/tracer.cc
> +++ b/gcc/tracer.cc
> @@ -424,12 +424,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize > 0 && flag_tracer && flag_reorder_blocks);
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_tracer
>  
> diff --git a/gcc/trans-mem.cc b/gcc/trans-mem.cc
> index ae2921f808e..131dce05476 100644
> --- a/gcc/trans-mem.cc
> +++ b/gcc/trans-mem.cc
> @@ -864,8 +864,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tm; }
> -  virtual unsigned int execute (function *) { return
> diagnose_tm_blocks (); }
> +  bool gate (function *) final override { return flag_tm; }
> +  unsigned int execute (function *) final override
> +  {
> +    return diagnose_tm_blocks ();
> +  }
>  
>  }; // class pass_diagnose_tm_blocks
>  
> @@ -1850,8 +1853,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tm; }
> -  virtual unsigned int execute (function *) { return execute_lower_tm
> (); }
> +  bool gate (function *) final override { return flag_tm; }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_lower_tm ();
> +  }
>  
>  }; // class pass_lower_tm
>  
> @@ -2144,7 +2150,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_tm_init (); }
> +  bool gate (function *) final override { return gate_tm_init (); }
>  
>  }; // class pass_tm_init
>  
> @@ -3162,7 +3168,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return execute_tm_mark
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_tm_mark ();
> +  }
>  
>  }; // class pass_tm_mark
>  
> @@ -3324,7 +3333,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_tm_edges
>  
> @@ -4085,8 +4094,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tm && optimize > 0; }
> -  virtual unsigned int execute (function *) { return execute_tm_memopt
> (); }
> +  bool gate (function *) final override { return flag_tm && optimize >
> 0; }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_tm_memopt ();
> +  }
>  
>  }; // class pass_tm_memopt
>  
> @@ -5667,8 +5679,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tm; }
> -  virtual unsigned int execute (function *) { return ipa_tm_execute
> (); }
> +  bool gate (function *) final override { return flag_tm; }
> +  unsigned int execute (function *) final override { return
> ipa_tm_execute (); }
>  
>  }; // class pass_ipa_tm
>  
> diff --git a/gcc/tree-call-cdce.cc b/gcc/tree-call-cdce.cc
> index 83991fe373e..feb61f362cf 100644
> --- a/gcc/tree-call-cdce.cc
> +++ b/gcc/tree-call-cdce.cc
> @@ -1171,7 +1171,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* The limit constants used in the implementation
>          assume IEEE floating point format.  Other formats
> @@ -1179,7 +1179,7 @@ public:
>        return flag_tree_builtin_call_dce != 0;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_call_cdce
>  
> diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> index 19ba09facce..37e89adf10e 100644
> --- a/gcc/tree-cfg.cc
> +++ b/gcc/tree-cfg.cc
> @@ -407,7 +407,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return execute_build_cfg
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_build_cfg ();
> +  }
>  
>  }; // class pass_build_cfg
>  
> @@ -9200,9 +9203,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return
> split_critical_edges (); }
> +  unsigned int execute (function *)  final override
> +  {
> +    return split_critical_edges ();
> +  }
>  
> -  opt_pass * clone () { return new pass_split_crit_edges (m_ctxt); }
> +  opt_pass * clone () final override
> +  {
> +    return new pass_split_crit_edges (m_ctxt);
> +  }
>  }; // class pass_split_crit_edges
>  
>  } // anon namespace
> @@ -9459,7 +9468,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_warn_function_return
>  
> @@ -9665,8 +9674,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_warn_unused_result; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *)  final override { return
> flag_warn_unused_result; }
> +  unsigned int execute (function *) final override
>      {
>        do_warn_unused_result (gimple_body (current_function_decl));
>        return 0;
> @@ -9875,8 +9884,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
> -  virtual unsigned int execute (function *) { return execute_fixup_cfg
> (); }
> +  opt_pass * clone () final override { return new pass_fixup_cfg
> (m_ctxt); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_fixup_cfg ();
> +  }
>  
>  }; // class pass_fixup_cfg
>  
> diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
> index 893619eaaa4..a6d0bf2c40a 100644
> --- a/gcc/tree-cfgcleanup.cc
> +++ b/gcc/tree-cfgcleanup.cc
> @@ -1406,8 +1406,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_merge_phi (m_ctxt); }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_merge_phi
> (m_ctxt); }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_merge_phi
>  
> @@ -1584,7 +1584,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return execute_cleanup_cfg_post_optimizing ();
>      }
> diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
> index f722057bfec..61950a0f099 100644
> --- a/gcc/tree-complex.cc
> +++ b/gcc/tree-complex.cc
> @@ -1915,8 +1915,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_lower_complex (m_ctxt); }
> -  virtual unsigned int execute (function *) { return
> tree_lower_complex (); }
> +  opt_pass * clone () final override { return new pass_lower_complex
> (m_ctxt); }
> +  unsigned int execute (function *) final override
> +  {
> +    return tree_lower_complex ();
> +  }
>  
>  }; // class pass_lower_complex
>  
> @@ -1952,14 +1955,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        /* With errors, normal optimization passes are not run.  If we
> don't
>          lower complex operations at all, rtl expansion will abort.  */
>        return !(fun->curr_properties & PROP_gimple_lcx);
>      }
>  
> -  virtual unsigned int execute (function *) { return
> tree_lower_complex (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return tree_lower_complex ();
> +  }
>  
>  }; // class pass_lower_complex_O0
>  
> diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
> index c37a5845343..076ecd3ec9a 100644
> --- a/gcc/tree-eh.cc
> +++ b/gcc/tree-eh.cc
> @@ -2176,7 +2176,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_lower_eh
>  
> @@ -3295,8 +3295,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_exceptions != 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return flag_exceptions != 0;
> }
> +  unsigned int execute (function *) final override
>      {
>        refactor_eh_r (gimple_body (current_function_decl));
>        return 0;
> @@ -3497,8 +3497,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_exceptions != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_exceptions != 0;
> }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_lower_resx
>  
> @@ -3922,8 +3922,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun) { return fun->eh->region_tree !=
> NULL; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *fun) final override
> +  {
> +    return fun->eh->region_tree != NULL;
> +  }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_lower_eh_dispatch
>  
> @@ -4859,13 +4862,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_cleanup_eh (m_ctxt); }
> -  virtual bool gate (function *fun)
> +  opt_pass * clone () final override { return new pass_cleanup_eh
> (m_ctxt); }
> +  bool gate (function *fun) final override
>      {
>        return fun->eh != NULL && fun->eh->region_tree != NULL;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_cleanup_eh
>  
> diff --git a/gcc/tree-emutls.cc b/gcc/tree-emutls.cc
> index 5f68703822c..b5aa307f60d 100644
> --- a/gcc/tree-emutls.cc
> +++ b/gcc/tree-emutls.cc
> @@ -838,13 +838,16 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* If the target supports TLS natively, we need do nothing
> here.  */
>        return !targetm.have_tls;
>      }
>  
> -  virtual unsigned int execute (function *) { return ipa_lower_emutls
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return ipa_lower_emutls ();
> +  }
>  
>  }; // class pass_ipa_lower_emutls
>  
> diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
> index 4531ca58bdf..480fea0e7c2 100644
> --- a/gcc/tree-if-conv.cc
> +++ b/gcc/tree-if-conv.cc
> @@ -3408,8 +3408,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_if_conversion
>  
> diff --git a/gcc/tree-into-ssa.cc b/gcc/tree-into-ssa.cc
> index 22c2e5b7982..46df57ae0e1 100644
> --- a/gcc/tree-into-ssa.cc
> +++ b/gcc/tree-into-ssa.cc
> @@ -2403,13 +2403,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        /* Do nothing for funcions that was produced already in SSA
> form.  */
>        return !(fun->curr_properties & PROP_ssa);
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_build_ssa
>  
> diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-
> distribution.cc
> index db6e9096a86..ec44c450cae 100644
> --- a/gcc/tree-loop-distribution.cc
> +++ b/gcc/tree-loop-distribution.cc
> @@ -3896,13 +3896,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return flag_tree_loop_distribution
>         || flag_tree_loop_distribute_patterns;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_loop_distribution
>  
> diff --git a/gcc/tree-nrv.cc b/gcc/tree-nrv.cc
> index b96d5b86f27..1faa481a8c9 100644
> --- a/gcc/tree-nrv.cc
> +++ b/gcc/tree-nrv.cc
> @@ -125,9 +125,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize > 0; }
> +  bool gate (function *) final override { return optimize > 0; }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_nrv
>  
> @@ -344,7 +344,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_return_slot
>  
> diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc
> index 5ca87ae3504..bc3d7dd9bfa 100644
> --- a/gcc/tree-object-size.cc
> +++ b/gcc/tree-object-size.cc
> @@ -2122,8 +2122,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_object_sizes (m_ctxt); }
> -  virtual unsigned int execute (function *fun)
> +  opt_pass * clone () final override { return new pass_object_sizes
> (m_ctxt); }
> +  unsigned int execute (function *fun) final override
>    {
>      return object_sizes_execute (fun, false);
>    }
> @@ -2162,7 +2162,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *fun)
> +  unsigned int execute (function *fun) final override
>    {
>      return object_sizes_execute (fun, true);
>    }
> diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc
> index da1069683a3..2c3ef436ab7 100644
> --- a/gcc/tree-parloops.cc
> +++ b/gcc/tree-parloops.cc
> @@ -4173,16 +4173,19 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      if (oacc_kernels_p)
>        return flag_openacc;
>      else
>        return flag_tree_parallelize_loops > 1;
>    }
> -  virtual unsigned int execute (function *);
> -  opt_pass * clone () { return new pass_parallelize_loops (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  unsigned int execute (function *) final override;
> +  opt_pass * clone () final override
> +  {
> +    return new pass_parallelize_loops (m_ctxt);
> +  }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        oacc_kernels_p = param;
> diff --git a/gcc/tree-predcom.cc b/gcc/tree-predcom.cc
> index fb457250bbd..5d923fba170 100644
> --- a/gcc/tree-predcom.cc
> +++ b/gcc/tree-predcom.cc
> @@ -3514,8 +3514,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool
> -  gate (function *)
> +  bool
> +  gate (function *) final override
>    {
>      if (flag_predictive_commoning != 0)
>        return true;
> @@ -3529,8 +3529,8 @@ public:
>      return false;
>    }
>  
> -  virtual unsigned int
> -  execute (function *fun)
> +  unsigned int
> +  execute (function *fun) final override
>    {
>      bool allow_unroll_p = flag_predictive_commoning != 0;
>      return run_tree_predictive_commoning (fun, allow_unroll_p);
> diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
> index 97aab8801d0..2beb49241f2 100644
> --- a/gcc/tree-profile.cc
> +++ b/gcc/tree-profile.cc
> @@ -884,8 +884,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *) { return tree_profiling
> (); }
> +  bool gate (function *) final override;
> +  unsigned int execute (function *) final override { return
> tree_profiling (); }
>  
>  }; // class pass_ipa_tree_profile
>  
> diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
> index 081c51b58a4..461c8e0b0f4 100644
> --- a/gcc/tree-sra.cc
> +++ b/gcc/tree-sra.cc
> @@ -4743,8 +4743,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_intra_sra (); }
> -  virtual unsigned int execute (function *) { return early_intra_sra
> (); }
> +  bool gate (function *) final override { return gate_intra_sra (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return early_intra_sra ();
> +  }
>  
>  }; // class pass_sra_early
>  
> @@ -4779,8 +4782,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_intra_sra (); }
> -  virtual unsigned int execute (function *) { return late_intra_sra
> (); }
> +  bool gate (function *) final override { return gate_intra_sra (); }
> +  unsigned int execute (function *) final override { return
> late_intra_sra (); }
>  
>  }; // class pass_sra
>  
> diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc
> index 81c97676625..579a966cc9b 100644
> --- a/gcc/tree-ssa-ccp.cc
> +++ b/gcc/tree-ssa-ccp.cc
> @@ -2994,14 +2994,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_ccp (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override { return new pass_ccp (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        nonzero_p = param;
>      }
> -  virtual bool gate (function *) { return flag_tree_ccp != 0; }
> -  virtual unsigned int execute (function *) { return do_ssa_ccp
> (nonzero_p); }
> +  bool gate (function *) final override { return flag_tree_ccp != 0; }
> +  unsigned int execute (function *) final override
> +  {
> +    return do_ssa_ccp (nonzero_p);
> +  }
>  
>   private:
>    /* Determines whether the pass instance records nonzero bits.  */
> @@ -4199,8 +4202,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_fold_builtins
> (m_ctxt); }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_fold_builtins
>  
> @@ -4550,9 +4553,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_post_ipa_warn (m_ctxt); }
> -  virtual bool gate (function *) { return warn_nonnull != 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_post_ipa_warn
> (m_ctxt); }
> +  bool gate (function *) final override { return warn_nonnull != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_fold_builtins
>  
> diff --git a/gcc/tree-ssa-copy.cc b/gcc/tree-ssa-copy.cc
> index 050a6d11434..782ceb500cc 100644
> --- a/gcc/tree-ssa-copy.cc
> +++ b/gcc/tree-ssa-copy.cc
> @@ -642,9 +642,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
> -  virtual unsigned int execute (function *) { return execute_copy_prop
> (); }
> +  opt_pass * clone () final override { return new pass_copy_prop
> (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_copy_prop
> != 0; }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_copy_prop ();
> +  }
>  
>  }; // class pass_copy_prop
>  
> diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
> index a6b284018d4..5df64922594 100644
> --- a/gcc/tree-ssa-dce.cc
> +++ b/gcc/tree-ssa-dce.cc
> @@ -1974,9 +1974,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_dce (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dce != 0; }
> -  virtual unsigned int execute (function *) { return tree_ssa_dce ();
> }
> +  opt_pass * clone () final override { return new pass_dce (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_dce != 0; }
> +  unsigned int execute (function *) final override { return
> tree_ssa_dce (); }
>  
>  }; // class pass_dce
>  
> @@ -2011,14 +2011,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_cd_dce (m_ctxt); }
> -  void set_pass_param (unsigned n, bool param)
> +  opt_pass * clone () final override { return new pass_cd_dce
> (m_ctxt); }
> +  void set_pass_param (unsigned n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        update_address_taken_p = param;
>      }
> -  virtual bool gate (function *) { return flag_tree_dce != 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return flag_tree_dce != 0; }
> +  unsigned int execute (function *) final override
>      {
>        return (tree_ssa_cd_dce ()
>               | (update_address_taken_p ? TODO_update_address_taken :
> 0));
> diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
> index 9a843217553..97e17ca68e4 100644
> --- a/gcc/tree-ssa-dom.cc
> +++ b/gcc/tree-ssa-dom.cc
> @@ -793,14 +793,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_dominator (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override { return new pass_dominator
> (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        may_peel_loop_headers_p = param;
>      }
> -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_tree_dom != 0; }
> +  unsigned int execute (function *) final override;
>  
>   private:
>    /* This flag is used to prevent loops from being peeled repeatedly
> in jump
> diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
> index 881a2d0f98d..1c1fdb7e75b 100644
> --- a/gcc/tree-ssa-dse.cc
> +++ b/gcc/tree-ssa-dse.cc
> @@ -1455,9 +1455,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_dse (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dse != 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_dse (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_dse != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_dse
>  
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index 0917202b74c..6f09642172d 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -3330,9 +3330,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_forwprop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_forwprop; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_forwprop
> (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_forwprop; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_forwprop
>  
> diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
> index 88a9f062dcd..80c41c45489 100644
> --- a/gcc/tree-ssa-ifcombine.cc
> +++ b/gcc/tree-ssa-ifcombine.cc
> @@ -829,7 +829,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_tree_ifcombine
>  
> diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
> index 2f5a390404c..9ab63d1fa0c 100644
> --- a/gcc/tree-ssa-loop-ch.cc
> +++ b/gcc/tree-ssa-loop-ch.cc
> @@ -311,12 +311,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_ch != 0; }
> +  bool gate (function *) final override { return flag_tree_ch != 0; }
>    
>    /* Initialize and finalize loop structures, copying headers
> inbetween.  */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
> -  opt_pass * clone () { return new pass_ch (m_ctxt); }
> +  opt_pass * clone () final override { return new pass_ch (m_ctxt); }
>  
>  protected:
>    /* ch_base method: */
> @@ -347,14 +347,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>    {
>      return flag_tree_ch != 0
>            && (flag_tree_loop_vectorize != 0 || fun-
> >has_force_vectorize_loops);
>    }
>    
>    /* Just copy headers, no initialization/finalization of loop
> structures.  */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  protected:
>    /* ch_base method: */
> diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
> index 6d9316eed1f..c0893f1927c 100644
> --- a/gcc/tree-ssa-loop-im.cc
> +++ b/gcc/tree-ssa-loop-im.cc
> @@ -3597,9 +3597,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_lim (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_loop_im != 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_lim (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_loop_im !=
> 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_lim
>  
> diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-
> ivcanon.cc
> index 2ee00a3f843..e52397235a1 100644
> --- a/gcc/tree-ssa-loop-ivcanon.cc
> +++ b/gcc/tree-ssa-loop-ivcanon.cc
> @@ -1539,8 +1539,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_loop_ivcanon != 0;
> }
> -  virtual unsigned int execute (function *fun);
> +  bool gate (function *) final override { return
> flag_tree_loop_ivcanon != 0; }
> +  unsigned int execute (function *fun) final override;
>  
>  }; // class pass_iv_canon
>  
> @@ -1586,7 +1586,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_complete_unroll
>  
> @@ -1644,8 +1644,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize >= 2; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return optimize >= 2; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_complete_unrolli
>  
> diff --git a/gcc/tree-ssa-loop-prefetch.cc b/gcc/tree-ssa-loop-
> prefetch.cc
> index aebd7c9206f..8f190ae469b 100644
> --- a/gcc/tree-ssa-loop-prefetch.cc
> +++ b/gcc/tree-ssa-loop-prefetch.cc
> @@ -2069,8 +2069,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_prefetch_loop_arrays >
> 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override
> +  {
> +    return flag_prefetch_loop_arrays > 0;
> +  }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_loop_prefetch
>  
> diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc
> index b93ee4c8769..d61bad5ba47 100644
> --- a/gcc/tree-ssa-loop-split.cc
> +++ b/gcc/tree-ssa-loop-split.cc
> @@ -1724,8 +1724,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_split_loops != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_split_loops !=
> 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_loop_split
>  
> diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-
> unswitch.cc
> index 2927f308234..3b6486f305a 100644
> --- a/gcc/tree-ssa-loop-unswitch.cc
> +++ b/gcc/tree-ssa-loop-unswitch.cc
> @@ -1035,8 +1035,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_unswitch_loops != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_unswitch_loops
> != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_tree_unswitch
>  
> diff --git a/gcc/tree-ssa-loop.cc b/gcc/tree-ssa-loop.cc
> index 73aa46627b4..1c058b08c2f 100644
> --- a/gcc/tree-ssa-loop.cc
> +++ b/gcc/tree-ssa-loop.cc
> @@ -67,9 +67,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_loop_optimize; }
> +  bool gate (function *) final override { return
> flag_tree_loop_optimize; }
>  
> -  virtual unsigned int execute (function *fn);
> +  unsigned int execute (function *fn) final override;
>  }; // class pass_fix_loops
>  
>  unsigned int
> @@ -134,7 +134,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fn) { return gate_loop (fn); }
> +  bool gate (function *fn) final override { return gate_loop (fn); }
>  
>  }; // class pass_tree_loop
>  
> @@ -189,7 +189,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fn) { return gate_oacc_kernels (fn); }
> +  bool gate (function *fn) final override { return gate_oacc_kernels
> (fn); }
>  
>  }; // class pass_oacc_kernels
>  
> @@ -226,7 +226,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>    {
>      return (optimize
>             && flag_openacc
> @@ -303,7 +303,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fn) { return !gate_loop (fn); }
> +  bool gate (function *fn) final override { return !gate_loop (fn); }
>  
>  }; // class pass_tree_no_loop
>  
> @@ -341,7 +341,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_tree_loop_init
>  
> @@ -395,8 +395,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_scev_cprop; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_tree_scev_cprop;
> }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_scev_cprop
>  
> @@ -446,8 +446,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_ivopts != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_ivopts != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_iv_optimize
>  
> @@ -503,7 +503,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *) { return
> tree_ssa_loop_done (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return tree_ssa_loop_done ();
> +  }
>  
>  }; // class pass_tree_loop_done
>  
> diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
> index ce1df01f629..fe9f37b4cd4 100644
> --- a/gcc/tree-ssa-math-opts.cc
> +++ b/gcc/tree-ssa-math-opts.cc
> @@ -920,8 +920,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return optimize &&
> flag_reciprocal_math; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override
> +  {
> +    return optimize && flag_reciprocal_math;
> +  }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_cse_reciprocals
>  
> @@ -2249,14 +2252,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* We no longer require either sincos or cexp, since powi
> expansion
>          piggybacks on this pass.  */
>        return optimize;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_cse_sincos
>  
> @@ -4892,12 +4895,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return flag_expensive_optimizations && optimize;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_optimize_widening_mul
>  
> diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
> index 8c9c46d41f1..162ca7098cd 100644
> --- a/gcc/tree-ssa-phiopt.cc
> +++ b/gcc/tree-ssa-phiopt.cc
> @@ -3960,14 +3960,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_phiopt (m_ctxt); }
> -  void set_pass_param (unsigned n, bool param)
> +  opt_pass * clone () final override { return new pass_phiopt
> (m_ctxt); }
> +  void set_pass_param (unsigned n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        early_p = param;
>      }
> -  virtual bool gate (function *) { return flag_ssa_phiopt; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return flag_ssa_phiopt; }
> +  unsigned int execute (function *) final override
>      {
>        return tree_ssa_phiopt_worker (false,
>                                      !early_p ? gate_hoist_loads () :
> false,
> @@ -4009,8 +4009,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_cselim; }
> -  virtual unsigned int execute (function *) { return tree_ssa_cs_elim
> (); }
> +  bool gate (function *) final override { return flag_tree_cselim; }
> +  unsigned int execute (function *) final override
> +  {
> +    return tree_ssa_cs_elim ();
> +  }
>  
>  }; // class pass_cselim
>  
> diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
> index 7bbfc8c002a..965f1d1c4eb 100644
> --- a/gcc/tree-ssa-phiprop.cc
> +++ b/gcc/tree-ssa-phiprop.cc
> @@ -476,8 +476,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_phiprop; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return flag_tree_phiprop; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_phiprop
>  
> diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
> index 09a5e2055ca..e029bd36da3 100644
> --- a/gcc/tree-ssa-pre.cc
> +++ b/gcc/tree-ssa-pre.cc
> @@ -4339,9 +4339,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      { return flag_tree_pre != 0 || flag_code_hoisting != 0; }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_pre
>  
> diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
> index 406523b5d2f..e13e2cb308d 100644
> --- a/gcc/tree-ssa-reassoc.cc
> +++ b/gcc/tree-ssa-reassoc.cc
> @@ -7132,15 +7132,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_reassoc (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override { return new pass_reassoc
> (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        insert_powi_p = param;
>        bias_loop_carried_phi_ranks_p = !param;
>      }
> -  virtual bool gate (function *) { return flag_tree_reassoc != 0; }
> -  virtual unsigned int execute (function *)
> +  bool gate (function *) final override { return flag_tree_reassoc !=
> 0; }
> +  unsigned int execute (function *) final override
>    {
>      return execute_reassoc (insert_powi_p,
> bias_loop_carried_phi_ranks_p);
>    }
> diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
> index ed68557f0b2..18392e031b8 100644
> --- a/gcc/tree-ssa-sccvn.cc
> +++ b/gcc/tree-ssa-sccvn.cc
> @@ -8295,17 +8295,17 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_fre (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override { return new pass_fre (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        may_iterate = param;
>      }
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return flag_tree_fre != 0 && (may_iterate || optimize > 1);
>      }
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  private:
>    bool may_iterate;
> diff --git a/gcc/tree-ssa-sink.cc b/gcc/tree-ssa-sink.cc
> index 8ce4403ddc8..7f653a988f4 100644
> --- a/gcc/tree-ssa-sink.cc
> +++ b/gcc/tree-ssa-sink.cc
> @@ -829,10 +829,10 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_sink != 0; }
> -  virtual unsigned int execute (function *);
> -  opt_pass *clone (void) { return new pass_sink_code (m_ctxt); }
> -  void set_pass_param (unsigned n, bool param)
> +  bool gate (function *) final override { return flag_tree_sink != 0;
> }
> +  unsigned int execute (function *) final override;
> +  opt_pass *clone (void) final override { return new pass_sink_code
> (m_ctxt); }
> +  void set_pass_param (unsigned n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        unsplit_edges = param;
> diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc
> index 1d4c0f78fbf..2cceba6f7af 100644
> --- a/gcc/tree-ssa-strlen.cc
> +++ b/gcc/tree-ssa-strlen.cc
> @@ -5962,8 +5962,8 @@ public:
>      : gimple_opt_pass (pass_data_warn_printf, ctxt)
>    {}
>  
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *fun) final override
>    {
>      return printf_strlen_execute (fun, true);
>    }
> @@ -5999,10 +5999,10 @@ public:
>      : gimple_opt_pass (pass_data_strlen, ctxt)
>    {}
>  
> -  opt_pass * clone () { return new pass_strlen (m_ctxt); }
> +  opt_pass * clone () final override { return new pass_strlen
> (m_ctxt); }
>  
> -  virtual bool gate (function *);
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override;
> +  unsigned int execute (function *fun) final override
>    {
>      return printf_strlen_execute (fun, false);
>    }
> diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
> index 581bdcf5652..dcf13d939bd 100644
> --- a/gcc/tree-ssa-structalias.cc
> +++ b/gcc/tree-ssa-structalias.cc
> @@ -8085,7 +8085,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_pta; }
> +  bool gate (function *) final override { return flag_tree_pta; }
>  
>  }; // class pass_build_alias
>  
> @@ -8123,7 +8123,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_pta; }
> +  bool gate (function *) final override { return flag_tree_pta; }
>  
>  }; // class pass_build_ealias
>  
> @@ -8737,7 +8737,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (optimize
>               && flag_ipa_pta
> @@ -8745,9 +8745,12 @@ public:
>               && !seen_error ());
>      }
>  
> -  opt_pass * clone () { return new pass_ipa_pta (m_ctxt); }
> +  opt_pass * clone () final override { return new pass_ipa_pta
> (m_ctxt); }
>  
> -  virtual unsigned int execute (function *) { return ipa_pta_execute
> (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return ipa_pta_execute ();
> +  }
>  
>  }; // class pass_ipa_pta
>  
> diff --git a/gcc/tree-ssa-uncprop.cc b/gcc/tree-ssa-uncprop.cc
> index aea7d69584f..510f8319d8c 100644
> --- a/gcc/tree-ssa-uncprop.cc
> +++ b/gcc/tree-ssa-uncprop.cc
> @@ -453,9 +453,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_uncprop (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_uncprop
> (m_ctxt); }
> +  bool gate (function *) final override { return flag_tree_dom != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_uncprop
>  
> diff --git a/gcc/tree-ssa-uninit.cc b/gcc/tree-ssa-uninit.cc
> index b48fcf1a8ba..087f0dc965d 100644
> --- a/gcc/tree-ssa-uninit.cc
> +++ b/gcc/tree-ssa-uninit.cc
> @@ -1317,9 +1317,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass *clone () { return new pass_late_warn_uninitialized
> (m_ctxt); }
> -  virtual bool gate (function *) { return gate_warn_uninitialized ();
> }
> -  virtual unsigned int execute (function *);
> +  opt_pass *clone () final override
> +  {
> +    return new pass_late_warn_uninitialized (m_ctxt);
> +  }
> +  bool gate (function *) final override { return
> gate_warn_uninitialized (); }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_late_warn_uninitialized
>  
> @@ -1459,8 +1462,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_warn_uninitialized ();
> }
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override { return
> gate_warn_uninitialized (); }
> +  unsigned int execute (function *fun) final override
>    {
>      return execute_early_warn_uninitialized (fun);
>    }
> diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
> index 05536cd2f74..bc22ece636a 100644
> --- a/gcc/tree-ssanames.cc
> +++ b/gcc/tree-ssanames.cc
> @@ -920,7 +920,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_release_ssa_names
>  
> diff --git a/gcc/tree-stdarg.cc b/gcc/tree-stdarg.cc
> index 9038cd43aaa..ed4c8d8c775 100644
> --- a/gcc/tree-stdarg.cc
> +++ b/gcc/tree-stdarg.cc
> @@ -1126,7 +1126,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        /* Always run this pass, in order to expand va_arg
> internal_fns.  We
>          also need to do that if fun->stdarg == 0, because a va_arg may
> also
> @@ -1135,7 +1135,7 @@ public:
>        return true;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_stdarg
>  
> @@ -1185,12 +1185,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (cfun->curr_properties & PROP_gimple_lva) == 0;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_lower_vaarg
>  
> diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-
> conversion.cc
> index 50a17927f39..17a31f7a63c 100644
> --- a/gcc/tree-switch-conversion.cc
> +++ b/gcc/tree-switch-conversion.cc
> @@ -2428,8 +2428,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return flag_tree_switch_conversion
> != 0; }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override
> +  {
> +    return flag_tree_switch_conversion != 0;
> +  }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_convert_switch
>  
> @@ -2507,18 +2510,18 @@ public:
>  
>    static const pass_data data;
>    opt_pass *
> -  clone ()
> +  clone () final override
>    {
>      return new pass_lower_switch<O0> (m_ctxt);
>    }
>  
> -  virtual bool
> -  gate (function *)
> +  bool
> +  gate (function *) final override
>    {
>      return !O0 || !optimize;
>    }
>  
> -  virtual unsigned int execute (function *fun);
> +  unsigned int execute (function *fun) final override;
>  }; // class pass_lower_switch
>  
>  template <bool O0>
> diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc
> index 5a3466e5d53..6745d57580b 100644
> --- a/gcc/tree-tailcall.cc
> +++ b/gcc/tree-tailcall.cc
> @@ -1261,9 +1261,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_tail_recursion (m_ctxt); }
> -  virtual bool gate (function *) { return gate_tail_calls (); }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_tail_recursion (m_ctxt);
> +  }
> +  bool gate (function *) final override { return gate_tail_calls (); }
> +  unsigned int execute (function *) final override
>      {
>        return tree_optimize_tail_calls_1 (false);
>      }
> @@ -1301,8 +1304,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return gate_tail_calls (); }
> -  virtual unsigned int execute (function *) { return
> execute_tail_calls (); }
> +  bool gate (function *) final override { return gate_tail_calls (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return execute_tail_calls ();
> +  }
>  
>  }; // class pass_tail_calls
>  
> diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
> index d99e3207fbe..d974fd1b7fe 100644
> --- a/gcc/tree-vect-generic.cc
> +++ b/gcc/tree-vect-generic.cc
> @@ -2415,12 +2415,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        return !(fun->curr_properties & PROP_gimple_lvec);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return expand_vector_operations ();
>      }
> @@ -2459,8 +2459,11 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_lower_vector_ssa (m_ctxt); }
> -  virtual unsigned int execute (function *)
> +  opt_pass * clone () final override
> +  {
> +    return new pass_lower_vector_ssa (m_ctxt);
> +  }
> +  unsigned int execute (function *) final override
>      {
>        return expand_vector_operations ();
>      }
> diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc
> index a63fa391273..53dc4520963 100644
> --- a/gcc/tree-vectorizer.cc
> +++ b/gcc/tree-vectorizer.cc
> @@ -1193,12 +1193,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *fun)
> +  bool gate (function *fun) final override
>      {
>        return flag_tree_loop_vectorize || fun-
> >has_force_vectorize_loops;
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_vectorize
>  
> @@ -1405,9 +1405,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_simduid_cleanup (m_ctxt); }
> -  virtual bool gate (function *fun) { return fun->has_simduid_loops; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override
> +  {
> +    return new pass_simduid_cleanup (m_ctxt);
> +  }
> +  bool gate (function *fun) final override { return fun-
> >has_simduid_loops; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_simduid_cleanup
>  
> @@ -1463,9 +1466,9 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_slp_vectorize (m_ctxt); }
> -  virtual bool gate (function *) { return flag_tree_slp_vectorize !=
> 0; }
> -  virtual unsigned int execute (function *);
> +  opt_pass * clone () final override { return new pass_slp_vectorize
> (m_ctxt); }
> +  bool gate (function *) final override { return
> flag_tree_slp_vectorize != 0; }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_slp_vectorize
>  
> @@ -1696,12 +1699,15 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return flag_section_anchors && flag_tree_loop_vectorize;
>      }
>  
> -  virtual unsigned int execute (function *) { return
> increase_alignment (); }
> +  unsigned int execute (function *) final override
> +  {
> +    return increase_alignment ();
> +  }
>  
>  }; // class pass_ipa_increase_alignment
>  
> diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
> index 0784d658567..da0a6d5a8b6 100644
> --- a/gcc/tree-vrp.cc
> +++ b/gcc/tree-vrp.cc
> @@ -4402,14 +4402,14 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_vrp (m_ctxt); }
> -  void set_pass_param (unsigned int n, bool param)
> +  opt_pass * clone () final override { return new pass_vrp (m_ctxt); }
> +  void set_pass_param (unsigned int n, bool param) final override
>      {
>        gcc_assert (n == 0);
>        warn_array_bounds_p = param;
>      }
> -  virtual bool gate (function *) { return flag_tree_vrp != 0; }
> -  virtual unsigned int execute (function *fun)
> +  bool gate (function *) final override { return flag_tree_vrp != 0; }
> +  unsigned int execute (function *fun) final override
>      {
>        if ((my_pass == 1 && param_vrp1_mode == VRP_MODE_RANGER)
>           || (my_pass == 2 && param_vrp2_mode == VRP_MODE_RANGER))
> diff --git a/gcc/tsan.cc b/gcc/tsan.cc
> index 02e8ac7cf79..79d4582acd1 100644
> --- a/gcc/tsan.cc
> +++ b/gcc/tsan.cc
> @@ -909,13 +909,13 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  opt_pass * clone () { return new pass_tsan (m_ctxt); }
> -  virtual bool gate (function *)
> +  opt_pass * clone () final override { return new pass_tsan (m_ctxt);
> }
> +  bool gate (function *) final override
>  {
>    return sanitize_flags_p (SANITIZE_THREAD);
>  }
>  
> -  virtual unsigned int execute (function *) { return tsan_pass (); }
> +  unsigned int execute (function *) final override { return tsan_pass
> (); }
>  
>  }; // class pass_tsan
>  
> @@ -950,12 +950,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (sanitize_flags_p (SANITIZE_THREAD) && !optimize);
>      }
>  
> -  virtual unsigned int execute (function *) { return tsan_pass (); }
> +  unsigned int execute (function *) final override { return tsan_pass
> (); }
>  
>  }; // class pass_tsan_O0
>  
> diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc
> index 6c058142c37..18c75b471f4 100644
> --- a/gcc/ubsan.cc
> +++ b/gcc/ubsan.cc
> @@ -2329,7 +2329,7 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return sanitize_flags_p ((SANITIZE_NULL | SANITIZE_SI_OVERFLOW
>                                 | SANITIZE_BOOL | SANITIZE_ENUM
> @@ -2341,7 +2341,7 @@ public:
>                                 | SANITIZE_BUILTIN));
>      }
>  
> -  virtual unsigned int execute (function *);
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_ubsan
>  
> diff --git a/gcc/var-tracking.cc b/gcc/var-tracking.cc
> index 7c3ad0a55bd..235981d100f 100644
> --- a/gcc/var-tracking.cc
> +++ b/gcc/var-tracking.cc
> @@ -10592,12 +10592,12 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *)
> +  bool gate (function *) final override
>      {
>        return (flag_var_tracking && !targetm.delay_vartrack);
>      }
>  
> -  virtual unsigned int execute (function *)
> +  unsigned int execute (function *) final override
>      {
>        return variable_tracking_main ();
>      }
> diff --git a/gcc/vtable-verify.cc b/gcc/vtable-verify.cc
> index 48f9987082e..24894e7f108 100644
> --- a/gcc/vtable-verify.cc
> +++ b/gcc/vtable-verify.cc
> @@ -818,8 +818,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return (flag_vtable_verify); }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return (flag_vtable_verify);
> }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_vtable_verify
>  
> diff --git a/gcc/web.cc b/gcc/web.cc
> index a5874a98825..bd0ec94f1f4 100644
> --- a/gcc/web.cc
> +++ b/gcc/web.cc
> @@ -323,8 +323,8 @@ public:
>    {}
>  
>    /* opt_pass methods: */
> -  virtual bool gate (function *) { return (optimize > 0 && flag_web);
> }
> -  virtual unsigned int execute (function *);
> +  bool gate (function *) final override { return (optimize > 0 &&
> flag_web); }
> +  unsigned int execute (function *) final override;
>  
>  }; // class pass_web
>
  
David Malcolm June 24, 2022, 6:08 p.m. UTC | #2
On Mon, 2022-06-13 at 14:22 -0400, David Malcolm wrote:
> Ping for this patch:
>   https://gcc.gnu.org/pipermail/gcc-patches/2022-May/595444.html
> 
> OK for trunk?
> 
> Thanks
> Dave
> 
> On Mon, 2022-05-23 at 15:28 -0400, David Malcolm wrote:
> > gcc/ChangeLog:
> >         * adjust-alignment.cc: Add "final" and "override" to
> > opt_pass
> >         vfunc implementations, removing redundant "virtual" as
> >         appropriate.
> >         * asan.cc: Likewise.
> >         * auto-inc-dec.cc: Likewise.
> >         * auto-profile.cc: Likewise.
> >         * bb-reorder.cc: Likewise.
> >         * cfgcleanup.cc: Likewise.
> >         * cfgexpand.cc: Likewise.
> >         * cfgrtl.cc: Likewise.
> >         * cgraphbuild.cc: Likewise.
> >         * combine-stack-adj.cc: Likewise.
> >         * combine.cc: Likewise.
> >         * compare-elim.cc: Likewise.
> >         * config/i386/i386-features.cc: Likewise.
> >         * coroutine-passes.cc: Likewise.
> >         * cprop.cc: Likewise.
> >         * cse.cc: Likewise.
> >         * dce.cc: Likewise.
> >         * df-core.cc: Likewise.
> >         * dse.cc: Likewise.
> >         * dwarf2cfi.cc: Likewise.
> >         * early-remat.cc: Likewise.
> >         * except.cc: Likewise.
> >         * final.cc: Likewise.
> >         * function.cc: Likewise.
> >         * fwprop.cc: Likewise.
> >         * gcse.cc: Likewise.
> >         * gimple-harden-conditionals.cc: Likewise.
> >         * gimple-if-to-switch.cc: Likewise.
> >         * gimple-isel.cc: Likewise.
> >         * gimple-laddress.cc: Likewise.
> >         * gimple-loop-interchange.cc: Likewise.
> >         * gimple-loop-jam.cc: Likewise.
> >         * gimple-loop-versioning.cc: Likewise.
> >         * gimple-low.cc: Likewise.
> >         * gimple-ssa-backprop.cc: Likewise.
> >         * gimple-ssa-evrp.cc: Likewise.
> >         * gimple-ssa-isolate-paths.cc: Likewise.
> >         * gimple-ssa-nonnull-compare.cc: Likewise.
> >         * gimple-ssa-split-paths.cc: Likewise.
> >         * gimple-ssa-store-merging.cc: Likewise.
> >         * gimple-ssa-strength-reduction.cc: Likewise.
> >         * gimple-ssa-warn-access.cc: Likewise.
> >         * gimple-ssa-warn-alloca.cc: Likewise.
> >         * gimple-ssa-warn-restrict.cc: Likewise.
> >         * gimple-warn-recursion.cc: Likewise.
> >         * graphite.cc: Likewise.
> >         * ifcvt.cc: Likewise.
> >         * init-regs.cc: Likewise.
> >         * ipa-comdats.cc: Likewise.
> >         * ipa-cp.cc: Likewise.
> >         * ipa-devirt.cc: Likewise.
> >         * ipa-fnsummary.cc: Likewise.
> >         * ipa-free-lang-data.cc: Likewise.
> >         * ipa-icf.cc: Likewise.
> >         * ipa-inline.cc: Likewise.
> >         * ipa-modref.cc: Likewise.
> >         * ipa-profile.cc: Likewise.
> >         * ipa-pure-const.cc: Likewise.
> >         * ipa-reference.cc: Likewise.
> >         * ipa-split.cc: Likewise.
> >         * ipa-sra.cc: Likewise.
> >         * ipa-visibility.cc: Likewise.
> >         * ipa.cc: Likewise.
> >         * ira.cc: Likewise.
> >         * jump.cc: Likewise.
> >         * loop-init.cc: Likewise.
> >         * lower-subreg.cc: Likewise.
> >         * mode-switching.cc: Likewise.
> >         * modulo-sched.cc: Likewise.
> >         * multiple_target.cc: Likewise.
> >         * omp-expand.cc: Likewise.
> >         * omp-low.cc: Likewise.
> >         * omp-oacc-kernels-decompose.cc: Likewise.
> >         * omp-oacc-neuter-broadcast.cc: Likewise.
> >         * omp-offload.cc: Likewise.
> >         * omp-simd-clone.cc: Likewise.
> >         * passes.cc: Likewise.
> >         * postreload-gcse.cc: Likewise.
> >         * postreload.cc: Likewise.
> >         * predict.cc: Likewise.
> >         * recog.cc: Likewise.
> >         * ree.cc: Likewise.
> >         * reg-stack.cc: Likewise.
> >         * regcprop.cc: Likewise.
> >         * reginfo.cc: Likewise.
> >         * regrename.cc: Likewise.
> >         * reorg.cc: Likewise.
> >         * sancov.cc: Likewise.
> >         * sanopt.cc: Likewise.
> >         * sched-rgn.cc: Likewise.
> >         * stack-ptr-mod.cc: Likewise.
> >         * store-motion.cc: Likewise.
> >         * tracer.cc: Likewise.
> >         * trans-mem.cc: Likewise.
> >         * tree-call-cdce.cc: Likewise.
> >         * tree-cfg.cc: Likewise.
> >         * tree-cfgcleanup.cc: Likewise.
> >         * tree-complex.cc: Likewise.
> >         * tree-eh.cc: Likewise.
> >         * tree-emutls.cc: Likewise.
> >         * tree-if-conv.cc: Likewise.
> >         * tree-into-ssa.cc: Likewise.
> >         * tree-loop-distribution.cc: Likewise.
> >         * tree-nrv.cc: Likewise.
> >         * tree-object-size.cc: Likewise.
> >         * tree-parloops.cc: Likewise.
> >         * tree-predcom.cc: Likewise.
> >         * tree-profile.cc: Likewise.
> >         * tree-sra.cc: Likewise.
> >         * tree-ssa-ccp.cc: Likewise.
> >         * tree-ssa-copy.cc: Likewise.
> >         * tree-ssa-dce.cc: Likewise.
> >         * tree-ssa-dom.cc: Likewise.
> >         * tree-ssa-dse.cc: Likewise.
> >         * tree-ssa-forwprop.cc: Likewise.
> >         * tree-ssa-ifcombine.cc: Likewise.
> >         * tree-ssa-loop-ch.cc: Likewise.
> >         * tree-ssa-loop-im.cc: Likewise.
> >         * tree-ssa-loop-ivcanon.cc: Likewise.
> >         * tree-ssa-loop-prefetch.cc: Likewise.
> >         * tree-ssa-loop-split.cc: Likewise.
> >         * tree-ssa-loop-unswitch.cc: Likewise.
> >         * tree-ssa-loop.cc: Likewise.
> >         * tree-ssa-math-opts.cc: Likewise.
> >         * tree-ssa-phiopt.cc: Likewise.
> >         * tree-ssa-phiprop.cc: Likewise.
> >         * tree-ssa-pre.cc: Likewise.
> >         * tree-ssa-reassoc.cc: Likewise.
> >         * tree-ssa-sccvn.cc: Likewise.
> >         * tree-ssa-sink.cc: Likewise.
> >         * tree-ssa-strlen.cc: Likewise.
> >         * tree-ssa-structalias.cc: Likewise.
> >         * tree-ssa-uncprop.cc: Likewise.
> >         * tree-ssa-uninit.cc: Likewise.
> >         * tree-ssanames.cc: Likewise.
> >         * tree-stdarg.cc: Likewise.
> >         * tree-switch-conversion.cc: Likewise.
> >         * tree-tailcall.cc: Likewise.
> >         * tree-vect-generic.cc: Likewise.
> >         * tree-vectorizer.cc: Likewise.
> >         * tree-vrp.cc: Likewise.
> >         * tsan.cc: Likewise.
> >         * ubsan.cc: Likewise.
> >         * var-tracking.cc: Likewise.
> >         * vtable-verify.cc: Likewise.
> >         * web.cc: Likewise.
> > 
> > Signed-off-by: David Malcolm <dmalcolm@redhat.com>
> > ---
> >  gcc/adjust-alignment.cc              |  2 +-
> >  gcc/asan.cc                          | 19 ++++++++++++----
> >  gcc/auto-inc-dec.cc                  |  4 ++--
> >  gcc/auto-profile.cc                  |  8 +++----
> >  gcc/bb-reorder.cc                    | 12 +++++-----
> >  gcc/cfgcleanup.cc                    |  8 +++----
> >  gcc/cfgexpand.cc                     |  2 +-
> >  gcc/cfgrtl.cc                        |  6 ++---
> >  gcc/cgraphbuild.cc                   | 13 +++++++----
> >  gcc/combine-stack-adj.cc             |  4 ++--
> >  gcc/combine.cc                       |  4 ++--
> >  gcc/compare-elim.cc                  |  4 ++--
> >  gcc/config/i386/i386-features.cc     | 20 ++++++++--------
> >  gcc/coroutine-passes.cc              |  8 +++----
> >  gcc/cprop.cc                         |  9 +++++---
> >  gcc/cse.cc                           | 18 ++++++++++-----
> >  gcc/dce.cc                           |  8 +++----
> >  gcc/df-core.cc                       | 10 ++++----
> >  gcc/dse.cc                           | 14 ++++++++----
> >  gcc/dwarf2cfi.cc                     |  7 ++++--
> >  gcc/early-remat.cc                   |  4 ++--
> >  gcc/except.cc                        |  6 ++---
> >  gcc/final.cc                         | 14 ++++++++----
> >  gcc/function.cc                      | 10 ++++----
> >  gcc/fwprop.cc                        |  8 +++----
> >  gcc/gcse.cc                          | 14 ++++++++----
> >  gcc/gimple-harden-conditionals.cc    | 20 +++++++++++-----
> >  gcc/gimple-if-to-switch.cc           |  4 ++--
> >  gcc/gimple-isel.cc                   |  4 ++--
> >  gcc/gimple-laddress.cc               |  6 ++---
> >  gcc/gimple-loop-interchange.cc       |  6 ++---
> >  gcc/gimple-loop-jam.cc               |  4 ++--
> >  gcc/gimple-loop-versioning.cc        |  7 ++++--
> >  gcc/gimple-low.cc                    |  5 +++-
> >  gcc/gimple-ssa-backprop.cc           |  6 ++---
> >  gcc/gimple-ssa-evrp.cc               |  6 ++---
> >  gcc/gimple-ssa-isolate-paths.cc      |  9 +++++---
> >  gcc/gimple-ssa-nonnull-compare.cc    |  4 ++--
> >  gcc/gimple-ssa-split-paths.cc        |  9 +++++---
> >  gcc/gimple-ssa-store-merging.cc      | 10 ++++----
> >  gcc/gimple-ssa-strength-reduction.cc |  4 ++--
> >  gcc/gimple-ssa-warn-access.cc        |  8 +++----
> >  gcc/gimple-ssa-warn-alloca.cc        |  8 +++----
> >  gcc/gimple-ssa-warn-restrict.cc      |  4 ++--
> >  gcc/gimple-warn-recursion.cc         |  4 ++--
> >  gcc/graphite.cc                      |  9 +++++---
> >  gcc/ifcvt.cc                         | 12 +++++-----
> >  gcc/init-regs.cc                     |  4 ++--
> >  gcc/ipa-comdats.cc                   |  4 ++--
> >  gcc/ipa-cp.cc                        |  4 ++--
> >  gcc/ipa-devirt.cc                    |  8 +++----
> >  gcc/ipa-fnsummary.cc                 | 20 ++++++++++------
> >  gcc/ipa-free-lang-data.cc            |  2 +-
> >  gcc/ipa-icf.cc                       |  4 ++--
> >  gcc/ipa-inline.cc                    |  4 ++--
> >  gcc/ipa-modref.cc                    | 12 +++++-----
> >  gcc/ipa-profile.cc                   |  4 ++--
> >  gcc/ipa-pure-const.cc                | 26 +++++++++++++--------
> >  gcc/ipa-reference.cc                 |  4 ++--
> >  gcc/ipa-split.cc                     |  8 +++----
> >  gcc/ipa-sra.cc                       |  7 ++++--
> >  gcc/ipa-visibility.cc                |  6 ++---
> >  gcc/ipa.cc                           |  9 +++++---
> >  gcc/ira.cc                           |  8 +++----
> >  gcc/jump.cc                          |  5 +++-
> >  gcc/loop-init.cc                     | 18 +++++++--------
> >  gcc/lower-subreg.cc                  | 16 +++++++------
> >  gcc/mode-switching.cc                |  6 ++---
> >  gcc/modulo-sched.cc                  |  4 ++--
> >  gcc/multiple_target.cc               |  7 ++++--
> >  gcc/omp-expand.cc                    | 14 ++++++++----
> >  gcc/omp-low.cc                       |  9 +++++---
> >  gcc/omp-oacc-kernels-decompose.cc    |  4 ++--
> >  gcc/omp-oacc-neuter-broadcast.cc     |  4 ++--
> >  gcc/omp-offload.cc                   | 16 ++++++-------
> >  gcc/omp-simd-clone.cc                |  7 ++++--
> >  gcc/passes.cc                        | 34 ++++++++++++++++--------
> > ----
> >  gcc/postreload-gcse.cc               |  7 ++++--
> >  gcc/postreload.cc                    |  7 ++++--
> >  gcc/predict.cc                       | 13 +++++++----
> >  gcc/recog.cc                         | 32 +++++++++++++++---------
> > --
> >  gcc/ree.cc                           |  7 ++++--
> >  gcc/reg-stack.cc                     |  4 ++--
> >  gcc/regcprop.cc                      |  4 ++--
> >  gcc/reginfo.cc                       |  2 +-
> >  gcc/regrename.cc                     |  7 ++++--
> >  gcc/reorg.cc                         |  8 +++----
> >  gcc/sancov.cc                        | 10 ++++----
> >  gcc/sanopt.cc                        |  4 ++--
> >  gcc/sched-rgn.cc                     | 19 +++++++++-------
> >  gcc/stack-ptr-mod.cc                 |  2 +-
> >  gcc/store-motion.cc                  |  4 ++--
> >  gcc/tracer.cc                        |  4 ++--
> >  gcc/trans-mem.cc                     | 34 +++++++++++++++++++-----
> > ----
> >  gcc/tree-call-cdce.cc                |  4 ++--
> >  gcc/tree-cfg.cc                      | 28 ++++++++++++++++-------
> >  gcc/tree-cfgcleanup.cc               |  6 ++---
> >  gcc/tree-complex.cc                  | 14 ++++++++----
> >  gcc/tree-eh.cc                       | 23 +++++++++++--------
> >  gcc/tree-emutls.cc                   |  7 ++++--
> >  gcc/tree-if-conv.cc                  |  4 ++--
> >  gcc/tree-into-ssa.cc                 |  4 ++--
> >  gcc/tree-loop-distribution.cc        |  4 ++--
> >  gcc/tree-nrv.cc                      |  6 ++---
> >  gcc/tree-object-size.cc              |  6 ++---
> >  gcc/tree-parloops.cc                 | 11 +++++----
> >  gcc/tree-predcom.cc                  |  8 +++----
> >  gcc/tree-profile.cc                  |  4 ++--
> >  gcc/tree-sra.cc                      | 11 +++++----
> >  gcc/tree-ssa-ccp.cc                  | 21 +++++++++--------
> >  gcc/tree-ssa-copy.cc                 |  9 +++++---
> >  gcc/tree-ssa-dce.cc                  | 14 ++++++------
> >  gcc/tree-ssa-dom.cc                  |  8 +++----
> >  gcc/tree-ssa-dse.cc                  |  6 ++---
> >  gcc/tree-ssa-forwprop.cc             |  6 ++---
> >  gcc/tree-ssa-ifcombine.cc            |  2 +-
> >  gcc/tree-ssa-loop-ch.cc              | 10 ++++----
> >  gcc/tree-ssa-loop-im.cc              |  6 ++---
> >  gcc/tree-ssa-loop-ivcanon.cc         | 10 ++++----
> >  gcc/tree-ssa-loop-prefetch.cc        |  7 ++++--
> >  gcc/tree-ssa-loop-split.cc           |  4 ++--
> >  gcc/tree-ssa-loop-unswitch.cc        |  4 ++--
> >  gcc/tree-ssa-loop.cc                 | 27 ++++++++++++----------
> >  gcc/tree-ssa-math-opts.cc            | 15 +++++++-----
> >  gcc/tree-ssa-phiopt.cc               | 15 +++++++-----
> >  gcc/tree-ssa-phiprop.cc              |  4 ++--
> >  gcc/tree-ssa-pre.cc                  |  4 ++--
> >  gcc/tree-ssa-reassoc.cc              |  8 +++----
> >  gcc/tree-ssa-sccvn.cc                |  8 +++----
> >  gcc/tree-ssa-sink.cc                 |  8 +++----
> >  gcc/tree-ssa-strlen.cc               | 10 ++++----
> >  gcc/tree-ssa-structalias.cc          | 13 +++++++----
> >  gcc/tree-ssa-uncprop.cc              |  6 ++---
> >  gcc/tree-ssa-uninit.cc               | 13 +++++++----
> >  gcc/tree-ssanames.cc                 |  2 +-
> >  gcc/tree-stdarg.cc                   |  8 +++----
> >  gcc/tree-switch-conversion.cc        | 15 +++++++-----
> >  gcc/tree-tailcall.cc                 | 16 +++++++++----
> >  gcc/tree-vect-generic.cc             | 11 +++++----
> >  gcc/tree-vectorizer.cc               | 26 +++++++++++++--------
> >  gcc/tree-vrp.cc                      |  8 +++----
> >  gcc/tsan.cc                          | 10 ++++----
> >  gcc/ubsan.cc                         |  4 ++--
> >  gcc/var-tracking.cc                  |  4 ++--
> >  gcc/vtable-verify.cc                 |  4 ++--
> >  gcc/web.cc                           |  4 ++--
> >  146 files changed, 769 insertions(+), 552 deletions(-)
> > 
> > diff --git a/gcc/adjust-alignment.cc b/gcc/adjust-alignment.cc
> > index 2db41e8b4c8..5c5f8f4e5c0 100644
> > --- a/gcc/adjust-alignment.cc
> > +++ b/gcc/adjust-alignment.cc
> > @@ -50,7 +50,7 @@ public:
> >      : gimple_opt_pass (pass_data_adjust_alignment, ctxt)
> >    {}
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  }; // class pass_adjust_alignment
> >  
> >  } // anon namespace
> > diff --git a/gcc/asan.cc b/gcc/asan.cc
> > index 4b583e54efd..5df333555ea 100644
> > --- a/gcc/asan.cc
> > +++ b/gcc/asan.cc
> > @@ -4209,9 +4209,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_asan (m_ctxt); }
> > -  virtual bool gate (function *) { return gate_asan () ||
> > gate_hwasan
> > (); }
> > -  virtual unsigned int execute (function *) { return
> > asan_instrument
> > (); }
> > +  opt_pass * clone () final override { return new pass_asan
> > (m_ctxt);
> > }
> > +  bool gate (function *) final override
> > +  {
> > +    return gate_asan () || gate_hwasan ();
> > +  }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return asan_instrument ();
> > +  }
> >  
> >  }; // class pass_asan
> >  
> > @@ -4246,11 +4252,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return !optimize && (gate_asan () || gate_hwasan ());
> >      }
> > -  virtual unsigned int execute (function *) { return
> > asan_instrument
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return asan_instrument ();
> > +  }
> >  
> >  }; // class pass_asan_O0
> >  
> > diff --git a/gcc/auto-inc-dec.cc b/gcc/auto-inc-dec.cc
> > index 85fe9d14950..481e7af6895 100644
> > --- a/gcc/auto-inc-dec.cc
> > +++ b/gcc/auto-inc-dec.cc
> > @@ -1692,7 +1692,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        if (!AUTO_INC_DEC)
> >         return false;
> > @@ -1701,7 +1701,7 @@ public:
> >      }
> >  
> >  
> > -  unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_inc_dec
> >  
> > diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
> > index 2b34b80b82d..6533722817f 100644
> > --- a/gcc/auto-profile.cc
> > +++ b/gcc/auto-profile.cc
> > @@ -1752,13 +1752,13 @@ public:
> >    }
> >  
> >    /* opt_pass methods: */
> > -  virtual bool
> > -  gate (function *)
> > +  bool
> > +  gate (function *) final override
> >    {
> >      return flag_auto_profile;
> >    }
> > -  virtual unsigned int
> > -  execute (function *)
> > +  unsigned int
> > +  execute (function *) final override
> >    {
> >      return autofdo::auto_profile ();
> >    }
> > diff --git a/gcc/bb-reorder.cc b/gcc/bb-reorder.cc
> > index d20ccb83aa6..bdbe2e9ea7a 100644
> > --- a/gcc/bb-reorder.cc
> > +++ b/gcc/bb-reorder.cc
> > @@ -2633,7 +2633,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        if (targetm.cannot_modify_jumps_p ())
> >         return false;
> > @@ -2641,7 +2641,7 @@ public:
> >               && (flag_reorder_blocks ||
> > flag_reorder_blocks_and_partition));
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_reorder_blocks
> >  
> > @@ -2794,8 +2794,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_duplicate_computed_gotos
> >  
> > @@ -2937,8 +2937,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_partition_blocks
> >  
> > diff --git a/gcc/cfgcleanup.cc b/gcc/cfgcleanup.cc
> > index 335af4911bb..18047da7b24 100644
> > --- a/gcc/cfgcleanup.cc
> > +++ b/gcc/cfgcleanup.cc
> > @@ -3227,7 +3227,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_jump
> >  
> > @@ -3274,11 +3274,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return flag_thread_jumps && flag_expensive_optimizations;
> >    }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_jump_after_combine
> >  
> > @@ -3322,7 +3322,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
> >        return 0;
> > diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
> > index bb33c1b939e..1d7f6b260d0 100644
> > --- a/gcc/cfgexpand.cc
> > +++ b/gcc/cfgexpand.cc
> > @@ -6573,7 +6573,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_expand
> >  
> > diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
> > index 06be46d75df..9a4651f61a3 100644
> > --- a/gcc/cfgrtl.cc
> > +++ b/gcc/cfgrtl.cc
> > @@ -483,7 +483,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_free_cfg
> >  
> > @@ -3698,7 +3698,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        cfg_layout_initialize (0);
> >        return 0;
> > @@ -3737,7 +3737,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_outof_cfg_layout_mode
> >  
> > diff --git a/gcc/cgraphbuild.cc b/gcc/cgraphbuild.cc
> > index fdd17aa5a2d..bae44591a29 100644
> > --- a/gcc/cgraphbuild.cc
> > +++ b/gcc/cgraphbuild.cc
> > @@ -290,7 +290,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_build_cgraph_edges
> >  
> > @@ -484,8 +484,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_rebuild_cgraph_edges
> > (m_ctxt);
> > }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_rebuild_cgraph_edges (m_ctxt);
> > +  }
> > +  unsigned int execute (function *) final override
> >    {
> >      return cgraph_edge::rebuild_edges ();
> >    }
> > @@ -524,10 +527,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () {
> > +  opt_pass * clone () final override {
> >      return new pass_remove_cgraph_callee_edges (m_ctxt);
> >    }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_remove_cgraph_callee_edges
> >  
> > diff --git a/gcc/combine-stack-adj.cc b/gcc/combine-stack-adj.cc
> > index e8ba2717063..e76d60a8f7e 100644
> > --- a/gcc/combine-stack-adj.cc
> > +++ b/gcc/combine-stack-adj.cc
> > @@ -823,8 +823,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_stack_adjustments ();
> >      }
> > diff --git a/gcc/combine.cc b/gcc/combine.cc
> > index 9a34ef847aa..a8305273e44 100644
> > --- a/gcc/combine.cc
> > +++ b/gcc/combine.cc
> > @@ -15015,8 +15015,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return (optimize > 0); }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return (optimize > 0); }
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_combine ();
> >      }
> > diff --git a/gcc/compare-elim.cc b/gcc/compare-elim.cc
> > index 985c0c92182..e869d9d3249 100644
> > --- a/gcc/compare-elim.cc
> > +++ b/gcc/compare-elim.cc
> > @@ -954,7 +954,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Setting this target hook value is how a backend indicates
> > the
> > need.  */
> >        if (targetm.flags_regnum == INVALID_REGNUM)
> > @@ -962,7 +962,7 @@ public:
> >        return flag_compare_elim_after_reload;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_compare_elim_after_reload ();
> >      }
> > diff --git a/gcc/config/i386/i386-features.cc
> > b/gcc/config/i386/i386-
> > features.cc
> > index 6fe41c3c24f..24e8336689c 100644
> > --- a/gcc/config/i386/i386-features.cc
> > +++ b/gcc/config/i386/i386-features.cc
> > @@ -1873,13 +1873,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return TARGET_AVX && TARGET_VZEROUPPER
> >         && flag_expensive_optimizations && !optimize_size;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_insert_vzeroupper ();
> >      }
> > @@ -1908,23 +1908,23 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return ((!timode_p || TARGET_64BIT)
> >               && TARGET_STV && TARGET_SSE2 && optimize > 1);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return convert_scalars_to_vector (timode_p);
> >      }
> >  
> > -  opt_pass *clone ()
> > +  opt_pass *clone () final override
> >      {
> >        return new pass_stv (m_ctxt);
> >      }
> >  
> > -  void set_pass_param (unsigned int n, bool param)
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        timode_p = param;
> > @@ -2135,14 +2135,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        need_endbr = (flag_cf_protection & CF_BRANCH) != 0;
> >        patchable_area_size = crtl->patch_area_size - crtl-
> > > patch_area_entry;
> >        return need_endbr || patchable_area_size;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        timevar_push (TV_MACH_DEP);
> >        rest_of_insert_endbr_and_patchable_area (need_endbr,
> > @@ -2399,7 +2399,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (TARGET_AVX
> >               && TARGET_SSE_PARTIAL_REG_DEPENDENCY
> > @@ -2408,7 +2408,7 @@ public:
> >               && optimize_function_for_speed_p (cfun));
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return remove_partial_avx_dependency ();
> >      }
> > diff --git a/gcc/coroutine-passes.cc b/gcc/coroutine-passes.cc
> > index 7b9a97af5a2..21ac9469805 100644
> > --- a/gcc/coroutine-passes.cc
> > +++ b/gcc/coroutine-passes.cc
> > @@ -213,9 +213,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_coroutines; };
> > +  bool gate (function *) final override { return flag_coroutines;
> > };
> >  
> > -  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
> > +  unsigned int execute (function *f ATTRIBUTE_UNUSED) final
> > override
> >    {
> >      return execute_lower_coro_builtins ();
> >    }
> > @@ -511,12 +511,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *f)
> > +  bool gate (function *f) final override
> >      {
> >        return flag_coroutines && f->coroutine_component;
> >      }
> >  
> > -  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
> > +  unsigned int execute (function *f ATTRIBUTE_UNUSED) final
> > override
> >    {
> >      return execute_early_expand_coro_ifns ();
> >    }
> > diff --git a/gcc/cprop.cc b/gcc/cprop.cc
> > index cf01c2d79a9..580f811545d 100644
> > --- a/gcc/cprop.cc
> > +++ b/gcc/cprop.cc
> > @@ -1953,15 +1953,18 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_rtl_cprop (m_ctxt); }
> > -  virtual bool gate (function *fun)
> > +  opt_pass * clone () final override { return new pass_rtl_cprop
> > (m_ctxt); }
> > +  bool gate (function *fun) final override
> >      {
> >        return optimize > 0 && flag_gcse
> >         && !fun->calls_setjmp
> >         && dbg_cnt (cprop);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > execute_rtl_cprop
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_rtl_cprop ();
> > +  }
> >  
> >  }; // class pass_rtl_cprop
> >  
> > diff --git a/gcc/cse.cc b/gcc/cse.cc
> > index a18b599d324..b13afd4ba72 100644
> > --- a/gcc/cse.cc
> > +++ b/gcc/cse.cc
> > @@ -7571,8 +7571,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize > 0; }
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_cse (); }
> > +  bool gate (function *) final override { return optimize > 0; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_cse ();
> > +  }
> >  
> >  }; // class pass_cse
> >  
> > @@ -7642,12 +7645,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_rerun_cse_after_loop;
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_cse2 (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_cse2 ();
> > +  }
> >  
> >  }; // class pass_cse2
> >  
> > @@ -7715,12 +7721,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_rerun_cse_after_global_opts;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_cse_after_global_opts ();
> >      }
> > diff --git a/gcc/dce.cc b/gcc/dce.cc
> > index 6676cbcd429..64aa0aa471d 100644
> > --- a/gcc/dce.cc
> > +++ b/gcc/dce.cc
> > @@ -849,12 +849,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 1 && flag_dce && dbg_cnt (dce_ud);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_ud_dce ();
> >      }
> > @@ -1280,12 +1280,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_dce && dbg_cnt (dce_fast);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_fast_dce ();
> >      }
> > diff --git a/gcc/df-core.cc b/gcc/df-core.cc
> > index a901b84878f..97b2bbf6d2b 100644
> > --- a/gcc/df-core.cc
> > +++ b/gcc/df-core.cc
> > @@ -741,8 +741,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize > 0; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return optimize > 0; }
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_df_initialize ();
> >      }
> > @@ -781,8 +781,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize == 0; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return optimize == 0; }
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_df_initialize ();
> >      }
> > @@ -848,7 +848,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_df_finish ();
> >      }
> > diff --git a/gcc/dse.cc b/gcc/dse.cc
> > index 30c11cee034..83c572f6220 100644
> > --- a/gcc/dse.cc
> > +++ b/gcc/dse.cc
> > @@ -3747,12 +3747,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_dse && dbg_cnt (dse1);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_dse (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_dse ();
> > +  }
> >  
> >  }; // class pass_rtl_dse1
> >  
> > @@ -3787,12 +3790,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_dse && dbg_cnt (dse2);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_dse (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_dse ();
> > +  }
> >  
> >  }; // class pass_rtl_dse2
> >  
> > diff --git a/gcc/dwarf2cfi.cc b/gcc/dwarf2cfi.cc
> > index ab7c5cc5b27..bef3165e691 100644
> > --- a/gcc/dwarf2cfi.cc
> > +++ b/gcc/dwarf2cfi.cc
> > @@ -3788,8 +3788,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > execute_dwarf2_frame (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_dwarf2_frame ();
> > +  }
> >  
> >  }; // class pass_dwarf2_frame
> >  
> > diff --git a/gcc/early-remat.cc b/gcc/early-remat.cc
> > index 2738892b4e7..5c368293c35 100644
> > --- a/gcc/early-remat.cc
> > +++ b/gcc/early-remat.cc
> > @@ -2615,12 +2615,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return optimize > 1 && NUM_POLY_INT_COEFFS > 1;
> >    }
> >  
> > -  virtual unsigned int execute (function *f)
> > +  unsigned int execute (function *f) final override
> >    {
> >      auto_sbitmap selected_modes (NUM_MACHINE_MODES);
> >      bitmap_clear (selected_modes);
> > diff --git a/gcc/except.cc b/gcc/except.cc
> > index b94de425557..7d7ce40c846 100644
> > --- a/gcc/except.cc
> > +++ b/gcc/except.cc
> > @@ -2047,7 +2047,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return set_nothrow_function_flags ();
> >      }
> > @@ -2722,8 +2722,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        int ret = convert_to_eh_region_ranges ();
> >        maybe_add_nop_after_section_switch ();
> > diff --git a/gcc/final.cc b/gcc/final.cc
> > index a9868861bd2..81e21cb8db6 100644
> > --- a/gcc/final.cc
> > +++ b/gcc/final.cc
> > @@ -808,7 +808,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > compute_alignments (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return compute_alignments ();
> > +  }
> >  
> >  }; // class pass_compute_alignments
> >  
> > @@ -4360,7 +4363,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_final (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_final ();
> > +  }
> >  
> >  }; // class pass_final
> >  
> > @@ -4404,7 +4410,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_shorten_branches ();
> >      }
> > @@ -4579,7 +4585,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_clean_state ();
> >      }
> > diff --git a/gcc/function.cc b/gcc/function.cc
> > index ad0096a43ef..0c3e4fffb05 100644
> > --- a/gcc/function.cc
> > +++ b/gcc/function.cc
> > @@ -2029,7 +2029,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return instantiate_virtual_regs ();
> >      }
> > @@ -6516,7 +6516,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_check_leaf_regs ();
> >      }
> > @@ -6617,7 +6617,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_thread_prologue_and_epilogue ();
> >      }
> > @@ -6655,7 +6655,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_zero_call_used_regs
> >  
> > @@ -6926,7 +6926,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_match_asm_constraints
> >  
> > diff --git a/gcc/fwprop.cc b/gcc/fwprop.cc
> > index d12fc2f34ac..fc652ab9a1f 100644
> > --- a/gcc/fwprop.cc
> > +++ b/gcc/fwprop.cc
> > @@ -1029,8 +1029,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_fwprop (); }
> > -  virtual unsigned int execute (function *) { return fwprop
> > (false); }
> > +  bool gate (function *) final override { return gate_fwprop (); }
> > +  unsigned int execute (function *) final override { return fwprop
> > (false); }
> >  
> >  }; // class pass_rtl_fwprop
> >  
> > @@ -1065,8 +1065,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_fwprop (); }
> > -  virtual unsigned int execute (function *) { return fwprop
> > (true); }
> > +  bool gate (function *) final override { return gate_fwprop (); }
> > +  unsigned int execute (function *) final override { return fwprop
> > (true); }
> >  
> >  }; // class pass_rtl_fwprop_addr
> >  
> > diff --git a/gcc/gcse.cc b/gcc/gcse.cc
> > index b67353143a2..f06278a5534 100644
> > --- a/gcc/gcse.cc
> > +++ b/gcc/gcse.cc
> > @@ -4049,8 +4049,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > execute_rtl_pre
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *)  final override
> > +  {
> > +    return execute_rtl_pre ();
> > +  }
> >  
> >  }; // class pass_rtl_pre
> >  
> > @@ -4099,8 +4102,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > execute_rtl_hoist
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_rtl_hoist ();
> > +  }
> >  
> >  }; // class pass_rtl_hoist
> >  
> > diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-
> > conditionals.cc
> > index 79c0a5784ba..4ca6776fca7 100644
> > --- a/gcc/gimple-harden-conditionals.cc
> > +++ b/gcc/gimple-harden-conditionals.cc
> > @@ -71,11 +71,15 @@ public:
> >    pass_harden_compares (gcc::context *ctxt)
> >      : gimple_opt_pass (pass_data_harden_compares, ctxt)
> >    {}
> > -  opt_pass *clone () { return new pass_harden_compares (m_ctxt); }
> > -  virtual bool gate (function *) {
> > +  opt_pass *clone ()  final override
> > +  {
> > +    return new pass_harden_compares (m_ctxt);
> > +  }
> > +  bool gate (function *) final override
> > +  {
> >      return flag_harden_compares;
> >    }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  };
> >  
> >  /* Define a pass to harden conditionals in branches.  This pass
> > must
> > @@ -102,11 +106,15 @@ public:
> >    pass_harden_conditional_branches (gcc::context *ctxt)
> >      : gimple_opt_pass (pass_data_harden_conditional_branches,
> > ctxt)
> >    {}
> > -  opt_pass *clone () { return new pass_harden_conditional_branches
> > (m_ctxt); }
> > -  virtual bool gate (function *) {
> > +  opt_pass *clone () final override
> > +  {
> > +    return new pass_harden_conditional_branches (m_ctxt);
> > +  }
> > +  bool gate (function *) final override
> > +  {
> >      return flag_harden_conditional_branches;
> >    }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  };
> >  
> >  }
> > diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-
> > switch.cc
> > index 5dcfe5b77e0..c89aef34381 100644
> > --- a/gcc/gimple-if-to-switch.cc
> > +++ b/gcc/gimple-if-to-switch.cc
> > @@ -478,13 +478,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return (jump_table_cluster::is_enabled ()
> >             || bit_test_cluster::is_enabled ());
> >    }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_if_to_switch
> >  
> > diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
> > index 44d086d8b28..aa9c1290735 100644
> > --- a/gcc/gimple-isel.cc
> > +++ b/gcc/gimple-isel.cc
> > @@ -355,12 +355,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return true;
> >      }
> >  
> > -  virtual unsigned int execute (function *fun)
> > +  unsigned int execute (function *fun) final override
> >      {
> >        return gimple_expand_vec_exprs (fun);
> >      }
> > diff --git a/gcc/gimple-laddress.cc b/gcc/gimple-laddress.cc
> > index 13c7858e161..11754dac5c3 100644
> > --- a/gcc/gimple-laddress.cc
> > +++ b/gcc/gimple-laddress.cc
> > @@ -66,9 +66,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_laddress (m_ctxt); }
> > -  virtual bool gate (function *) { return optimize != 0; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_laddress
> > (m_ctxt); }
> > +  bool gate (function *) final override { return optimize != 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_laddress
> >  
> > diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-
> > interchange.cc
> > index 53adc02acc2..5f59730be4c 100644
> > --- a/gcc/gimple-loop-interchange.cc
> > +++ b/gcc/gimple-loop-interchange.cc
> > @@ -1703,9 +1703,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_linterchange (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_loop_interchange; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new
> > pass_linterchange
> > (m_ctxt); }
> > +  bool gate (function *) final override { return
> > flag_loop_interchange; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_linterchange
> >  
> > diff --git a/gcc/gimple-loop-jam.cc b/gcc/gimple-loop-jam.cc
> > index e33dd9091df..9b18b52a54c 100644
> > --- a/gcc/gimple-loop-jam.cc
> > +++ b/gcc/gimple-loop-jam.cc
> > @@ -641,8 +641,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_unroll_jam != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_unroll_jam
> > != 0;
> > }
> > +  unsigned int execute (function *) final override;
> >  
> >  };
> >  
> > diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-
> > versioning.cc
> > index ab02bdd4b15..6bcf6eba691 100644
> > --- a/gcc/gimple-loop-versioning.cc
> > +++ b/gcc/gimple-loop-versioning.cc
> > @@ -1782,8 +1782,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return
> > flag_version_loops_for_strides; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override
> > +  {
> > +    return flag_version_loops_for_strides;
> > +  }
> > +  unsigned int execute (function *) final override;
> >  };
> >  
> >  unsigned int
> > diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc
> > index 2ec19d5657d..4cd27dd19b0 100644
> > --- a/gcc/gimple-low.cc
> > +++ b/gcc/gimple-low.cc
> > @@ -192,7 +192,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > lower_function_body (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return lower_function_body ();
> > +  }
> >  
> >  }; // class pass_lower_cf
> >  
> > diff --git a/gcc/gimple-ssa-backprop.cc b/gcc/gimple-ssa-
> > backprop.cc
> > index 74f98111256..55986ddbfe3 100644
> > --- a/gcc/gimple-ssa-backprop.cc
> > +++ b/gcc/gimple-ssa-backprop.cc
> > @@ -945,9 +945,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_backprop (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_ssa_backprop; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_backprop
> > (m_ctxt); }
> > +  bool gate (function *) final override { return
> > flag_ssa_backprop; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_backprop
> >  
> > diff --git a/gcc/gimple-ssa-evrp.cc b/gcc/gimple-ssa-evrp.cc
> > index 20388ed5431..793a3ea1f19 100644
> > --- a/gcc/gimple-ssa-evrp.cc
> > +++ b/gcc/gimple-ssa-evrp.cc
> > @@ -377,12 +377,12 @@ public:
> >      {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_early_vrp (m_ctxt); }
> > -  virtual bool gate (function *)
> > +  opt_pass * clone () final override { return new pass_early_vrp
> > (m_ctxt); }
> > +  bool gate (function *) final override
> >      {
> >        return flag_tree_vrp != 0;
> >      }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      { return execute_early_vrp (); }
> >  
> >  }; // class pass_vrp
> > diff --git a/gcc/gimple-ssa-isolate-paths.cc b/gcc/gimple-ssa-
> > isolate-
> > paths.cc
> > index cc0ed9760a0..87ecd19ef4a 100644
> > --- a/gcc/gimple-ssa-isolate-paths.cc
> > +++ b/gcc/gimple-ssa-isolate-paths.cc
> > @@ -969,8 +969,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_isolate_erroneous_paths
> > (m_ctxt); }
> > -  virtual bool gate (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_isolate_erroneous_paths (m_ctxt);
> > +  }
> > +  bool gate (function *) final override
> >      {
> >        /* If we do not have a suitable builtin function for the
> > trap
> > statement,
> >          then do not perform the optimization.  */
> > @@ -979,7 +982,7 @@ public:
> >               || warn_null_dereference);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return gimple_ssa_isolate_erroneous_paths ();
> >      }
> > diff --git a/gcc/gimple-ssa-nonnull-compare.cc b/gcc/gimple-ssa-
> > nonnull-compare.cc
> > index cc52b914258..f9ce8c7a083 100644
> > --- a/gcc/gimple-ssa-nonnull-compare.cc
> > +++ b/gcc/gimple-ssa-nonnull-compare.cc
> > @@ -126,9 +126,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return warn_nonnull_compare; }
> > +  bool gate (function *) final override { return
> > warn_nonnull_compare;
> > }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_warn_nonnull_compare
> >  
> > diff --git a/gcc/gimple-ssa-split-paths.cc b/gcc/gimple-ssa-split-
> > paths.cc
> > index 6abe1d51400..f2e43e52c95 100644
> > --- a/gcc/gimple-ssa-split-paths.cc
> > +++ b/gcc/gimple-ssa-split-paths.cc
> > @@ -579,9 +579,12 @@ class pass_split_paths : public
> > gimple_opt_pass
> >        : gimple_opt_pass (pass_data_split_paths, ctxt)
> >      {}
> >     /* opt_pass methods: */
> > -   opt_pass * clone () { return new pass_split_paths (m_ctxt); }
> > -   virtual bool gate (function *) { return gate_split_paths (); }
> > -   virtual unsigned int execute (function *) { return
> > execute_split_paths (); }
> > +  opt_pass * clone () final override { return new pass_split_paths
> > (m_ctxt); }
> > +  bool gate (function *) final override { return gate_split_paths
> > ();
> > }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_split_paths ();
> > +  }
> >  
> >  }; // class pass_split_paths
> >  
> > diff --git a/gcc/gimple-ssa-store-merging.cc b/gcc/gimple-ssa-
> > store-
> > merging.cc
> > index b952ce57917..0640168bcc4 100644
> > --- a/gcc/gimple-ssa-store-merging.cc
> > +++ b/gcc/gimple-ssa-store-merging.cc
> > @@ -1037,12 +1037,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return flag_expensive_optimizations && optimize &&
> > BITS_PER_UNIT
> > == 8;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_optimize_bswap
> >  
> > @@ -2433,8 +2433,8 @@ public:
> >    /* Pass not supported for PDP-endian, nor for insane hosts or
> >       target character sizes where native_{encode,interpret}_expr
> >       doesn't work properly.  */
> > -  virtual bool
> > -  gate (function *)
> > +  bool
> > +  gate (function *) final override
> >    {
> >      return flag_store_merging
> >            && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN
> > @@ -2442,7 +2442,7 @@ public:
> >            && BITS_PER_UNIT == 8;
> >    }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  private:
> >    hash_map<tree_operand_hash, class imm_store_chain_info *>
> > m_stores;
> > diff --git a/gcc/gimple-ssa-strength-reduction.cc b/gcc/gimple-ssa-
> > strength-reduction.cc
> > index dad73d31874..2b559e96fc8 100644
> > --- a/gcc/gimple-ssa-strength-reduction.cc
> > +++ b/gcc/gimple-ssa-strength-reduction.cc
> > @@ -4002,8 +4002,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_slsr; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_tree_slsr; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_strength_reduction
> >  
> > diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-
> > access.cc
> > index 9357a4e576a..1f70cbdb884 100644
> > --- a/gcc/gimple-ssa-warn-access.cc
> > +++ b/gcc/gimple-ssa-warn-access.cc
> > @@ -2069,13 +2069,13 @@ class pass_waccess : public gimple_opt_pass
> >  
> >    ~pass_waccess ();
> >  
> > -  opt_pass *clone ();
> > +  opt_pass *clone () final override;
> >  
> > -  virtual bool gate (function *);
> > +  bool gate (function *) final override;
> >  
> > -  void set_pass_param (unsigned, bool);
> > +  void set_pass_param (unsigned, bool) final override;
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  private:
> >    /* Not copyable or assignable.  */
> > diff --git a/gcc/gimple-ssa-warn-alloca.cc b/gcc/gimple-ssa-warn-
> > alloca.cc
> > index 273b88ec141..83a241a3a4b 100644
> > --- a/gcc/gimple-ssa-warn-alloca.cc
> > +++ b/gcc/gimple-ssa-warn-alloca.cc
> > @@ -58,8 +58,8 @@ public:
> >    pass_walloca (gcc::context *ctxt)
> >      : gimple_opt_pass(pass_data_walloca, ctxt), xlimit_certain_p
> > (false)
> >    {}
> > -  opt_pass *clone () { return new pass_walloca (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass *clone () final override { return new pass_walloca
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        // Set to true to enable only warnings for alloca calls that
> > @@ -69,8 +69,8 @@ public:
> >        // the "may be too large" kind.
> >        xlimit_certain_p = param;
> >      }
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >   private:
> >    // Set to TRUE the first time we run this pass on a function.
> > diff --git a/gcc/gimple-ssa-warn-restrict.cc b/gcc/gimple-ssa-warn-
> > restrict.cc
> > index b678e806da3..2a1afcbb0fc 100644
> > --- a/gcc/gimple-ssa-warn-restrict.cc
> > +++ b/gcc/gimple-ssa-warn-restrict.cc
> > @@ -64,8 +64,8 @@ class pass_wrestrict : public gimple_opt_pass
> >   public:
> >    pass_wrestrict (gcc::context *);
> >  
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >    void check_call (gimple *);
> >  
> > diff --git a/gcc/gimple-warn-recursion.cc b/gcc/gimple-warn-
> > recursion.cc
> > index 91a3cdbacd4..9b04899cf78 100644
> > --- a/gcc/gimple-warn-recursion.cc
> > +++ b/gcc/gimple-warn-recursion.cc
> > @@ -52,9 +52,9 @@ public:
> >    pass_warn_recursion (gcc::context *);
> >  
> >  private:
> > -  virtual bool gate (function *) { return warn_infinite_recursion;
> > }
> > +  bool gate (function *) final override { return
> > warn_infinite_recursion; }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >    bool find_function_exit (basic_block);
> >  
> > diff --git a/gcc/graphite.cc b/gcc/graphite.cc
> > index ab8683b5b41..a88b13c0219 100644
> > --- a/gcc/graphite.cc
> > +++ b/gcc/graphite.cc
> > @@ -574,7 +574,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_graphite_transforms
> > ();
> > }
> > +  bool gate (function *) final override { return
> > gate_graphite_transforms (); }
> >  
> >  }; // class pass_graphite
> >  
> > @@ -609,8 +609,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_graphite_transforms
> > ();
> > }
> > -  virtual unsigned int execute (function *fun) { return
> > graphite_transforms (fun); }
> > +  bool gate (function *) final override { return
> > gate_graphite_transforms (); }
> > +  unsigned int execute (function *fun) final override
> > +  {
> > +    return graphite_transforms (fun);
> > +  }
> >  
> >  }; // class pass_graphite_transforms
> >  
> > diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
> > index b983e87389f..28b153cf2ae 100644
> > --- a/gcc/ifcvt.cc
> > +++ b/gcc/ifcvt.cc
> > @@ -5933,12 +5933,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize > 0) && dbg_cnt (if_conversion);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_if_conversion ();
> >      }
> > @@ -5980,13 +5980,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_if_conversion
> >         && dbg_cnt (if_after_combine);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        if_convert (true);
> >        return 0;
> > @@ -6026,13 +6026,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return optimize > 0 && flag_if_conversion2
> >         && dbg_cnt (if_after_reload);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        if_convert (true);
> >        return 0;
> > diff --git a/gcc/init-regs.cc b/gcc/init-regs.cc
> > index 220ef705997..652befefdaa 100644
> > --- a/gcc/init-regs.cc
> > +++ b/gcc/init-regs.cc
> > @@ -153,8 +153,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize > 0; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return optimize > 0; }
> > +  unsigned int execute (function *) final override
> >      {
> >        initialize_uninitialized_regs ();
> >        return 0;
> > diff --git a/gcc/ipa-comdats.cc b/gcc/ipa-comdats.cc
> > index 566faf3cc1f..da792065ed3 100644
> > --- a/gcc/ipa-comdats.cc
> > +++ b/gcc/ipa-comdats.cc
> > @@ -420,8 +420,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return ipa_comdats
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override { return
> > ipa_comdats (); }
> >  
> >  }; // class pass_ipa_comdats
> >  
> > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
> > index 152fe7244f7..38a21b17e39 100644
> > --- a/gcc/ipa-cp.cc
> > +++ b/gcc/ipa-cp.cc
> > @@ -6659,14 +6659,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* FIXME: We should remove the optimize check after we
> > ensure we
> > never run
> >          IPA passes when not optimizing.  */
> >        return (flag_ipa_cp && optimize) || in_lto_p;
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return ipcp_driver
> > (); }
> > +  unsigned int execute (function *) final override { return
> > ipcp_driver (); }
> >  
> >  }; // class pass_ipa_cp
> >  
> > diff --git a/gcc/ipa-devirt.cc b/gcc/ipa-devirt.cc
> > index 9f1442dc3cc..412ca14f66b 100644
> > --- a/gcc/ipa-devirt.cc
> > +++ b/gcc/ipa-devirt.cc
> > @@ -3969,7 +3969,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* In LTO, always run the IPA passes and decide on function
> > basis if the
> >          pass is enabled.  */
> > @@ -3982,7 +3982,7 @@ public:
> >               && optimize);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return ipa_devirt
> > (); }
> > +  unsigned int execute (function *) final override { return
> > ipa_devirt
> > (); }
> >  
> >  }; // class pass_ipa_devirt
> >  
> > @@ -4361,12 +4361,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (in_lto_p || flag_lto);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return 0;
> >      }
> > diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
> > index b12e7a1124d..832794fd5dc 100644
> > --- a/gcc/ipa-fnsummary.cc
> > +++ b/gcc/ipa-fnsummary.cc
> > @@ -4846,8 +4846,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_local_fn_summary (m_ctxt);
> > }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_local_fn_summary (m_ctxt);
> > +  }
> > +  unsigned int execute (function *) final override
> >      {
> >        return compute_fn_summary_for_current ();
> >      }
> > @@ -4889,14 +4892,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass *clone () { return new pass_ipa_free_fn_summary
> > (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass *clone () final override
> > +  {
> > +    return new pass_ipa_free_fn_summary (m_ctxt);
> > +  }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        small_p = param;
> >      }
> > -  virtual bool gate (function *) { return true; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return true; }
> > +  unsigned int execute (function *) final override
> >      {
> >        ipa_free_fn_summary ();
> >        /* Free ipa-prop structures if they are no longer needed. 
> > */
> > @@ -4950,7 +4956,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return 0; }
> > +  unsigned int execute (function *) final override { return 0; }
> >  
> >  }; // class pass_ipa_fn_summary
> >  
> > diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc
> > index f99f7be1c58..ccdbf849c25 100644
> > --- a/gcc/ipa-free-lang-data.cc
> > +++ b/gcc/ipa-free-lang-data.cc
> > @@ -1173,7 +1173,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > free_lang_data
> > (); }
> > +  unsigned int execute (function *) final override { return
> > free_lang_data (); }
> >  
> >  }; // class pass_ipa_free_lang_data
> >  
> > diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
> > index 765ae746745..a8a162268ee 100644
> > --- a/gcc/ipa-icf.cc
> > +++ b/gcc/ipa-icf.cc
> > @@ -3637,12 +3637,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return in_lto_p || flag_ipa_icf_variables ||
> > flag_ipa_icf_functions;
> >    }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >    {
> >      return ipa_icf_driver();
> >    }
> > diff --git a/gcc/ipa-inline.cc b/gcc/ipa-inline.cc
> > index 22a009b7435..14969198cde 100644
> > --- a/gcc/ipa-inline.cc
> > +++ b/gcc/ipa-inline.cc
> > @@ -3100,7 +3100,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_early_inline
> >  
> > @@ -3150,7 +3150,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return ipa_inline
> > (); }
> > +  unsigned int execute (function *) final override { return
> > ipa_inline
> > (); }
> >  
> >  }; // class pass_ipa_inline
> >  
> > diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
> > index 556816ab429..7c1f974bc7a 100644
> > --- a/gcc/ipa-modref.cc
> > +++ b/gcc/ipa-modref.cc
> > @@ -3508,15 +3508,15 @@ class pass_modref : public gimple_opt_pass
> >         : gimple_opt_pass (pass_data_modref, ctxt) {}
> >  
> >      /* opt_pass methods: */
> > -    opt_pass *clone ()
> > +    opt_pass *clone () final override
> >      {
> >        return new pass_modref (m_ctxt);
> >      }
> > -    virtual bool gate (function *)
> > +    bool gate (function *) final override
> >      {
> >        return flag_ipa_modref;
> >      }
> > -    virtual unsigned int execute (function *);
> > +    unsigned int execute (function *) final override;
> >  };
> >  
> >  /* Encode TT to the output block OB using the summary streaming
> > API. 
> > */
> > @@ -4170,12 +4170,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass *clone () { return new pass_ipa_modref (m_ctxt); }
> > -  virtual bool gate (function *)
> > +  opt_pass *clone () final override { return new pass_ipa_modref
> > (m_ctxt); }
> > +  bool gate (function *) final override
> >    {
> >      return true;
> >    }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  };
> >  
> > diff --git a/gcc/ipa-profile.cc b/gcc/ipa-profile.cc
> > index b74d77f2c95..496f292acba 100644
> > --- a/gcc/ipa-profile.cc
> > +++ b/gcc/ipa-profile.cc
> > @@ -1053,8 +1053,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_ipa_profile ||
> > in_lto_p; }
> > -  virtual unsigned int execute (function *) { return ipa_profile
> > (); }
> > +  bool gate (function *) final override { return flag_ipa_profile
> > ||
> > in_lto_p; }
> > +  unsigned int execute (function *) final override { return
> > ipa_profile (); }
> >  
> >  }; // class pass_ipa_profile
> >  
> > diff --git a/gcc/ipa-pure-const.cc b/gcc/ipa-pure-const.cc
> > index 2b4950a5969..0e55fc4bfc5 100644
> > --- a/gcc/ipa-pure-const.cc
> > +++ b/gcc/ipa-pure-const.cc
> > @@ -168,8 +168,8 @@ public:
> >    pass_ipa_pure_const(gcc::context *ctxt);
> >  
> >    /* opt_pass methods: */
> > -  bool gate (function *) { return gate_pure_const (); }
> > -  unsigned int execute (function *fun);
> > +  bool gate (function *) final override { return gate_pure_const
> > (); }
> > +  unsigned int execute (function *fun) final override;
> >  
> >    void register_hooks (void);
> >  
> > @@ -2154,9 +2154,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_local_pure_const (m_ctxt);
> > }
> > -  virtual bool gate (function *) { return gate_pure_const (); }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_local_pure_const (m_ctxt);
> > +  }
> > +  bool gate (function *) final override { return gate_pure_const
> > (); }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_local_pure_const
> >  
> > @@ -2270,8 +2273,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return
> > warn_suggest_attribute_noreturn; }
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override
> > +  {
> > +    return warn_suggest_attribute_noreturn;
> > +  }
> > +  unsigned int execute (function *fun) final override
> >      {
> >        if (!TREE_THIS_VOLATILE (current_function_decl)
> >           && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0)
> > @@ -2316,9 +2322,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_nothrow (m_ctxt); }
> > -  virtual bool gate (function *) { return optimize; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_nothrow
> > (m_ctxt); }
> > +  bool gate (function *) final override { return optimize; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_nothrow
> >  
> > diff --git a/gcc/ipa-reference.cc b/gcc/ipa-reference.cc
> > index 67e0c85a95e..b5a2350ce72 100644
> > --- a/gcc/ipa-reference.cc
> > +++ b/gcc/ipa-reference.cc
> > @@ -1299,14 +1299,14 @@ public:
> >      {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return ((in_lto_p || flag_ipa_reference)
> >               /* Don't bother doing anything if the program has
> > errors.  */
> >               && !seen_error ());
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return propagate ();
> > }
> > +  unsigned int execute (function *) final override { return
> > propagate
> > (); }
> >  
> >  }; // class pass_ipa_reference
> >  
> > diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc
> > index 60021bad13c..16734617d03 100644
> > --- a/gcc/ipa-split.cc
> > +++ b/gcc/ipa-split.cc
> > @@ -1915,8 +1915,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_split_functions ();
> >      }
> > @@ -1974,8 +1974,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_feedback_split_functions ();
> >      }
> > diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
> > index 261a720858f..4f705a3febf 100644
> > --- a/gcc/ipa-sra.cc
> > +++ b/gcc/ipa-sra.cc
> > @@ -4049,14 +4049,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* TODO: We should remove the optimize check after we ensure
> > we
> > never run
> >          IPA passes when not optimizing.  */
> >        return (flag_ipa_sra && optimize);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > ipa_sra_analysis
> > (); }
> > +  unsigned int execute (function *)  final override
> > +  {
> > +    return ipa_sra_analysis ();
> > +  }
> >  
> >  }; // class pass_ipa_sra
> >  
> > diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc
> > index e95a0dd252f..8a27e7bcdfd 100644
> > --- a/gcc/ipa-visibility.cc
> > +++ b/gcc/ipa-visibility.cc
> > @@ -959,12 +959,12 @@ public:
> >  
> >    /* opt_pass methods: */
> >  
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Do not re-run on ltrans stage.  */
> >        return !flag_ltrans;
> >      }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return whole_program_function_and_variable_visibility ();
> >      }
> > @@ -988,7 +988,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return function_and_variable_visibility (flag_whole_program
> > &&
> > !flag_lto);
> >      }
> > diff --git a/gcc/ipa.cc b/gcc/ipa.cc
> > index f53f15f5f0a..c01dca17bec 100644
> > --- a/gcc/ipa.cc
> > +++ b/gcc/ipa.cc
> > @@ -1343,8 +1343,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > ipa_cdtor_merge
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return ipa_cdtor_merge ();
> > +  }
> >  
> >  }; // class pass_ipa_cdtor_merge
> >  
> > @@ -1566,7 +1569,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > ipa_single_use
> > (); }
> > +  unsigned int execute (function *) final override { return
> > ipa_single_use (); }
> >  
> >  }; // class pass_ipa_single_use
> >  
> > diff --git a/gcc/ira.cc b/gcc/ira.cc
> > index e3b3c549120..42c9cead9f8 100644
> > --- a/gcc/ira.cc
> > +++ b/gcc/ira.cc
> > @@ -6074,11 +6074,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return !targetm.no_register_allocation;
> >      }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        ira (dump_file);
> >        return 0;
> > @@ -6117,11 +6117,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return !targetm.no_register_allocation;
> >      }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        do_reload ();
> >        return 0;
> > diff --git a/gcc/jump.cc b/gcc/jump.cc
> > index 332f86878e1..e6207169be0 100644
> > --- a/gcc/jump.cc
> > +++ b/gcc/jump.cc
> > @@ -182,7 +182,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > cleanup_barriers
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return cleanup_barriers ();
> > +  }
> >  
> >  }; // class pass_cleanup_barriers
> >  
> > diff --git a/gcc/loop-init.cc b/gcc/loop-init.cc
> > index 1e4f6cfd7fb..648aa290916 100644
> > --- a/gcc/loop-init.cc
> > +++ b/gcc/loop-init.cc
> > @@ -357,7 +357,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > +  bool gate (function *) final override;
> >  
> >  }; // class pass_loop2
> >  
> > @@ -429,7 +429,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return rtl_loop_init
> > ();
> > }
> > +  unsigned int execute (function *) final override { return
> > rtl_loop_init (); }
> >  
> >  }; // class pass_rtl_loop_init
> >  
> > @@ -467,7 +467,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_rtl_loop_done
> >  
> > @@ -523,8 +523,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return
> > flag_move_loop_invariants; }
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override { return
> > flag_move_loop_invariants; }
> > +  unsigned int execute (function *fun) final override
> >      {
> >        if (number_of_loops (fun) > 1)
> >         move_loop_invariants ();
> > @@ -565,12 +565,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (flag_unroll_loops || flag_unroll_all_loops || cfun-
> > > has_unroll);
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_rtl_unroll_loops
> >  
> > @@ -625,8 +625,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_rtl_doloop
> >  
> > diff --git a/gcc/lower-subreg.cc b/gcc/lower-subreg.cc
> > index d30bbeeabda..03e9326c663 100644
> > --- a/gcc/lower-subreg.cc
> > +++ b/gcc/lower-subreg.cc
> > @@ -1769,8 +1769,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_split_wide_types !=
> > 0;
> > }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return
> > flag_split_wide_types
> > != 0; }
> > +  unsigned int execute (function *) final override
> >      {
> >        decompose_multiword_subregs (false);
> >        return 0;
> > @@ -1811,9 +1811,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_split_wide_types
> > -                                         &&
> > flag_split_wide_types_early; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override
> > +  {
> > +    return flag_split_wide_types && flag_split_wide_types_early;
> > +  }
> > +  unsigned int execute (function *) final override
> >      {
> >        decompose_multiword_subregs (true);
> >        return 0;
> > @@ -1854,8 +1856,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_split_wide_types; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return
> > flag_split_wide_types; }
> > +  unsigned int execute (function *) final override
> >      {
> >        decompose_multiword_subregs (true);
> >        return 0;
> > diff --git a/gcc/mode-switching.cc b/gcc/mode-switching.cc
> > index 6e3f1dc65e2..b0f6e7cedd4 100644
> > --- a/gcc/mode-switching.cc
> > +++ b/gcc/mode-switching.cc
> > @@ -893,8 +893,8 @@ public:
> >    /* opt_pass methods: */
> >    /* The epiphany backend creates a second instance of this pass,
> > so
> > we need
> >       a clone method.  */
> > -  opt_pass * clone () { return new pass_mode_switching (m_ctxt); }
> > -  virtual bool gate (function *)
> > +  opt_pass * clone () final override { return new
> > pass_mode_switching
> > (m_ctxt); }
> > +  bool gate (function *) final override
> >      {
> >  #ifdef OPTIMIZE_MODE_SWITCHING
> >        return true;
> > @@ -903,7 +903,7 @@ public:
> >  #endif
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >  #ifdef OPTIMIZE_MODE_SWITCHING
> >        optimize_mode_switching ();
> > diff --git a/gcc/modulo-sched.cc b/gcc/modulo-sched.cc
> > index 1e1fa7055a2..f78d791cb01 100644
> > --- a/gcc/modulo-sched.cc
> > +++ b/gcc/modulo-sched.cc
> > @@ -3338,12 +3338,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >  {
> >    return (optimize > 0 && flag_modulo_sched);
> >  }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_sms
> >  
> > diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
> > index 7fe02fb55c8..3e2d26882c8 100644
> > --- a/gcc/multiple_target.cc
> > +++ b/gcc/multiple_target.cc
> > @@ -526,8 +526,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > ipa_target_clone
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return ipa_target_clone ();
> > +  }
> >  };
> >  
> >  bool
> > diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc
> > index 9fcc67a3448..3d48e1df175 100644
> > --- a/gcc/omp-expand.cc
> > +++ b/gcc/omp-expand.cc
> > @@ -10574,7 +10574,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        bool gate = ((flag_openacc != 0 || flag_openmp != 0
> >                     || flag_openmp_simd != 0)
> > @@ -10621,12 +10621,18 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        return !(fun->curr_properties & PROP_gimple_eomp);
> >      }
> > -  virtual unsigned int execute (function *) { return
> > execute_expand_omp (); }
> > -  opt_pass * clone () { return new pass_expand_omp_ssa (m_ctxt); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_expand_omp ();
> > +  }
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_expand_omp_ssa (m_ctxt);
> > +  }
> >  
> >  }; // class pass_expand_omp_ssa
> >  
> > diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
> > index c83af6c3865..e00788f0ea1 100644
> > --- a/gcc/omp-low.cc
> > +++ b/gcc/omp-low.cc
> > @@ -14594,7 +14594,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > execute_lower_omp
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_lower_omp ();
> > +  }
> >  
> >  }; // class pass_lower_omp
> >  
> > @@ -14902,11 +14905,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return flag_openacc || flag_openmp || flag_openmp_simd;
> >    }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return diagnose_omp_structured_block_errors ();
> >      }
> > diff --git a/gcc/omp-oacc-kernels-decompose.cc b/gcc/omp-oacc-
> > kernels-
> > decompose.cc
> > index ec9b0faab0a..524060e2fca 100644
> > --- a/gcc/omp-oacc-kernels-decompose.cc
> > +++ b/gcc/omp-oacc-kernels-decompose.cc
> > @@ -1615,12 +1615,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return (flag_openacc
> >             && param_openacc_kernels == OPENACC_KERNELS_DECOMPOSE);
> >    }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >    {
> >      return omp_oacc_kernels_decompose ();
> >    }
> > diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-
> > neuter-
> > broadcast.cc
> > index 81e3223a94c..b6177794cde 100644
> > --- a/gcc/omp-oacc-neuter-broadcast.cc
> > +++ b/gcc/omp-oacc-neuter-broadcast.cc
> > @@ -1945,7 +1945,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >    {
> >      if (!flag_openacc)
> >        return false;
> > @@ -1961,7 +1961,7 @@ public:
> >      return true;
> >    }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_omp_oacc_neuter_broadcast ();
> >      }
> > diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
> > index ad4e772015e..9de04fc520c 100644
> > --- a/gcc/omp-offload.cc
> > +++ b/gcc/omp-offload.cc
> > @@ -2449,9 +2449,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_openacc; };
> > +  bool gate (function *) final override { return flag_openacc; };
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_oacc_loop_designation ();
> >      }
> > @@ -2479,9 +2479,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_openacc; };
> > +  bool gate (function *) final override { return flag_openacc; };
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_oacc_device_lower ();
> >      }
> > @@ -2713,13 +2713,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        return (!(fun->curr_properties & PROP_gimple_lomp_dev)
> >               || (flag_openmp
> >                   && cgraph_node::get (fun->decl)-
> > > calls_declare_variant_alt));
> >      }
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_omp_device_lower ();
> >      }
> > @@ -2759,7 +2759,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >  #ifdef ACCEL_COMPILER
> >        return offloading_function_p (fun->decl);
> > @@ -2769,7 +2769,7 @@ public:
> >  #endif
> >      }
> >  
> > -  virtual unsigned execute (function *);
> > +  unsigned execute (function *) final override;
> >  };
> >  
> >  /* Callback for walk_gimple_stmt used to scan for link var
> > operands. 
> > */
> > diff --git a/gcc/omp-simd-clone.cc b/gcc/omp-simd-clone.cc
> > index 04fe03cde5f..32649bc3f9a 100644
> > --- a/gcc/omp-simd-clone.cc
> > +++ b/gcc/omp-simd-clone.cc
> > @@ -1819,8 +1819,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > ipa_omp_simd_clone (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return ipa_omp_simd_clone ();
> > +  }
> >  };
> >  
> >  bool
> > diff --git a/gcc/passes.cc b/gcc/passes.cc
> > index 36e5b4ac45f..78a07f8691a 100644
> > --- a/gcc/passes.cc
> > +++ b/gcc/passes.cc
> > @@ -417,13 +417,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Don't bother doing anything if the program has errors. 
> > */
> >        return (!seen_error () && !in_lto_p);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_build_ssa_passes ();
> >      }
> > @@ -451,7 +451,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Don't bother doing anything if the program has errors. 
> > */
> >        return (!seen_error () && !in_lto_p);
> > @@ -480,7 +480,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Don't bother doing anything if the program has errors. 
> > */
> >        return (!seen_error () && !in_lto_p);
> > @@ -531,7 +531,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize >= 1
> >               /* Don't bother doing anything if the program has
> > errors.  */
> > @@ -571,7 +571,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize >= 1 &&
> > !optimize_debug; }
> > +  bool gate (function *) final override
> > +  {
> > +    return optimize >= 1 && !optimize_debug;
> > +  }
> >  
> >  }; // class pass_all_optimizations
> >  
> > @@ -606,7 +609,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize >= 1 &&
> > optimize_debug; }
> > +  bool gate (function *) final override
> > +  {
> > +    return optimize >= 1 && optimize_debug;
> > +  }
> >  
> >  }; // class pass_all_optimizations_g
> >  
> > @@ -641,7 +647,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Early return if there were errors.  We can run afoul of
> > our
> >          consistency checks, and there's not really much point in
> > fixing them.  */
> > @@ -681,7 +687,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return reload_completed; }
> > +  bool gate (function *) final override { return reload_completed;
> > }
> >  
> >  }; // class pass_postreload
> >  
> > @@ -716,7 +722,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return reload_completed || targetm.no_register_allocation;
> >    }
> > @@ -756,15 +762,15 @@ public:
> >    {
> >    }
> >  
> > -  virtual bool
> > -  gate (function *fun)
> > +  bool
> > +  gate (function *fun) final override
> >    {
> >      return flag_tree_slp_vectorize
> >            && (fun->pending_TODOs &
> > PENDING_TODO_force_next_scalar_cleanup);
> >    }
> >  
> > -  virtual unsigned int
> > -  execute (function *fun)
> > +  unsigned int
> > +  execute (function *fun) final override
> >    {
> >      fun->pending_TODOs &= ~PENDING_TODO_force_next_scalar_cleanup;
> >      return 0;
> > diff --git a/gcc/postreload-gcse.cc b/gcc/postreload-gcse.cc
> > index fc63f0b5c77..1c795b43ca3 100644
> > --- a/gcc/postreload-gcse.cc
> > +++ b/gcc/postreload-gcse.cc
> > @@ -1447,13 +1447,16 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        return (optimize > 0 && flag_gcse_after_reload
> >               && optimize_function_for_speed_p (fun));
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_gcse2 (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_gcse2 ();
> > +  }
> >  
> >  }; // class pass_gcse2
> >  
> > diff --git a/gcc/postreload.cc b/gcc/postreload.cc
> > index 4a67d0d437a..d1c99fe6dc9 100644
> > --- a/gcc/postreload.cc
> > +++ b/gcc/postreload.cc
> > @@ -2339,9 +2339,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return (optimize > 0 &&
> > reload_completed); }
> > +  bool gate (function *) final override
> > +  {
> > +    return (optimize > 0 && reload_completed);
> > +  }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_postreload_cse
> >  
> > diff --git a/gcc/predict.cc b/gcc/predict.cc
> > index 5734e4c8516..fb9fa514fbc 100644
> > --- a/gcc/predict.cc
> > +++ b/gcc/predict.cc
> > @@ -4079,8 +4079,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_guess_branch_prob;
> > }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return
> > flag_guess_branch_prob; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_profile
> >  
> > @@ -4233,14 +4233,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_strip_predict_hints
> > (m_ctxt);
> > }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_strip_predict_hints (m_ctxt);
> > +  }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        early_p = param;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  private:
> >    bool early_p;
> > diff --git a/gcc/recog.cc b/gcc/recog.cc
> > index cd2410ab2ae..dac172bc7c0 100644
> > --- a/gcc/recog.cc
> > +++ b/gcc/recog.cc
> > @@ -4358,9 +4358,12 @@ public:
> >    /* opt_pass methods: */
> >    /* The epiphany backend creates a second instance of this pass,
> > so
> > we need
> >       a clone method.  */
> > -  opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
> > -  virtual bool gate (function *) { return (optimize > 0 &&
> > flag_peephole2); }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override { return new pass_peephole2
> > (m_ctxt); }
> > +  bool gate (function *) final override
> > +  {
> > +    return (optimize > 0 && flag_peephole2);
> > +  }
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_peephole2 ();
> >      }
> > @@ -4400,8 +4403,11 @@ public:
> >    /* opt_pass methods: */
> >    /* The epiphany backend creates a second instance of this pass,
> > so
> >       we need a clone method.  */
> > -  opt_pass * clone () { return new pass_split_all_insns (m_ctxt);
> > }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_split_all_insns (m_ctxt);
> > +  }
> > +  unsigned int execute (function *) final override
> >      {
> >        split_all_insns ();
> >        return 0;
> > @@ -4440,13 +4446,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* If optimizing, then go ahead and split insns now.  */
> >        return optimize > 0;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        split_all_insns ();
> >        return 0;
> > @@ -4495,12 +4501,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return enable_split_before_sched2 ();
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        split_all_insns ();
> >        return 0;
> > @@ -4539,8 +4545,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        split_all_insns ();
> >        return 0;
> > @@ -4598,7 +4604,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* The placement of the splitting that we do for
> > shorten_branches
> >          depends on whether regstack is used by the target or not. 
> > */
> > @@ -4609,7 +4615,7 @@ public:
> >  #endif
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return split_all_insns_noflow ();
> >      }
> > diff --git a/gcc/ree.cc b/gcc/ree.cc
> > index de4f18e8a4d..da64ef679b7 100644
> > --- a/gcc/ree.cc
> > +++ b/gcc/ree.cc
> > @@ -1403,8 +1403,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return (optimize > 0 &&
> > flag_ree);
> > }
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_ree (); }
> > +  bool gate (function *) final override { return (optimize > 0 &&
> > flag_ree); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_ree ();
> > +  }
> >  
> >  }; // class pass_ree
> >  
> > diff --git a/gcc/reg-stack.cc b/gcc/reg-stack.cc
> > index 5afeadf8c49..fd032501ad9 100644
> > --- a/gcc/reg-stack.cc
> > +++ b/gcc/reg-stack.cc
> > @@ -3413,7 +3413,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >  #ifdef STACK_REGS
> >        return true;
> > @@ -3468,7 +3468,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_stack_regs ();
> >      }
> > diff --git a/gcc/regcprop.cc b/gcc/regcprop.cc
> > index 1fdc36713cd..8fcf9d529dd 100644
> > --- a/gcc/regcprop.cc
> > +++ b/gcc/regcprop.cc
> > @@ -1293,12 +1293,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize > 0 && (flag_cprop_registers));
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_cprop_hardreg
> >  
> > diff --git a/gcc/reginfo.cc b/gcc/reginfo.cc
> > index 2ab7bbb7353..705779d5c18 100644
> > --- a/gcc/reginfo.cc
> > +++ b/gcc/reginfo.cc
> > @@ -953,7 +953,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return reginfo_init
> > ();
> > }
> > +  unsigned int execute (function *) final override { return
> > reginfo_init (); }
> >  
> >  }; // class pass_reginfo_init
> >  
> > diff --git a/gcc/regrename.cc b/gcc/regrename.cc
> > index 10271e1b17d..021a822cb79 100644
> > --- a/gcc/regrename.cc
> > +++ b/gcc/regrename.cc
> > @@ -2013,12 +2013,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize > 0 && (flag_rename_registers));
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > regrename_optimize (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return regrename_optimize ();
> > +  }
> >  
> >  }; // class pass_regrename
> >  
> > diff --git a/gcc/reorg.cc b/gcc/reorg.cc
> > index 7624f514906..07b2045986c 100644
> > --- a/gcc/reorg.cc
> > +++ b/gcc/reorg.cc
> > @@ -3866,8 +3866,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_delay_slots ();
> >      }
> > @@ -3917,12 +3917,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return targetm.machine_dependent_reorg != 0;
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        targetm.machine_dependent_reorg ();
> >        return 0;
> > diff --git a/gcc/sancov.cc b/gcc/sancov.cc
> > index 9c1025200b4..052fa4ef881 100644
> > --- a/gcc/sancov.cc
> > +++ b/gcc/sancov.cc
> > @@ -308,17 +308,17 @@ public:
> >  
> >    static const pass_data data;
> >    opt_pass *
> > -  clone ()
> > +  clone () final override
> >    {
> >      return new pass_sancov<O0> (m_ctxt);
> >    }
> > -  virtual bool
> > -  gate (function *fun)
> > +  bool
> > +  gate (function *fun) final override
> >    {
> >      return sanitize_coverage_p (fun->decl) && (!O0 || !optimize);
> >    }
> > -  virtual unsigned int
> > -  execute (function *fun)
> > +  unsigned int
> > +  execute (function *fun) final override
> >    {
> >      return sancov_pass (fun);
> >    }
> > diff --git a/gcc/sanopt.cc b/gcc/sanopt.cc
> > index 125e0c936e7..7aebc6f39dc 100644
> > --- a/gcc/sanopt.cc
> > +++ b/gcc/sanopt.cc
> > @@ -942,8 +942,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_sanitize; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_sanitize; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_sanopt
> >  
> > diff --git a/gcc/sched-rgn.cc b/gcc/sched-rgn.cc
> > index a0dfdb7881f..0dc2a8f2851 100644
> > --- a/gcc/sched-rgn.cc
> > +++ b/gcc/sched-rgn.cc
> > @@ -3779,7 +3779,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >  #ifdef INSN_SCHEDULING
> >        return flag_live_range_shrinkage;
> > @@ -3788,7 +3788,7 @@ public:
> >  #endif
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_live_range_shrinkage ();
> >      }
> > @@ -3826,8 +3826,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > rest_of_handle_sched (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return rest_of_handle_sched ();
> > +  }
> >  
> >  }; // class pass_sched
> >  
> > @@ -3872,8 +3875,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_sched2 ();
> >      }
> > @@ -3922,8 +3925,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return rest_of_handle_sched_fusion ();
> >      }
> > diff --git a/gcc/stack-ptr-mod.cc b/gcc/stack-ptr-mod.cc
> > index b14bef98c49..4ccbb1cace3 100644
> > --- a/gcc/stack-ptr-mod.cc
> > +++ b/gcc/stack-ptr-mod.cc
> > @@ -71,7 +71,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_stack_ptr_mod
> >  
> > diff --git a/gcc/store-motion.cc b/gcc/store-motion.cc
> > index 0f708700a14..b61c0686844 100644
> > --- a/gcc/store-motion.cc
> > +++ b/gcc/store-motion.cc
> > @@ -1243,8 +1243,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_rtl_store_motion ();
> >      }
> > diff --git a/gcc/tracer.cc b/gcc/tracer.cc
> > index 4d054fe8fc8..64517846dc4 100644
> > --- a/gcc/tracer.cc
> > +++ b/gcc/tracer.cc
> > @@ -424,12 +424,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize > 0 && flag_tracer && flag_reorder_blocks);
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_tracer
> >  
> > diff --git a/gcc/trans-mem.cc b/gcc/trans-mem.cc
> > index ae2921f808e..131dce05476 100644
> > --- a/gcc/trans-mem.cc
> > +++ b/gcc/trans-mem.cc
> > @@ -864,8 +864,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tm; }
> > -  virtual unsigned int execute (function *) { return
> > diagnose_tm_blocks (); }
> > +  bool gate (function *) final override { return flag_tm; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return diagnose_tm_blocks ();
> > +  }
> >  
> >  }; // class pass_diagnose_tm_blocks
> >  
> > @@ -1850,8 +1853,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tm; }
> > -  virtual unsigned int execute (function *) { return
> > execute_lower_tm
> > (); }
> > +  bool gate (function *) final override { return flag_tm; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_lower_tm ();
> > +  }
> >  
> >  }; // class pass_lower_tm
> >  
> > @@ -2144,7 +2150,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_tm_init (); }
> > +  bool gate (function *) final override { return gate_tm_init ();
> > }
> >  
> >  }; // class pass_tm_init
> >  
> > @@ -3162,7 +3168,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > execute_tm_mark
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_tm_mark ();
> > +  }
> >  
> >  }; // class pass_tm_mark
> >  
> > @@ -3324,7 +3333,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_tm_edges
> >  
> > @@ -4085,8 +4094,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tm && optimize > 0;
> > }
> > -  virtual unsigned int execute (function *) { return
> > execute_tm_memopt
> > (); }
> > +  bool gate (function *) final override { return flag_tm &&
> > optimize >
> > 0; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_tm_memopt ();
> > +  }
> >  
> >  }; // class pass_tm_memopt
> >  
> > @@ -5667,8 +5679,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tm; }
> > -  virtual unsigned int execute (function *) { return
> > ipa_tm_execute
> > (); }
> > +  bool gate (function *) final override { return flag_tm; }
> > +  unsigned int execute (function *) final override { return
> > ipa_tm_execute (); }
> >  
> >  }; // class pass_ipa_tm
> >  
> > diff --git a/gcc/tree-call-cdce.cc b/gcc/tree-call-cdce.cc
> > index 83991fe373e..feb61f362cf 100644
> > --- a/gcc/tree-call-cdce.cc
> > +++ b/gcc/tree-call-cdce.cc
> > @@ -1171,7 +1171,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* The limit constants used in the implementation
> >          assume IEEE floating point format.  Other formats
> > @@ -1179,7 +1179,7 @@ public:
> >        return flag_tree_builtin_call_dce != 0;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_call_cdce
> >  
> > diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
> > index 19ba09facce..37e89adf10e 100644
> > --- a/gcc/tree-cfg.cc
> > +++ b/gcc/tree-cfg.cc
> > @@ -407,7 +407,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > execute_build_cfg
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_build_cfg ();
> > +  }
> >  
> >  }; // class pass_build_cfg
> >  
> > @@ -9200,9 +9203,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > split_critical_edges (); }
> > +  unsigned int execute (function *)  final override
> > +  {
> > +    return split_critical_edges ();
> > +  }
> >  
> > -  opt_pass * clone () { return new pass_split_crit_edges (m_ctxt);
> > }
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_split_crit_edges (m_ctxt);
> > +  }
> >  }; // class pass_split_crit_edges
> >  
> >  } // anon namespace
> > @@ -9459,7 +9468,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_warn_function_return
> >  
> > @@ -9665,8 +9674,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_warn_unused_result;
> > }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *)  final override { return
> > flag_warn_unused_result; }
> > +  unsigned int execute (function *) final override
> >      {
> >        do_warn_unused_result (gimple_body (current_function_decl));
> >        return 0;
> > @@ -9875,8 +9884,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
> > -  virtual unsigned int execute (function *) { return
> > execute_fixup_cfg
> > (); }
> > +  opt_pass * clone () final override { return new pass_fixup_cfg
> > (m_ctxt); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_fixup_cfg ();
> > +  }
> >  
> >  }; // class pass_fixup_cfg
> >  
> > diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
> > index 893619eaaa4..a6d0bf2c40a 100644
> > --- a/gcc/tree-cfgcleanup.cc
> > +++ b/gcc/tree-cfgcleanup.cc
> > @@ -1406,8 +1406,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_merge_phi (m_ctxt); }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_merge_phi
> > (m_ctxt); }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_merge_phi
> >  
> > @@ -1584,7 +1584,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return execute_cleanup_cfg_post_optimizing ();
> >      }
> > diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
> > index f722057bfec..61950a0f099 100644
> > --- a/gcc/tree-complex.cc
> > +++ b/gcc/tree-complex.cc
> > @@ -1915,8 +1915,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_lower_complex (m_ctxt); }
> > -  virtual unsigned int execute (function *) { return
> > tree_lower_complex (); }
> > +  opt_pass * clone () final override { return new
> > pass_lower_complex
> > (m_ctxt); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return tree_lower_complex ();
> > +  }
> >  
> >  }; // class pass_lower_complex
> >  
> > @@ -1952,14 +1955,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        /* With errors, normal optimization passes are not run.  If
> > we
> > don't
> >          lower complex operations at all, rtl expansion will
> > abort.  */
> >        return !(fun->curr_properties & PROP_gimple_lcx);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > tree_lower_complex (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return tree_lower_complex ();
> > +  }
> >  
> >  }; // class pass_lower_complex_O0
> >  
> > diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
> > index c37a5845343..076ecd3ec9a 100644
> > --- a/gcc/tree-eh.cc
> > +++ b/gcc/tree-eh.cc
> > @@ -2176,7 +2176,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_lower_eh
> >  
> > @@ -3295,8 +3295,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_exceptions != 0; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return flag_exceptions
> > != 0;
> > }
> > +  unsigned int execute (function *) final override
> >      {
> >        refactor_eh_r (gimple_body (current_function_decl));
> >        return 0;
> > @@ -3497,8 +3497,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_exceptions != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_exceptions
> > != 0;
> > }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_lower_resx
> >  
> > @@ -3922,8 +3922,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun) { return fun->eh->region_tree
> > !=
> > NULL; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *fun) final override
> > +  {
> > +    return fun->eh->region_tree != NULL;
> > +  }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_lower_eh_dispatch
> >  
> > @@ -4859,13 +4862,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_cleanup_eh (m_ctxt); }
> > -  virtual bool gate (function *fun)
> > +  opt_pass * clone () final override { return new pass_cleanup_eh
> > (m_ctxt); }
> > +  bool gate (function *fun) final override
> >      {
> >        return fun->eh != NULL && fun->eh->region_tree != NULL;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_cleanup_eh
> >  
> > diff --git a/gcc/tree-emutls.cc b/gcc/tree-emutls.cc
> > index 5f68703822c..b5aa307f60d 100644
> > --- a/gcc/tree-emutls.cc
> > +++ b/gcc/tree-emutls.cc
> > @@ -838,13 +838,16 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* If the target supports TLS natively, we need do nothing
> > here.  */
> >        return !targetm.have_tls;
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > ipa_lower_emutls
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return ipa_lower_emutls ();
> > +  }
> >  
> >  }; // class pass_ipa_lower_emutls
> >  
> > diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
> > index 4531ca58bdf..480fea0e7c2 100644
> > --- a/gcc/tree-if-conv.cc
> > +++ b/gcc/tree-if-conv.cc
> > @@ -3408,8 +3408,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_if_conversion
> >  
> > diff --git a/gcc/tree-into-ssa.cc b/gcc/tree-into-ssa.cc
> > index 22c2e5b7982..46df57ae0e1 100644
> > --- a/gcc/tree-into-ssa.cc
> > +++ b/gcc/tree-into-ssa.cc
> > @@ -2403,13 +2403,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        /* Do nothing for funcions that was produced already in SSA
> > form.  */
> >        return !(fun->curr_properties & PROP_ssa);
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_build_ssa
> >  
> > diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-
> > distribution.cc
> > index db6e9096a86..ec44c450cae 100644
> > --- a/gcc/tree-loop-distribution.cc
> > +++ b/gcc/tree-loop-distribution.cc
> > @@ -3896,13 +3896,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return flag_tree_loop_distribution
> >         || flag_tree_loop_distribute_patterns;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_loop_distribution
> >  
> > diff --git a/gcc/tree-nrv.cc b/gcc/tree-nrv.cc
> > index b96d5b86f27..1faa481a8c9 100644
> > --- a/gcc/tree-nrv.cc
> > +++ b/gcc/tree-nrv.cc
> > @@ -125,9 +125,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize > 0; }
> > +  bool gate (function *) final override { return optimize > 0; }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_nrv
> >  
> > @@ -344,7 +344,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_return_slot
> >  
> > diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc
> > index 5ca87ae3504..bc3d7dd9bfa 100644
> > --- a/gcc/tree-object-size.cc
> > +++ b/gcc/tree-object-size.cc
> > @@ -2122,8 +2122,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_object_sizes (m_ctxt); }
> > -  virtual unsigned int execute (function *fun)
> > +  opt_pass * clone () final override { return new
> > pass_object_sizes
> > (m_ctxt); }
> > +  unsigned int execute (function *fun) final override
> >    {
> >      return object_sizes_execute (fun, false);
> >    }
> > @@ -2162,7 +2162,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *fun)
> > +  unsigned int execute (function *fun) final override
> >    {
> >      return object_sizes_execute (fun, true);
> >    }
> > diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc
> > index da1069683a3..2c3ef436ab7 100644
> > --- a/gcc/tree-parloops.cc
> > +++ b/gcc/tree-parloops.cc
> > @@ -4173,16 +4173,19 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      if (oacc_kernels_p)
> >        return flag_openacc;
> >      else
> >        return flag_tree_parallelize_loops > 1;
> >    }
> > -  virtual unsigned int execute (function *);
> > -  opt_pass * clone () { return new pass_parallelize_loops
> > (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  unsigned int execute (function *) final override;
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_parallelize_loops (m_ctxt);
> > +  }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        oacc_kernels_p = param;
> > diff --git a/gcc/tree-predcom.cc b/gcc/tree-predcom.cc
> > index fb457250bbd..5d923fba170 100644
> > --- a/gcc/tree-predcom.cc
> > +++ b/gcc/tree-predcom.cc
> > @@ -3514,8 +3514,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool
> > -  gate (function *)
> > +  bool
> > +  gate (function *) final override
> >    {
> >      if (flag_predictive_commoning != 0)
> >        return true;
> > @@ -3529,8 +3529,8 @@ public:
> >      return false;
> >    }
> >  
> > -  virtual unsigned int
> > -  execute (function *fun)
> > +  unsigned int
> > +  execute (function *fun) final override
> >    {
> >      bool allow_unroll_p = flag_predictive_commoning != 0;
> >      return run_tree_predictive_commoning (fun, allow_unroll_p);
> > diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
> > index 97aab8801d0..2beb49241f2 100644
> > --- a/gcc/tree-profile.cc
> > +++ b/gcc/tree-profile.cc
> > @@ -884,8 +884,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *) { return
> > tree_profiling
> > (); }
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *) final override { return
> > tree_profiling (); }
> >  
> >  }; // class pass_ipa_tree_profile
> >  
> > diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
> > index 081c51b58a4..461c8e0b0f4 100644
> > --- a/gcc/tree-sra.cc
> > +++ b/gcc/tree-sra.cc
> > @@ -4743,8 +4743,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_intra_sra (); }
> > -  virtual unsigned int execute (function *) { return
> > early_intra_sra
> > (); }
> > +  bool gate (function *) final override { return gate_intra_sra
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return early_intra_sra ();
> > +  }
> >  
> >  }; // class pass_sra_early
> >  
> > @@ -4779,8 +4782,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_intra_sra (); }
> > -  virtual unsigned int execute (function *) { return
> > late_intra_sra
> > (); }
> > +  bool gate (function *) final override { return gate_intra_sra
> > (); }
> > +  unsigned int execute (function *) final override { return
> > late_intra_sra (); }
> >  
> >  }; // class pass_sra
> >  
> > diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc
> > index 81c97676625..579a966cc9b 100644
> > --- a/gcc/tree-ssa-ccp.cc
> > +++ b/gcc/tree-ssa-ccp.cc
> > @@ -2994,14 +2994,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_ccp (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override { return new pass_ccp
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        nonzero_p = param;
> >      }
> > -  virtual bool gate (function *) { return flag_tree_ccp != 0; }
> > -  virtual unsigned int execute (function *) { return do_ssa_ccp
> > (nonzero_p); }
> > +  bool gate (function *) final override { return flag_tree_ccp !=
> > 0; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return do_ssa_ccp (nonzero_p);
> > +  }
> >  
> >   private:
> >    /* Determines whether the pass instance records nonzero bits. 
> > */
> > @@ -4199,8 +4202,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new
> > pass_fold_builtins
> > (m_ctxt); }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_fold_builtins
> >  
> > @@ -4550,9 +4553,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_post_ipa_warn (m_ctxt); }
> > -  virtual bool gate (function *) { return warn_nonnull != 0; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new
> > pass_post_ipa_warn
> > (m_ctxt); }
> > +  bool gate (function *) final override { return warn_nonnull !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_fold_builtins
> >  
> > diff --git a/gcc/tree-ssa-copy.cc b/gcc/tree-ssa-copy.cc
> > index 050a6d11434..782ceb500cc 100644
> > --- a/gcc/tree-ssa-copy.cc
> > +++ b/gcc/tree-ssa-copy.cc
> > @@ -642,9 +642,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_copy_prop !=
> > 0; }
> > -  virtual unsigned int execute (function *) { return
> > execute_copy_prop
> > (); }
> > +  opt_pass * clone () final override { return new pass_copy_prop
> > (m_ctxt); }
> > +  bool gate (function *) final override { return
> > flag_tree_copy_prop
> > != 0; }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_copy_prop ();
> > +  }
> >  
> >  }; // class pass_copy_prop
> >  
> > diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
> > index a6b284018d4..5df64922594 100644
> > --- a/gcc/tree-ssa-dce.cc
> > +++ b/gcc/tree-ssa-dce.cc
> > @@ -1974,9 +1974,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_dce (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_dce != 0; }
> > -  virtual unsigned int execute (function *) { return tree_ssa_dce
> > ();
> > }
> > +  opt_pass * clone () final override { return new pass_dce
> > (m_ctxt); }
> > +  bool gate (function *) final override { return flag_tree_dce !=
> > 0; }
> > +  unsigned int execute (function *) final override { return
> > tree_ssa_dce (); }
> >  
> >  }; // class pass_dce
> >  
> > @@ -2011,14 +2011,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_cd_dce (m_ctxt); }
> > -  void set_pass_param (unsigned n, bool param)
> > +  opt_pass * clone () final override { return new pass_cd_dce
> > (m_ctxt); }
> > +  void set_pass_param (unsigned n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        update_address_taken_p = param;
> >      }
> > -  virtual bool gate (function *) { return flag_tree_dce != 0; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return flag_tree_dce !=
> > 0; }
> > +  unsigned int execute (function *) final override
> >      {
> >        return (tree_ssa_cd_dce ()
> >               | (update_address_taken_p ? TODO_update_address_taken
> > :
> > 0));
> > diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
> > index 9a843217553..97e17ca68e4 100644
> > --- a/gcc/tree-ssa-dom.cc
> > +++ b/gcc/tree-ssa-dom.cc
> > @@ -793,14 +793,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_dominator (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override { return new pass_dominator
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        may_peel_loop_headers_p = param;
> >      }
> > -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_tree_dom !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >   private:
> >    /* This flag is used to prevent loops from being peeled
> > repeatedly
> > in jump
> > diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
> > index 881a2d0f98d..1c1fdb7e75b 100644
> > --- a/gcc/tree-ssa-dse.cc
> > +++ b/gcc/tree-ssa-dse.cc
> > @@ -1455,9 +1455,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_dse (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_dse != 0; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_dse
> > (m_ctxt); }
> > +  bool gate (function *) final override { return flag_tree_dse !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_dse
> >  
> > diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> > index 0917202b74c..6f09642172d 100644
> > --- a/gcc/tree-ssa-forwprop.cc
> > +++ b/gcc/tree-ssa-forwprop.cc
> > @@ -3330,9 +3330,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_forwprop (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_forwprop; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_forwprop
> > (m_ctxt); }
> > +  bool gate (function *) final override { return
> > flag_tree_forwprop; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_forwprop
> >  
> > diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
> > index 88a9f062dcd..80c41c45489 100644
> > --- a/gcc/tree-ssa-ifcombine.cc
> > +++ b/gcc/tree-ssa-ifcombine.cc
> > @@ -829,7 +829,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_tree_ifcombine
> >  
> > diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
> > index 2f5a390404c..9ab63d1fa0c 100644
> > --- a/gcc/tree-ssa-loop-ch.cc
> > +++ b/gcc/tree-ssa-loop-ch.cc
> > @@ -311,12 +311,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_ch != 0; }
> > +  bool gate (function *) final override { return flag_tree_ch !=
> > 0; }
> >    
> >    /* Initialize and finalize loop structures, copying headers
> > inbetween.  */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> > -  opt_pass * clone () { return new pass_ch (m_ctxt); }
> > +  opt_pass * clone () final override { return new pass_ch
> > (m_ctxt); }
> >  
> >  protected:
> >    /* ch_base method: */
> > @@ -347,14 +347,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >    {
> >      return flag_tree_ch != 0
> >            && (flag_tree_loop_vectorize != 0 || fun-
> > > has_force_vectorize_loops);
> >    }
> >    
> >    /* Just copy headers, no initialization/finalization of loop
> > structures.  */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  protected:
> >    /* ch_base method: */
> > diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
> > index 6d9316eed1f..c0893f1927c 100644
> > --- a/gcc/tree-ssa-loop-im.cc
> > +++ b/gcc/tree-ssa-loop-im.cc
> > @@ -3597,9 +3597,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_lim (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_loop_im != 0;
> > }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_lim
> > (m_ctxt); }
> > +  bool gate (function *) final override { return flag_tree_loop_im
> > !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_lim
> >  
> > diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-
> > ivcanon.cc
> > index 2ee00a3f843..e52397235a1 100644
> > --- a/gcc/tree-ssa-loop-ivcanon.cc
> > +++ b/gcc/tree-ssa-loop-ivcanon.cc
> > @@ -1539,8 +1539,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_loop_ivcanon
> > != 0;
> > }
> > -  virtual unsigned int execute (function *fun);
> > +  bool gate (function *) final override { return
> > flag_tree_loop_ivcanon != 0; }
> > +  unsigned int execute (function *fun) final override;
> >  
> >  }; // class pass_iv_canon
> >  
> > @@ -1586,7 +1586,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_complete_unroll
> >  
> > @@ -1644,8 +1644,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize >= 2; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return optimize >= 2; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_complete_unrolli
> >  
> > diff --git a/gcc/tree-ssa-loop-prefetch.cc b/gcc/tree-ssa-loop-
> > prefetch.cc
> > index aebd7c9206f..8f190ae469b 100644
> > --- a/gcc/tree-ssa-loop-prefetch.cc
> > +++ b/gcc/tree-ssa-loop-prefetch.cc
> > @@ -2069,8 +2069,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return
> > flag_prefetch_loop_arrays >
> > 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override
> > +  {
> > +    return flag_prefetch_loop_arrays > 0;
> > +  }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_loop_prefetch
> >  
> > diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-
> > split.cc
> > index b93ee4c8769..d61bad5ba47 100644
> > --- a/gcc/tree-ssa-loop-split.cc
> > +++ b/gcc/tree-ssa-loop-split.cc
> > @@ -1724,8 +1724,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_split_loops != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_split_loops
> > !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_loop_split
> >  
> > diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-
> > unswitch.cc
> > index 2927f308234..3b6486f305a 100644
> > --- a/gcc/tree-ssa-loop-unswitch.cc
> > +++ b/gcc/tree-ssa-loop-unswitch.cc
> > @@ -1035,8 +1035,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_unswitch_loops !=
> > 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return
> > flag_unswitch_loops
> > != 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_tree_unswitch
> >  
> > diff --git a/gcc/tree-ssa-loop.cc b/gcc/tree-ssa-loop.cc
> > index 73aa46627b4..1c058b08c2f 100644
> > --- a/gcc/tree-ssa-loop.cc
> > +++ b/gcc/tree-ssa-loop.cc
> > @@ -67,9 +67,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_loop_optimize;
> > }
> > +  bool gate (function *) final override { return
> > flag_tree_loop_optimize; }
> >  
> > -  virtual unsigned int execute (function *fn);
> > +  unsigned int execute (function *fn) final override;
> >  }; // class pass_fix_loops
> >  
> >  unsigned int
> > @@ -134,7 +134,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fn) { return gate_loop (fn); }
> > +  bool gate (function *fn) final override { return gate_loop (fn);
> > }
> >  
> >  }; // class pass_tree_loop
> >  
> > @@ -189,7 +189,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fn) { return gate_oacc_kernels
> > (fn); }
> > +  bool gate (function *fn) final override { return
> > gate_oacc_kernels
> > (fn); }
> >  
> >  }; // class pass_oacc_kernels
> >  
> > @@ -226,7 +226,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >    {
> >      return (optimize
> >             && flag_openacc
> > @@ -303,7 +303,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fn) { return !gate_loop (fn); }
> > +  bool gate (function *fn) final override { return !gate_loop
> > (fn); }
> >  
> >  }; // class pass_tree_no_loop
> >  
> > @@ -341,7 +341,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_tree_loop_init
> >  
> > @@ -395,8 +395,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_scev_cprop; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return
> > flag_tree_scev_cprop;
> > }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_scev_cprop
> >  
> > @@ -446,8 +446,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_ivopts != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return flag_ivopts != 0;
> > }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_iv_optimize
> >  
> > @@ -503,7 +503,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *) { return
> > tree_ssa_loop_done (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return tree_ssa_loop_done ();
> > +  }
> >  
> >  }; // class pass_tree_loop_done
> >  
> > diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
> > index ce1df01f629..fe9f37b4cd4 100644
> > --- a/gcc/tree-ssa-math-opts.cc
> > +++ b/gcc/tree-ssa-math-opts.cc
> > @@ -920,8 +920,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return optimize &&
> > flag_reciprocal_math; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override
> > +  {
> > +    return optimize && flag_reciprocal_math;
> > +  }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_cse_reciprocals
> >  
> > @@ -2249,14 +2252,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* We no longer require either sincos or cexp, since powi
> > expansion
> >          piggybacks on this pass.  */
> >        return optimize;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_cse_sincos
> >  
> > @@ -4892,12 +4895,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return flag_expensive_optimizations && optimize;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_optimize_widening_mul
> >  
> > diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
> > index 8c9c46d41f1..162ca7098cd 100644
> > --- a/gcc/tree-ssa-phiopt.cc
> > +++ b/gcc/tree-ssa-phiopt.cc
> > @@ -3960,14 +3960,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_phiopt (m_ctxt); }
> > -  void set_pass_param (unsigned n, bool param)
> > +  opt_pass * clone () final override { return new pass_phiopt
> > (m_ctxt); }
> > +  void set_pass_param (unsigned n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        early_p = param;
> >      }
> > -  virtual bool gate (function *) { return flag_ssa_phiopt; }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return flag_ssa_phiopt;
> > }
> > +  unsigned int execute (function *) final override
> >      {
> >        return tree_ssa_phiopt_worker (false,
> >                                      !early_p ? gate_hoist_loads ()
> > :
> > false,
> > @@ -4009,8 +4009,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_cselim; }
> > -  virtual unsigned int execute (function *) { return
> > tree_ssa_cs_elim
> > (); }
> > +  bool gate (function *) final override { return flag_tree_cselim;
> > }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return tree_ssa_cs_elim ();
> > +  }
> >  
> >  }; // class pass_cselim
> >  
> > diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
> > index 7bbfc8c002a..965f1d1c4eb 100644
> > --- a/gcc/tree-ssa-phiprop.cc
> > +++ b/gcc/tree-ssa-phiprop.cc
> > @@ -476,8 +476,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_phiprop; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return
> > flag_tree_phiprop; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_phiprop
> >  
> > diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
> > index 09a5e2055ca..e029bd36da3 100644
> > --- a/gcc/tree-ssa-pre.cc
> > +++ b/gcc/tree-ssa-pre.cc
> > @@ -4339,9 +4339,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      { return flag_tree_pre != 0 || flag_code_hoisting != 0; }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_pre
> >  
> > diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
> > index 406523b5d2f..e13e2cb308d 100644
> > --- a/gcc/tree-ssa-reassoc.cc
> > +++ b/gcc/tree-ssa-reassoc.cc
> > @@ -7132,15 +7132,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_reassoc (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override { return new pass_reassoc
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        insert_powi_p = param;
> >        bias_loop_carried_phi_ranks_p = !param;
> >      }
> > -  virtual bool gate (function *) { return flag_tree_reassoc != 0;
> > }
> > -  virtual unsigned int execute (function *)
> > +  bool gate (function *) final override { return flag_tree_reassoc
> > !=
> > 0; }
> > +  unsigned int execute (function *) final override
> >    {
> >      return execute_reassoc (insert_powi_p,
> > bias_loop_carried_phi_ranks_p);
> >    }
> > diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
> > index ed68557f0b2..18392e031b8 100644
> > --- a/gcc/tree-ssa-sccvn.cc
> > +++ b/gcc/tree-ssa-sccvn.cc
> > @@ -8295,17 +8295,17 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_fre (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override { return new pass_fre
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        may_iterate = param;
> >      }
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return flag_tree_fre != 0 && (may_iterate || optimize > 1);
> >      }
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  private:
> >    bool may_iterate;
> > diff --git a/gcc/tree-ssa-sink.cc b/gcc/tree-ssa-sink.cc
> > index 8ce4403ddc8..7f653a988f4 100644
> > --- a/gcc/tree-ssa-sink.cc
> > +++ b/gcc/tree-ssa-sink.cc
> > @@ -829,10 +829,10 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_sink != 0; }
> > -  virtual unsigned int execute (function *);
> > -  opt_pass *clone (void) { return new pass_sink_code (m_ctxt); }
> > -  void set_pass_param (unsigned n, bool param)
> > +  bool gate (function *) final override { return flag_tree_sink !=
> > 0;
> > }
> > +  unsigned int execute (function *) final override;
> > +  opt_pass *clone (void) final override { return new
> > pass_sink_code
> > (m_ctxt); }
> > +  void set_pass_param (unsigned n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        unsplit_edges = param;
> > diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc
> > index 1d4c0f78fbf..2cceba6f7af 100644
> > --- a/gcc/tree-ssa-strlen.cc
> > +++ b/gcc/tree-ssa-strlen.cc
> > @@ -5962,8 +5962,8 @@ public:
> >      : gimple_opt_pass (pass_data_warn_printf, ctxt)
> >    {}
> >  
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *fun) final override
> >    {
> >      return printf_strlen_execute (fun, true);
> >    }
> > @@ -5999,10 +5999,10 @@ public:
> >      : gimple_opt_pass (pass_data_strlen, ctxt)
> >    {}
> >  
> > -  opt_pass * clone () { return new pass_strlen (m_ctxt); }
> > +  opt_pass * clone () final override { return new pass_strlen
> > (m_ctxt); }
> >  
> > -  virtual bool gate (function *);
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override;
> > +  unsigned int execute (function *fun) final override
> >    {
> >      return printf_strlen_execute (fun, false);
> >    }
> > diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-
> > structalias.cc
> > index 581bdcf5652..dcf13d939bd 100644
> > --- a/gcc/tree-ssa-structalias.cc
> > +++ b/gcc/tree-ssa-structalias.cc
> > @@ -8085,7 +8085,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_pta; }
> > +  bool gate (function *) final override { return flag_tree_pta; }
> >  
> >  }; // class pass_build_alias
> >  
> > @@ -8123,7 +8123,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return flag_tree_pta; }
> > +  bool gate (function *) final override { return flag_tree_pta; }
> >  
> >  }; // class pass_build_ealias
> >  
> > @@ -8737,7 +8737,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (optimize
> >               && flag_ipa_pta
> > @@ -8745,9 +8745,12 @@ public:
> >               && !seen_error ());
> >      }
> >  
> > -  opt_pass * clone () { return new pass_ipa_pta (m_ctxt); }
> > +  opt_pass * clone () final override { return new pass_ipa_pta
> > (m_ctxt); }
> >  
> > -  virtual unsigned int execute (function *) { return
> > ipa_pta_execute
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return ipa_pta_execute ();
> > +  }
> >  
> >  }; // class pass_ipa_pta
> >  
> > diff --git a/gcc/tree-ssa-uncprop.cc b/gcc/tree-ssa-uncprop.cc
> > index aea7d69584f..510f8319d8c 100644
> > --- a/gcc/tree-ssa-uncprop.cc
> > +++ b/gcc/tree-ssa-uncprop.cc
> > @@ -453,9 +453,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_uncprop (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_dom != 0; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new pass_uncprop
> > (m_ctxt); }
> > +  bool gate (function *) final override { return flag_tree_dom !=
> > 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_uncprop
> >  
> > diff --git a/gcc/tree-ssa-uninit.cc b/gcc/tree-ssa-uninit.cc
> > index b48fcf1a8ba..087f0dc965d 100644
> > --- a/gcc/tree-ssa-uninit.cc
> > +++ b/gcc/tree-ssa-uninit.cc
> > @@ -1317,9 +1317,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass *clone () { return new pass_late_warn_uninitialized
> > (m_ctxt); }
> > -  virtual bool gate (function *) { return gate_warn_uninitialized
> > ();
> > }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass *clone () final override
> > +  {
> > +    return new pass_late_warn_uninitialized (m_ctxt);
> > +  }
> > +  bool gate (function *) final override { return
> > gate_warn_uninitialized (); }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_late_warn_uninitialized
> >  
> > @@ -1459,8 +1462,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_warn_uninitialized
> > ();
> > }
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override { return
> > gate_warn_uninitialized (); }
> > +  unsigned int execute (function *fun) final override
> >    {
> >      return execute_early_warn_uninitialized (fun);
> >    }
> > diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
> > index 05536cd2f74..bc22ece636a 100644
> > --- a/gcc/tree-ssanames.cc
> > +++ b/gcc/tree-ssanames.cc
> > @@ -920,7 +920,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_release_ssa_names
> >  
> > diff --git a/gcc/tree-stdarg.cc b/gcc/tree-stdarg.cc
> > index 9038cd43aaa..ed4c8d8c775 100644
> > --- a/gcc/tree-stdarg.cc
> > +++ b/gcc/tree-stdarg.cc
> > @@ -1126,7 +1126,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        /* Always run this pass, in order to expand va_arg
> > internal_fns.  We
> >          also need to do that if fun->stdarg == 0, because a va_arg
> > may
> > also
> > @@ -1135,7 +1135,7 @@ public:
> >        return true;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_stdarg
> >  
> > @@ -1185,12 +1185,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (cfun->curr_properties & PROP_gimple_lva) == 0;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_lower_vaarg
> >  
> > diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-
> > conversion.cc
> > index 50a17927f39..17a31f7a63c 100644
> > --- a/gcc/tree-switch-conversion.cc
> > +++ b/gcc/tree-switch-conversion.cc
> > @@ -2428,8 +2428,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return
> > flag_tree_switch_conversion
> > != 0; }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override
> > +  {
> > +    return flag_tree_switch_conversion != 0;
> > +  }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_convert_switch
> >  
> > @@ -2507,18 +2510,18 @@ public:
> >  
> >    static const pass_data data;
> >    opt_pass *
> > -  clone ()
> > +  clone () final override
> >    {
> >      return new pass_lower_switch<O0> (m_ctxt);
> >    }
> >  
> > -  virtual bool
> > -  gate (function *)
> > +  bool
> > +  gate (function *) final override
> >    {
> >      return !O0 || !optimize;
> >    }
> >  
> > -  virtual unsigned int execute (function *fun);
> > +  unsigned int execute (function *fun) final override;
> >  }; // class pass_lower_switch
> >  
> >  template <bool O0>
> > diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc
> > index 5a3466e5d53..6745d57580b 100644
> > --- a/gcc/tree-tailcall.cc
> > +++ b/gcc/tree-tailcall.cc
> > @@ -1261,9 +1261,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_tail_recursion (m_ctxt); }
> > -  virtual bool gate (function *) { return gate_tail_calls (); }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_tail_recursion (m_ctxt);
> > +  }
> > +  bool gate (function *) final override { return gate_tail_calls
> > (); }
> > +  unsigned int execute (function *) final override
> >      {
> >        return tree_optimize_tail_calls_1 (false);
> >      }
> > @@ -1301,8 +1304,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return gate_tail_calls (); }
> > -  virtual unsigned int execute (function *) { return
> > execute_tail_calls (); }
> > +  bool gate (function *) final override { return gate_tail_calls
> > (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return execute_tail_calls ();
> > +  }
> >  
> >  }; // class pass_tail_calls
> >  
> > diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
> > index d99e3207fbe..d974fd1b7fe 100644
> > --- a/gcc/tree-vect-generic.cc
> > +++ b/gcc/tree-vect-generic.cc
> > @@ -2415,12 +2415,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        return !(fun->curr_properties & PROP_gimple_lvec);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return expand_vector_operations ();
> >      }
> > @@ -2459,8 +2459,11 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_lower_vector_ssa (m_ctxt);
> > }
> > -  virtual unsigned int execute (function *)
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_lower_vector_ssa (m_ctxt);
> > +  }
> > +  unsigned int execute (function *) final override
> >      {
> >        return expand_vector_operations ();
> >      }
> > diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc
> > index a63fa391273..53dc4520963 100644
> > --- a/gcc/tree-vectorizer.cc
> > +++ b/gcc/tree-vectorizer.cc
> > @@ -1193,12 +1193,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *fun)
> > +  bool gate (function *fun) final override
> >      {
> >        return flag_tree_loop_vectorize || fun-
> > > has_force_vectorize_loops;
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_vectorize
> >  
> > @@ -1405,9 +1405,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_simduid_cleanup (m_ctxt);
> > }
> > -  virtual bool gate (function *fun) { return fun-
> > >has_simduid_loops; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override
> > +  {
> > +    return new pass_simduid_cleanup (m_ctxt);
> > +  }
> > +  bool gate (function *fun) final override { return fun-
> > > has_simduid_loops; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_simduid_cleanup
> >  
> > @@ -1463,9 +1466,9 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_slp_vectorize (m_ctxt); }
> > -  virtual bool gate (function *) { return flag_tree_slp_vectorize
> > !=
> > 0; }
> > -  virtual unsigned int execute (function *);
> > +  opt_pass * clone () final override { return new
> > pass_slp_vectorize
> > (m_ctxt); }
> > +  bool gate (function *) final override { return
> > flag_tree_slp_vectorize != 0; }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_slp_vectorize
> >  
> > @@ -1696,12 +1699,15 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return flag_section_anchors && flag_tree_loop_vectorize;
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return
> > increase_alignment (); }
> > +  unsigned int execute (function *) final override
> > +  {
> > +    return increase_alignment ();
> > +  }
> >  
> >  }; // class pass_ipa_increase_alignment
> >  
> > diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
> > index 0784d658567..da0a6d5a8b6 100644
> > --- a/gcc/tree-vrp.cc
> > +++ b/gcc/tree-vrp.cc
> > @@ -4402,14 +4402,14 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_vrp (m_ctxt); }
> > -  void set_pass_param (unsigned int n, bool param)
> > +  opt_pass * clone () final override { return new pass_vrp
> > (m_ctxt); }
> > +  void set_pass_param (unsigned int n, bool param) final override
> >      {
> >        gcc_assert (n == 0);
> >        warn_array_bounds_p = param;
> >      }
> > -  virtual bool gate (function *) { return flag_tree_vrp != 0; }
> > -  virtual unsigned int execute (function *fun)
> > +  bool gate (function *) final override { return flag_tree_vrp !=
> > 0; }
> > +  unsigned int execute (function *fun) final override
> >      {
> >        if ((my_pass == 1 && param_vrp1_mode == VRP_MODE_RANGER)
> >           || (my_pass == 2 && param_vrp2_mode == VRP_MODE_RANGER))
> > diff --git a/gcc/tsan.cc b/gcc/tsan.cc
> > index 02e8ac7cf79..79d4582acd1 100644
> > --- a/gcc/tsan.cc
> > +++ b/gcc/tsan.cc
> > @@ -909,13 +909,13 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  opt_pass * clone () { return new pass_tsan (m_ctxt); }
> > -  virtual bool gate (function *)
> > +  opt_pass * clone () final override { return new pass_tsan
> > (m_ctxt);
> > }
> > +  bool gate (function *) final override
> >  {
> >    return sanitize_flags_p (SANITIZE_THREAD);
> >  }
> >  
> > -  virtual unsigned int execute (function *) { return tsan_pass ();
> > }
> > +  unsigned int execute (function *) final override { return
> > tsan_pass
> > (); }
> >  
> >  }; // class pass_tsan
> >  
> > @@ -950,12 +950,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (sanitize_flags_p (SANITIZE_THREAD) && !optimize);
> >      }
> >  
> > -  virtual unsigned int execute (function *) { return tsan_pass ();
> > }
> > +  unsigned int execute (function *) final override { return
> > tsan_pass
> > (); }
> >  
> >  }; // class pass_tsan_O0
> >  
> > diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc
> > index 6c058142c37..18c75b471f4 100644
> > --- a/gcc/ubsan.cc
> > +++ b/gcc/ubsan.cc
> > @@ -2329,7 +2329,7 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return sanitize_flags_p ((SANITIZE_NULL |
> > SANITIZE_SI_OVERFLOW
> >                                 | SANITIZE_BOOL | SANITIZE_ENUM
> > @@ -2341,7 +2341,7 @@ public:
> >                                 | SANITIZE_BUILTIN));
> >      }
> >  
> > -  virtual unsigned int execute (function *);
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_ubsan
> >  
> > diff --git a/gcc/var-tracking.cc b/gcc/var-tracking.cc
> > index 7c3ad0a55bd..235981d100f 100644
> > --- a/gcc/var-tracking.cc
> > +++ b/gcc/var-tracking.cc
> > @@ -10592,12 +10592,12 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *)
> > +  bool gate (function *) final override
> >      {
> >        return (flag_var_tracking && !targetm.delay_vartrack);
> >      }
> >  
> > -  virtual unsigned int execute (function *)
> > +  unsigned int execute (function *) final override
> >      {
> >        return variable_tracking_main ();
> >      }
> > diff --git a/gcc/vtable-verify.cc b/gcc/vtable-verify.cc
> > index 48f9987082e..24894e7f108 100644
> > --- a/gcc/vtable-verify.cc
> > +++ b/gcc/vtable-verify.cc
> > @@ -818,8 +818,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return (flag_vtable_verify); }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return
> > (flag_vtable_verify);
> > }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_vtable_verify
> >  
> > diff --git a/gcc/web.cc b/gcc/web.cc
> > index a5874a98825..bd0ec94f1f4 100644
> > --- a/gcc/web.cc
> > +++ b/gcc/web.cc
> > @@ -323,8 +323,8 @@ public:
> >    {}
> >  
> >    /* opt_pass methods: */
> > -  virtual bool gate (function *) { return (optimize > 0 &&
> > flag_web);
> > }
> > -  virtual unsigned int execute (function *);
> > +  bool gate (function *) final override { return (optimize > 0 &&
> > flag_web); }
> > +  unsigned int execute (function *) final override;
> >  
> >  }; // class pass_web
> >  
>
  
Jeff Law June 24, 2022, 6:45 p.m. UTC | #3
On 6/24/2022 12:08 PM, David Malcolm via Gcc-patches wrote:
> On Mon, 2022-06-13 at 14:22 -0400, David Malcolm wrote:
>> Ping for this patch:
>>    https://gcc.gnu.org/pipermail/gcc-patches/2022-May/595444.html
>>
>> OK for trunk?
Sorry, I though the series had been approved at some point.   In 
general, adding final/override and removing redundant virtuals should be 
considered trivial IMHO.

So just to be clear, OK for the trunk.

jeff
  
David Malcolm June 27, 2022, 9:16 p.m. UTC | #4
On Fri, 2022-06-24 at 12:45 -0600, Jeff Law via Gcc-patches wrote:
> 
> 
> On 6/24/2022 12:08 PM, David Malcolm via Gcc-patches wrote:
> > On Mon, 2022-06-13 at 14:22 -0400, David Malcolm wrote:
> > > Ping for this patch:
> > >    https://gcc.gnu.org/pipermail/gcc-patches/2022-May/595444.html
> > > 
> > > OK for trunk?
> Sorry, I though the series had been approved at some point.   In 
> general, adding final/override and removing redundant virtuals should
> be 
> considered trivial IMHO.
> 
> So just to be clear, OK for the trunk.

Thanks; I've pushed the remaining patches as r13-1305-g725793af78064f
through r13-1310-g26f77c4d19b827.

I had to do some minor refreshing of the patches against trunk to avoid
conflicts; I bootstrapped and regression-tested the result on x86_64-
pc-linux-gnu before pushing.

Dave
  

Patch

diff --git a/gcc/adjust-alignment.cc b/gcc/adjust-alignment.cc
index 2db41e8b4c8..5c5f8f4e5c0 100644
--- a/gcc/adjust-alignment.cc
+++ b/gcc/adjust-alignment.cc
@@ -50,7 +50,7 @@  public:
     : gimple_opt_pass (pass_data_adjust_alignment, ctxt)
   {}
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 }; // class pass_adjust_alignment
 
 } // anon namespace
diff --git a/gcc/asan.cc b/gcc/asan.cc
index 4b583e54efd..5df333555ea 100644
--- a/gcc/asan.cc
+++ b/gcc/asan.cc
@@ -4209,9 +4209,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_asan (m_ctxt); }
-  virtual bool gate (function *) { return gate_asan () || gate_hwasan (); }
-  virtual unsigned int execute (function *) { return asan_instrument (); }
+  opt_pass * clone () final override { return new pass_asan (m_ctxt); }
+  bool gate (function *) final override
+  {
+    return gate_asan () || gate_hwasan ();
+  }
+  unsigned int execute (function *) final override
+  {
+    return asan_instrument ();
+  }
 
 }; // class pass_asan
 
@@ -4246,11 +4252,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return !optimize && (gate_asan () || gate_hwasan ());
     }
-  virtual unsigned int execute (function *) { return asan_instrument (); }
+  unsigned int execute (function *) final override
+  {
+    return asan_instrument ();
+  }
 
 }; // class pass_asan_O0
 
diff --git a/gcc/auto-inc-dec.cc b/gcc/auto-inc-dec.cc
index 85fe9d14950..481e7af6895 100644
--- a/gcc/auto-inc-dec.cc
+++ b/gcc/auto-inc-dec.cc
@@ -1692,7 +1692,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       if (!AUTO_INC_DEC)
 	return false;
@@ -1701,7 +1701,7 @@  public:
     }
 
 
-  unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_inc_dec
 
diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc
index 2b34b80b82d..6533722817f 100644
--- a/gcc/auto-profile.cc
+++ b/gcc/auto-profile.cc
@@ -1752,13 +1752,13 @@  public:
   }
 
   /* opt_pass methods: */
-  virtual bool
-  gate (function *)
+  bool
+  gate (function *) final override
   {
     return flag_auto_profile;
   }
-  virtual unsigned int
-  execute (function *)
+  unsigned int
+  execute (function *) final override
   {
     return autofdo::auto_profile ();
   }
diff --git a/gcc/bb-reorder.cc b/gcc/bb-reorder.cc
index d20ccb83aa6..bdbe2e9ea7a 100644
--- a/gcc/bb-reorder.cc
+++ b/gcc/bb-reorder.cc
@@ -2633,7 +2633,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       if (targetm.cannot_modify_jumps_p ())
 	return false;
@@ -2641,7 +2641,7 @@  public:
 	      && (flag_reorder_blocks || flag_reorder_blocks_and_partition));
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_reorder_blocks
 
@@ -2794,8 +2794,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
 }; // class pass_duplicate_computed_gotos
 
@@ -2937,8 +2937,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
 }; // class pass_partition_blocks
 
diff --git a/gcc/cfgcleanup.cc b/gcc/cfgcleanup.cc
index 335af4911bb..18047da7b24 100644
--- a/gcc/cfgcleanup.cc
+++ b/gcc/cfgcleanup.cc
@@ -3227,7 +3227,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_jump
 
@@ -3274,11 +3274,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return flag_thread_jumps && flag_expensive_optimizations;
   }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_jump_after_combine
 
@@ -3322,7 +3322,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
       return 0;
diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index bb33c1b939e..1d7f6b260d0 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -6573,7 +6573,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_expand
 
diff --git a/gcc/cfgrtl.cc b/gcc/cfgrtl.cc
index 06be46d75df..9a4651f61a3 100644
--- a/gcc/cfgrtl.cc
+++ b/gcc/cfgrtl.cc
@@ -483,7 +483,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_free_cfg
 
@@ -3698,7 +3698,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       cfg_layout_initialize (0);
       return 0;
@@ -3737,7 +3737,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_outof_cfg_layout_mode
 
diff --git a/gcc/cgraphbuild.cc b/gcc/cgraphbuild.cc
index fdd17aa5a2d..bae44591a29 100644
--- a/gcc/cgraphbuild.cc
+++ b/gcc/cgraphbuild.cc
@@ -290,7 +290,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_build_cgraph_edges
 
@@ -484,8 +484,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_rebuild_cgraph_edges (m_ctxt); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_rebuild_cgraph_edges (m_ctxt);
+  }
+  unsigned int execute (function *) final override
   {
     return cgraph_edge::rebuild_edges ();
   }
@@ -524,10 +527,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () {
+  opt_pass * clone () final override {
     return new pass_remove_cgraph_callee_edges (m_ctxt);
   }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_remove_cgraph_callee_edges
 
diff --git a/gcc/combine-stack-adj.cc b/gcc/combine-stack-adj.cc
index e8ba2717063..e76d60a8f7e 100644
--- a/gcc/combine-stack-adj.cc
+++ b/gcc/combine-stack-adj.cc
@@ -823,8 +823,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_stack_adjustments ();
     }
diff --git a/gcc/combine.cc b/gcc/combine.cc
index 9a34ef847aa..a8305273e44 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -15015,8 +15015,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return (optimize > 0); }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return (optimize > 0); }
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_combine ();
     }
diff --git a/gcc/compare-elim.cc b/gcc/compare-elim.cc
index 985c0c92182..e869d9d3249 100644
--- a/gcc/compare-elim.cc
+++ b/gcc/compare-elim.cc
@@ -954,7 +954,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Setting this target hook value is how a backend indicates the need.  */
       if (targetm.flags_regnum == INVALID_REGNUM)
@@ -962,7 +962,7 @@  public:
       return flag_compare_elim_after_reload;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_compare_elim_after_reload ();
     }
diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 6fe41c3c24f..24e8336689c 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -1873,13 +1873,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return TARGET_AVX && TARGET_VZEROUPPER
 	&& flag_expensive_optimizations && !optimize_size;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_insert_vzeroupper ();
     }
@@ -1908,23 +1908,23 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return ((!timode_p || TARGET_64BIT)
 	      && TARGET_STV && TARGET_SSE2 && optimize > 1);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return convert_scalars_to_vector (timode_p);
     }
 
-  opt_pass *clone ()
+  opt_pass *clone () final override
     {
       return new pass_stv (m_ctxt);
     }
 
-  void set_pass_param (unsigned int n, bool param)
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       timode_p = param;
@@ -2135,14 +2135,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       need_endbr = (flag_cf_protection & CF_BRANCH) != 0;
       patchable_area_size = crtl->patch_area_size - crtl->patch_area_entry;
       return need_endbr || patchable_area_size;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       timevar_push (TV_MACH_DEP);
       rest_of_insert_endbr_and_patchable_area (need_endbr,
@@ -2399,7 +2399,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (TARGET_AVX
 	      && TARGET_SSE_PARTIAL_REG_DEPENDENCY
@@ -2408,7 +2408,7 @@  public:
 	      && optimize_function_for_speed_p (cfun));
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return remove_partial_avx_dependency ();
     }
diff --git a/gcc/coroutine-passes.cc b/gcc/coroutine-passes.cc
index 7b9a97af5a2..21ac9469805 100644
--- a/gcc/coroutine-passes.cc
+++ b/gcc/coroutine-passes.cc
@@ -213,9 +213,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_coroutines; };
+  bool gate (function *) final override { return flag_coroutines; };
 
-  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
+  unsigned int execute (function *f ATTRIBUTE_UNUSED) final override
   {
     return execute_lower_coro_builtins ();
   }
@@ -511,12 +511,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *f)
+  bool gate (function *f) final override
     {
       return flag_coroutines && f->coroutine_component;
     }
 
-  virtual unsigned int execute (function *f ATTRIBUTE_UNUSED)
+  unsigned int execute (function *f ATTRIBUTE_UNUSED) final override
   {
     return execute_early_expand_coro_ifns ();
   }
diff --git a/gcc/cprop.cc b/gcc/cprop.cc
index cf01c2d79a9..580f811545d 100644
--- a/gcc/cprop.cc
+++ b/gcc/cprop.cc
@@ -1953,15 +1953,18 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_rtl_cprop (m_ctxt); }
-  virtual bool gate (function *fun)
+  opt_pass * clone () final override { return new pass_rtl_cprop (m_ctxt); }
+  bool gate (function *fun) final override
     {
       return optimize > 0 && flag_gcse
 	&& !fun->calls_setjmp
 	&& dbg_cnt (cprop);
     }
 
-  virtual unsigned int execute (function *) { return execute_rtl_cprop (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_rtl_cprop ();
+  }
 
 }; // class pass_rtl_cprop
 
diff --git a/gcc/cse.cc b/gcc/cse.cc
index a18b599d324..b13afd4ba72 100644
--- a/gcc/cse.cc
+++ b/gcc/cse.cc
@@ -7571,8 +7571,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize > 0; }
-  virtual unsigned int execute (function *) { return rest_of_handle_cse (); }
+  bool gate (function *) final override { return optimize > 0; }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_cse ();
+  }
 
 }; // class pass_cse
 
@@ -7642,12 +7645,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_rerun_cse_after_loop;
     }
 
-  virtual unsigned int execute (function *) { return rest_of_handle_cse2 (); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_cse2 ();
+  }
 
 }; // class pass_cse2
 
@@ -7715,12 +7721,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_rerun_cse_after_global_opts;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_cse_after_global_opts ();
     }
diff --git a/gcc/dce.cc b/gcc/dce.cc
index 6676cbcd429..64aa0aa471d 100644
--- a/gcc/dce.cc
+++ b/gcc/dce.cc
@@ -849,12 +849,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 1 && flag_dce && dbg_cnt (dce_ud);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_ud_dce ();
     }
@@ -1280,12 +1280,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_dce && dbg_cnt (dce_fast);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_fast_dce ();
     }
diff --git a/gcc/df-core.cc b/gcc/df-core.cc
index a901b84878f..97b2bbf6d2b 100644
--- a/gcc/df-core.cc
+++ b/gcc/df-core.cc
@@ -741,8 +741,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize > 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return optimize > 0; }
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_df_initialize ();
     }
@@ -781,8 +781,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize == 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return optimize == 0; }
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_df_initialize ();
     }
@@ -848,7 +848,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_df_finish ();
     }
diff --git a/gcc/dse.cc b/gcc/dse.cc
index 30c11cee034..83c572f6220 100644
--- a/gcc/dse.cc
+++ b/gcc/dse.cc
@@ -3747,12 +3747,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_dse && dbg_cnt (dse1);
     }
 
-  virtual unsigned int execute (function *) { return rest_of_handle_dse (); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_dse ();
+  }
 
 }; // class pass_rtl_dse1
 
@@ -3787,12 +3790,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_dse && dbg_cnt (dse2);
     }
 
-  virtual unsigned int execute (function *) { return rest_of_handle_dse (); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_dse ();
+  }
 
 }; // class pass_rtl_dse2
 
diff --git a/gcc/dwarf2cfi.cc b/gcc/dwarf2cfi.cc
index ab7c5cc5b27..bef3165e691 100644
--- a/gcc/dwarf2cfi.cc
+++ b/gcc/dwarf2cfi.cc
@@ -3788,8 +3788,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return execute_dwarf2_frame (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return execute_dwarf2_frame ();
+  }
 
 }; // class pass_dwarf2_frame
 
diff --git a/gcc/early-remat.cc b/gcc/early-remat.cc
index 2738892b4e7..5c368293c35 100644
--- a/gcc/early-remat.cc
+++ b/gcc/early-remat.cc
@@ -2615,12 +2615,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return optimize > 1 && NUM_POLY_INT_COEFFS > 1;
   }
 
-  virtual unsigned int execute (function *f)
+  unsigned int execute (function *f) final override
   {
     auto_sbitmap selected_modes (NUM_MACHINE_MODES);
     bitmap_clear (selected_modes);
diff --git a/gcc/except.cc b/gcc/except.cc
index b94de425557..7d7ce40c846 100644
--- a/gcc/except.cc
+++ b/gcc/except.cc
@@ -2047,7 +2047,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return set_nothrow_function_flags ();
     }
@@ -2722,8 +2722,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       int ret = convert_to_eh_region_ranges ();
       maybe_add_nop_after_section_switch ();
diff --git a/gcc/final.cc b/gcc/final.cc
index a9868861bd2..81e21cb8db6 100644
--- a/gcc/final.cc
+++ b/gcc/final.cc
@@ -808,7 +808,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return compute_alignments (); }
+  unsigned int execute (function *) final override
+  {
+    return compute_alignments ();
+  }
 
 }; // class pass_compute_alignments
 
@@ -4360,7 +4363,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return rest_of_handle_final (); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_final ();
+  }
 
 }; // class pass_final
 
@@ -4404,7 +4410,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_shorten_branches ();
     }
@@ -4579,7 +4585,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_clean_state ();
     }
diff --git a/gcc/function.cc b/gcc/function.cc
index ad0096a43ef..0c3e4fffb05 100644
--- a/gcc/function.cc
+++ b/gcc/function.cc
@@ -2029,7 +2029,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return instantiate_virtual_regs ();
     }
@@ -6516,7 +6516,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_check_leaf_regs ();
     }
@@ -6617,7 +6617,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_thread_prologue_and_epilogue ();
     }
@@ -6655,7 +6655,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_zero_call_used_regs
 
@@ -6926,7 +6926,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_match_asm_constraints
 
diff --git a/gcc/fwprop.cc b/gcc/fwprop.cc
index d12fc2f34ac..fc652ab9a1f 100644
--- a/gcc/fwprop.cc
+++ b/gcc/fwprop.cc
@@ -1029,8 +1029,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_fwprop (); }
-  virtual unsigned int execute (function *) { return fwprop (false); }
+  bool gate (function *) final override { return gate_fwprop (); }
+  unsigned int execute (function *) final override { return fwprop (false); }
 
 }; // class pass_rtl_fwprop
 
@@ -1065,8 +1065,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_fwprop (); }
-  virtual unsigned int execute (function *) { return fwprop (true); }
+  bool gate (function *) final override { return gate_fwprop (); }
+  unsigned int execute (function *) final override { return fwprop (true); }
 
 }; // class pass_rtl_fwprop_addr
 
diff --git a/gcc/gcse.cc b/gcc/gcse.cc
index b67353143a2..f06278a5534 100644
--- a/gcc/gcse.cc
+++ b/gcc/gcse.cc
@@ -4049,8 +4049,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return execute_rtl_pre (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *)  final override
+  {
+    return execute_rtl_pre ();
+  }
 
 }; // class pass_rtl_pre
 
@@ -4099,8 +4102,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return execute_rtl_hoist (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return execute_rtl_hoist ();
+  }
 
 }; // class pass_rtl_hoist
 
diff --git a/gcc/gimple-harden-conditionals.cc b/gcc/gimple-harden-conditionals.cc
index 79c0a5784ba..4ca6776fca7 100644
--- a/gcc/gimple-harden-conditionals.cc
+++ b/gcc/gimple-harden-conditionals.cc
@@ -71,11 +71,15 @@  public:
   pass_harden_compares (gcc::context *ctxt)
     : gimple_opt_pass (pass_data_harden_compares, ctxt)
   {}
-  opt_pass *clone () { return new pass_harden_compares (m_ctxt); }
-  virtual bool gate (function *) {
+  opt_pass *clone ()  final override
+  {
+    return new pass_harden_compares (m_ctxt);
+  }
+  bool gate (function *) final override
+  {
     return flag_harden_compares;
   }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 };
 
 /* Define a pass to harden conditionals in branches.  This pass must
@@ -102,11 +106,15 @@  public:
   pass_harden_conditional_branches (gcc::context *ctxt)
     : gimple_opt_pass (pass_data_harden_conditional_branches, ctxt)
   {}
-  opt_pass *clone () { return new pass_harden_conditional_branches (m_ctxt); }
-  virtual bool gate (function *) {
+  opt_pass *clone () final override
+  {
+    return new pass_harden_conditional_branches (m_ctxt);
+  }
+  bool gate (function *) final override
+  {
     return flag_harden_conditional_branches;
   }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 };
 
 }
diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
index 5dcfe5b77e0..c89aef34381 100644
--- a/gcc/gimple-if-to-switch.cc
+++ b/gcc/gimple-if-to-switch.cc
@@ -478,13 +478,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return (jump_table_cluster::is_enabled ()
 	    || bit_test_cluster::is_enabled ());
   }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_if_to_switch
 
diff --git a/gcc/gimple-isel.cc b/gcc/gimple-isel.cc
index 44d086d8b28..aa9c1290735 100644
--- a/gcc/gimple-isel.cc
+++ b/gcc/gimple-isel.cc
@@ -355,12 +355,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return true;
     }
 
-  virtual unsigned int execute (function *fun)
+  unsigned int execute (function *fun) final override
     {
       return gimple_expand_vec_exprs (fun);
     }
diff --git a/gcc/gimple-laddress.cc b/gcc/gimple-laddress.cc
index 13c7858e161..11754dac5c3 100644
--- a/gcc/gimple-laddress.cc
+++ b/gcc/gimple-laddress.cc
@@ -66,9 +66,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_laddress (m_ctxt); }
-  virtual bool gate (function *) { return optimize != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_laddress (m_ctxt); }
+  bool gate (function *) final override { return optimize != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_laddress
 
diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc
index 53adc02acc2..5f59730be4c 100644
--- a/gcc/gimple-loop-interchange.cc
+++ b/gcc/gimple-loop-interchange.cc
@@ -1703,9 +1703,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_linterchange (m_ctxt); }
-  virtual bool gate (function *) { return flag_loop_interchange; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_linterchange (m_ctxt); }
+  bool gate (function *) final override { return flag_loop_interchange; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_linterchange
 
diff --git a/gcc/gimple-loop-jam.cc b/gcc/gimple-loop-jam.cc
index e33dd9091df..9b18b52a54c 100644
--- a/gcc/gimple-loop-jam.cc
+++ b/gcc/gimple-loop-jam.cc
@@ -641,8 +641,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_unroll_jam != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_unroll_jam != 0; }
+  unsigned int execute (function *) final override;
 
 };
 
diff --git a/gcc/gimple-loop-versioning.cc b/gcc/gimple-loop-versioning.cc
index ab02bdd4b15..6bcf6eba691 100644
--- a/gcc/gimple-loop-versioning.cc
+++ b/gcc/gimple-loop-versioning.cc
@@ -1782,8 +1782,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_version_loops_for_strides; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override
+  {
+    return flag_version_loops_for_strides;
+  }
+  unsigned int execute (function *) final override;
 };
 
 unsigned int
diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc
index 2ec19d5657d..4cd27dd19b0 100644
--- a/gcc/gimple-low.cc
+++ b/gcc/gimple-low.cc
@@ -192,7 +192,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return lower_function_body (); }
+  unsigned int execute (function *) final override
+  {
+    return lower_function_body ();
+  }
 
 }; // class pass_lower_cf
 
diff --git a/gcc/gimple-ssa-backprop.cc b/gcc/gimple-ssa-backprop.cc
index 74f98111256..55986ddbfe3 100644
--- a/gcc/gimple-ssa-backprop.cc
+++ b/gcc/gimple-ssa-backprop.cc
@@ -945,9 +945,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_backprop (m_ctxt); }
-  virtual bool gate (function *) { return flag_ssa_backprop; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_backprop (m_ctxt); }
+  bool gate (function *) final override { return flag_ssa_backprop; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_backprop
 
diff --git a/gcc/gimple-ssa-evrp.cc b/gcc/gimple-ssa-evrp.cc
index 20388ed5431..793a3ea1f19 100644
--- a/gcc/gimple-ssa-evrp.cc
+++ b/gcc/gimple-ssa-evrp.cc
@@ -377,12 +377,12 @@  public:
     {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_early_vrp (m_ctxt); }
-  virtual bool gate (function *)
+  opt_pass * clone () final override { return new pass_early_vrp (m_ctxt); }
+  bool gate (function *) final override
     {
       return flag_tree_vrp != 0;
     }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     { return execute_early_vrp (); }
 
 }; // class pass_vrp
diff --git a/gcc/gimple-ssa-isolate-paths.cc b/gcc/gimple-ssa-isolate-paths.cc
index cc0ed9760a0..87ecd19ef4a 100644
--- a/gcc/gimple-ssa-isolate-paths.cc
+++ b/gcc/gimple-ssa-isolate-paths.cc
@@ -969,8 +969,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_isolate_erroneous_paths (m_ctxt); }
-  virtual bool gate (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_isolate_erroneous_paths (m_ctxt);
+  }
+  bool gate (function *) final override
     {
       /* If we do not have a suitable builtin function for the trap statement,
 	 then do not perform the optimization.  */
@@ -979,7 +982,7 @@  public:
 	      || warn_null_dereference);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return gimple_ssa_isolate_erroneous_paths ();
     }
diff --git a/gcc/gimple-ssa-nonnull-compare.cc b/gcc/gimple-ssa-nonnull-compare.cc
index cc52b914258..f9ce8c7a083 100644
--- a/gcc/gimple-ssa-nonnull-compare.cc
+++ b/gcc/gimple-ssa-nonnull-compare.cc
@@ -126,9 +126,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return warn_nonnull_compare; }
+  bool gate (function *) final override { return warn_nonnull_compare; }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_warn_nonnull_compare
 
diff --git a/gcc/gimple-ssa-split-paths.cc b/gcc/gimple-ssa-split-paths.cc
index 6abe1d51400..f2e43e52c95 100644
--- a/gcc/gimple-ssa-split-paths.cc
+++ b/gcc/gimple-ssa-split-paths.cc
@@ -579,9 +579,12 @@  class pass_split_paths : public gimple_opt_pass
       : gimple_opt_pass (pass_data_split_paths, ctxt)
     {}
    /* opt_pass methods: */
-   opt_pass * clone () { return new pass_split_paths (m_ctxt); }
-   virtual bool gate (function *) { return gate_split_paths (); }
-   virtual unsigned int execute (function *) { return execute_split_paths (); }
+  opt_pass * clone () final override { return new pass_split_paths (m_ctxt); }
+  bool gate (function *) final override { return gate_split_paths (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_split_paths ();
+  }
 
 }; // class pass_split_paths
 
diff --git a/gcc/gimple-ssa-store-merging.cc b/gcc/gimple-ssa-store-merging.cc
index b952ce57917..0640168bcc4 100644
--- a/gcc/gimple-ssa-store-merging.cc
+++ b/gcc/gimple-ssa-store-merging.cc
@@ -1037,12 +1037,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return flag_expensive_optimizations && optimize && BITS_PER_UNIT == 8;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_optimize_bswap
 
@@ -2433,8 +2433,8 @@  public:
   /* Pass not supported for PDP-endian, nor for insane hosts or
      target character sizes where native_{encode,interpret}_expr
      doesn't work properly.  */
-  virtual bool
-  gate (function *)
+  bool
+  gate (function *) final override
   {
     return flag_store_merging
 	   && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN
@@ -2442,7 +2442,7 @@  public:
 	   && BITS_PER_UNIT == 8;
   }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 private:
   hash_map<tree_operand_hash, class imm_store_chain_info *> m_stores;
diff --git a/gcc/gimple-ssa-strength-reduction.cc b/gcc/gimple-ssa-strength-reduction.cc
index dad73d31874..2b559e96fc8 100644
--- a/gcc/gimple-ssa-strength-reduction.cc
+++ b/gcc/gimple-ssa-strength-reduction.cc
@@ -4002,8 +4002,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_slsr; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_tree_slsr; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_strength_reduction
 
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index 9357a4e576a..1f70cbdb884 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -2069,13 +2069,13 @@  class pass_waccess : public gimple_opt_pass
 
   ~pass_waccess ();
 
-  opt_pass *clone ();
+  opt_pass *clone () final override;
 
-  virtual bool gate (function *);
+  bool gate (function *) final override;
 
-  void set_pass_param (unsigned, bool);
+  void set_pass_param (unsigned, bool) final override;
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 private:
   /* Not copyable or assignable.  */
diff --git a/gcc/gimple-ssa-warn-alloca.cc b/gcc/gimple-ssa-warn-alloca.cc
index 273b88ec141..83a241a3a4b 100644
--- a/gcc/gimple-ssa-warn-alloca.cc
+++ b/gcc/gimple-ssa-warn-alloca.cc
@@ -58,8 +58,8 @@  public:
   pass_walloca (gcc::context *ctxt)
     : gimple_opt_pass(pass_data_walloca, ctxt), xlimit_certain_p (false)
   {}
-  opt_pass *clone () { return new pass_walloca (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass *clone () final override { return new pass_walloca (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       // Set to true to enable only warnings for alloca calls that
@@ -69,8 +69,8 @@  public:
       // the "may be too large" kind.
       xlimit_certain_p = param;
     }
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
  private:
   // Set to TRUE the first time we run this pass on a function.
diff --git a/gcc/gimple-ssa-warn-restrict.cc b/gcc/gimple-ssa-warn-restrict.cc
index b678e806da3..2a1afcbb0fc 100644
--- a/gcc/gimple-ssa-warn-restrict.cc
+++ b/gcc/gimple-ssa-warn-restrict.cc
@@ -64,8 +64,8 @@  class pass_wrestrict : public gimple_opt_pass
  public:
   pass_wrestrict (gcc::context *);
 
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
   void check_call (gimple *);
 
diff --git a/gcc/gimple-warn-recursion.cc b/gcc/gimple-warn-recursion.cc
index 91a3cdbacd4..9b04899cf78 100644
--- a/gcc/gimple-warn-recursion.cc
+++ b/gcc/gimple-warn-recursion.cc
@@ -52,9 +52,9 @@  public:
   pass_warn_recursion (gcc::context *);
 
 private:
-  virtual bool gate (function *) { return warn_infinite_recursion; }
+  bool gate (function *) final override { return warn_infinite_recursion; }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
   bool find_function_exit (basic_block);
 
diff --git a/gcc/graphite.cc b/gcc/graphite.cc
index ab8683b5b41..a88b13c0219 100644
--- a/gcc/graphite.cc
+++ b/gcc/graphite.cc
@@ -574,7 +574,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_graphite_transforms (); }
+  bool gate (function *) final override { return gate_graphite_transforms (); }
 
 }; // class pass_graphite
 
@@ -609,8 +609,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_graphite_transforms (); }
-  virtual unsigned int execute (function *fun) { return graphite_transforms (fun); }
+  bool gate (function *) final override { return gate_graphite_transforms (); }
+  unsigned int execute (function *fun) final override
+  {
+    return graphite_transforms (fun);
+  }
 
 }; // class pass_graphite_transforms
 
diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc
index b983e87389f..28b153cf2ae 100644
--- a/gcc/ifcvt.cc
+++ b/gcc/ifcvt.cc
@@ -5933,12 +5933,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize > 0) && dbg_cnt (if_conversion);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_if_conversion ();
     }
@@ -5980,13 +5980,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_if_conversion
 	&& dbg_cnt (if_after_combine);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       if_convert (true);
       return 0;
@@ -6026,13 +6026,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return optimize > 0 && flag_if_conversion2
 	&& dbg_cnt (if_after_reload);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       if_convert (true);
       return 0;
diff --git a/gcc/init-regs.cc b/gcc/init-regs.cc
index 220ef705997..652befefdaa 100644
--- a/gcc/init-regs.cc
+++ b/gcc/init-regs.cc
@@ -153,8 +153,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize > 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return optimize > 0; }
+  unsigned int execute (function *) final override
     {
       initialize_uninitialized_regs ();
       return 0;
diff --git a/gcc/ipa-comdats.cc b/gcc/ipa-comdats.cc
index 566faf3cc1f..da792065ed3 100644
--- a/gcc/ipa-comdats.cc
+++ b/gcc/ipa-comdats.cc
@@ -420,8 +420,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return ipa_comdats (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override { return ipa_comdats (); }
 
 }; // class pass_ipa_comdats
 
diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index 152fe7244f7..38a21b17e39 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -6659,14 +6659,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* FIXME: We should remove the optimize check after we ensure we never run
 	 IPA passes when not optimizing.  */
       return (flag_ipa_cp && optimize) || in_lto_p;
     }
 
-  virtual unsigned int execute (function *) { return ipcp_driver (); }
+  unsigned int execute (function *) final override { return ipcp_driver (); }
 
 }; // class pass_ipa_cp
 
diff --git a/gcc/ipa-devirt.cc b/gcc/ipa-devirt.cc
index 9f1442dc3cc..412ca14f66b 100644
--- a/gcc/ipa-devirt.cc
+++ b/gcc/ipa-devirt.cc
@@ -3969,7 +3969,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* In LTO, always run the IPA passes and decide on function basis if the
 	 pass is enabled.  */
@@ -3982,7 +3982,7 @@  public:
 	      && optimize);
     }
 
-  virtual unsigned int execute (function *) { return ipa_devirt (); }
+  unsigned int execute (function *) final override { return ipa_devirt (); }
 
 }; // class pass_ipa_devirt
 
@@ -4361,12 +4361,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (in_lto_p || flag_lto);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return 0;
     }
diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc
index b12e7a1124d..832794fd5dc 100644
--- a/gcc/ipa-fnsummary.cc
+++ b/gcc/ipa-fnsummary.cc
@@ -4846,8 +4846,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_local_fn_summary (m_ctxt);
+  }
+  unsigned int execute (function *) final override
     {
       return compute_fn_summary_for_current ();
     }
@@ -4889,14 +4892,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass *clone () { return new pass_ipa_free_fn_summary (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass *clone () final override
+  {
+    return new pass_ipa_free_fn_summary (m_ctxt);
+  }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       small_p = param;
     }
-  virtual bool gate (function *) { return true; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return true; }
+  unsigned int execute (function *) final override
     {
       ipa_free_fn_summary ();
       /* Free ipa-prop structures if they are no longer needed.  */
@@ -4950,7 +4956,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return 0; }
+  unsigned int execute (function *) final override { return 0; }
 
 }; // class pass_ipa_fn_summary
 
diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc
index f99f7be1c58..ccdbf849c25 100644
--- a/gcc/ipa-free-lang-data.cc
+++ b/gcc/ipa-free-lang-data.cc
@@ -1173,7 +1173,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return free_lang_data (); }
+  unsigned int execute (function *) final override { return free_lang_data (); }
 
 }; // class pass_ipa_free_lang_data
 
diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index 765ae746745..a8a162268ee 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -3637,12 +3637,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return in_lto_p || flag_ipa_icf_variables || flag_ipa_icf_functions;
   }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
   {
     return ipa_icf_driver();
   }
diff --git a/gcc/ipa-inline.cc b/gcc/ipa-inline.cc
index 22a009b7435..14969198cde 100644
--- a/gcc/ipa-inline.cc
+++ b/gcc/ipa-inline.cc
@@ -3100,7 +3100,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_early_inline
 
@@ -3150,7 +3150,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return ipa_inline (); }
+  unsigned int execute (function *) final override { return ipa_inline (); }
 
 }; // class pass_ipa_inline
 
diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc
index 556816ab429..7c1f974bc7a 100644
--- a/gcc/ipa-modref.cc
+++ b/gcc/ipa-modref.cc
@@ -3508,15 +3508,15 @@  class pass_modref : public gimple_opt_pass
 	: gimple_opt_pass (pass_data_modref, ctxt) {}
 
     /* opt_pass methods: */
-    opt_pass *clone ()
+    opt_pass *clone () final override
     {
       return new pass_modref (m_ctxt);
     }
-    virtual bool gate (function *)
+    bool gate (function *) final override
     {
       return flag_ipa_modref;
     }
-    virtual unsigned int execute (function *);
+    unsigned int execute (function *) final override;
 };
 
 /* Encode TT to the output block OB using the summary streaming API.  */
@@ -4170,12 +4170,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass *clone () { return new pass_ipa_modref (m_ctxt); }
-  virtual bool gate (function *)
+  opt_pass *clone () final override { return new pass_ipa_modref (m_ctxt); }
+  bool gate (function *) final override
   {
     return true;
   }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 };
 
diff --git a/gcc/ipa-profile.cc b/gcc/ipa-profile.cc
index b74d77f2c95..496f292acba 100644
--- a/gcc/ipa-profile.cc
+++ b/gcc/ipa-profile.cc
@@ -1053,8 +1053,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_ipa_profile || in_lto_p; }
-  virtual unsigned int execute (function *) { return ipa_profile (); }
+  bool gate (function *) final override { return flag_ipa_profile || in_lto_p; }
+  unsigned int execute (function *) final override { return ipa_profile (); }
 
 }; // class pass_ipa_profile
 
diff --git a/gcc/ipa-pure-const.cc b/gcc/ipa-pure-const.cc
index 2b4950a5969..0e55fc4bfc5 100644
--- a/gcc/ipa-pure-const.cc
+++ b/gcc/ipa-pure-const.cc
@@ -168,8 +168,8 @@  public:
   pass_ipa_pure_const(gcc::context *ctxt);
 
   /* opt_pass methods: */
-  bool gate (function *) { return gate_pure_const (); }
-  unsigned int execute (function *fun);
+  bool gate (function *) final override { return gate_pure_const (); }
+  unsigned int execute (function *fun) final override;
 
   void register_hooks (void);
 
@@ -2154,9 +2154,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_local_pure_const (m_ctxt); }
-  virtual bool gate (function *) { return gate_pure_const (); }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override
+  {
+    return new pass_local_pure_const (m_ctxt);
+  }
+  bool gate (function *) final override { return gate_pure_const (); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_local_pure_const
 
@@ -2270,8 +2273,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return warn_suggest_attribute_noreturn; }
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override
+  {
+    return warn_suggest_attribute_noreturn;
+  }
+  unsigned int execute (function *fun) final override
     {
       if (!TREE_THIS_VOLATILE (current_function_decl)
 	  && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) == 0)
@@ -2316,9 +2322,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_nothrow (m_ctxt); }
-  virtual bool gate (function *) { return optimize; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_nothrow (m_ctxt); }
+  bool gate (function *) final override { return optimize; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_nothrow
 
diff --git a/gcc/ipa-reference.cc b/gcc/ipa-reference.cc
index 67e0c85a95e..b5a2350ce72 100644
--- a/gcc/ipa-reference.cc
+++ b/gcc/ipa-reference.cc
@@ -1299,14 +1299,14 @@  public:
     {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return ((in_lto_p || flag_ipa_reference)
 	      /* Don't bother doing anything if the program has errors.  */
 	      && !seen_error ());
     }
 
-  virtual unsigned int execute (function *) { return propagate (); }
+  unsigned int execute (function *) final override { return propagate (); }
 
 }; // class pass_ipa_reference
 
diff --git a/gcc/ipa-split.cc b/gcc/ipa-split.cc
index 60021bad13c..16734617d03 100644
--- a/gcc/ipa-split.cc
+++ b/gcc/ipa-split.cc
@@ -1915,8 +1915,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return execute_split_functions ();
     }
@@ -1974,8 +1974,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return execute_feedback_split_functions ();
     }
diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
index 261a720858f..4f705a3febf 100644
--- a/gcc/ipa-sra.cc
+++ b/gcc/ipa-sra.cc
@@ -4049,14 +4049,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* TODO: We should remove the optimize check after we ensure we never run
 	 IPA passes when not optimizing.  */
       return (flag_ipa_sra && optimize);
     }
 
-  virtual unsigned int execute (function *) { return ipa_sra_analysis (); }
+  unsigned int execute (function *)  final override
+  {
+    return ipa_sra_analysis ();
+  }
 
 }; // class pass_ipa_sra
 
diff --git a/gcc/ipa-visibility.cc b/gcc/ipa-visibility.cc
index e95a0dd252f..8a27e7bcdfd 100644
--- a/gcc/ipa-visibility.cc
+++ b/gcc/ipa-visibility.cc
@@ -959,12 +959,12 @@  public:
 
   /* opt_pass methods: */
 
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Do not re-run on ltrans stage.  */
       return !flag_ltrans;
     }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return whole_program_function_and_variable_visibility ();
     }
@@ -988,7 +988,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return function_and_variable_visibility (flag_whole_program && !flag_lto);
     }
diff --git a/gcc/ipa.cc b/gcc/ipa.cc
index f53f15f5f0a..c01dca17bec 100644
--- a/gcc/ipa.cc
+++ b/gcc/ipa.cc
@@ -1343,8 +1343,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return ipa_cdtor_merge (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return ipa_cdtor_merge ();
+  }
 
 }; // class pass_ipa_cdtor_merge
 
@@ -1566,7 +1569,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return ipa_single_use (); }
+  unsigned int execute (function *) final override { return ipa_single_use (); }
 
 }; // class pass_ipa_single_use
 
diff --git a/gcc/ira.cc b/gcc/ira.cc
index e3b3c549120..42c9cead9f8 100644
--- a/gcc/ira.cc
+++ b/gcc/ira.cc
@@ -6074,11 +6074,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return !targetm.no_register_allocation;
     }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       ira (dump_file);
       return 0;
@@ -6117,11 +6117,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return !targetm.no_register_allocation;
     }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       do_reload ();
       return 0;
diff --git a/gcc/jump.cc b/gcc/jump.cc
index 332f86878e1..e6207169be0 100644
--- a/gcc/jump.cc
+++ b/gcc/jump.cc
@@ -182,7 +182,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return cleanup_barriers (); }
+  unsigned int execute (function *) final override
+  {
+    return cleanup_barriers ();
+  }
 
 }; // class pass_cleanup_barriers
 
diff --git a/gcc/loop-init.cc b/gcc/loop-init.cc
index 1e4f6cfd7fb..648aa290916 100644
--- a/gcc/loop-init.cc
+++ b/gcc/loop-init.cc
@@ -357,7 +357,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
+  bool gate (function *) final override;
 
 }; // class pass_loop2
 
@@ -429,7 +429,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return rtl_loop_init (); }
+  unsigned int execute (function *) final override { return rtl_loop_init (); }
 
 }; // class pass_rtl_loop_init
 
@@ -467,7 +467,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_rtl_loop_done
 
@@ -523,8 +523,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_move_loop_invariants; }
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override { return flag_move_loop_invariants; }
+  unsigned int execute (function *fun) final override
     {
       if (number_of_loops (fun) > 1)
 	move_loop_invariants ();
@@ -565,12 +565,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (flag_unroll_loops || flag_unroll_all_loops || cfun->has_unroll);
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_rtl_unroll_loops
 
@@ -625,8 +625,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
 }; // class pass_rtl_doloop
 
diff --git a/gcc/lower-subreg.cc b/gcc/lower-subreg.cc
index d30bbeeabda..03e9326c663 100644
--- a/gcc/lower-subreg.cc
+++ b/gcc/lower-subreg.cc
@@ -1769,8 +1769,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_split_wide_types != 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_split_wide_types != 0; }
+  unsigned int execute (function *) final override
     {
       decompose_multiword_subregs (false);
       return 0;
@@ -1811,9 +1811,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_split_wide_types
-					  && flag_split_wide_types_early; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override
+  {
+    return flag_split_wide_types && flag_split_wide_types_early;
+  }
+  unsigned int execute (function *) final override
     {
       decompose_multiword_subregs (true);
       return 0;
@@ -1854,8 +1856,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_split_wide_types; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_split_wide_types; }
+  unsigned int execute (function *) final override
     {
       decompose_multiword_subregs (true);
       return 0;
diff --git a/gcc/mode-switching.cc b/gcc/mode-switching.cc
index 6e3f1dc65e2..b0f6e7cedd4 100644
--- a/gcc/mode-switching.cc
+++ b/gcc/mode-switching.cc
@@ -893,8 +893,8 @@  public:
   /* opt_pass methods: */
   /* The epiphany backend creates a second instance of this pass, so we need
      a clone method.  */
-  opt_pass * clone () { return new pass_mode_switching (m_ctxt); }
-  virtual bool gate (function *)
+  opt_pass * clone () final override { return new pass_mode_switching (m_ctxt); }
+  bool gate (function *) final override
     {
 #ifdef OPTIMIZE_MODE_SWITCHING
       return true;
@@ -903,7 +903,7 @@  public:
 #endif
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
 #ifdef OPTIMIZE_MODE_SWITCHING
       optimize_mode_switching ();
diff --git a/gcc/modulo-sched.cc b/gcc/modulo-sched.cc
index 1e1fa7055a2..f78d791cb01 100644
--- a/gcc/modulo-sched.cc
+++ b/gcc/modulo-sched.cc
@@ -3338,12 +3338,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
 {
   return (optimize > 0 && flag_modulo_sched);
 }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_sms
 
diff --git a/gcc/multiple_target.cc b/gcc/multiple_target.cc
index 7fe02fb55c8..3e2d26882c8 100644
--- a/gcc/multiple_target.cc
+++ b/gcc/multiple_target.cc
@@ -526,8 +526,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return ipa_target_clone (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return ipa_target_clone ();
+  }
 };
 
 bool
diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc
index 9fcc67a3448..3d48e1df175 100644
--- a/gcc/omp-expand.cc
+++ b/gcc/omp-expand.cc
@@ -10574,7 +10574,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       bool gate = ((flag_openacc != 0 || flag_openmp != 0
 		    || flag_openmp_simd != 0)
@@ -10621,12 +10621,18 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       return !(fun->curr_properties & PROP_gimple_eomp);
     }
-  virtual unsigned int execute (function *) { return execute_expand_omp (); }
-  opt_pass * clone () { return new pass_expand_omp_ssa (m_ctxt); }
+  unsigned int execute (function *) final override
+  {
+    return execute_expand_omp ();
+  }
+  opt_pass * clone () final override
+  {
+    return new pass_expand_omp_ssa (m_ctxt);
+  }
 
 }; // class pass_expand_omp_ssa
 
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index c83af6c3865..e00788f0ea1 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -14594,7 +14594,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return execute_lower_omp (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_lower_omp ();
+  }
 
 }; // class pass_lower_omp
 
@@ -14902,11 +14905,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return flag_openacc || flag_openmp || flag_openmp_simd;
   }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return diagnose_omp_structured_block_errors ();
     }
diff --git a/gcc/omp-oacc-kernels-decompose.cc b/gcc/omp-oacc-kernels-decompose.cc
index ec9b0faab0a..524060e2fca 100644
--- a/gcc/omp-oacc-kernels-decompose.cc
+++ b/gcc/omp-oacc-kernels-decompose.cc
@@ -1615,12 +1615,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return (flag_openacc
 	    && param_openacc_kernels == OPENACC_KERNELS_DECOMPOSE);
   }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
   {
     return omp_oacc_kernels_decompose ();
   }
diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-broadcast.cc
index 81e3223a94c..b6177794cde 100644
--- a/gcc/omp-oacc-neuter-broadcast.cc
+++ b/gcc/omp-oacc-neuter-broadcast.cc
@@ -1945,7 +1945,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
   {
     if (!flag_openacc)
       return false;
@@ -1961,7 +1961,7 @@  public:
     return true;
   }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_omp_oacc_neuter_broadcast ();
     }
diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
index ad4e772015e..9de04fc520c 100644
--- a/gcc/omp-offload.cc
+++ b/gcc/omp-offload.cc
@@ -2449,9 +2449,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_openacc; };
+  bool gate (function *) final override { return flag_openacc; };
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_oacc_loop_designation ();
     }
@@ -2479,9 +2479,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_openacc; };
+  bool gate (function *) final override { return flag_openacc; };
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_oacc_device_lower ();
     }
@@ -2713,13 +2713,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       return (!(fun->curr_properties & PROP_gimple_lomp_dev)
 	      || (flag_openmp
 		  && cgraph_node::get (fun->decl)->calls_declare_variant_alt));
     }
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_omp_device_lower ();
     }
@@ -2759,7 +2759,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
 #ifdef ACCEL_COMPILER
       return offloading_function_p (fun->decl);
@@ -2769,7 +2769,7 @@  public:
 #endif
     }
 
-  virtual unsigned execute (function *);
+  unsigned execute (function *) final override;
 };
 
 /* Callback for walk_gimple_stmt used to scan for link var operands.  */
diff --git a/gcc/omp-simd-clone.cc b/gcc/omp-simd-clone.cc
index 04fe03cde5f..32649bc3f9a 100644
--- a/gcc/omp-simd-clone.cc
+++ b/gcc/omp-simd-clone.cc
@@ -1819,8 +1819,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return ipa_omp_simd_clone (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return ipa_omp_simd_clone ();
+  }
 };
 
 bool
diff --git a/gcc/passes.cc b/gcc/passes.cc
index 36e5b4ac45f..78a07f8691a 100644
--- a/gcc/passes.cc
+++ b/gcc/passes.cc
@@ -417,13 +417,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Don't bother doing anything if the program has errors.  */
       return (!seen_error () && !in_lto_p);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_build_ssa_passes ();
     }
@@ -451,7 +451,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Don't bother doing anything if the program has errors.  */
       return (!seen_error () && !in_lto_p);
@@ -480,7 +480,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Don't bother doing anything if the program has errors.  */
       return (!seen_error () && !in_lto_p);
@@ -531,7 +531,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize >= 1
 	      /* Don't bother doing anything if the program has errors.  */
@@ -571,7 +571,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize >= 1 && !optimize_debug; }
+  bool gate (function *) final override
+  {
+    return optimize >= 1 && !optimize_debug;
+  }
 
 }; // class pass_all_optimizations
 
@@ -606,7 +609,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize >= 1 && optimize_debug; }
+  bool gate (function *) final override
+  {
+    return optimize >= 1 && optimize_debug;
+  }
 
 }; // class pass_all_optimizations_g
 
@@ -641,7 +647,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Early return if there were errors.  We can run afoul of our
 	 consistency checks, and there's not really much point in fixing them.  */
@@ -681,7 +687,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return reload_completed; }
+  bool gate (function *) final override { return reload_completed; }
 
 }; // class pass_postreload
 
@@ -716,7 +722,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return reload_completed || targetm.no_register_allocation;
   }
@@ -756,15 +762,15 @@  public:
   {
   }
 
-  virtual bool
-  gate (function *fun)
+  bool
+  gate (function *fun) final override
   {
     return flag_tree_slp_vectorize
 	   && (fun->pending_TODOs & PENDING_TODO_force_next_scalar_cleanup);
   }
 
-  virtual unsigned int
-  execute (function *fun)
+  unsigned int
+  execute (function *fun) final override
   {
     fun->pending_TODOs &= ~PENDING_TODO_force_next_scalar_cleanup;
     return 0;
diff --git a/gcc/postreload-gcse.cc b/gcc/postreload-gcse.cc
index fc63f0b5c77..1c795b43ca3 100644
--- a/gcc/postreload-gcse.cc
+++ b/gcc/postreload-gcse.cc
@@ -1447,13 +1447,16 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       return (optimize > 0 && flag_gcse_after_reload
 	      && optimize_function_for_speed_p (fun));
     }
 
-  virtual unsigned int execute (function *) { return rest_of_handle_gcse2 (); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_gcse2 ();
+  }
 
 }; // class pass_gcse2
 
diff --git a/gcc/postreload.cc b/gcc/postreload.cc
index 4a67d0d437a..d1c99fe6dc9 100644
--- a/gcc/postreload.cc
+++ b/gcc/postreload.cc
@@ -2339,9 +2339,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return (optimize > 0 && reload_completed); }
+  bool gate (function *) final override
+  {
+    return (optimize > 0 && reload_completed);
+  }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_postreload_cse
 
diff --git a/gcc/predict.cc b/gcc/predict.cc
index 5734e4c8516..fb9fa514fbc 100644
--- a/gcc/predict.cc
+++ b/gcc/predict.cc
@@ -4079,8 +4079,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_guess_branch_prob; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_guess_branch_prob; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_profile
 
@@ -4233,14 +4233,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_strip_predict_hints (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override
+  {
+    return new pass_strip_predict_hints (m_ctxt);
+  }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       early_p = param;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 private:
   bool early_p;
diff --git a/gcc/recog.cc b/gcc/recog.cc
index cd2410ab2ae..dac172bc7c0 100644
--- a/gcc/recog.cc
+++ b/gcc/recog.cc
@@ -4358,9 +4358,12 @@  public:
   /* opt_pass methods: */
   /* The epiphany backend creates a second instance of this pass, so we need
      a clone method.  */
-  opt_pass * clone () { return new pass_peephole2 (m_ctxt); }
-  virtual bool gate (function *) { return (optimize > 0 && flag_peephole2); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override { return new pass_peephole2 (m_ctxt); }
+  bool gate (function *) final override
+  {
+    return (optimize > 0 && flag_peephole2);
+  }
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_peephole2 ();
     }
@@ -4400,8 +4403,11 @@  public:
   /* opt_pass methods: */
   /* The epiphany backend creates a second instance of this pass, so
      we need a clone method.  */
-  opt_pass * clone () { return new pass_split_all_insns (m_ctxt); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_split_all_insns (m_ctxt);
+  }
+  unsigned int execute (function *) final override
     {
       split_all_insns ();
       return 0;
@@ -4440,13 +4446,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* If optimizing, then go ahead and split insns now.  */
       return optimize > 0;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       split_all_insns ();
       return 0;
@@ -4495,12 +4501,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return enable_split_before_sched2 ();
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       split_all_insns ();
       return 0;
@@ -4539,8 +4545,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       split_all_insns ();
       return 0;
@@ -4598,7 +4604,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* The placement of the splitting that we do for shorten_branches
 	 depends on whether regstack is used by the target or not.  */
@@ -4609,7 +4615,7 @@  public:
 #endif
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return split_all_insns_noflow ();
     }
diff --git a/gcc/ree.cc b/gcc/ree.cc
index de4f18e8a4d..da64ef679b7 100644
--- a/gcc/ree.cc
+++ b/gcc/ree.cc
@@ -1403,8 +1403,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return (optimize > 0 && flag_ree); }
-  virtual unsigned int execute (function *) { return rest_of_handle_ree (); }
+  bool gate (function *) final override { return (optimize > 0 && flag_ree); }
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_ree ();
+  }
 
 }; // class pass_ree
 
diff --git a/gcc/reg-stack.cc b/gcc/reg-stack.cc
index 5afeadf8c49..fd032501ad9 100644
--- a/gcc/reg-stack.cc
+++ b/gcc/reg-stack.cc
@@ -3413,7 +3413,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
 #ifdef STACK_REGS
       return true;
@@ -3468,7 +3468,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_stack_regs ();
     }
diff --git a/gcc/regcprop.cc b/gcc/regcprop.cc
index 1fdc36713cd..8fcf9d529dd 100644
--- a/gcc/regcprop.cc
+++ b/gcc/regcprop.cc
@@ -1293,12 +1293,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize > 0 && (flag_cprop_registers));
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_cprop_hardreg
 
diff --git a/gcc/reginfo.cc b/gcc/reginfo.cc
index 2ab7bbb7353..705779d5c18 100644
--- a/gcc/reginfo.cc
+++ b/gcc/reginfo.cc
@@ -953,7 +953,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return reginfo_init (); }
+  unsigned int execute (function *) final override { return reginfo_init (); }
 
 }; // class pass_reginfo_init
 
diff --git a/gcc/regrename.cc b/gcc/regrename.cc
index 10271e1b17d..021a822cb79 100644
--- a/gcc/regrename.cc
+++ b/gcc/regrename.cc
@@ -2013,12 +2013,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize > 0 && (flag_rename_registers));
     }
 
-  virtual unsigned int execute (function *) { return regrename_optimize (); }
+  unsigned int execute (function *) final override
+  {
+    return regrename_optimize ();
+  }
 
 }; // class pass_regrename
 
diff --git a/gcc/reorg.cc b/gcc/reorg.cc
index 7624f514906..07b2045986c 100644
--- a/gcc/reorg.cc
+++ b/gcc/reorg.cc
@@ -3866,8 +3866,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_delay_slots ();
     }
@@ -3917,12 +3917,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return targetm.machine_dependent_reorg != 0;
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       targetm.machine_dependent_reorg ();
       return 0;
diff --git a/gcc/sancov.cc b/gcc/sancov.cc
index 9c1025200b4..052fa4ef881 100644
--- a/gcc/sancov.cc
+++ b/gcc/sancov.cc
@@ -308,17 +308,17 @@  public:
 
   static const pass_data data;
   opt_pass *
-  clone ()
+  clone () final override
   {
     return new pass_sancov<O0> (m_ctxt);
   }
-  virtual bool
-  gate (function *fun)
+  bool
+  gate (function *fun) final override
   {
     return sanitize_coverage_p (fun->decl) && (!O0 || !optimize);
   }
-  virtual unsigned int
-  execute (function *fun)
+  unsigned int
+  execute (function *fun) final override
   {
     return sancov_pass (fun);
   }
diff --git a/gcc/sanopt.cc b/gcc/sanopt.cc
index 125e0c936e7..7aebc6f39dc 100644
--- a/gcc/sanopt.cc
+++ b/gcc/sanopt.cc
@@ -942,8 +942,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_sanitize; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_sanitize; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_sanopt
 
diff --git a/gcc/sched-rgn.cc b/gcc/sched-rgn.cc
index a0dfdb7881f..0dc2a8f2851 100644
--- a/gcc/sched-rgn.cc
+++ b/gcc/sched-rgn.cc
@@ -3779,7 +3779,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
 #ifdef INSN_SCHEDULING
       return flag_live_range_shrinkage;
@@ -3788,7 +3788,7 @@  public:
 #endif
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_live_range_shrinkage ();
     }
@@ -3826,8 +3826,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return rest_of_handle_sched (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
+  {
+    return rest_of_handle_sched ();
+  }
 
 }; // class pass_sched
 
@@ -3872,8 +3875,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_sched2 ();
     }
@@ -3922,8 +3925,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return rest_of_handle_sched_fusion ();
     }
diff --git a/gcc/stack-ptr-mod.cc b/gcc/stack-ptr-mod.cc
index b14bef98c49..4ccbb1cace3 100644
--- a/gcc/stack-ptr-mod.cc
+++ b/gcc/stack-ptr-mod.cc
@@ -71,7 +71,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_stack_ptr_mod
 
diff --git a/gcc/store-motion.cc b/gcc/store-motion.cc
index 0f708700a14..b61c0686844 100644
--- a/gcc/store-motion.cc
+++ b/gcc/store-motion.cc
@@ -1243,8 +1243,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override
     {
       return execute_rtl_store_motion ();
     }
diff --git a/gcc/tracer.cc b/gcc/tracer.cc
index 4d054fe8fc8..64517846dc4 100644
--- a/gcc/tracer.cc
+++ b/gcc/tracer.cc
@@ -424,12 +424,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize > 0 && flag_tracer && flag_reorder_blocks);
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_tracer
 
diff --git a/gcc/trans-mem.cc b/gcc/trans-mem.cc
index ae2921f808e..131dce05476 100644
--- a/gcc/trans-mem.cc
+++ b/gcc/trans-mem.cc
@@ -864,8 +864,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tm; }
-  virtual unsigned int execute (function *) { return diagnose_tm_blocks (); }
+  bool gate (function *) final override { return flag_tm; }
+  unsigned int execute (function *) final override
+  {
+    return diagnose_tm_blocks ();
+  }
 
 }; // class pass_diagnose_tm_blocks
 
@@ -1850,8 +1853,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tm; }
-  virtual unsigned int execute (function *) { return execute_lower_tm (); }
+  bool gate (function *) final override { return flag_tm; }
+  unsigned int execute (function *) final override
+  {
+    return execute_lower_tm ();
+  }
 
 }; // class pass_lower_tm
 
@@ -2144,7 +2150,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_tm_init (); }
+  bool gate (function *) final override { return gate_tm_init (); }
 
 }; // class pass_tm_init
 
@@ -3162,7 +3168,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return execute_tm_mark (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_tm_mark ();
+  }
 
 }; // class pass_tm_mark
 
@@ -3324,7 +3333,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_tm_edges
 
@@ -4085,8 +4094,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tm && optimize > 0; }
-  virtual unsigned int execute (function *) { return execute_tm_memopt (); }
+  bool gate (function *) final override { return flag_tm && optimize > 0; }
+  unsigned int execute (function *) final override
+  {
+    return execute_tm_memopt ();
+  }
 
 }; // class pass_tm_memopt
 
@@ -5667,8 +5679,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tm; }
-  virtual unsigned int execute (function *) { return ipa_tm_execute (); }
+  bool gate (function *) final override { return flag_tm; }
+  unsigned int execute (function *) final override { return ipa_tm_execute (); }
 
 }; // class pass_ipa_tm
 
diff --git a/gcc/tree-call-cdce.cc b/gcc/tree-call-cdce.cc
index 83991fe373e..feb61f362cf 100644
--- a/gcc/tree-call-cdce.cc
+++ b/gcc/tree-call-cdce.cc
@@ -1171,7 +1171,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* The limit constants used in the implementation
 	 assume IEEE floating point format.  Other formats
@@ -1179,7 +1179,7 @@  public:
       return flag_tree_builtin_call_dce != 0;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_call_cdce
 
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 19ba09facce..37e89adf10e 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -407,7 +407,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return execute_build_cfg (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_build_cfg ();
+  }
 
 }; // class pass_build_cfg
 
@@ -9200,9 +9203,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return split_critical_edges (); }
+  unsigned int execute (function *)  final override
+  {
+    return split_critical_edges ();
+  }
 
-  opt_pass * clone () { return new pass_split_crit_edges (m_ctxt); }
+  opt_pass * clone () final override
+  {
+    return new pass_split_crit_edges (m_ctxt);
+  }
 }; // class pass_split_crit_edges
 
 } // anon namespace
@@ -9459,7 +9468,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_warn_function_return
 
@@ -9665,8 +9674,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_warn_unused_result; }
-  virtual unsigned int execute (function *)
+  bool gate (function *)  final override { return flag_warn_unused_result; }
+  unsigned int execute (function *) final override
     {
       do_warn_unused_result (gimple_body (current_function_decl));
       return 0;
@@ -9875,8 +9884,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_fixup_cfg (m_ctxt); }
-  virtual unsigned int execute (function *) { return execute_fixup_cfg (); }
+  opt_pass * clone () final override { return new pass_fixup_cfg (m_ctxt); }
+  unsigned int execute (function *) final override
+  {
+    return execute_fixup_cfg ();
+  }
 
 }; // class pass_fixup_cfg
 
diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
index 893619eaaa4..a6d0bf2c40a 100644
--- a/gcc/tree-cfgcleanup.cc
+++ b/gcc/tree-cfgcleanup.cc
@@ -1406,8 +1406,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_merge_phi (m_ctxt); }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_merge_phi (m_ctxt); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_merge_phi
 
@@ -1584,7 +1584,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return execute_cleanup_cfg_post_optimizing ();
     }
diff --git a/gcc/tree-complex.cc b/gcc/tree-complex.cc
index f722057bfec..61950a0f099 100644
--- a/gcc/tree-complex.cc
+++ b/gcc/tree-complex.cc
@@ -1915,8 +1915,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_lower_complex (m_ctxt); }
-  virtual unsigned int execute (function *) { return tree_lower_complex (); }
+  opt_pass * clone () final override { return new pass_lower_complex (m_ctxt); }
+  unsigned int execute (function *) final override
+  {
+    return tree_lower_complex ();
+  }
 
 }; // class pass_lower_complex
 
@@ -1952,14 +1955,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       /* With errors, normal optimization passes are not run.  If we don't
 	 lower complex operations at all, rtl expansion will abort.  */
       return !(fun->curr_properties & PROP_gimple_lcx);
     }
 
-  virtual unsigned int execute (function *) { return tree_lower_complex (); }
+  unsigned int execute (function *) final override
+  {
+    return tree_lower_complex ();
+  }
 
 }; // class pass_lower_complex_O0
 
diff --git a/gcc/tree-eh.cc b/gcc/tree-eh.cc
index c37a5845343..076ecd3ec9a 100644
--- a/gcc/tree-eh.cc
+++ b/gcc/tree-eh.cc
@@ -2176,7 +2176,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_lower_eh
 
@@ -3295,8 +3295,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_exceptions != 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_exceptions != 0; }
+  unsigned int execute (function *) final override
     {
       refactor_eh_r (gimple_body (current_function_decl));
       return 0;
@@ -3497,8 +3497,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_exceptions != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_exceptions != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_lower_resx
 
@@ -3922,8 +3922,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun) { return fun->eh->region_tree != NULL; }
-  virtual unsigned int execute (function *);
+  bool gate (function *fun) final override
+  {
+    return fun->eh->region_tree != NULL;
+  }
+  unsigned int execute (function *) final override;
 
 }; // class pass_lower_eh_dispatch
 
@@ -4859,13 +4862,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_cleanup_eh (m_ctxt); }
-  virtual bool gate (function *fun)
+  opt_pass * clone () final override { return new pass_cleanup_eh (m_ctxt); }
+  bool gate (function *fun) final override
     {
       return fun->eh != NULL && fun->eh->region_tree != NULL;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_cleanup_eh
 
diff --git a/gcc/tree-emutls.cc b/gcc/tree-emutls.cc
index 5f68703822c..b5aa307f60d 100644
--- a/gcc/tree-emutls.cc
+++ b/gcc/tree-emutls.cc
@@ -838,13 +838,16 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* If the target supports TLS natively, we need do nothing here.  */
       return !targetm.have_tls;
     }
 
-  virtual unsigned int execute (function *) { return ipa_lower_emutls (); }
+  unsigned int execute (function *) final override
+  {
+    return ipa_lower_emutls ();
+  }
 
 }; // class pass_ipa_lower_emutls
 
diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc
index 4531ca58bdf..480fea0e7c2 100644
--- a/gcc/tree-if-conv.cc
+++ b/gcc/tree-if-conv.cc
@@ -3408,8 +3408,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override;
 
 }; // class pass_if_conversion
 
diff --git a/gcc/tree-into-ssa.cc b/gcc/tree-into-ssa.cc
index 22c2e5b7982..46df57ae0e1 100644
--- a/gcc/tree-into-ssa.cc
+++ b/gcc/tree-into-ssa.cc
@@ -2403,13 +2403,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       /* Do nothing for funcions that was produced already in SSA form.  */
       return !(fun->curr_properties & PROP_ssa);
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_build_ssa
 
diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
index db6e9096a86..ec44c450cae 100644
--- a/gcc/tree-loop-distribution.cc
+++ b/gcc/tree-loop-distribution.cc
@@ -3896,13 +3896,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return flag_tree_loop_distribution
 	|| flag_tree_loop_distribute_patterns;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_loop_distribution
 
diff --git a/gcc/tree-nrv.cc b/gcc/tree-nrv.cc
index b96d5b86f27..1faa481a8c9 100644
--- a/gcc/tree-nrv.cc
+++ b/gcc/tree-nrv.cc
@@ -125,9 +125,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize > 0; }
+  bool gate (function *) final override { return optimize > 0; }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_nrv
 
@@ -344,7 +344,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_return_slot
 
diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc
index 5ca87ae3504..bc3d7dd9bfa 100644
--- a/gcc/tree-object-size.cc
+++ b/gcc/tree-object-size.cc
@@ -2122,8 +2122,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_object_sizes (m_ctxt); }
-  virtual unsigned int execute (function *fun)
+  opt_pass * clone () final override { return new pass_object_sizes (m_ctxt); }
+  unsigned int execute (function *fun) final override
   {
     return object_sizes_execute (fun, false);
   }
@@ -2162,7 +2162,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *fun)
+  unsigned int execute (function *fun) final override
   {
     return object_sizes_execute (fun, true);
   }
diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc
index da1069683a3..2c3ef436ab7 100644
--- a/gcc/tree-parloops.cc
+++ b/gcc/tree-parloops.cc
@@ -4173,16 +4173,19 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     if (oacc_kernels_p)
       return flag_openacc;
     else
       return flag_tree_parallelize_loops > 1;
   }
-  virtual unsigned int execute (function *);
-  opt_pass * clone () { return new pass_parallelize_loops (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  unsigned int execute (function *) final override;
+  opt_pass * clone () final override
+  {
+    return new pass_parallelize_loops (m_ctxt);
+  }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       oacc_kernels_p = param;
diff --git a/gcc/tree-predcom.cc b/gcc/tree-predcom.cc
index fb457250bbd..5d923fba170 100644
--- a/gcc/tree-predcom.cc
+++ b/gcc/tree-predcom.cc
@@ -3514,8 +3514,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool
-  gate (function *)
+  bool
+  gate (function *) final override
   {
     if (flag_predictive_commoning != 0)
       return true;
@@ -3529,8 +3529,8 @@  public:
     return false;
   }
 
-  virtual unsigned int
-  execute (function *fun)
+  unsigned int
+  execute (function *fun) final override
   {
     bool allow_unroll_p = flag_predictive_commoning != 0;
     return run_tree_predictive_commoning (fun, allow_unroll_p);
diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
index 97aab8801d0..2beb49241f2 100644
--- a/gcc/tree-profile.cc
+++ b/gcc/tree-profile.cc
@@ -884,8 +884,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *) { return tree_profiling (); }
+  bool gate (function *) final override;
+  unsigned int execute (function *) final override { return tree_profiling (); }
 
 }; // class pass_ipa_tree_profile
 
diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
index 081c51b58a4..461c8e0b0f4 100644
--- a/gcc/tree-sra.cc
+++ b/gcc/tree-sra.cc
@@ -4743,8 +4743,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_intra_sra (); }
-  virtual unsigned int execute (function *) { return early_intra_sra (); }
+  bool gate (function *) final override { return gate_intra_sra (); }
+  unsigned int execute (function *) final override
+  {
+    return early_intra_sra ();
+  }
 
 }; // class pass_sra_early
 
@@ -4779,8 +4782,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_intra_sra (); }
-  virtual unsigned int execute (function *) { return late_intra_sra (); }
+  bool gate (function *) final override { return gate_intra_sra (); }
+  unsigned int execute (function *) final override { return late_intra_sra (); }
 
 }; // class pass_sra
 
diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc
index 81c97676625..579a966cc9b 100644
--- a/gcc/tree-ssa-ccp.cc
+++ b/gcc/tree-ssa-ccp.cc
@@ -2994,14 +2994,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_ccp (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override { return new pass_ccp (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       nonzero_p = param;
     }
-  virtual bool gate (function *) { return flag_tree_ccp != 0; }
-  virtual unsigned int execute (function *) { return do_ssa_ccp (nonzero_p); }
+  bool gate (function *) final override { return flag_tree_ccp != 0; }
+  unsigned int execute (function *) final override
+  {
+    return do_ssa_ccp (nonzero_p);
+  }
 
  private:
   /* Determines whether the pass instance records nonzero bits.  */
@@ -4199,8 +4202,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_fold_builtins (m_ctxt); }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_fold_builtins (m_ctxt); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_fold_builtins
 
@@ -4550,9 +4553,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_post_ipa_warn (m_ctxt); }
-  virtual bool gate (function *) { return warn_nonnull != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_post_ipa_warn (m_ctxt); }
+  bool gate (function *) final override { return warn_nonnull != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_fold_builtins
 
diff --git a/gcc/tree-ssa-copy.cc b/gcc/tree-ssa-copy.cc
index 050a6d11434..782ceb500cc 100644
--- a/gcc/tree-ssa-copy.cc
+++ b/gcc/tree-ssa-copy.cc
@@ -642,9 +642,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_copy_prop (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_copy_prop != 0; }
-  virtual unsigned int execute (function *) { return execute_copy_prop (); }
+  opt_pass * clone () final override { return new pass_copy_prop (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_copy_prop != 0; }
+  unsigned int execute (function *) final override
+  {
+    return execute_copy_prop ();
+  }
 
 }; // class pass_copy_prop
 
diff --git a/gcc/tree-ssa-dce.cc b/gcc/tree-ssa-dce.cc
index a6b284018d4..5df64922594 100644
--- a/gcc/tree-ssa-dce.cc
+++ b/gcc/tree-ssa-dce.cc
@@ -1974,9 +1974,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_dce (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_dce != 0; }
-  virtual unsigned int execute (function *) { return tree_ssa_dce (); }
+  opt_pass * clone () final override { return new pass_dce (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_dce != 0; }
+  unsigned int execute (function *) final override { return tree_ssa_dce (); }
 
 }; // class pass_dce
 
@@ -2011,14 +2011,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_cd_dce (m_ctxt); }
-  void set_pass_param (unsigned n, bool param)
+  opt_pass * clone () final override { return new pass_cd_dce (m_ctxt); }
+  void set_pass_param (unsigned n, bool param) final override
     {
       gcc_assert (n == 0);
       update_address_taken_p = param;
     }
-  virtual bool gate (function *) { return flag_tree_dce != 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_tree_dce != 0; }
+  unsigned int execute (function *) final override
     {
       return (tree_ssa_cd_dce ()
 	      | (update_address_taken_p ? TODO_update_address_taken : 0));
diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
index 9a843217553..97e17ca68e4 100644
--- a/gcc/tree-ssa-dom.cc
+++ b/gcc/tree-ssa-dom.cc
@@ -793,14 +793,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_dominator (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override { return new pass_dominator (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       may_peel_loop_headers_p = param;
     }
-  virtual bool gate (function *) { return flag_tree_dom != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_tree_dom != 0; }
+  unsigned int execute (function *) final override;
 
  private:
   /* This flag is used to prevent loops from being peeled repeatedly in jump
diff --git a/gcc/tree-ssa-dse.cc b/gcc/tree-ssa-dse.cc
index 881a2d0f98d..1c1fdb7e75b 100644
--- a/gcc/tree-ssa-dse.cc
+++ b/gcc/tree-ssa-dse.cc
@@ -1455,9 +1455,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_dse (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_dse != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_dse (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_dse != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_dse
 
diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
index 0917202b74c..6f09642172d 100644
--- a/gcc/tree-ssa-forwprop.cc
+++ b/gcc/tree-ssa-forwprop.cc
@@ -3330,9 +3330,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_forwprop (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_forwprop; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_forwprop (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_forwprop; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_forwprop
 
diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
index 88a9f062dcd..80c41c45489 100644
--- a/gcc/tree-ssa-ifcombine.cc
+++ b/gcc/tree-ssa-ifcombine.cc
@@ -829,7 +829,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_tree_ifcombine
 
diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc
index 2f5a390404c..9ab63d1fa0c 100644
--- a/gcc/tree-ssa-loop-ch.cc
+++ b/gcc/tree-ssa-loop-ch.cc
@@ -311,12 +311,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_ch != 0; }
+  bool gate (function *) final override { return flag_tree_ch != 0; }
   
   /* Initialize and finalize loop structures, copying headers inbetween.  */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
-  opt_pass * clone () { return new pass_ch (m_ctxt); }
+  opt_pass * clone () final override { return new pass_ch (m_ctxt); }
 
 protected:
   /* ch_base method: */
@@ -347,14 +347,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
   {
     return flag_tree_ch != 0
 	   && (flag_tree_loop_vectorize != 0 || fun->has_force_vectorize_loops);
   }
   
   /* Just copy headers, no initialization/finalization of loop structures.  */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 protected:
   /* ch_base method: */
diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc
index 6d9316eed1f..c0893f1927c 100644
--- a/gcc/tree-ssa-loop-im.cc
+++ b/gcc/tree-ssa-loop-im.cc
@@ -3597,9 +3597,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_lim (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_loop_im != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_lim (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_loop_im != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_lim
 
diff --git a/gcc/tree-ssa-loop-ivcanon.cc b/gcc/tree-ssa-loop-ivcanon.cc
index 2ee00a3f843..e52397235a1 100644
--- a/gcc/tree-ssa-loop-ivcanon.cc
+++ b/gcc/tree-ssa-loop-ivcanon.cc
@@ -1539,8 +1539,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_loop_ivcanon != 0; }
-  virtual unsigned int execute (function *fun);
+  bool gate (function *) final override { return flag_tree_loop_ivcanon != 0; }
+  unsigned int execute (function *fun) final override;
 
 }; // class pass_iv_canon
 
@@ -1586,7 +1586,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_complete_unroll
 
@@ -1644,8 +1644,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize >= 2; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return optimize >= 2; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_complete_unrolli
 
diff --git a/gcc/tree-ssa-loop-prefetch.cc b/gcc/tree-ssa-loop-prefetch.cc
index aebd7c9206f..8f190ae469b 100644
--- a/gcc/tree-ssa-loop-prefetch.cc
+++ b/gcc/tree-ssa-loop-prefetch.cc
@@ -2069,8 +2069,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_prefetch_loop_arrays > 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override
+  {
+    return flag_prefetch_loop_arrays > 0;
+  }
+  unsigned int execute (function *) final override;
 
 }; // class pass_loop_prefetch
 
diff --git a/gcc/tree-ssa-loop-split.cc b/gcc/tree-ssa-loop-split.cc
index b93ee4c8769..d61bad5ba47 100644
--- a/gcc/tree-ssa-loop-split.cc
+++ b/gcc/tree-ssa-loop-split.cc
@@ -1724,8 +1724,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_split_loops != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_split_loops != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_loop_split
 
diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-unswitch.cc
index 2927f308234..3b6486f305a 100644
--- a/gcc/tree-ssa-loop-unswitch.cc
+++ b/gcc/tree-ssa-loop-unswitch.cc
@@ -1035,8 +1035,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_unswitch_loops != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_unswitch_loops != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_tree_unswitch
 
diff --git a/gcc/tree-ssa-loop.cc b/gcc/tree-ssa-loop.cc
index 73aa46627b4..1c058b08c2f 100644
--- a/gcc/tree-ssa-loop.cc
+++ b/gcc/tree-ssa-loop.cc
@@ -67,9 +67,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_loop_optimize; }
+  bool gate (function *) final override { return flag_tree_loop_optimize; }
 
-  virtual unsigned int execute (function *fn);
+  unsigned int execute (function *fn) final override;
 }; // class pass_fix_loops
 
 unsigned int
@@ -134,7 +134,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fn) { return gate_loop (fn); }
+  bool gate (function *fn) final override { return gate_loop (fn); }
 
 }; // class pass_tree_loop
 
@@ -189,7 +189,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fn) { return gate_oacc_kernels (fn); }
+  bool gate (function *fn) final override { return gate_oacc_kernels (fn); }
 
 }; // class pass_oacc_kernels
 
@@ -226,7 +226,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
   {
     return (optimize
 	    && flag_openacc
@@ -303,7 +303,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fn) { return !gate_loop (fn); }
+  bool gate (function *fn) final override { return !gate_loop (fn); }
 
 }; // class pass_tree_no_loop
 
@@ -341,7 +341,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_tree_loop_init
 
@@ -395,8 +395,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_scev_cprop; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_tree_scev_cprop; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_scev_cprop
 
@@ -446,8 +446,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_ivopts != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_ivopts != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_iv_optimize
 
@@ -503,7 +503,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *) { return tree_ssa_loop_done (); }
+  unsigned int execute (function *) final override
+  {
+    return tree_ssa_loop_done ();
+  }
 
 }; // class pass_tree_loop_done
 
diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc
index ce1df01f629..fe9f37b4cd4 100644
--- a/gcc/tree-ssa-math-opts.cc
+++ b/gcc/tree-ssa-math-opts.cc
@@ -920,8 +920,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return optimize && flag_reciprocal_math; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override
+  {
+    return optimize && flag_reciprocal_math;
+  }
+  unsigned int execute (function *) final override;
 
 }; // class pass_cse_reciprocals
 
@@ -2249,14 +2252,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* We no longer require either sincos or cexp, since powi expansion
 	 piggybacks on this pass.  */
       return optimize;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_cse_sincos
 
@@ -4892,12 +4895,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return flag_expensive_optimizations && optimize;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_optimize_widening_mul
 
diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
index 8c9c46d41f1..162ca7098cd 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -3960,14 +3960,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_phiopt (m_ctxt); }
-  void set_pass_param (unsigned n, bool param)
+  opt_pass * clone () final override { return new pass_phiopt (m_ctxt); }
+  void set_pass_param (unsigned n, bool param) final override
     {
       gcc_assert (n == 0);
       early_p = param;
     }
-  virtual bool gate (function *) { return flag_ssa_phiopt; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_ssa_phiopt; }
+  unsigned int execute (function *) final override
     {
       return tree_ssa_phiopt_worker (false,
 				     !early_p ? gate_hoist_loads () : false,
@@ -4009,8 +4009,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_cselim; }
-  virtual unsigned int execute (function *) { return tree_ssa_cs_elim (); }
+  bool gate (function *) final override { return flag_tree_cselim; }
+  unsigned int execute (function *) final override
+  {
+    return tree_ssa_cs_elim ();
+  }
 
 }; // class pass_cselim
 
diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
index 7bbfc8c002a..965f1d1c4eb 100644
--- a/gcc/tree-ssa-phiprop.cc
+++ b/gcc/tree-ssa-phiprop.cc
@@ -476,8 +476,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_phiprop; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return flag_tree_phiprop; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_phiprop
 
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index 09a5e2055ca..e029bd36da3 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -4339,9 +4339,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     { return flag_tree_pre != 0 || flag_code_hoisting != 0; }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_pre
 
diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
index 406523b5d2f..e13e2cb308d 100644
--- a/gcc/tree-ssa-reassoc.cc
+++ b/gcc/tree-ssa-reassoc.cc
@@ -7132,15 +7132,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_reassoc (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override { return new pass_reassoc (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       insert_powi_p = param;
       bias_loop_carried_phi_ranks_p = !param;
     }
-  virtual bool gate (function *) { return flag_tree_reassoc != 0; }
-  virtual unsigned int execute (function *)
+  bool gate (function *) final override { return flag_tree_reassoc != 0; }
+  unsigned int execute (function *) final override
   {
     return execute_reassoc (insert_powi_p, bias_loop_carried_phi_ranks_p);
   }
diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index ed68557f0b2..18392e031b8 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -8295,17 +8295,17 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_fre (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override { return new pass_fre (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       may_iterate = param;
     }
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return flag_tree_fre != 0 && (may_iterate || optimize > 1);
     }
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 private:
   bool may_iterate;
diff --git a/gcc/tree-ssa-sink.cc b/gcc/tree-ssa-sink.cc
index 8ce4403ddc8..7f653a988f4 100644
--- a/gcc/tree-ssa-sink.cc
+++ b/gcc/tree-ssa-sink.cc
@@ -829,10 +829,10 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_sink != 0; }
-  virtual unsigned int execute (function *);
-  opt_pass *clone (void) { return new pass_sink_code (m_ctxt); }
-  void set_pass_param (unsigned n, bool param)
+  bool gate (function *) final override { return flag_tree_sink != 0; }
+  unsigned int execute (function *) final override;
+  opt_pass *clone (void) final override { return new pass_sink_code (m_ctxt); }
+  void set_pass_param (unsigned n, bool param) final override
     {
       gcc_assert (n == 0);
       unsplit_edges = param;
diff --git a/gcc/tree-ssa-strlen.cc b/gcc/tree-ssa-strlen.cc
index 1d4c0f78fbf..2cceba6f7af 100644
--- a/gcc/tree-ssa-strlen.cc
+++ b/gcc/tree-ssa-strlen.cc
@@ -5962,8 +5962,8 @@  public:
     : gimple_opt_pass (pass_data_warn_printf, ctxt)
   {}
 
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override;
+  unsigned int execute (function *fun) final override
   {
     return printf_strlen_execute (fun, true);
   }
@@ -5999,10 +5999,10 @@  public:
     : gimple_opt_pass (pass_data_strlen, ctxt)
   {}
 
-  opt_pass * clone () { return new pass_strlen (m_ctxt); }
+  opt_pass * clone () final override { return new pass_strlen (m_ctxt); }
 
-  virtual bool gate (function *);
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override;
+  unsigned int execute (function *fun) final override
   {
     return printf_strlen_execute (fun, false);
   }
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index 581bdcf5652..dcf13d939bd 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -8085,7 +8085,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_pta; }
+  bool gate (function *) final override { return flag_tree_pta; }
 
 }; // class pass_build_alias
 
@@ -8123,7 +8123,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_pta; }
+  bool gate (function *) final override { return flag_tree_pta; }
 
 }; // class pass_build_ealias
 
@@ -8737,7 +8737,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (optimize
 	      && flag_ipa_pta
@@ -8745,9 +8745,12 @@  public:
 	      && !seen_error ());
     }
 
-  opt_pass * clone () { return new pass_ipa_pta (m_ctxt); }
+  opt_pass * clone () final override { return new pass_ipa_pta (m_ctxt); }
 
-  virtual unsigned int execute (function *) { return ipa_pta_execute (); }
+  unsigned int execute (function *) final override
+  {
+    return ipa_pta_execute ();
+  }
 
 }; // class pass_ipa_pta
 
diff --git a/gcc/tree-ssa-uncprop.cc b/gcc/tree-ssa-uncprop.cc
index aea7d69584f..510f8319d8c 100644
--- a/gcc/tree-ssa-uncprop.cc
+++ b/gcc/tree-ssa-uncprop.cc
@@ -453,9 +453,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_uncprop (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_dom != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_uncprop (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_dom != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_uncprop
 
diff --git a/gcc/tree-ssa-uninit.cc b/gcc/tree-ssa-uninit.cc
index b48fcf1a8ba..087f0dc965d 100644
--- a/gcc/tree-ssa-uninit.cc
+++ b/gcc/tree-ssa-uninit.cc
@@ -1317,9 +1317,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass *clone () { return new pass_late_warn_uninitialized (m_ctxt); }
-  virtual bool gate (function *) { return gate_warn_uninitialized (); }
-  virtual unsigned int execute (function *);
+  opt_pass *clone () final override
+  {
+    return new pass_late_warn_uninitialized (m_ctxt);
+  }
+  bool gate (function *) final override { return gate_warn_uninitialized (); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_late_warn_uninitialized
 
@@ -1459,8 +1462,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_warn_uninitialized (); }
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override { return gate_warn_uninitialized (); }
+  unsigned int execute (function *fun) final override
   {
     return execute_early_warn_uninitialized (fun);
   }
diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
index 05536cd2f74..bc22ece636a 100644
--- a/gcc/tree-ssanames.cc
+++ b/gcc/tree-ssanames.cc
@@ -920,7 +920,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_release_ssa_names
 
diff --git a/gcc/tree-stdarg.cc b/gcc/tree-stdarg.cc
index 9038cd43aaa..ed4c8d8c775 100644
--- a/gcc/tree-stdarg.cc
+++ b/gcc/tree-stdarg.cc
@@ -1126,7 +1126,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       /* Always run this pass, in order to expand va_arg internal_fns.  We
 	 also need to do that if fun->stdarg == 0, because a va_arg may also
@@ -1135,7 +1135,7 @@  public:
       return true;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_stdarg
 
@@ -1185,12 +1185,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (cfun->curr_properties & PROP_gimple_lva) == 0;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_lower_vaarg
 
diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc
index 50a17927f39..17a31f7a63c 100644
--- a/gcc/tree-switch-conversion.cc
+++ b/gcc/tree-switch-conversion.cc
@@ -2428,8 +2428,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override
+  {
+    return flag_tree_switch_conversion != 0;
+  }
+  unsigned int execute (function *) final override;
 
 }; // class pass_convert_switch
 
@@ -2507,18 +2510,18 @@  public:
 
   static const pass_data data;
   opt_pass *
-  clone ()
+  clone () final override
   {
     return new pass_lower_switch<O0> (m_ctxt);
   }
 
-  virtual bool
-  gate (function *)
+  bool
+  gate (function *) final override
   {
     return !O0 || !optimize;
   }
 
-  virtual unsigned int execute (function *fun);
+  unsigned int execute (function *fun) final override;
 }; // class pass_lower_switch
 
 template <bool O0>
diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc
index 5a3466e5d53..6745d57580b 100644
--- a/gcc/tree-tailcall.cc
+++ b/gcc/tree-tailcall.cc
@@ -1261,9 +1261,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_tail_recursion (m_ctxt); }
-  virtual bool gate (function *) { return gate_tail_calls (); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_tail_recursion (m_ctxt);
+  }
+  bool gate (function *) final override { return gate_tail_calls (); }
+  unsigned int execute (function *) final override
     {
       return tree_optimize_tail_calls_1 (false);
     }
@@ -1301,8 +1304,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return gate_tail_calls (); }
-  virtual unsigned int execute (function *) { return execute_tail_calls (); }
+  bool gate (function *) final override { return gate_tail_calls (); }
+  unsigned int execute (function *) final override
+  {
+    return execute_tail_calls ();
+  }
 
 }; // class pass_tail_calls
 
diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc
index d99e3207fbe..d974fd1b7fe 100644
--- a/gcc/tree-vect-generic.cc
+++ b/gcc/tree-vect-generic.cc
@@ -2415,12 +2415,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       return !(fun->curr_properties & PROP_gimple_lvec);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return expand_vector_operations ();
     }
@@ -2459,8 +2459,11 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_lower_vector_ssa (m_ctxt); }
-  virtual unsigned int execute (function *)
+  opt_pass * clone () final override
+  {
+    return new pass_lower_vector_ssa (m_ctxt);
+  }
+  unsigned int execute (function *) final override
     {
       return expand_vector_operations ();
     }
diff --git a/gcc/tree-vectorizer.cc b/gcc/tree-vectorizer.cc
index a63fa391273..53dc4520963 100644
--- a/gcc/tree-vectorizer.cc
+++ b/gcc/tree-vectorizer.cc
@@ -1193,12 +1193,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *fun)
+  bool gate (function *fun) final override
     {
       return flag_tree_loop_vectorize || fun->has_force_vectorize_loops;
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_vectorize
 
@@ -1405,9 +1405,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_simduid_cleanup (m_ctxt); }
-  virtual bool gate (function *fun) { return fun->has_simduid_loops; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override
+  {
+    return new pass_simduid_cleanup (m_ctxt);
+  }
+  bool gate (function *fun) final override { return fun->has_simduid_loops; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_simduid_cleanup
 
@@ -1463,9 +1466,9 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_slp_vectorize (m_ctxt); }
-  virtual bool gate (function *) { return flag_tree_slp_vectorize != 0; }
-  virtual unsigned int execute (function *);
+  opt_pass * clone () final override { return new pass_slp_vectorize (m_ctxt); }
+  bool gate (function *) final override { return flag_tree_slp_vectorize != 0; }
+  unsigned int execute (function *) final override;
 
 }; // class pass_slp_vectorize
 
@@ -1696,12 +1699,15 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return flag_section_anchors && flag_tree_loop_vectorize;
     }
 
-  virtual unsigned int execute (function *) { return increase_alignment (); }
+  unsigned int execute (function *) final override
+  {
+    return increase_alignment ();
+  }
 
 }; // class pass_ipa_increase_alignment
 
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index 0784d658567..da0a6d5a8b6 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -4402,14 +4402,14 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_vrp (m_ctxt); }
-  void set_pass_param (unsigned int n, bool param)
+  opt_pass * clone () final override { return new pass_vrp (m_ctxt); }
+  void set_pass_param (unsigned int n, bool param) final override
     {
       gcc_assert (n == 0);
       warn_array_bounds_p = param;
     }
-  virtual bool gate (function *) { return flag_tree_vrp != 0; }
-  virtual unsigned int execute (function *fun)
+  bool gate (function *) final override { return flag_tree_vrp != 0; }
+  unsigned int execute (function *fun) final override
     {
       if ((my_pass == 1 && param_vrp1_mode == VRP_MODE_RANGER)
 	  || (my_pass == 2 && param_vrp2_mode == VRP_MODE_RANGER))
diff --git a/gcc/tsan.cc b/gcc/tsan.cc
index 02e8ac7cf79..79d4582acd1 100644
--- a/gcc/tsan.cc
+++ b/gcc/tsan.cc
@@ -909,13 +909,13 @@  public:
   {}
 
   /* opt_pass methods: */
-  opt_pass * clone () { return new pass_tsan (m_ctxt); }
-  virtual bool gate (function *)
+  opt_pass * clone () final override { return new pass_tsan (m_ctxt); }
+  bool gate (function *) final override
 {
   return sanitize_flags_p (SANITIZE_THREAD);
 }
 
-  virtual unsigned int execute (function *) { return tsan_pass (); }
+  unsigned int execute (function *) final override { return tsan_pass (); }
 
 }; // class pass_tsan
 
@@ -950,12 +950,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (sanitize_flags_p (SANITIZE_THREAD) && !optimize);
     }
 
-  virtual unsigned int execute (function *) { return tsan_pass (); }
+  unsigned int execute (function *) final override { return tsan_pass (); }
 
 }; // class pass_tsan_O0
 
diff --git a/gcc/ubsan.cc b/gcc/ubsan.cc
index 6c058142c37..18c75b471f4 100644
--- a/gcc/ubsan.cc
+++ b/gcc/ubsan.cc
@@ -2329,7 +2329,7 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return sanitize_flags_p ((SANITIZE_NULL | SANITIZE_SI_OVERFLOW
 				| SANITIZE_BOOL | SANITIZE_ENUM
@@ -2341,7 +2341,7 @@  public:
 				| SANITIZE_BUILTIN));
     }
 
-  virtual unsigned int execute (function *);
+  unsigned int execute (function *) final override;
 
 }; // class pass_ubsan
 
diff --git a/gcc/var-tracking.cc b/gcc/var-tracking.cc
index 7c3ad0a55bd..235981d100f 100644
--- a/gcc/var-tracking.cc
+++ b/gcc/var-tracking.cc
@@ -10592,12 +10592,12 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *)
+  bool gate (function *) final override
     {
       return (flag_var_tracking && !targetm.delay_vartrack);
     }
 
-  virtual unsigned int execute (function *)
+  unsigned int execute (function *) final override
     {
       return variable_tracking_main ();
     }
diff --git a/gcc/vtable-verify.cc b/gcc/vtable-verify.cc
index 48f9987082e..24894e7f108 100644
--- a/gcc/vtable-verify.cc
+++ b/gcc/vtable-verify.cc
@@ -818,8 +818,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return (flag_vtable_verify); }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return (flag_vtable_verify); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_vtable_verify
 
diff --git a/gcc/web.cc b/gcc/web.cc
index a5874a98825..bd0ec94f1f4 100644
--- a/gcc/web.cc
+++ b/gcc/web.cc
@@ -323,8 +323,8 @@  public:
   {}
 
   /* opt_pass methods: */
-  virtual bool gate (function *) { return (optimize > 0 && flag_web); }
-  virtual unsigned int execute (function *);
+  bool gate (function *) final override { return (optimize > 0 && flag_web); }
+  unsigned int execute (function *) final override;
 
 }; // class pass_web