diff --git a/include/clang/AST/ASTConsumer.h b/include/clang/AST/ASTConsumer.h
index b2730e46222877e7ef912c1b85d7283002109959..02669e9bd14719352088597f50b7e41d646b33f6 100644
--- a/include/clang/AST/ASTConsumer.h
+++ b/include/clang/AST/ASTConsumer.h
@@ -43,7 +43,7 @@ class ASTConsumer {
 public:
   ASTConsumer() : SemaConsumer(false) { }
 
-  virtual ~ASTConsumer() {}
+  virtual ~ASTConsumer() = default;
 
   /// Initialize - This is called to initialize the consumer, providing the
   /// ASTContext.
diff --git a/include/clang/AST/CanonicalType.h b/include/clang/AST/CanonicalType.h
index b25800bfedb91f99cfffc0a77fc0cd3cf066c72f..6e0f88ee7dbdb01361a5b4aca8a8aecf8edbc39e 100644
--- a/include/clang/AST/CanonicalType.h
+++ b/include/clang/AST/CanonicalType.h
@@ -333,7 +333,7 @@ template<typename T>
 class CanProxy : public CanProxyAdaptor<T> {
 public:
   /// \brief Build a NULL proxy.
-  CanProxy() { }
+  CanProxy() = default;
 
   /// \brief Build a proxy to the given canonical type.
   CanProxy(CanQual<T> Stored) { this->Stored = Stored; }
@@ -389,7 +389,7 @@ struct CanTypeIterator
           CanQualType,
           typename std::iterator_traits<InputIterator>::difference_type,
           CanProxy<Type>, CanQualType> {
-  CanTypeIterator() {}
+  CanTypeIterator() = default;
   explicit CanTypeIterator(InputIterator Iter)
       : CanTypeIterator::iterator_adaptor_base(std::move(Iter)) {}
 
diff --git a/include/clang/AST/DeclFriend.h b/include/clang/AST/DeclFriend.h
index 12b93b408a7037c99518e3fb08efe2843294b701..5bd6da8797c9dad1a375f8c7c2d63440cd5c3c5f 100644
--- a/include/clang/AST/DeclFriend.h
+++ b/include/clang/AST/DeclFriend.h
@@ -180,7 +180,7 @@ class CXXRecordDecl::friend_iterator {
   friend class CXXRecordDecl;
   explicit friend_iterator(FriendDecl *Ptr) : Ptr(Ptr) {}
 public:
-  friend_iterator() {}
+  friend_iterator() = default;
 
   typedef FriendDecl *value_type;
   typedef FriendDecl *reference;
diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h
index bd38ac88238fe91cfa840c87eb16b571c03f8d34..3c6ef814426d531fbcf85a8dfab4104e0a4b4d17 100644
--- a/include/clang/AST/DeclTemplate.h
+++ b/include/clang/AST/DeclTemplate.h
@@ -664,7 +664,7 @@ protected:
             typename std::iterator_traits<typename llvm::FoldingSetVector<
                 EntryType>::iterator>::iterator_category,
             DeclType *, ptrdiff_t, DeclType *, DeclType *> {
-    SpecIterator() {}
+    SpecIterator() = default;
     explicit SpecIterator(
         typename llvm::FoldingSetVector<EntryType>::iterator SetIter)
         : SpecIterator::iterator_adaptor_base(std::move(SetIter)) {}
diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h
index cc1fc0ae186e8fcf55bc9404f0a03414f6143fe1..2e5de8768f1d01c7a3de30f4885607dd43c3e007 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -337,7 +337,7 @@ public:
     {}
 
   public:
-    Classification() {}
+    Classification() = default;
 
     Kinds getKind() const { return static_cast<Kinds>(Kind); }
     ModifiableType getModifiable() const {
@@ -4076,7 +4076,7 @@ public:
     friend class DesignatedInitExpr;
 
   public:
-    Designator() {}
+    Designator() = default;
 
     /// @brief Initializes a field designator.
     Designator(const IdentifierInfo *FieldName, SourceLocation DotLoc,
diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h
index e8493f1933c6607e0764ae7a073b049b9a62c30a..45d852ae0e493687bcb7952c076668d0cfe54854 100644
--- a/include/clang/AST/ExprCXX.h
+++ b/include/clang/AST/ExprCXX.h
@@ -2278,7 +2278,7 @@ public:
     : Expr(ArrayTypeTraitExprClass, Empty), ATT(0), Value(false),
       QueriedType() { }
 
-  virtual ~ArrayTypeTraitExpr() { }
+  virtual ~ArrayTypeTraitExpr() = default;
 
   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
   SourceLocation getLocEnd() const LLVM_READONLY { return RParen; }
diff --git a/include/clang/AST/Mangle.h b/include/clang/AST/Mangle.h
index 7b725b65ca1e1f6c06ac011233c58e00bfadd3a3..29d79592e54ff2ca82c7a2e7cc6cfd604a1d5663 100644
--- a/include/clang/AST/Mangle.h
+++ b/include/clang/AST/Mangle.h
@@ -64,7 +64,7 @@ public:
                          ManglerKind Kind)
       : Context(Context), Diags(Diags), Kind(Kind) {}
 
-  virtual ~MangleContext() { }
+  virtual ~MangleContext() = default;
 
   ASTContext &getASTContext() const { return Context; }
 
diff --git a/include/clang/AST/MangleNumberingContext.h b/include/clang/AST/MangleNumberingContext.h
index 7a818557fdb7446ce71d37a2d9720a860f44ce7f..fd15e1a98b7d40a8082a5951ab3dbbc0347c164f 100644
--- a/include/clang/AST/MangleNumberingContext.h
+++ b/include/clang/AST/MangleNumberingContext.h
@@ -32,7 +32,7 @@ class VarDecl;
 /// literals within a particular context.
 class MangleNumberingContext : public RefCountedBase<MangleNumberingContext> {
 public:
-  virtual ~MangleNumberingContext() {}
+  virtual ~MangleNumberingContext() = default;
 
   /// \brief Retrieve the mangling number of a new lambda expression with the
   /// given call operator within this context.
diff --git a/include/clang/AST/Redeclarable.h b/include/clang/AST/Redeclarable.h
index 92046d582bf38975e8d53dc23a806902b037f6da..fd397bec0a4c6d4d9b526703678ad9e56a7f2d83 100644
--- a/include/clang/AST/Redeclarable.h
+++ b/include/clang/AST/Redeclarable.h
@@ -248,7 +248,7 @@ Decl *getPrimaryMergedDecl(Decl *D);
 template<typename decl_type>
 class Mergeable {
 public:
-  Mergeable() {}
+  Mergeable() = default;
 
   /// \brief Return the first declaration of this declaration or itself if this
   /// is the only declaration.
diff --git a/include/clang/AST/StmtIterator.h b/include/clang/AST/StmtIterator.h
index 81f8ad4344a9c744e25c3bea5c8a0cc28eb41d05..ced6ac831680ec14007d676e5b1113fb38888bc9 100644
--- a/include/clang/AST/StmtIterator.h
+++ b/include/clang/AST/StmtIterator.h
@@ -81,7 +81,7 @@ class StmtIteratorImpl : public StmtIteratorBase,
 protected:
   StmtIteratorImpl(const StmtIteratorBase& RHS) : StmtIteratorBase(RHS) {}
 public:
-  StmtIteratorImpl() {}
+  StmtIteratorImpl() = default;
   StmtIteratorImpl(Stmt **s) : StmtIteratorBase(s) {}
   StmtIteratorImpl(Decl **dgi, Decl **dge) : StmtIteratorBase(dgi, dge) {}
   StmtIteratorImpl(const VariableArrayType *t) : StmtIteratorBase(t) {}
diff --git a/include/clang/AST/UnresolvedSet.h b/include/clang/AST/UnresolvedSet.h
index 26ee1cf71c813464d2d768c5e366345862261bf6..af2f30fe3438a3dd2f2f9ec98d6987aff07978e5 100644
--- a/include/clang/AST/UnresolvedSet.h
+++ b/include/clang/AST/UnresolvedSet.h
@@ -59,7 +59,7 @@ class UnresolvedSetImpl {
   // UnresolvedSet.
 private:
   template <unsigned N> friend class UnresolvedSet;
-  UnresolvedSetImpl() {}
+  UnresolvedSetImpl() = default;
   UnresolvedSetImpl(const UnresolvedSetImpl &) {}
 
 public:
diff --git a/include/clang/AST/VTableBuilder.h b/include/clang/AST/VTableBuilder.h
index 481fd11d6afbe8611e8923378fd6b24aeeb36395..385a8173038a21dcfc1f0689ffeef4b8e9d0cd1b 100644
--- a/include/clang/AST/VTableBuilder.h
+++ b/include/clang/AST/VTableBuilder.h
@@ -298,7 +298,7 @@ public:
 
   bool isMicrosoft() const { return IsMicrosoftABI; }
 
-  virtual ~VTableContextBase() {}
+  virtual ~VTableContextBase() = default;
 
 protected:
   typedef llvm::DenseMap<const CXXMethodDecl *, ThunkInfoVectorTy> ThunksMapTy;
diff --git a/include/clang/ASTMatchers/ASTMatchersInternal.h b/include/clang/ASTMatchers/ASTMatchersInternal.h
index 8e1abc6f771284c648abb106387a7301199b78bc..e703319f619d1264cae063a95ec3a67ec7c24454 100644
--- a/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -131,7 +131,7 @@ public:
   /// BoundNodesTree.
   class Visitor {
   public:
-    virtual ~Visitor() {}
+    virtual ~Visitor() = default;
 
     /// \brief Called multiple times during a single call to VisitMatches(...).
     ///
@@ -209,7 +209,7 @@ public:
 template <typename T>
 class MatcherInterface : public DynMatcherInterface {
 public:
-  ~MatcherInterface() override {}
+  ~MatcherInterface() override = default;
 
   /// \brief Returns true if 'Node' can be matched.
   ///
@@ -798,7 +798,7 @@ public:
     AMM_ParentOnly
   };
 
-  virtual ~ASTMatchFinder() {}
+  virtual ~ASTMatchFinder() = default;
 
   /// \brief Returns true if the given class is directly or indirectly derived
   /// from a base type matching \c base.
@@ -1376,7 +1376,7 @@ class VariadicDynCastAllOfMatcher
         BindableMatcher<SourceT>, Matcher<TargetT>,
         makeDynCastAllOfComposite<SourceT, TargetT> > {
 public:
-  VariadicDynCastAllOfMatcher() {}
+  VariadicDynCastAllOfMatcher() = default;
 };
 
 /// \brief A \c VariadicAllOfMatcher<T> object is a variadic functor that takes
@@ -1394,7 +1394,7 @@ class VariadicAllOfMatcher : public llvm::VariadicFunction<
                                BindableMatcher<T>, Matcher<T>,
                                makeAllOfComposite<T> > {
 public:
-  VariadicAllOfMatcher() {}
+  VariadicAllOfMatcher() = default;
 };
 
 /// \brief Matches nodes of type \c TLoc for which the inner
@@ -1515,7 +1515,7 @@ public:
 
   struct Func : public llvm::VariadicFunction<Self, Matcher<InnerTBase>,
                                               &Self::create> {
-    Func() {}
+    Func() = default;
   };
 
 private:
diff --git a/include/clang/Analysis/Analyses/FormatString.h b/include/clang/Analysis/Analyses/FormatString.h
index 4471311a3390a1ef29096d600fb899eb12b27197..fbcc8a5fbfcb929419ec9d1a96fe21baeb8f91e9 100644
--- a/include/clang/Analysis/Analyses/FormatString.h
+++ b/include/clang/Analysis/Analyses/FormatString.h
@@ -606,7 +606,7 @@ enum PositionContext { FieldWidthPos = 0, PrecisionPos = 1 };
 
 class FormatStringHandler {
 public:
-  FormatStringHandler() {}
+  FormatStringHandler() = default;
   virtual ~FormatStringHandler();
 
   virtual void HandleNullChar(const char *nullCharacter) {}
diff --git a/include/clang/Analysis/Analyses/LiveVariables.h b/include/clang/Analysis/Analyses/LiveVariables.h
index e17f73a61f8195534068b966b87fe254132241fc..c6c0ece13b9d83c401cf1c6df46411401a6cfad8 100644
--- a/include/clang/Analysis/Analyses/LiveVariables.h
+++ b/include/clang/Analysis/Analyses/LiveVariables.h
@@ -53,7 +53,7 @@ public:
   class Observer {
     virtual void anchor();
   public:
-    virtual ~Observer() {}
+    virtual ~Observer() = default;
     
     /// A callback invoked right before invoking the
     ///  liveness transfer function on the given statement.
diff --git a/include/clang/Analysis/Analyses/ReachableCode.h b/include/clang/Analysis/Analyses/ReachableCode.h
index 4c523bfc8b561c84cfa3a0c7213aa8f994aad209..a388cc9feca026868aa4e7e4b25399c4f7c55b9c 100644
--- a/include/clang/Analysis/Analyses/ReachableCode.h
+++ b/include/clang/Analysis/Analyses/ReachableCode.h
@@ -48,7 +48,7 @@ enum UnreachableKind {
 class Callback {
   virtual void anchor();
 public:
-  virtual ~Callback() {}
+  virtual ~Callback() = default;
   virtual void HandleUnreachable(UnreachableKind UK,
                                  SourceLocation L,
                                  SourceRange ConditionVal,
diff --git a/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h b/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
index 705fe910d092316a9c27619e05a9ceed886ca369..5bf0ea496b44e21e3847950737b1acc3b7f2e75f 100644
--- a/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
+++ b/include/clang/Analysis/Analyses/ThreadSafetyTraverse.h
@@ -176,7 +176,7 @@ template <class Self>
 class VisitReducer : public Traversal<Self, VisitReducerBase>,
                      public VisitReducerBase {
 public:
-  VisitReducer() {}
+  VisitReducer() = default;
 
 public:
   R_SExpr reduceNull() { return true; }
diff --git a/include/clang/Analysis/Analyses/UninitializedValues.h b/include/clang/Analysis/Analyses/UninitializedValues.h
index 53ff20c23560c4dd4573acdcc42857e4d43ce17a..18ed02dd2ea09e9c756603eebbc0d5931dc03b29 100644
--- a/include/clang/Analysis/Analyses/UninitializedValues.h
+++ b/include/clang/Analysis/Analyses/UninitializedValues.h
@@ -99,7 +99,7 @@ public:
 
 class UninitVariablesHandler {
 public:
-  UninitVariablesHandler() {}
+  UninitVariablesHandler() = default;
   virtual ~UninitVariablesHandler();
 
   /// Called when the uninitialized variable is used at the given expression.
diff --git a/include/clang/Analysis/AnalysisContext.h b/include/clang/Analysis/AnalysisContext.h
index 931190e43a66861c7f20db9039444ad450d0e9ee..124ec3dda5d2697c5257c3a118ca1ae64c3d445d 100644
--- a/include/clang/Analysis/AnalysisContext.h
+++ b/include/clang/Analysis/AnalysisContext.h
@@ -44,7 +44,7 @@ namespace idx { class TranslationUnit; }
 /// to AnalysisDeclContext.
 class ManagedAnalysis {
 protected:
-  ManagedAnalysis() {}
+  ManagedAnalysis() = default;
 public:
   virtual ~ManagedAnalysis();
 
@@ -289,7 +289,7 @@ class StackFrameContext : public LocationContext {
       Block(blk), Index(idx) {}
 
 public:
-  ~StackFrameContext() override {}
+  ~StackFrameContext() override = default;
 
   const Stmt *getCallSite() const { return CallSite; }
 
@@ -324,7 +324,7 @@ class ScopeContext : public LocationContext {
     : LocationContext(Scope, ctx, parent), Enter(s) {}
 
 public:
-  ~ScopeContext() override {}
+  ~ScopeContext() override = default;
 
   void Profile(llvm::FoldingSetNodeID &ID) override;
 
@@ -352,7 +352,7 @@ class BlockInvocationContext : public LocationContext {
     : LocationContext(Block, ctx, parent), BD(bd), ContextData(contextData) {}
 
 public:
-  ~BlockInvocationContext() override {}
+  ~BlockInvocationContext() override = default;
 
   const BlockDecl *getBlockDecl() const { return BD; }
   
diff --git a/include/clang/Analysis/CFG.h b/include/clang/Analysis/CFG.h
index 293990c88e703f0498efef9a45f9b0d711bba306..58e26604dcb8306ed06da0de554562525061661a 100644
--- a/include/clang/Analysis/CFG.h
+++ b/include/clang/Analysis/CFG.h
@@ -704,11 +704,11 @@ public:
 /// operator error is found when building the CFG.
 class CFGCallback {
 public:
-  CFGCallback() {}
+  CFGCallback() = default;
   virtual void compareAlwaysTrue(const BinaryOperator *B, bool isAlwaysTrue) {}
   virtual void compareBitwiseEquality(const BinaryOperator *B,
                                       bool isAlwaysTrue) {}
-  virtual ~CFGCallback() {}
+  virtual ~CFGCallback() = default;
 };
 
 /// CFG - Represents a source-level, intra-procedural CFG that represents the
diff --git a/include/clang/Basic/FileSystemStatCache.h b/include/clang/Basic/FileSystemStatCache.h
index cad91893489bc8b0ef0a973575d13ac9c5068873..430851df67c328b8c1dba26a9202f3c5cc4d7f11 100644
--- a/include/clang/Basic/FileSystemStatCache.h
+++ b/include/clang/Basic/FileSystemStatCache.h
@@ -51,7 +51,7 @@ protected:
   std::unique_ptr<FileSystemStatCache> NextStatCache;
 
 public:
-  virtual ~FileSystemStatCache() {}
+  virtual ~FileSystemStatCache() = default;
   
   enum LookupResult {
     CacheExists,   ///< We know the file exists and its cached stat data.
diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h
index d672314f56e2d44d45b85af3bcfa45af2a834a1e..b0812ccd90a945f138a11e95fa0dce31b57d7906 100644
--- a/include/clang/Basic/IdentifierTable.h
+++ b/include/clang/Basic/IdentifierTable.h
@@ -385,7 +385,7 @@ private:
   void operator=(const IdentifierIterator &) = delete;
 
 protected:
-  IdentifierIterator() { }
+  IdentifierIterator() = default;
   
 public:
   virtual ~IdentifierIterator();
diff --git a/include/clang/Driver/Job.h b/include/clang/Driver/Job.h
index 263356f396f3ee755d9090dab1ebd91e830d883e..d1fd6e346507f6b54edb5c70ff99d5b1202242ee 100644
--- a/include/clang/Driver/Job.h
+++ b/include/clang/Driver/Job.h
@@ -88,7 +88,7 @@ public:
   // FIXME: This really shouldn't be copyable, but is currently copied in some
   // error handling in Driver::generateCompilationDiagnostics.
   Command(const Command &) = default;
-  virtual ~Command() {}
+  virtual ~Command() = default;
 
   virtual void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,
                      CrashReportInfo *CrashInfo = nullptr) const;
diff --git a/include/clang/Edit/EditsReceiver.h b/include/clang/Edit/EditsReceiver.h
index 600ac28ea920ee1124fb868f2c9b571b545cb02f..1b63d0ee864f7c26bb18265f8273d3ae2c2897f7 100644
--- a/include/clang/Edit/EditsReceiver.h
+++ b/include/clang/Edit/EditsReceiver.h
@@ -20,7 +20,7 @@ namespace edit {
 
 class EditsReceiver {
 public:
-  virtual ~EditsReceiver() { }
+  virtual ~EditsReceiver() = default;
 
   virtual void insert(SourceLocation loc, StringRef text) = 0;
   virtual void replace(CharSourceRange range, StringRef text) = 0;
diff --git a/include/clang/Frontend/SerializedDiagnosticReader.h b/include/clang/Frontend/SerializedDiagnosticReader.h
index 3db362bf3470fe35caa0a4f26bb21d03b4a5a07d..5c0a06f4c1448d6de0775552a04d062041b4c4c4 100644
--- a/include/clang/Frontend/SerializedDiagnosticReader.h
+++ b/include/clang/Frontend/SerializedDiagnosticReader.h
@@ -58,8 +58,8 @@ struct Location {
 /// the various constructs that are found in serialized diagnostics.
 class SerializedDiagnosticReader {
 public:
-  SerializedDiagnosticReader() {}
-  virtual ~SerializedDiagnosticReader() {}
+  SerializedDiagnosticReader() = default;
+  virtual ~SerializedDiagnosticReader() = default;
 
   /// \brief Read the diagnostics in \c File
   std::error_code readDiagnostics(StringRef File);
diff --git a/include/clang/Frontend/VerifyDiagnosticConsumer.h b/include/clang/Frontend/VerifyDiagnosticConsumer.h
index 475f07f9dc06ad55d774352c4f70c3be17b7bccd..493dac3b11a9e6007fd48c512cdb36e0e2300cc7 100644
--- a/include/clang/Frontend/VerifyDiagnosticConsumer.h
+++ b/include/clang/Frontend/VerifyDiagnosticConsumer.h
@@ -161,7 +161,7 @@ public:
     unsigned Min, Max;
     bool MatchAnyLine;
 
-    virtual ~Directive() { }
+    virtual ~Directive() = default;
 
     // Returns true if directive text is valid.
     // Otherwise returns false and populates E.
diff --git a/include/clang/Lex/ModuleMap.h b/include/clang/Lex/ModuleMap.h
index 155943e5453c8de431700cc25a2d29abd3712297..3320843243bd17c07068c82f3d3076f3402bc742 100644
--- a/include/clang/Lex/ModuleMap.h
+++ b/include/clang/Lex/ModuleMap.h
@@ -40,7 +40,7 @@ class ModuleMapParser;
 /// reads module map files.
 class ModuleMapCallbacks {
 public:
-  virtual ~ModuleMapCallbacks() {}
+  virtual ~ModuleMapCallbacks() = default;
 
   /// \brief Called when a module map file has been read.
   ///
diff --git a/include/clang/Lex/PTHLexer.h b/include/clang/Lex/PTHLexer.h
index 904be792b2a9830544400c68ddc0463f3dc9410a..e2e2306c0e82181a1a53ee9c1ecf9d16bfafbea8 100644
--- a/include/clang/Lex/PTHLexer.h
+++ b/include/clang/Lex/PTHLexer.h
@@ -64,7 +64,7 @@ protected:
   PTHLexer(Preprocessor& pp, FileID FID, const unsigned char *D,
            const unsigned char* ppcond, PTHManager &PM);
 public:
-  ~PTHLexer() override {}
+  ~PTHLexer() override = default;
 
   /// Lex - Return the next token.
   bool Lex(Token &Tok);
diff --git a/include/clang/Lex/PreprocessorLexer.h b/include/clang/Lex/PreprocessorLexer.h
index 6d6cf05a96c457bf8835516d0f5041693a89f9c0..dfc7768f6271d61f25dd47fec0838f7c14699b6a 100644
--- a/include/clang/Lex/PreprocessorLexer.h
+++ b/include/clang/Lex/PreprocessorLexer.h
@@ -81,7 +81,7 @@ protected:
       ParsingFilename(false),
       LexingRawMode(false) {}
 
-  virtual ~PreprocessorLexer() {}
+  virtual ~PreprocessorLexer() = default;
 
   virtual void IndirectLex(Token& Result) = 0;
 
diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h
index cce5405a1e0a5c2640e007df074b66c3006da5b7..09d6a4b8504c1846c6808c7e5487b84bce811067 100644
--- a/include/clang/Sema/Sema.h
+++ b/include/clang/Sema/Sema.h
@@ -1313,7 +1313,7 @@ public:
     TypeDiagnoser(bool Suppressed = false) : Suppressed(Suppressed) { }
 
     virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) = 0;
-    virtual ~TypeDiagnoser() {}
+    virtual ~TypeDiagnoser() = default;
   };
 
   static int getPrintable(int I) { return I; }
@@ -2297,7 +2297,7 @@ public:
     virtual SemaDiagnosticBuilder diagnoseConversion(
         Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) = 0;
 
-    virtual ~ContextualImplicitConverter() {}
+    virtual ~ContextualImplicitConverter() = default;
   };
 
   class ICEConvertDiagnoser : public ContextualImplicitConverter {
@@ -8597,7 +8597,7 @@ public:
 
     virtual void diagnoseNotICE(Sema &S, SourceLocation Loc, SourceRange SR) =0;
     virtual void diagnoseFold(Sema &S, SourceLocation Loc, SourceRange SR);
-    virtual ~VerifyICEDiagnoser() { }
+    virtual ~VerifyICEDiagnoser() = default;
   };
 
   /// VerifyIntegerConstantExpression - Verifies that an expression is an ICE,
diff --git a/include/clang/Sema/TypoCorrection.h b/include/clang/Sema/TypoCorrection.h
index 958aab0fce349a164ecbfab5b43bc63a7b8e6771..6c8a2852df2ca9b28edf2c71b4c8e437e2b17e9a 100644
--- a/include/clang/Sema/TypoCorrection.h
+++ b/include/clang/Sema/TypoCorrection.h
@@ -255,7 +255,7 @@ public:
         IsObjCIvarLookup(false), IsAddressOfOperand(false), Typo(Typo),
         TypoNNS(TypoNNS) {}
 
-  virtual ~CorrectionCandidateCallback() {}
+  virtual ~CorrectionCandidateCallback() = default;
 
   /// \brief Simple predicate used by the default RankCandidate to
   /// determine whether to return an edit distance of 0 or InvalidDistance.
diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
index 57c73fd6eca16e29a1f8582d706c7b3dbb59dad9..b8133bfd127ac0b4ebe7372f4c4eb0fe458150d6 100644
--- a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
+++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporter.h
@@ -57,7 +57,7 @@ public:
   class NodeResolver {
     virtual void anchor();
   public:
-    virtual ~NodeResolver() {}
+    virtual ~NodeResolver() = default;
     virtual const ExplodedNode*
             getOriginalNode(const ExplodedNode *N) = 0;
   };
@@ -529,7 +529,7 @@ class BugReporterContext {
 public:
   BugReporterContext(GRBugReporter& br) : BR(br) {}
 
-  virtual ~BugReporterContext() {}
+  virtual ~BugReporterContext() = default;
 
   GRBugReporter& getBugReporter() { return BR; }
 
diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
index 16226e94df48c66f30a5b5295d12bbf30ef41667..60f91de6dfcc2a4bff9acf3a298abd831a18732c 100644
--- a/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
+++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
@@ -42,7 +42,7 @@ public:
   BugType(const CheckerBase *checker, StringRef name, StringRef cat)
       : Check(checker->getCheckName()), Name(name), Category(cat),
         SuppressonSink(false) {}
-  virtual ~BugType() {}
+  virtual ~BugType() = default;
 
   // FIXME: Should these be made strings as well?
   StringRef getName() const { return Name; }
diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
index 35421f9455ea30615a6e51f6049b1df18369667e..ad083f712213ca96ac97f1af83ed61e863ac0f3c 100644
--- a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
+++ b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h
@@ -481,7 +481,7 @@ private:
 
 public:
   StackHintGeneratorForSymbol(SymbolRef S, StringRef M) : Sym(S), Msg(M) {}
-  ~StackHintGeneratorForSymbol() override {}
+  ~StackHintGeneratorForSymbol() override = default;
 
   /// \brief Search the call expression for the symbol Sym and dispatch the
   /// 'getMessageForX()' methods to construct a specific message.
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
index cf888b5040e5f24a6f3582d03b2a98b087838131..7fe8e3d3db4566c198c6fdc478ec9f124dbd410f 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
@@ -168,7 +168,7 @@ protected:
                  RegionAndSymbolInvalidationTraits *ETraits) const {}
 
 public:
-  virtual ~CallEvent() {}
+  virtual ~CallEvent() = default;
 
   /// \brief Returns the kind of call this is.
   virtual Kind getKind() const = 0;
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
index d5822e22448199ff93c51f6707c808b0294f158b..368fdee4be326a29526274509dd91529bae7bb29 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
@@ -254,7 +254,7 @@ public:
     assert(hasNoSinksInFrontier());
   }
 
-  virtual ~NodeBuilder() {}
+  virtual ~NodeBuilder() = default;
 
   /// \brief Generates a node in the ExplodedGraph.
   ExplodedNode *generateNode(const ProgramPoint &PP,
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
index a68d3410a87b5271ddc3f87c609bb438d279f63c..9ae9aaf6ded277bd73da15ee9a0a6bcc2c7f1543 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
@@ -68,7 +68,7 @@ public:
       ArrayIndexTy(context.IntTy),
       ArrayIndexWidth(context.getTypeSize(ArrayIndexTy)) {}
 
-  virtual ~SValBuilder() {}
+  virtual ~SValBuilder() = default;
 
   bool haveSameType(const SymExpr *Sym1, const SymExpr *Sym2) {
     return haveSameType(Sym1->getType(), Sym2->getType());
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h b/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
index a03b6306a0edea7ba2b3900834e91cbb86e11c75..b29e5f7047073387c56be38d921fa023b8c25044 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h
@@ -49,7 +49,7 @@ protected:
   StoreManager(ProgramStateManager &stateMgr);
 
 public:
-  virtual ~StoreManager() {}
+  virtual ~StoreManager() = default;
 
   /// Return the value bound to specified location in a given state.
   /// \param[in] store The analysis state.
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
index 741ba0e2f290ab0d798ac3d1db96888141cb61d3..fa3f200ba8a46f590553d703d6ce09052beb4920 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h
@@ -43,7 +43,7 @@ class MemRegion;
 class SubEngine {
   virtual void anchor();
 public:
-  virtual ~SubEngine() {}
+  virtual ~SubEngine() = default;
 
   virtual ProgramStateRef getInitialState(const LocationContext *InitLoc) = 0;
 
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
index 05de02db592aec32007b9523413ad6916ad97408..cfb7edec8e96c9c77a4963a7318e1510b29b9221 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h
@@ -57,7 +57,7 @@ protected:
   SymExpr(Kind k) : K(k) {}
 
 public:
-  virtual ~SymExpr() {}
+  virtual ~SymExpr() = default;
 
   Kind getKind() const { return K; }
 
@@ -109,7 +109,7 @@ protected:
   SymbolData(Kind k, SymbolID sym) : SymExpr(k), Sym(sym) {}
 
 public:
-  ~SymbolData() override {}
+  ~SymbolData() override = default;
 
   SymbolID getSymbolID() const { return Sym; }
 
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/TaintManager.h b/include/clang/StaticAnalyzer/Core/PathSensitive/TaintManager.h
index d39b5017d312df900f4ac1c452a00574f7dd08d0..d46efd4ef0fb73715f5135810cd515fdea1d1152 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/TaintManager.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/TaintManager.h
@@ -37,7 +37,7 @@ template<> struct ProgramStateTrait<TaintMap>
 
 class TaintManager {
 
-  TaintManager() {}
+  TaintManager() = default;
 };
 
 }
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h b/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h
index 4f1a60e675569b4a0ff2abb8a3f6c6bc50961149..24d4503f377efab3a234ed5d209d6d7bc357e346 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h
@@ -82,7 +82,7 @@ public:
 
   class Visitor {
   public:
-    Visitor() {}
+    Visitor() = default;
     virtual ~Visitor();
     virtual bool visit(const WorkListUnit &U) = 0;
   };
diff --git a/include/clang/Tooling/FileMatchTrie.h b/include/clang/Tooling/FileMatchTrie.h
index 745c1645068a48fa08697c5b46f23a891ba930d9..d7a6a379c257f5ffeeed7325921b0630d41eb3a4 100644
--- a/include/clang/Tooling/FileMatchTrie.h
+++ b/include/clang/Tooling/FileMatchTrie.h
@@ -25,7 +25,7 @@ namespace clang {
 namespace tooling {
 
 struct PathComparator {
-  virtual ~PathComparator() {}
+  virtual ~PathComparator() = default;
   virtual bool equivalent(StringRef FileA, StringRef FileB) const = 0;
 };
 class FileMatchTrieNode;
diff --git a/include/clang/Tooling/Tooling.h b/include/clang/Tooling/Tooling.h
index b7a9b25acd0e4bcabe80a963ecd1b54258534c0e..ada1f526b5b7ba7058dd0756cdcf6e84a3f16586 100644
--- a/include/clang/Tooling/Tooling.h
+++ b/include/clang/Tooling/Tooling.h
@@ -110,7 +110,7 @@ std::unique_ptr<FrontendActionFactory> newFrontendActionFactory();
 /// newFrontendActionFactory.
 class SourceFileCallbacks {
 public:
-  virtual ~SourceFileCallbacks() {}
+  virtual ~SourceFileCallbacks() = default;
 
   /// \brief Called before a source file is processed by a FrontEndAction.
   /// \see clang::FrontendAction::BeginSourceFileAction
diff --git a/lib/ARCMigrate/ARCMT.cpp b/lib/ARCMigrate/ARCMT.cpp
index 7eb01fb93db05ac9a4778eeb8ea3e8c9756cc0dd..c9239ded2b2d000978cbc0fafa86bb3a72103254 100644
--- a/lib/ARCMigrate/ARCMT.cpp
+++ b/lib/ARCMigrate/ARCMT.cpp
@@ -498,7 +498,7 @@ public:
 } // end anonymous namespace.
 
 /// \brief Anchor for VTable.
-MigrationProcess::RewriteListener::~RewriteListener() { }
+MigrationProcess::RewriteListener::~RewriteListener() = default;
 
 MigrationProcess::MigrationProcess(
     const CompilerInvocation &CI,
diff --git a/lib/ARCMigrate/TransformActions.cpp b/lib/ARCMigrate/TransformActions.cpp
index c628b54ed414d8cd50510883904452af458584be..e7eb821691f9c4ac68026575299bac7a5e3be729 100644
--- a/lib/ARCMigrate/TransformActions.cpp
+++ b/lib/ARCMigrate/TransformActions.cpp
@@ -594,7 +594,7 @@ SourceLocation TransformActionsImpl::getLocForEndOfToken(SourceLocation loc,
   return PP.getLocForEndOfToken(loc);
 }
 
-TransformActions::RewriteReceiver::~RewriteReceiver() { }
+TransformActions::RewriteReceiver::~RewriteReceiver() = default;
 
 TransformActions::TransformActions(DiagnosticsEngine &diag,
                                    CapturedDiagList &capturedDiags,
diff --git a/lib/ARCMigrate/Transforms.cpp b/lib/ARCMigrate/Transforms.cpp
index 56d3af7233bf6ea94a2549de207193de4a16ba7c..2bdaf19ebca3316bf69767871485e8ded209d643 100644
--- a/lib/ARCMigrate/Transforms.cpp
+++ b/lib/ARCMigrate/Transforms.cpp
@@ -27,7 +27,7 @@ using namespace clang;
 using namespace arcmt;
 using namespace trans;
 
-ASTTraverser::~ASTTraverser() { }
+ASTTraverser::~ASTTraverser() = default;
 
 bool MigrationPass::CFBridgingFunctionsDefined() {
   if (!EnableCFBridgeFns.hasValue())
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 848158877aa7674bd21614d47dbfd55d12ed7963..1f1e00a812e4c8c6927172b814a8688c50f0e4f4 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -7914,7 +7914,7 @@ QualType ASTContext::getCorrespondingUnsignedType(QualType T) const {
   }
 }
 
-ASTMutationListener::~ASTMutationListener() { }
+ASTMutationListener::~ASTMutationListener() = default;
 
 void ASTMutationListener::DeducedReturnType(const FunctionDecl *FD,
                                             QualType ReturnType) {}
@@ -8502,7 +8502,7 @@ MangleContext *ASTContext::createMangleContext() {
   llvm_unreachable("Unsupported ABI");
 }
 
-CXXABI::~CXXABI() {}
+CXXABI::~CXXABI() = default;
 
 size_t ASTContext::getSideTableAllocatedMemory() const {
   return ASTRecordLayouts.getMemorySize() +
diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp
index 6816dd11d9b20447150dbbea95c231486322ae9d..fded9444a5213dba589c28aa227e7b360319f719 100644
--- a/lib/AST/ASTImporter.cpp
+++ b/lib/AST/ASTImporter.cpp
@@ -5344,7 +5344,7 @@ ASTImporter::ASTImporter(ASTContext &ToContext, FileManager &ToFileManager,
     = ToContext.getTranslationUnitDecl();
 }
 
-ASTImporter::~ASTImporter() { }
+ASTImporter::~ASTImporter() = default;
 
 QualType ASTImporter::Import(QualType FromT) {
   if (FromT.isNull())
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 406dff68993a84bebdcba24df364dfa35e8866ce..ff92630a263a2f8ae47e51de7359c09f62f443fc 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -236,7 +236,7 @@ void PrettyStackTraceDecl::print(raw_ostream &OS) const {
 //===----------------------------------------------------------------------===//
 
 // Out-of-line virtual method providing a home for Decl.
-Decl::~Decl() { }
+Decl::~Decl() = default;
 
 void Decl::setDeclContext(DeclContext *DC) {
   DeclCtx = DC;
@@ -836,7 +836,7 @@ bool DeclContext::classof(const Decl *D) {
   }
 }
 
-DeclContext::~DeclContext() { }
+DeclContext::~DeclContext() = default;
 
 /// \brief Find the parent context of this context that will be
 /// used for unqualified name lookup.
diff --git a/lib/AST/ExternalASTSource.cpp b/lib/AST/ExternalASTSource.cpp
index e3de8c5fefa2b5e8885cf6e10c2b7f802f3c8716..c42a8b4fcd0cf58b473a88224c415b221cb0f78c 100644
--- a/lib/AST/ExternalASTSource.cpp
+++ b/lib/AST/ExternalASTSource.cpp
@@ -21,7 +21,7 @@
 
 using namespace clang;
 
-ExternalASTSource::~ExternalASTSource() { }
+ExternalASTSource::~ExternalASTSource() = default;
 
 llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
 ExternalASTSource::getSourceDescriptor(unsigned ID) {
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index bf155f5680bbd4e8a6bb65d50864f503ccf3c313..21c2959f648c03090e2d87682b6beca5314db6c3 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -2338,4 +2338,4 @@ void Stmt::printPretty(raw_ostream &OS,
 //===----------------------------------------------------------------------===//
 
 // Implement virtual destructor.
-PrinterHelper::~PrinterHelper() {}
+PrinterHelper::~PrinterHelper() = default;
diff --git a/lib/AST/VTableBuilder.cpp b/lib/AST/VTableBuilder.cpp
index 6829da5bb142c00dbbcb141356636f60bdc959f5..747a1bda367f83c7fead95f150b679aa7ffa164a 100644
--- a/lib/AST/VTableBuilder.cpp
+++ b/lib/AST/VTableBuilder.cpp
@@ -2229,7 +2229,7 @@ VTableLayout::VTableLayout(uint64_t NumVTableComponents,
   });
 }
 
-VTableLayout::~VTableLayout() { }
+VTableLayout::~VTableLayout() = default;
 
 ItaniumVTableContext::ItaniumVTableContext(ASTContext &Context)
     : VTableContextBase(/*MS=*/false) {}
diff --git a/lib/ASTMatchers/ASTMatchFinder.cpp b/lib/ASTMatchers/ASTMatchFinder.cpp
index 8807b13c5ed1dbf47473913cde96fe5c0fde3240..f4cf5ef20f228142c960999bcf87c9b87c953f0d 100644
--- a/lib/ASTMatchers/ASTMatchFinder.cpp
+++ b/lib/ASTMatchers/ASTMatchFinder.cpp
@@ -902,13 +902,13 @@ MatchFinder::MatchResult::MatchResult(const BoundNodes &Nodes,
   : Nodes(Nodes), Context(Context),
     SourceManager(&Context->getSourceManager()) {}
 
-MatchFinder::MatchCallback::~MatchCallback() {}
-MatchFinder::ParsingDoneTestCallback::~ParsingDoneTestCallback() {}
+MatchFinder::MatchCallback::~MatchCallback() = default;
+MatchFinder::ParsingDoneTestCallback::~ParsingDoneTestCallback() = default;
 
 MatchFinder::MatchFinder(MatchFinderOptions Options)
     : Options(std::move(Options)), ParsingDone(nullptr) {}
 
-MatchFinder::~MatchFinder() {}
+MatchFinder::~MatchFinder() = default;
 
 void MatchFinder::addMatcher(const DeclarationMatcher &NodeMatch,
                              MatchCallback *Action) {
diff --git a/lib/ASTMatchers/Dynamic/Marshallers.h b/lib/ASTMatchers/Dynamic/Marshallers.h
index 64d6b7814aeb63f149743fb82ee6be8e73c3c4af..0d6fbf916c5fe7ac6808eb5a6f886662aff388cf 100644
--- a/lib/ASTMatchers/Dynamic/Marshallers.h
+++ b/lib/ASTMatchers/Dynamic/Marshallers.h
@@ -103,7 +103,7 @@ public:
 /// arguments, and various other methods for type introspection.
 class MatcherDescriptor {
 public:
-  virtual ~MatcherDescriptor() {}
+  virtual ~MatcherDescriptor() = default;
   virtual VariantMatcher create(SourceRange NameRange,
                                 ArrayRef<ParserValue> Args,
                                 Diagnostics *Error) const = 0;
@@ -491,7 +491,7 @@ public:
   OverloadedMatcherDescriptor(ArrayRef<MatcherDescriptor *> Callbacks)
       : Overloads(Callbacks.begin(), Callbacks.end()) {}
 
-  ~OverloadedMatcherDescriptor() override {}
+  ~OverloadedMatcherDescriptor() override = default;
 
   VariantMatcher create(SourceRange NameRange,
                         ArrayRef<ParserValue> Args,
diff --git a/lib/ASTMatchers/Dynamic/Parser.cpp b/lib/ASTMatchers/Dynamic/Parser.cpp
index cf9dab6dc7dbd09971f62b167f44bf7e76a1b726..ca4a12716d29c567a9446b5498f1e1b1da997426 100644
--- a/lib/ASTMatchers/Dynamic/Parser.cpp
+++ b/lib/ASTMatchers/Dynamic/Parser.cpp
@@ -257,7 +257,7 @@ private:
   const char *CodeCompletionLocation;
 };
 
-Parser::Sema::~Sema() {}
+Parser::Sema::~Sema() = default;
 
 std::vector<ArgKind> Parser::Sema::getAcceptedCompletionTypes(
     llvm::ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
@@ -526,7 +526,7 @@ Parser::Parser(CodeTokenizer *Tokenizer, Sema *S,
     : Tokenizer(Tokenizer), S(S ? S : &*DefaultRegistrySema),
       NamedValues(NamedValues), Error(Error) {}
 
-Parser::RegistrySema::~RegistrySema() {}
+Parser::RegistrySema::~RegistrySema() = default;
 
 llvm::Optional<MatcherCtor>
 Parser::RegistrySema::lookupMatcherCtor(StringRef MatcherName) {
diff --git a/lib/ASTMatchers/Dynamic/VariantValue.cpp b/lib/ASTMatchers/Dynamic/VariantValue.cpp
index 8f3c70c1a8d8aa15d4e254be15ee95277f404a5a..d73fb7b623f8a3de97572daac7218172dbe04eb3 100644
--- a/lib/ASTMatchers/Dynamic/VariantValue.cpp
+++ b/lib/ASTMatchers/Dynamic/VariantValue.cpp
@@ -75,7 +75,7 @@ VariantMatcher::MatcherOps::constructVariadicOperator(
   return DynTypedMatcher::constructVariadic(Op, NodeKind, DynMatchers);
 }
 
-VariantMatcher::Payload::~Payload() {}
+VariantMatcher::Payload::~Payload() = default;
 
 class VariantMatcher::SinglePayload : public VariantMatcher::Payload {
 public:
@@ -113,7 +113,7 @@ public:
   PolymorphicPayload(std::vector<DynTypedMatcher> MatchersIn)
       : Matchers(std::move(MatchersIn)) {}
 
-  ~PolymorphicPayload() override {}
+  ~PolymorphicPayload() override = default;
 
   llvm::Optional<DynTypedMatcher> getSingleMatcher() const override {
     if (Matchers.size() != 1)
diff --git a/lib/Analysis/AnalysisDeclContext.cpp b/lib/Analysis/AnalysisDeclContext.cpp
index d7fb7e95d7586959cfc2e9ae43ee1e3747c7fc1a..a54710181d1a39559428dd1e104e69c1657c8c54 100644
--- a/lib/Analysis/AnalysisDeclContext.cpp
+++ b/lib/Analysis/AnalysisDeclContext.cpp
@@ -551,7 +551,7 @@ ManagedAnalysis *&AnalysisDeclContext::getAnalysisImpl(const void *tag) {
 // Cleanup.
 //===----------------------------------------------------------------------===//
 
-ManagedAnalysis::~ManagedAnalysis() {}
+ManagedAnalysis::~ManagedAnalysis() = default;
 
 AnalysisDeclContext::~AnalysisDeclContext() {
   delete forcedBlkExprs;
@@ -568,7 +568,7 @@ AnalysisDeclContextManager::~AnalysisDeclContextManager() {
   llvm::DeleteContainerSeconds(Contexts);
 }
 
-LocationContext::~LocationContext() {}
+LocationContext::~LocationContext() = default;
 
 LocationContextManager::~LocationContextManager() {
   clear();
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp
index 6cb63f2b175512c4d30b4568051f9829fd925981..63201c45951f26d537082aad302ff308b5552c9e 100644
--- a/lib/Analysis/CFG.cpp
+++ b/lib/Analysis/CFG.cpp
@@ -4010,7 +4010,7 @@ public:
     }
   }
 
-  ~StmtPrinterHelper() override {}
+  ~StmtPrinterHelper() override = default;
 
   const LangOptions &getLangOpts() const { return LangOpts; }
   void setBlockID(signed i) { currentBlock = i; }
diff --git a/lib/Analysis/CodeInjector.cpp b/lib/Analysis/CodeInjector.cpp
index 76bf364444d1b66ef3f009209da79ba55d09093c..3ac94f9bc013515f2c42f5642f0f4ee45cdf202d 100644
--- a/lib/Analysis/CodeInjector.cpp
+++ b/lib/Analysis/CodeInjector.cpp
@@ -11,5 +11,5 @@
 
 using namespace clang;
 
-CodeInjector::CodeInjector() {}
-CodeInjector::~CodeInjector() {}
+CodeInjector::CodeInjector() = default;
+CodeInjector::~CodeInjector() = default;
diff --git a/lib/Analysis/Consumed.cpp b/lib/Analysis/Consumed.cpp
index 9df23923b014b924fb0c47c101d5a84758c89f7d..11429fff452e9c06fd90df6e105265022c169ffe 100644
--- a/lib/Analysis/Consumed.cpp
+++ b/lib/Analysis/Consumed.cpp
@@ -52,7 +52,7 @@ using namespace clang;
 using namespace consumed;
 
 // Key method definition
-ConsumedWarningsHandlerBase::~ConsumedWarningsHandlerBase() {}
+ConsumedWarningsHandlerBase::~ConsumedWarningsHandlerBase() = default;
 
 static SourceLocation getFirstStmtLoc(const CFGBlock *Block) {
   // Find the source location of the first statement in the block, if the block
diff --git a/lib/Analysis/FormatString.cpp b/lib/Analysis/FormatString.cpp
index 0948bc0b08a869734c036d45b9b680a8efd1e25b..f8bbafd54904862d739ea21eee3d91a867d4424e 100644
--- a/lib/Analysis/FormatString.cpp
+++ b/lib/Analysis/FormatString.cpp
@@ -26,7 +26,7 @@ using clang::analyze_format_string::ConversionSpecifier;
 using namespace clang;
 
 // Key function to FormatStringHandler.
-FormatStringHandler::~FormatStringHandler() {}
+FormatStringHandler::~FormatStringHandler() = default;
 
 //===----------------------------------------------------------------------===//
 // Functions for parsing format strings components in both printf and
diff --git a/lib/Analysis/ProgramPoint.cpp b/lib/Analysis/ProgramPoint.cpp
index 26b59bb71de2182431e0bf8be8465a7ad924db89..787e5bbca7cacdd7e0fd7300d4ad7e0c80d6af3f 100644
--- a/lib/Analysis/ProgramPoint.cpp
+++ b/lib/Analysis/ProgramPoint.cpp
@@ -16,7 +16,7 @@
 
 using namespace clang;
 
-ProgramPointTag::~ProgramPointTag() {}
+ProgramPointTag::~ProgramPointTag() = default;
 
 ProgramPoint ProgramPoint::getProgramPoint(const Stmt *S, ProgramPoint::Kind K,
                                            const LocationContext *LC,
diff --git a/lib/Analysis/ThreadSafety.cpp b/lib/Analysis/ThreadSafety.cpp
index bce5175ece2cd9d2a9dd677045129585a4659b08..407b7f0e0d970ec544509da4069c74a0b52b6c13 100644
--- a/lib/Analysis/ThreadSafety.cpp
+++ b/lib/Analysis/ThreadSafety.cpp
@@ -48,7 +48,7 @@ using namespace clang;
 using namespace threadSafety;
 
 // Key method definition
-ThreadSafetyHandler::~ThreadSafetyHandler() {}
+ThreadSafetyHandler::~ThreadSafetyHandler() = default;
 
 namespace {
 class TILPrinter :
@@ -107,7 +107,7 @@ public:
       : CapabilityExpr(CE), LKind(LK), AcquireLoc(Loc), Asserted(Asrt),
         Declared(Declrd) {}
 
-  virtual ~FactEntry() {}
+  virtual ~FactEntry() = default;
 
   LockKind          kind()       const { return LKind;      }
   SourceLocation    loc()        const { return AcquireLoc; }
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp
index f2f791957aa320cafa03f318b95e8dbd4db72932..2ee94d5e8e5c58865ff875e760edef524e59929a 100644
--- a/lib/Analysis/UninitializedValues.cpp
+++ b/lib/Analysis/UninitializedValues.cpp
@@ -837,7 +837,7 @@ struct PruneBlocksHandler : public UninitVariablesHandler {
     : hadUse(numBlocks, false), hadAnyUse(false),
       currentBlock(0) {}
 
-  ~PruneBlocksHandler() override {}
+  ~PruneBlocksHandler() override = default;
 
   /// Records if a CFGBlock had a potential use of an uninitialized variable.
   llvm::BitVector hadUse;
@@ -922,4 +922,4 @@ void clang::runUninitializedVariablesAnalysis(
   }
 }
 
-UninitVariablesHandler::~UninitVariablesHandler() {}
+UninitVariablesHandler::~UninitVariablesHandler() = default;
diff --git a/lib/Basic/Diagnostic.cpp b/lib/Basic/Diagnostic.cpp
index 0caa876a57b7d2a8df22a52550dfdbfff929d1f4..8c15f25b5b6f254264bd03c26094db4d2aa32186 100644
--- a/lib/Basic/Diagnostic.cpp
+++ b/lib/Basic/Diagnostic.cpp
@@ -393,7 +393,7 @@ bool DiagnosticsEngine::EmitCurrentDiagnostic(bool Force) {
 }
 
 
-DiagnosticConsumer::~DiagnosticConsumer() {}
+DiagnosticConsumer::~DiagnosticConsumer() = default;
 
 void DiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
                                         const Diagnostic &Info) {
@@ -981,7 +981,7 @@ bool DiagnosticConsumer::IncludeInDiagnosticCounts() const { return true; }
 
 void IgnoringDiagConsumer::anchor() { }
 
-ForwardingDiagnosticConsumer::~ForwardingDiagnosticConsumer() {}
+ForwardingDiagnosticConsumer::~ForwardingDiagnosticConsumer() = default;
 
 void ForwardingDiagnosticConsumer::HandleDiagnostic(
        DiagnosticsEngine::Level DiagLevel,
diff --git a/lib/Basic/FileManager.cpp b/lib/Basic/FileManager.cpp
index 21e6ea3ab4bbb298535ef0fb2dcf402d54fc45b1..c04ebda1309be017e8ccfd1be1b6ded69d2c6371 100644
--- a/lib/Basic/FileManager.cpp
+++ b/lib/Basic/FileManager.cpp
@@ -605,5 +605,5 @@ void FileManager::PrintStats() const {
 }
 
 // Virtual destructors for abstract base classes that need live in Basic.
-PCHContainerWriter::~PCHContainerWriter() {}
-PCHContainerReader::~PCHContainerReader() {}
+PCHContainerWriter::~PCHContainerWriter() = default;
+PCHContainerReader::~PCHContainerReader() = default;
diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp
index 199815aa891b5be6854ba9c627f7c5bcf56683b4..c60789d816cc182f827a4a39d694f1c76b4fee14 100644
--- a/lib/Basic/IdentifierTable.cpp
+++ b/lib/Basic/IdentifierTable.cpp
@@ -53,9 +53,9 @@ IdentifierInfo::IdentifierInfo() {
 // IdentifierTable Implementation
 //===----------------------------------------------------------------------===//
 
-IdentifierIterator::~IdentifierIterator() { }
+IdentifierIterator::~IdentifierIterator() = default;
 
-IdentifierInfoLookup::~IdentifierInfoLookup() {}
+IdentifierInfoLookup::~IdentifierInfoLookup() = default;
 
 namespace {
   /// \brief A simple identifier lookup iterator that represents an
diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp
index 536ae7ff5c8fe0e39f0475ff63c371b4cd5c3377..100f6e88f1aab3220029282937143bbc1f27c59f 100644
--- a/lib/Basic/SourceManager.cpp
+++ b/lib/Basic/SourceManager.cpp
@@ -2204,7 +2204,7 @@ LLVM_DUMP_METHOD void SourceManager::dump() const {
   }
 }
 
-ExternalSLocEntrySource::~ExternalSLocEntrySource() { }
+ExternalSLocEntrySource::~ExternalSLocEntrySource() = default;
 
 /// Return the amount of memory used by memory buffers, breaking down
 /// by heap-backed versus mmap'ed memory.
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp
index 21368f8b1145596dc402cd59b30ddf5d4e64bff9..6cde57d86538bec7f1d868b922fd38a52aa8cc63 100644
--- a/lib/Basic/TargetInfo.cpp
+++ b/lib/Basic/TargetInfo.cpp
@@ -100,7 +100,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) {
 }
 
 // Out of line virtual dtor for TargetInfo.
-TargetInfo::~TargetInfo() {}
+TargetInfo::~TargetInfo() = default;
 
 /// getTypeName - Return the user string for the specified integer type enum.
 /// For example, SignedShort -> "short".
diff --git a/lib/Basic/VirtualFileSystem.cpp b/lib/Basic/VirtualFileSystem.cpp
index a20132b3de892cd4fa43acf4c136948e30774f0a..540116f6c5e0aafe903984db41158d7d100e2546 100644
--- a/lib/Basic/VirtualFileSystem.cpp
+++ b/lib/Basic/VirtualFileSystem.cpp
@@ -84,9 +84,9 @@ bool Status::exists() const {
   return isStatusKnown() && Type != file_type::file_not_found;
 }
 
-File::~File() {}
+File::~File() = default;
 
-FileSystem::~FileSystem() {}
+FileSystem::~FileSystem() = default;
 
 ErrorOr<std::unique_ptr<MemoryBuffer>>
 FileSystem::getBufferForFile(const llvm::Twine &Name, int64_t FileSize,
@@ -315,7 +315,7 @@ OverlayFileSystem::setCurrentWorkingDirectory(const Twine &Path) {
   return std::error_code();
 }
 
-clang::vfs::detail::DirIterImpl::~DirIterImpl() { }
+clang::vfs::detail::DirIterImpl::~DirIterImpl() = default;
 
 namespace {
 class OverlayFSDirIterImpl : public clang::vfs::detail::DirIterImpl {
@@ -398,7 +398,7 @@ class InMemoryNode {
 public:
   InMemoryNode(Status Stat, InMemoryNodeKind Kind)
       : Stat(std::move(Stat)), Kind(Kind) {}
-  virtual ~InMemoryNode() {}
+  virtual ~InMemoryNode() = default;
   const Status &getStatus() const { return Stat; }
   InMemoryNodeKind getKind() const { return Kind; }
   virtual std::string toString(unsigned Indent) const = 0;
@@ -482,7 +482,7 @@ InMemoryFileSystem::InMemoryFileSystem(bool UseNormalizedPaths)
                  llvm::sys::fs::perms::all_all))),
       UseNormalizedPaths(UseNormalizedPaths) {}
 
-InMemoryFileSystem::~InMemoryFileSystem() {}
+InMemoryFileSystem::~InMemoryFileSystem() = default;
 
 std::string InMemoryFileSystem::toString() const {
   return Root->toString(/*Indent=*/0);
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index cfb09e72c7b4a078335d0e45a0760fb9d32ee5ff..b09532bbad8c6c6a62fba061245af2a89ed506b7 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -40,7 +40,7 @@ CGBlockInfo::CGBlockInfo(const BlockDecl *block, StringRef name)
 }
 
 // Anchor the vtable to this translation unit.
-BlockByrefHelpers::~BlockByrefHelpers() {}
+BlockByrefHelpers::~BlockByrefHelpers() = default;
 
 /// Build the given block as a global block.
 static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
diff --git a/lib/CodeGen/CGCUDARuntime.cpp b/lib/CodeGen/CGCUDARuntime.cpp
index 014a5dbd46d685957aade55210f0bf8f280a2fe5..bd8b034c814f2e210d6903c51639e93f0ca25260 100644
--- a/lib/CodeGen/CGCUDARuntime.cpp
+++ b/lib/CodeGen/CGCUDARuntime.cpp
@@ -22,7 +22,7 @@
 using namespace clang;
 using namespace CodeGen;
 
-CGCUDARuntime::~CGCUDARuntime() {}
+CGCUDARuntime::~CGCUDARuntime() = default;
 
 RValue CGCUDARuntime::EmitCUDAKernelCallExpr(CodeGenFunction &CGF,
                                              const CUDAKernelCallExpr *E,
diff --git a/lib/CodeGen/CGCXXABI.cpp b/lib/CodeGen/CGCXXABI.cpp
index 51f1b0730b32165bd62da1d0aebfc5019dda2aef..5455000f21e7990158338134c32d3250a779724e 100644
--- a/lib/CodeGen/CGCXXABI.cpp
+++ b/lib/CodeGen/CGCXXABI.cpp
@@ -18,7 +18,7 @@
 using namespace clang;
 using namespace CodeGen;
 
-CGCXXABI::~CGCXXABI() { }
+CGCXXABI::~CGCXXABI() = default;
 
 void CGCXXABI::ErrorUnsupportedABI(CodeGenFunction &CGF, StringRef S) {
   DiagnosticsEngine &Diags = CGF.CGM.getDiags();
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index bb7fdca667aa55d776289e1152451fbde082b4fa..2b8e44ba72a74225d8ac48681fdb7a8f8768cc40 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -584,7 +584,7 @@ struct TypeExpansion {
   const TypeExpansionKind Kind;
 
   TypeExpansion(TypeExpansionKind K) : Kind(K) {}
-  virtual ~TypeExpansion() {}
+  virtual ~TypeExpansion() = default;
 };
 
 struct ConstantArrayExpansion : TypeExpansion {
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index c4b5b43b7115b544a10d5e2fea9886d01e8a9c75..12ea96755cf29d92082bd52b3a0b81bd2b6fbe5d 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -3058,4 +3058,4 @@ CodeGenFunction::EmitBlockCopyAndAutorelease(llvm::Value *Block, QualType Ty) {
 }
 
 
-CGObjCRuntime::~CGObjCRuntime() {}
+CGObjCRuntime::~CGObjCRuntime() = default;
diff --git a/lib/CodeGen/CGOpenCLRuntime.cpp b/lib/CodeGen/CGOpenCLRuntime.cpp
index 8af39ceecdfe10c84bf7ad73e6f52993ba226c42..808406a97c3b820a54e7050af4c0eacf7a48158c 100644
--- a/lib/CodeGen/CGOpenCLRuntime.cpp
+++ b/lib/CodeGen/CGOpenCLRuntime.cpp
@@ -22,7 +22,7 @@
 using namespace clang;
 using namespace CodeGen;
 
-CGOpenCLRuntime::~CGOpenCLRuntime() {}
+CGOpenCLRuntime::~CGOpenCLRuntime() = default;
 
 void CGOpenCLRuntime::EmitWorkGroupLocalVarDecl(CodeGenFunction &CGF,
                                                 const VarDecl &D) {
diff --git a/lib/CodeGen/CGOpenMPRuntime.h b/lib/CodeGen/CGOpenMPRuntime.h
index dc4238cda62ad18c283d4d927b311e37e015c088..947f2cf7a9bb699fcddbdbed26c88d858ec95c44 100644
--- a/lib/CodeGen/CGOpenMPRuntime.h
+++ b/lib/CodeGen/CGOpenMPRuntime.h
@@ -369,7 +369,7 @@ private:
 
 public:
   explicit CGOpenMPRuntime(CodeGenModule &CGM);
-  virtual ~CGOpenMPRuntime() {}
+  virtual ~CGOpenMPRuntime() = default;
   virtual void clear();
 
   /// \brief Emits outlined function for the specified OpenMP parallel directive
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 8801c3b3f256d541a46bcf6292f2fd14439357e9..9fbfcf424aeaa71e42c029ba8724ca48124ca2a1 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -1801,7 +1801,7 @@ Address CodeGenFunction::EmitFieldAnnotations(const FieldDecl *D,
   return Address(V, Addr.getAlignment());
 }
 
-CodeGenFunction::CGCapturedStmtInfo::~CGCapturedStmtInfo() { }
+CodeGenFunction::CGCapturedStmtInfo::~CGCapturedStmtInfo() = default;
 
 CodeGenFunction::SanitizerScope::SanitizerScope(CodeGenFunction *CGF)
     : CGF(CGF) {
diff --git a/lib/CodeGen/CodeGenTBAA.cpp b/lib/CodeGen/CodeGenTBAA.cpp
index c3c925cde2fd1f825563d0dca632a15d393c40ef..ee232ce7736f06bb7a4bbb202040c9cded5cba3c 100644
--- a/lib/CodeGen/CodeGenTBAA.cpp
+++ b/lib/CodeGen/CodeGenTBAA.cpp
@@ -36,8 +36,7 @@ CodeGenTBAA::CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext& VMContext,
     MDHelper(VMContext), Root(nullptr), Char(nullptr) {
 }
 
-CodeGenTBAA::~CodeGenTBAA() {
-}
+CodeGenTBAA::~CodeGenTBAA() = default;
 
 llvm::MDNode *CodeGenTBAA::getRoot() {
   // Define the root of the tree. This identifies the tree, so that
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index f76fad16cc289c0456678e6e6dc4d3df4d1274a6..aa54b0a4d4f768ce0007b111337e1175cc5432e6 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -66,7 +66,7 @@ Address ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr,
   return Address::invalid();
 }
 
-ABIInfo::~ABIInfo() {}
+ABIInfo::~ABIInfo() = default;
 
 static CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT,
                                               CGCXXABI &CXXABI) {
diff --git a/lib/Driver/Tool.cpp b/lib/Driver/Tool.cpp
index 7142e822f16e593767af709a2706ccd88ec4bc19..6ae3506e657f154d1bc941f51161c1e5b91235d3 100644
--- a/lib/Driver/Tool.cpp
+++ b/lib/Driver/Tool.cpp
@@ -19,5 +19,4 @@ Tool::Tool(const char *_Name, const char *_ShortName, const ToolChain &TC,
       ResponseSupport(_ResponseSupport), ResponseEncoding(_ResponseEncoding),
       ResponseFlag(_ResponseFlag) {}
 
-Tool::~Tool() {
-}
+Tool::~Tool() = default;
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp
index 65d4f4f4e0ab336eeb7f563b0b7e133825bd817c..e4611d21b6d533142dd0eea8a0798bf6ed4aa91e 100644
--- a/lib/Driver/ToolChain.cpp
+++ b/lib/Driver/ToolChain.cpp
@@ -72,8 +72,7 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
           << A->getValue() << A->getAsString(Args);
 }
 
-ToolChain::~ToolChain() {
-}
+ToolChain::~ToolChain() = default;
 
 vfs::FileSystem &ToolChain::getVFS() const { return getDriver().getVFS(); }
 
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 6438ea7606aa986f66d5f158c62be7125f50b500..0687699e4a1d8c045e49debe096e8213a0c57872 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -156,9 +156,9 @@ StringRef MachO::getMachOArchName(const ArgList &Args) const {
   }
 }
 
-Darwin::~Darwin() {}
+Darwin::~Darwin() = default;
 
-MachO::~MachO() {}
+MachO::~MachO() = default;
 
 std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
                                                types::ID InputType) const {
@@ -2102,7 +2102,7 @@ Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
     getProgramPaths().push_back(getDriver().Dir);
 }
 
-Generic_GCC::~Generic_GCC() {}
+Generic_GCC::~Generic_GCC() = default;
 
 Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
   switch (AC) {
@@ -2339,7 +2339,7 @@ HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
                          GetTargetCPU(Args), InstalledDir, LibPaths);
 }
 
-HexagonToolChain::~HexagonToolChain() {}
+HexagonToolChain::~HexagonToolChain() = default;
 
 Tool *HexagonToolChain::buildAssembler() const {
   return new tools::hexagon::Assembler(*this);
@@ -2642,7 +2642,7 @@ TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
   getProgramPaths().push_back(Path);
 }
 
-TCEToolChain::~TCEToolChain() {}
+TCEToolChain::~TCEToolChain() = default;
 
 bool TCEToolChain::IsMathErrnoDefault() const { return true; }
 
@@ -3987,7 +3987,7 @@ MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
   }
 }
 
-MyriadToolChain::~MyriadToolChain() {}
+MyriadToolChain::~MyriadToolChain() = default;
 
 void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
                                                 ArgStringList &CC1Args) const {
diff --git a/lib/Format/BreakableToken.h b/lib/Format/BreakableToken.h
index eb1f9fda307114ff112a4f4d996df75ed42f1e86..506d979f2deda72a688a0e70b97dfbee5cd42949 100644
--- a/lib/Format/BreakableToken.h
+++ b/lib/Format/BreakableToken.h
@@ -36,7 +36,7 @@ public:
   /// \brief Contains starting character index and length of split.
   typedef std::pair<StringRef::size_type, unsigned> Split;
 
-  virtual ~BreakableToken() {}
+  virtual ~BreakableToken() = default;
 
   /// \brief Returns the number of lines in this token in the original code.
   virtual unsigned getLineCount() const = 0;
diff --git a/lib/Format/FormatToken.cpp b/lib/Format/FormatToken.cpp
index b293cf25c355ae1c3099f0278857c68e37a07f78..fec48605b04b88c88abd2d63cae2634fa96b469a 100644
--- a/lib/Format/FormatToken.cpp
+++ b/lib/Format/FormatToken.cpp
@@ -67,7 +67,7 @@ bool FormatToken::isSimpleTypeSpecifier() const {
   }
 }
 
-TokenRole::~TokenRole() {}
+TokenRole::~TokenRole() = default;
 
 void TokenRole::precomputeFormattingInfos(const FormatToken *Token) {}
 
diff --git a/lib/Format/UnwrappedLineFormatter.cpp b/lib/Format/UnwrappedLineFormatter.cpp
index 6d9b1da49b26ffeeaaa5823f2373b30b8299abd8..100aedcd99971d67e87bc0627f21f4e3e3b29848 100644
--- a/lib/Format/UnwrappedLineFormatter.cpp
+++ b/lib/Format/UnwrappedLineFormatter.cpp
@@ -477,7 +477,7 @@ public:
                 UnwrappedLineFormatter *BlockFormatter)
       : Indenter(Indenter), Whitespaces(Whitespaces), Style(Style),
         BlockFormatter(BlockFormatter) {}
-  virtual ~LineFormatter() {}
+  virtual ~LineFormatter() = default;
 
   /// \brief Formats an \c AnnotatedLine and returns the penalty.
   ///
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index 634dbe970845e6283e5cdd9dc0591f71f9516639..2956f841e79139ae9339c90b7f7be885b631a959 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/lib/Format/UnwrappedLineParser.cpp
@@ -25,7 +25,7 @@ namespace format {
 
 class FormatTokenSource {
 public:
-  virtual ~FormatTokenSource() {}
+  virtual ~FormatTokenSource() = default;
   virtual FormatToken *getNextToken() = 0;
 
   virtual unsigned getPosition() = 0;
diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h
index c2fa02957685a760aae8f3710dd065aa24f5ccbd..88c0dc5cb7fd1534d383b584d801e69632593cce 100644
--- a/lib/Format/UnwrappedLineParser.h
+++ b/lib/Format/UnwrappedLineParser.h
@@ -51,7 +51,7 @@ struct UnwrappedLine {
 
 class UnwrappedLineConsumer {
 public:
-  virtual ~UnwrappedLineConsumer() {}
+  virtual ~UnwrappedLineConsumer() = default;
   virtual void consumeUnwrappedLine(const UnwrappedLine &Line) = 0;
   virtual void finishRun() = 0;
 };
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp
index d3d7185ea3ad97ceea064701388ea6cdf764c558..1696e36418dfee380fbef7f9c292d3541dc01b61 100644
--- a/lib/Frontend/ASTUnit.cpp
+++ b/lib/Frontend/ASTUnit.cpp
@@ -2841,7 +2841,7 @@ void ASTUnit::ConcurrencyState::finish() {
 #else // NDEBUG
 
 ASTUnit::ConcurrencyState::ConcurrencyState() { Mutex = nullptr; }
-ASTUnit::ConcurrencyState::~ConcurrencyState() {}
+ASTUnit::ConcurrencyState::~ConcurrencyState() = default;
 void ASTUnit::ConcurrencyState::start() {}
 void ASTUnit::ConcurrencyState::finish() {}
 
diff --git a/lib/Frontend/CacheTokens.cpp b/lib/Frontend/CacheTokens.cpp
index 7d2a09cd7ca03cd28e507c14abc7d8607784af26..9f641855559fb25a2d3d51b5c51dbf09451c12b5 100644
--- a/lib/Frontend/CacheTokens.cpp
+++ b/lib/Frontend/CacheTokens.cpp
@@ -47,7 +47,7 @@ class PTHEntry {
   Offset TokenData, PPCondData;
 
 public:
-  PTHEntry() {}
+  PTHEntry() = default;
 
   PTHEntry(Offset td, Offset ppcd)
     : TokenData(td), PPCondData(ppcd) {}
@@ -547,7 +547,7 @@ class StatListener : public FileSystemStatCache {
   PTHMap &PM;
 public:
   StatListener(PTHMap &pm) : PM(pm) {}
-  ~StatListener() override {}
+  ~StatListener() override = default;
 
   LookupResult getStat(const char *Path, FileData &Data, bool isFile,
                        std::unique_ptr<vfs::File> *F,
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 6e234112d7d5014de96078096fd93e98a0cd55cb..b5ac59990fe4ca41e3e6dc5ecdf9d913e5e1d967 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -59,7 +59,7 @@ CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
     HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())),
     PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {}
 
-CompilerInvocationBase::~CompilerInvocationBase() {}
+CompilerInvocationBase::~CompilerInvocationBase() = default;
 
 //===----------------------------------------------------------------------===//
 // Deserialization (from args)
diff --git a/lib/Frontend/DependencyFile.cpp b/lib/Frontend/DependencyFile.cpp
index 93d4a803469657ea35fdfd0ef2775b7134dd9db6..15ddb702cb270d2b98f129ec06896306f20daf7b 100644
--- a/lib/Frontend/DependencyFile.cpp
+++ b/lib/Frontend/DependencyFile.cpp
@@ -137,7 +137,7 @@ bool DependencyCollector::sawDependency(StringRef Filename, bool FromModule,
          (needSystemDependencies() || !IsSystem);
 }
 
-DependencyCollector::~DependencyCollector() { }
+DependencyCollector::~DependencyCollector() = default;
 void DependencyCollector::attachToPreprocessor(Preprocessor &PP) {
   PP.addPPCallbacks(
       llvm::make_unique<DepCollectorPPCallbacks>(*this, PP.getSourceManager()));
diff --git a/lib/Frontend/DiagnosticRenderer.cpp b/lib/Frontend/DiagnosticRenderer.cpp
index 6ef9a89d86fd56dcd681138a40c0d50ec4898265..b8d4124f175ecad18f4fb021b674aa304ad05e1b 100644
--- a/lib/Frontend/DiagnosticRenderer.cpp
+++ b/lib/Frontend/DiagnosticRenderer.cpp
@@ -69,7 +69,7 @@ DiagnosticRenderer::DiagnosticRenderer(const LangOptions &LangOpts,
                                        DiagnosticOptions *DiagOpts)
   : LangOpts(LangOpts), DiagOpts(DiagOpts), LastLevel() {}
 
-DiagnosticRenderer::~DiagnosticRenderer() {}
+DiagnosticRenderer::~DiagnosticRenderer() = default;
 
 namespace {
 
@@ -577,7 +577,7 @@ void DiagnosticRenderer::emitMacroExpansions(SourceLocation Loc,
     emitSingleMacroExpansion(*I, Level, Ranges, SM);
 }
 
-DiagnosticNoteRenderer::~DiagnosticNoteRenderer() {}
+DiagnosticNoteRenderer::~DiagnosticNoteRenderer() = default;
 
 void DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc,
                                                  PresumedLoc PLoc,
diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp
index ecef92e0a7dde882d2f203e229156791b0a64ac5..3c6c7d5a44669c2cf4d16f2125d2f5b4923834bb 100644
--- a/lib/Frontend/FrontendAction.cpp
+++ b/lib/Frontend/FrontendAction.cpp
@@ -126,7 +126,7 @@ public:
 
 FrontendAction::FrontendAction() : Instance(nullptr) {}
 
-FrontendAction::~FrontendAction() {}
+FrontendAction::~FrontendAction() = default;
 
 void FrontendAction::setCurrentInput(const FrontendInputFile &CurrentInput,
                                      std::unique_ptr<ASTUnit> AST) {
diff --git a/lib/Frontend/MultiplexConsumer.cpp b/lib/Frontend/MultiplexConsumer.cpp
index 91ee100f6394d8717bcc9f3892d37dbe60d0dc6d..226e33da4555893ea5cf388a72f7739e0b58918f 100644
--- a/lib/Frontend/MultiplexConsumer.cpp
+++ b/lib/Frontend/MultiplexConsumer.cpp
@@ -262,7 +262,7 @@ MultiplexConsumer::MultiplexConsumer(
   }
 }
 
-MultiplexConsumer::~MultiplexConsumer() {}
+MultiplexConsumer::~MultiplexConsumer() = default;
 
 void MultiplexConsumer::Initialize(ASTContext &Context) {
   for (auto &Consumer : Consumers)
diff --git a/lib/Frontend/Rewrite/FixItRewriter.cpp b/lib/Frontend/Rewrite/FixItRewriter.cpp
index dc787ac9557c41c5a27146580532e4123e3eea0f..8daf2ce41b4176f3f2467eab77f4dd60490579f2 100644
--- a/lib/Frontend/Rewrite/FixItRewriter.cpp
+++ b/lib/Frontend/Rewrite/FixItRewriter.cpp
@@ -200,4 +200,4 @@ void FixItRewriter::Diag(SourceLocation Loc, unsigned DiagID) {
   Diags.setClient(this, false);
 }
 
-FixItOptions::~FixItOptions() {}
+FixItOptions::~FixItOptions() = default;
diff --git a/lib/Frontend/Rewrite/FrontendActions.cpp b/lib/Frontend/Rewrite/FrontendActions.cpp
index 8cf8adf37ed669dcb7ea502465411894d0d20575..d3a22ce9adcc368008dc8fc777bb4bcd32e4edc4 100644
--- a/lib/Frontend/Rewrite/FrontendActions.cpp
+++ b/lib/Frontend/Rewrite/FrontendActions.cpp
@@ -38,7 +38,7 @@ HTMLPrintAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
 }
 
 FixItAction::FixItAction() {}
-FixItAction::~FixItAction() {}
+FixItAction::~FixItAction() = default;
 
 std::unique_ptr<ASTConsumer>
 FixItAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
diff --git a/lib/Frontend/Rewrite/RewriteModernObjC.cpp b/lib/Frontend/Rewrite/RewriteModernObjC.cpp
index 2902ba78c4ef3e688118327bb07c30a40cfd24a9..3523783b5c53d4bcb90d041fc2f0d3bf981c7bf6 100644
--- a/lib/Frontend/Rewrite/RewriteModernObjC.cpp
+++ b/lib/Frontend/Rewrite/RewriteModernObjC.cpp
@@ -244,7 +244,7 @@ namespace {
                 DiagnosticsEngine &D, const LangOptions &LOpts,
                 bool silenceMacroWarn, bool LineInfo);
 
-    ~RewriteModernObjC() override {}
+    ~RewriteModernObjC() override = default;
 
     void HandleTranslationUnit(ASTContext &C) override;
 
diff --git a/lib/Frontend/Rewrite/RewriteObjC.cpp b/lib/Frontend/Rewrite/RewriteObjC.cpp
index 204820b3041aee71c26e0b12fffbba343bc5e73c..9d9be2cbc36445aaf12f73b2042ddb94e5596084 100644
--- a/lib/Frontend/Rewrite/RewriteObjC.cpp
+++ b/lib/Frontend/Rewrite/RewriteObjC.cpp
@@ -193,7 +193,7 @@ namespace {
                 DiagnosticsEngine &D, const LangOptions &LOpts,
                 bool silenceMacroWarn);
 
-    ~RewriteObjC() override {}
+    ~RewriteObjC() override = default;
 
     void HandleTranslationUnit(ASTContext &C) override;
 
@@ -512,7 +512,7 @@ namespace {
                                                      D, LOpts,
                                                      silenceMacroWarn) {}
 
-    ~RewriteObjCFragileABI() override {}
+    ~RewriteObjCFragileABI() override = default;
     void Initialize(ASTContext &context) override;
 
     // Rewriting metadata
diff --git a/lib/Frontend/SerializedDiagnosticPrinter.cpp b/lib/Frontend/SerializedDiagnosticPrinter.cpp
index 1bf10d27694560e38ec528c9e7a2fc87d313341a..1cf886ce7be39844dfeb9d2f1b88051053bb4a51 100644
--- a/lib/Frontend/SerializedDiagnosticPrinter.cpp
+++ b/lib/Frontend/SerializedDiagnosticPrinter.cpp
@@ -62,7 +62,7 @@ public:
                  DiagnosticOptions *DiagOpts)
     : DiagnosticNoteRenderer(LangOpts, DiagOpts), Writer(Writer) {}
 
-  ~SDiagsRenderer() override {}
+  ~SDiagsRenderer() override = default;
 
 protected:
   void emitDiagnosticMessage(SourceLocation Loc,
@@ -159,7 +159,7 @@ public:
     EmitPreamble();
   }
 
-  ~SDiagsWriter() override {}
+  ~SDiagsWriter() override = default;
 
   void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
                         const Diagnostic &Info) override;
diff --git a/lib/Frontend/TextDiagnostic.cpp b/lib/Frontend/TextDiagnostic.cpp
index d4e156d44582ff0bb0839548a9b2627b3cbac0dd..938fe58ea818d97b12b10ff75841d7738b677a48 100644
--- a/lib/Frontend/TextDiagnostic.cpp
+++ b/lib/Frontend/TextDiagnostic.cpp
@@ -669,7 +669,7 @@ TextDiagnostic::TextDiagnostic(raw_ostream &OS,
                                DiagnosticOptions *DiagOpts)
   : DiagnosticRenderer(LangOpts, DiagOpts), OS(OS) {}
 
-TextDiagnostic::~TextDiagnostic() {}
+TextDiagnostic::~TextDiagnostic() = default;
 
 void
 TextDiagnostic::emitDiagnosticMessage(SourceLocation Loc,
diff --git a/lib/Index/CommentToXML.cpp b/lib/Index/CommentToXML.cpp
index 15f1696cbe91063d5d8b7f86d694c3499fdfe75f..df103db1de96c3d2b2e41d4bf7269d1428b318f7 100644
--- a/lib/Index/CommentToXML.cpp
+++ b/lib/Index/CommentToXML.cpp
@@ -1128,7 +1128,7 @@ void CommentASTToXMLConverter::appendToResultWithCDATAEscaping(StringRef S) {
 }
 
 CommentToXMLConverter::CommentToXMLConverter() : FormatInMemoryUniqueId(0) {}
-CommentToXMLConverter::~CommentToXMLConverter() {}
+CommentToXMLConverter::~CommentToXMLConverter() = default;
 
 void CommentToXMLConverter::convertCommentToHTML(const FullComment *FC,
                                                  SmallVectorImpl<char> &HTML,
diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp
index 469d782deb316a78998281fea1089923f95ce698..79564ca2d5535966fd6137110ca0adfc8d4c5eeb 100644
--- a/lib/Lex/HeaderSearch.cpp
+++ b/lib/Lex/HeaderSearch.cpp
@@ -50,7 +50,7 @@ HeaderFileInfo::getControllingMacro(ExternalPreprocessorSource *External) {
   return ControllingMacro;
 }
 
-ExternalHeaderFileInfoSource::~ExternalHeaderFileInfoSource() {}
+ExternalHeaderFileInfoSource::~ExternalHeaderFileInfoSource() = default;
 
 HeaderSearch::HeaderSearch(IntrusiveRefCntPtr<HeaderSearchOptions> HSOpts,
                            SourceManager &SourceMgr, DiagnosticsEngine &Diags,
diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp
index c231e18eecc3ec63bc2f6f6d53720a44b5065cad..8f5171880a521398dc6ea090f6f41689bbd51f3d 100644
--- a/lib/Lex/PPLexerChange.cpp
+++ b/lib/Lex/PPLexerChange.cpp
@@ -24,7 +24,7 @@
 #include "llvm/Support/Path.h"
 using namespace clang;
 
-PPCallbacks::~PPCallbacks() {}
+PPCallbacks::~PPCallbacks() = default;
 
 //===----------------------------------------------------------------------===//
 // Miscellaneous Methods.
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp
index 5f63d35c5be74b528824b8005514548a051452df..f1a625a882086036486428c132af52055250d84c 100644
--- a/lib/Lex/PTHLexer.cpp
+++ b/lib/Lex/PTHLexer.cpp
@@ -424,8 +424,7 @@ PTHManager::PTHManager(
       StringIdLookup(std::move(stringIdLookup)), NumIds(numIds), PP(nullptr),
       SpellingBase(spellingBase), OriginalSourceFile(originalSourceFile) {}
 
-PTHManager::~PTHManager() {
-}
+PTHManager::~PTHManager() = default;
 
 static void InvalidPTH(DiagnosticsEngine &Diags, const char *Msg) {
   Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Error, "%0")) << Msg;
diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp
index 3134790ccb90c0321317277bb88e4f48f0b794ec..1f158cf5e329c5f67851dc18594e19529c1f8836 100644
--- a/lib/Lex/Pragma.cpp
+++ b/lib/Lex/Pragma.cpp
@@ -31,8 +31,7 @@ using namespace clang;
 #include "llvm/Support/raw_ostream.h"
 
 // Out-of-line destructor to provide a home for the class.
-PragmaHandler::~PragmaHandler() {
-}
+PragmaHandler::~PragmaHandler() = default;
 
 //===----------------------------------------------------------------------===//
 // EmptyPragmaHandler Implementation.
diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp
index 32e6de69f0dbf6c888050d847ed4cbb1620bbdad..d01dfca8b6136bb15127225d043650616dd25089 100644
--- a/lib/Lex/PreprocessingRecord.cpp
+++ b/lib/Lex/PreprocessingRecord.cpp
@@ -19,7 +19,7 @@
 
 using namespace clang;
 
-ExternalPreprocessingRecordSource::~ExternalPreprocessingRecordSource() { }
+ExternalPreprocessingRecordSource::~ExternalPreprocessingRecordSource() = default;
 
 
 InclusionDirective::InclusionDirective(PreprocessingRecord &PPRec,
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index 869890b46cf4a25ac1925036cc7b5d697f559bf7..7b1f78a510240d7dda3fa331e552afb13b5abd89 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -53,7 +53,7 @@
 using namespace clang;
 
 //===----------------------------------------------------------------------===//
-ExternalPreprocessorSource::~ExternalPreprocessorSource() { }
+ExternalPreprocessorSource::~ExternalPreprocessorSource() = default;
 
 Preprocessor::Preprocessor(IntrusiveRefCntPtr<PreprocessorOptions> PPOpts,
                            DiagnosticsEngine &diags, LangOptions &opts,
@@ -897,11 +897,11 @@ bool Preprocessor::HandleComment(Token &result, SourceRange Comment) {
   return true;
 }
 
-ModuleLoader::~ModuleLoader() { }
+ModuleLoader::~ModuleLoader() = default;
 
-CommentHandler::~CommentHandler() { }
+CommentHandler::~CommentHandler() = default;
 
-CodeCompletionHandler::~CodeCompletionHandler() { }
+CodeCompletionHandler::~CodeCompletionHandler() = default;
 
 void Preprocessor::createPreprocessingRecord() {
   if (Record)
diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp
index ab1f97d31a6905f6d76634b3205b72abe6c4a007..82fef5ace44321fce43f1e5f70782b69f1d82f1d 100644
--- a/lib/Parse/ParseCXXInlineMethods.cpp
+++ b/lib/Parse/ParseCXXInlineMethods.cpp
@@ -222,7 +222,7 @@ void Parser::ParseCXXNonStaticMemberInitializer(Decl *VarD) {
   Toks.push_back(Eof);
 }
 
-Parser::LateParsedDeclaration::~LateParsedDeclaration() {}
+Parser::LateParsedDeclaration::~LateParsedDeclaration() = default;
 void Parser::LateParsedDeclaration::ParseLexedMethodDeclarations() {}
 void Parser::LateParsedDeclaration::ParseLexedMemberInitializers() {}
 void Parser::LateParsedDeclaration::ParseLexedMethodDefs() {}
diff --git a/lib/Rewrite/TokenRewriter.cpp b/lib/Rewrite/TokenRewriter.cpp
index 494defdedaa945f2e6f8ece2978d631eba4607fa..cc2ed1350aacdbf38cf084f1ffa4bd71d31760c2 100644
--- a/lib/Rewrite/TokenRewriter.cpp
+++ b/lib/Rewrite/TokenRewriter.cpp
@@ -46,8 +46,7 @@ TokenRewriter::TokenRewriter(FileID FID, SourceManager &SM,
   }
 }
 
-TokenRewriter::~TokenRewriter() {
-}
+TokenRewriter::~TokenRewriter() = default;
 
 
 /// RemapIterator - Convert from token_iterator (a const iterator) to
diff --git a/lib/Sema/AttributeList.cpp b/lib/Sema/AttributeList.cpp
index 3c61c95ad8ec37e440340425adc3373929bf6eab..02986deacc00fb815af91bb56cf9c4d8dff7c3a1 100644
--- a/lib/Sema/AttributeList.cpp
+++ b/lib/Sema/AttributeList.cpp
@@ -44,7 +44,7 @@ AttributeFactory::AttributeFactory() {
   // Go ahead and configure all the inline capacity.  This is just a memset.
   FreeLists.resize(InlineFreeListsCapacity);
 }
-AttributeFactory::~AttributeFactory() {}
+AttributeFactory::~AttributeFactory() = default;
 
 static size_t getFreeListIndexForSize(size_t size) {
   assert(size >= sizeof(AttributeList));
diff --git a/lib/Sema/CodeCompleteConsumer.cpp b/lib/Sema/CodeCompleteConsumer.cpp
index 18e9a5911641ce8d136e7129776c99a9fe0deb66..708d9f58754d16cac4747bc357f5f912e9a1eab6 100644
--- a/lib/Sema/CodeCompleteConsumer.cpp
+++ b/lib/Sema/CodeCompleteConsumer.cpp
@@ -426,7 +426,7 @@ CodeCompleteConsumer::OverloadCandidate::getFunctionType() const {
 // Code completion consumer implementation
 //===----------------------------------------------------------------------===//
 
-CodeCompleteConsumer::~CodeCompleteConsumer() { }
+CodeCompleteConsumer::~CodeCompleteConsumer() = default;
 
 void 
 PrintingCodeCompleteConsumer::ProcessCodeCompleteResults(Sema &SemaRef,
diff --git a/lib/Sema/MultiplexExternalSemaSource.cpp b/lib/Sema/MultiplexExternalSemaSource.cpp
index 0f93421ac21b32d6685c726382be1ae3de8f0ca0..5d0effc5a5188877c253b76c0cd0a9ee343eb264 100644
--- a/lib/Sema/MultiplexExternalSemaSource.cpp
+++ b/lib/Sema/MultiplexExternalSemaSource.cpp
@@ -28,7 +28,7 @@ MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
 }
 
 // pin the vtable here.
-MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
+MultiplexExternalSemaSource::~MultiplexExternalSemaSource() = default;
 
 ///\brief Appends new source to the source list.
 ///
diff --git a/lib/Sema/ScopeInfo.cpp b/lib/Sema/ScopeInfo.cpp
index ba8c3642bc8cb8d01f8ad1e72151e3441a338b0b..a06375816f7aeabebde150a3a83c1691e9ffcd4d 100644
--- a/lib/Sema/ScopeInfo.cpp
+++ b/lib/Sema/ScopeInfo.cpp
@@ -232,6 +232,6 @@ void LambdaScopeInfo::getPotentialVariableCapture(unsigned Idx, VarDecl *&VD,
   assert(VD);
 }
 
-FunctionScopeInfo::~FunctionScopeInfo() { }
-BlockScopeInfo::~BlockScopeInfo() { }
-CapturedRegionScopeInfo::~CapturedRegionScopeInfo() { }
+FunctionScopeInfo::~FunctionScopeInfo() = default;
+BlockScopeInfo::~BlockScopeInfo() = default;
+CapturedRegionScopeInfo::~CapturedRegionScopeInfo() = default;
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index 300e2f040a201424c78839d3ea620cb65f1d5748..bac323712e839263cb0d77437b9a1122155c6b76 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -1255,7 +1255,7 @@ void Sema::ActOnComment(SourceRange Comment) {
 }
 
 // Pin this vtable to this file.
-ExternalSemaSource::~ExternalSemaSource() {}
+ExternalSemaSource::~ExternalSemaSource() = default;
 
 void ExternalSemaSource::ReadMethodPool(Selector Sel) { }
 
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 588ae3d88ebc95fd25687cbddee9500afb8b2c63..1d027d5f07dd3da357296c2ca98132886bc472bf 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -9567,8 +9567,8 @@ protected:
   }
 
 public:
-  ExprBuilder() {}
-  virtual ~ExprBuilder() {}
+  ExprBuilder() = default;
+  virtual ~ExprBuilder() = default;
 
   virtual Expr *build(Sema &S, SourceLocation Loc) const = 0;
 };
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp
index 6fbe0da8c901baaa1414342df5a8bdf1316a2b85..556e5bb8dc1a893dde2b76d490c59ee85fcaeda6 100644
--- a/lib/Sema/SemaLookup.cpp
+++ b/lib/Sema/SemaLookup.cpp
@@ -3172,7 +3172,7 @@ void Sema::ArgumentDependentLookup(DeclarationName Name, SourceLocation Loc,
 //----------------------------------------------------------------------------
 // Search for all visible declarations.
 //----------------------------------------------------------------------------
-VisibleDeclConsumer::~VisibleDeclConsumer() { }
+VisibleDeclConsumer::~VisibleDeclConsumer() = default;
 
 bool VisibleDeclConsumer::includeHiddenDecls() const { return false; }
 
diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp
index c4e1b26e7c5f3156cd313778a48ced41aab238f6..db658de7d94daea2def13e4295e88936be74cc2c 100644
--- a/lib/Sema/SemaOpenMP.cpp
+++ b/lib/Sema/SemaOpenMP.cpp
@@ -56,7 +56,7 @@ private:
   ArrayRef<T> Arr;
 };
 struct MatchesAlways {
-  MatchesAlways() {}
+  MatchesAlways() = default;
   template <class T> bool operator()(T) { return true; }
 };
 
diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp
index 8998a7e8bc9cd16a1719e6e24b8e28075f33e523..f8974adfac4bb9ec95bff9d4762610ac6ff6f1dc 100644
--- a/lib/Sema/SemaPseudoObject.cpp
+++ b/lib/Sema/SemaPseudoObject.cpp
@@ -202,7 +202,7 @@ namespace {
       : S(S), ResultIndex(PseudoObjectExpr::NoResult),
         GenericLoc(genericLoc) {}
 
-    virtual ~PseudoOpBuilder() {}
+    virtual ~PseudoOpBuilder() = default;
 
     /// Add a normal semantic expression.
     void addSemanticExpr(Expr *semantic) {
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 31d69cbac35e582ef2074ac01eb5ed34c81a0680..9378c98899d17041868e69017ffdfa47252cd5c5 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -3600,7 +3600,7 @@ public:
     const TemplateArgumentLoc *operator->() const { return &Arg; }
   };
 
-  TemplateArgumentLocInventIterator() { }
+  TemplateArgumentLocInventIterator() = default;
 
   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
                                              InputIterator Iter)
@@ -5249,7 +5249,7 @@ QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
     };
 
 
-    TemplateArgumentLocContainerIterator() {}
+    TemplateArgumentLocContainerIterator() = default;
 
     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
                                  unsigned Index)
diff --git a/lib/Serialization/ASTCommon.cpp b/lib/Serialization/ASTCommon.cpp
index ec1a936684f425f4db0e5c9f36fc0776f90d53ae..3839fdd187178f72521d4e8adad9a145893be090 100644
--- a/lib/Serialization/ASTCommon.cpp
+++ b/lib/Serialization/ASTCommon.cpp
@@ -21,7 +21,7 @@
 using namespace clang;
 
 // Give ASTDeserializationListener's VTable a home.
-ASTDeserializationListener::~ASTDeserializationListener() { }
+ASTDeserializationListener::~ASTDeserializationListener() = default;
 
 serialization::TypeIdx
 serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index 59347de9c17d3d115746a9a079e6b4c85ec5cd2e..5e3d7622fa933049b20cc641c7e5144722473c4a 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -164,7 +164,7 @@ bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
 // PCH validator implementation
 //===----------------------------------------------------------------------===//
 
-ASTReaderListener::~ASTReaderListener() {}
+ASTReaderListener::~ASTReaderListener() = default;
 
 /// \brief Compare the given set of language options against an existing set of
 /// language options.
diff --git a/lib/Serialization/GeneratePCH.cpp b/lib/Serialization/GeneratePCH.cpp
index 9de2fdb75a070f92464ee0f79657033edee257e2..0b9acbe5ffa096570c1feaa9d11659f334b32a89 100644
--- a/lib/Serialization/GeneratePCH.cpp
+++ b/lib/Serialization/GeneratePCH.cpp
@@ -34,8 +34,7 @@ PCHGenerator::PCHGenerator(const Preprocessor &PP, StringRef OutputFile,
   Buffer->IsComplete = false;
 }
 
-PCHGenerator::~PCHGenerator() {
-}
+PCHGenerator::~PCHGenerator() = default;
 
 void PCHGenerator::HandleTranslationUnit(ASTContext &Ctx) {
   // Don't create a PCH if there were fatal failures during module loading.
diff --git a/lib/Serialization/MultiOnDiskHashTable.h b/lib/Serialization/MultiOnDiskHashTable.h
index 04dea831695c8996d69df195d6796b4685bdf7a0..6b81f1eb3d3c8865268d193767f08b57fc9c7a13 100644
--- a/lib/Serialization/MultiOnDiskHashTable.h
+++ b/lib/Serialization/MultiOnDiskHashTable.h
@@ -161,7 +161,7 @@ private:
   friend class MultiOnDiskHashTableGenerator;
 
 public:
-  MultiOnDiskHashTable() {}
+  MultiOnDiskHashTable() = default;
   MultiOnDiskHashTable(MultiOnDiskHashTable &&O)
       : Tables(std::move(O.Tables)),
         PendingOverrides(std::move(O.PendingOverrides)) {
diff --git a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
index 5d8baf6ba7dec2f20871cde653eeae8f94de1cd7..8e304f7162bd1e3fe9639ee150492a3b566c6bd6 100644
--- a/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
@@ -142,7 +142,7 @@ public:
       : cfg(cfg), Ctx(ctx), BR(br), Checker(checker), AC(ac), Parents(parents),
         Escaped(escaped), currentBlock(nullptr) {}
 
-  ~DeadStoreObs() override {}
+  ~DeadStoreObs() override = default;
 
   bool isLive(const LiveVariables::LivenessValues &Live, const VarDecl *D) {
     if (Live.isLive(D))
diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp
index 56d57c5014041e96a3df84555cea22008fb2f0fd..1b17e7a6e20ebd3e94e575028405ba7e6c537066 100644
--- a/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -46,7 +46,7 @@ STATISTIC(MaxValidBugClassSize,
           "The maximum number of bug reports in the same equivalence class "
           "where at least one report is valid (not suppressed)");
 
-BugReporterVisitor::~BugReporterVisitor() {}
+BugReporterVisitor::~BugReporterVisitor() = default;
 
 void BugReporterContext::anchor() {}
 
@@ -2731,9 +2731,9 @@ PathDiagnosticLocation BugReport::getLocation(const SourceManager &SM) const {
 // Methods for BugReporter and subclasses.
 //===----------------------------------------------------------------------===//
 
-BugReportEquivClass::~BugReportEquivClass() { }
-GRBugReporter::~GRBugReporter() { }
-BugReporterData::~BugReporterData() {}
+BugReportEquivClass::~BugReportEquivClass() = default;
+GRBugReporter::~GRBugReporter() = default;
+BugReporterData::~BugReporterData() = default;
 
 ExplodedGraph &GRBugReporter::getGraph() { return Eng.getGraph(); }
 
diff --git a/lib/StaticAnalyzer/Core/ConstraintManager.cpp b/lib/StaticAnalyzer/Core/ConstraintManager.cpp
index b7db8333aaac6b4ecfe96110ec81a032698564a2..cf35f9879fe4b31c437062878d4d69a81d05e202 100644
--- a/lib/StaticAnalyzer/Core/ConstraintManager.cpp
+++ b/lib/StaticAnalyzer/Core/ConstraintManager.cpp
@@ -16,7 +16,7 @@
 using namespace clang;
 using namespace ento;
 
-ConstraintManager::~ConstraintManager() {}
+ConstraintManager::~ConstraintManager() = default;
 
 static DefinedSVal getLocFromSymbol(const ProgramStateRef &State,
                                     SymbolRef Sym) {
diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp
index 39cf7e771755dfe1a448b2ff5d5c7498b3b6fa66..58f81ebc53d1254f1521954b169c36f6c6f01eea 100644
--- a/lib/StaticAnalyzer/Core/CoreEngine.cpp
+++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp
@@ -38,7 +38,7 @@ STATISTIC(NumPathsExplored,
 // Worklist classes for exploration of reachable states.
 //===----------------------------------------------------------------------===//
 
-WorkList::Visitor::~Visitor() {}
+WorkList::Visitor::~Visitor() = default;
 
 namespace {
 class DFS : public WorkList {
@@ -100,7 +100,7 @@ public:
 
 // Place the dstor for WorkList here because it contains virtual member
 // functions, and we the code for the dstor generated in one compilation unit.
-WorkList::~WorkList() {}
+WorkList::~WorkList() = default;
 
 WorkList *WorkList::makeDFS() { return new DFS(); }
 WorkList *WorkList::makeBFS() { return new BFS(); }
diff --git a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
index 8a09720b2a19655c02ddd545cf3b23c78aa84129..b9dc1c363c2f90ca998209cec1127819971b3bed 100644
--- a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
+++ b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
@@ -31,7 +31,7 @@ using namespace ento;
 //===----------------------------------------------------------------------===//
 
 // An out of line virtual method to provide a home for the class vtable.
-ExplodedNode::Auditor::~Auditor() {}
+ExplodedNode::Auditor::~Auditor() = default;
 
 #ifndef NDEBUG
 static ExplodedNode::Auditor* NodeAuditor = nullptr;
@@ -50,7 +50,7 @@ void ExplodedNode::SetAuditor(ExplodedNode::Auditor* A) {
 ExplodedGraph::ExplodedGraph()
   : NumNodes(0), ReclaimNodeInterval(0) {}
 
-ExplodedGraph::~ExplodedGraph() {}
+ExplodedGraph::~ExplodedGraph() = default;
 
 //===----------------------------------------------------------------------===//
 // Node reclamation.
diff --git a/lib/StaticAnalyzer/Core/MemRegion.cpp b/lib/StaticAnalyzer/Core/MemRegion.cpp
index d41fed0619e730d7f7399c2313f5cfd9ec7b7a76..7946db4d3861312c38c861ceb62f7a29e587f0d6 100644
--- a/lib/StaticAnalyzer/Core/MemRegion.cpp
+++ b/lib/StaticAnalyzer/Core/MemRegion.cpp
@@ -135,12 +135,11 @@ RegionTy* MemRegionManager::getSubRegion(const A1 a1, const A2 a2, const A3 a3,
 // Object destruction.
 //===----------------------------------------------------------------------===//
 
-MemRegion::~MemRegion() {}
+MemRegion::~MemRegion() = default;
 
-MemRegionManager::~MemRegionManager() {
-  // All regions and their data are BumpPtrAllocated.  No need to call
-  // their destructors.
-}
+// All regions and their data are BumpPtrAllocated.  No need to call their
+// destructors.
+MemRegionManager::~MemRegionManager() = default;
 
 //===----------------------------------------------------------------------===//
 // Basic methods.
diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
index 504df30de834cae03aee76671be69360d46f814f..e5b473212e1981ce8ced76e9f750cc6790dbd89c 100644
--- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
+++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
@@ -55,11 +55,11 @@ PathDiagnosticPiece::PathDiagnosticPiece(StringRef s,
 PathDiagnosticPiece::PathDiagnosticPiece(Kind k, DisplayHint hint)
   : kind(k), Hint(hint), LastInMainSourceFile(false) {}
 
-PathDiagnosticPiece::~PathDiagnosticPiece() {}
-PathDiagnosticEventPiece::~PathDiagnosticEventPiece() {}
-PathDiagnosticCallPiece::~PathDiagnosticCallPiece() {}
-PathDiagnosticControlFlowPiece::~PathDiagnosticControlFlowPiece() {}
-PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() {}
+PathDiagnosticPiece::~PathDiagnosticPiece() = default;
+PathDiagnosticEventPiece::~PathDiagnosticEventPiece() = default;
+PathDiagnosticCallPiece::~PathDiagnosticCallPiece() = default;
+PathDiagnosticControlFlowPiece::~PathDiagnosticControlFlowPiece() = default;
+PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() = default;
 
 
 void PathPieces::flattenTo(PathPieces &Primary, PathPieces &Current,
@@ -103,7 +103,7 @@ void PathPieces::flattenTo(PathPieces &Primary, PathPieces &Current,
 }
 
 
-PathDiagnostic::~PathDiagnostic() {}
+PathDiagnostic::~PathDiagnostic() = default;
 
 PathDiagnostic::PathDiagnostic(StringRef CheckName, const Decl *declWithIssue,
                                StringRef bugtype, StringRef verboseDesc,
@@ -1119,7 +1119,7 @@ void PathDiagnostic::FullProfile(llvm::FoldingSetNodeID &ID) const {
     ID.AddString(*I);
 }
 
-StackHintGenerator::~StackHintGenerator() {}
+StackHintGenerator::~StackHintGenerator() = default;
 
 std::string StackHintGeneratorForSymbol::getMessage(const ExplodedNode *N){
   ProgramPoint P = N->getLocation();
diff --git a/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp b/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
index 59ed921c2501365d0ecba9af7fc6b15e902405ce..557774a894254a4ea87337554cd352c0789f1d2a 100644
--- a/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
+++ b/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp
@@ -37,7 +37,7 @@ namespace {
                      const LangOptions &LangOpts,
                      bool supportsMultipleFiles);
 
-    ~PlistDiagnostics() override {}
+    ~PlistDiagnostics() override = default;
 
     void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
                               FilesMade *filesMade) override;
diff --git a/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp b/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
index 4051242434ec9aa2b477bd73637f5236b5faae30..9ed1aa505706ddb6c4190dae630b8ed8c7973f7c 100644
--- a/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
+++ b/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
@@ -21,7 +21,7 @@ namespace clang {
 
 namespace ento {
 
-SimpleConstraintManager::~SimpleConstraintManager() {}
+SimpleConstraintManager::~SimpleConstraintManager() = default;
 
 bool SimpleConstraintManager::canReasonAbout(SVal X) const {
   Optional<nonloc::SymbolVal> SymVal = X.getAs<nonloc::SymbolVal>();
diff --git a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
index a704ce224554fc4e1c78ee1c2b582167ce842c52..6e18941f075ecafd7bc47f0afd41801b0c2d0b39 100644
--- a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
+++ b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
@@ -29,7 +29,7 @@ public:
   SimpleSValBuilder(llvm::BumpPtrAllocator &alloc, ASTContext &context,
                     ProgramStateManager &stateMgr)
                     : SValBuilder(alloc, context, stateMgr) {}
-  ~SimpleSValBuilder() override {}
+  ~SimpleSValBuilder() override = default;
 
   SVal evalMinus(NonLoc val) override;
   SVal evalComplement(NonLoc val) override;
diff --git a/lib/StaticAnalyzer/Core/Store.cpp b/lib/StaticAnalyzer/Core/Store.cpp
index 7cdb55a597821195babfd3bf2a60a09cf9217fc2..245f6ad26de2d300e4b952e6aebd9c3a9969d0b8 100644
--- a/lib/StaticAnalyzer/Core/Store.cpp
+++ b/lib/StaticAnalyzer/Core/Store.cpp
@@ -489,7 +489,7 @@ SVal StoreManager::getLValueElement(QualType elementType, NonLoc Offset,
                                                   Ctx));
 }
 
-StoreManager::BindingsHandler::~BindingsHandler() {}
+StoreManager::BindingsHandler::~BindingsHandler() = default;
 
 bool StoreManager::FindUniqueBinding::HandleBinding(StoreManager& SMgr,
                                                     Store store,
diff --git a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
index ca92ffe8f01d6c4ee7e9d057b7513c15b7840393..13af3c1c717b5bb15e7c8d377161d2e5ce45a5c7 100644
--- a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
+++ b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
@@ -92,7 +92,7 @@ class ClangDiagPathDiagConsumer : public PathDiagnosticConsumer {
 public:
   ClangDiagPathDiagConsumer(DiagnosticsEngine &Diag)
     : Diag(Diag), IncludePath(false) {}
-  ~ClangDiagPathDiagConsumer() override {}
+  ~ClangDiagPathDiagConsumer() override = default;
   StringRef getName() const override { return "ClangDiags"; }
 
   bool supportsLogicalOpControlFlow() const override { return true; }
diff --git a/lib/Tooling/CompilationDatabase.cpp b/lib/Tooling/CompilationDatabase.cpp
index 957e40137eacb4a1af505bc0a365eba928526a11..cdbfe5190a70b8d3cc5f68a71be8e2527a79dfb1 100644
--- a/lib/Tooling/CompilationDatabase.cpp
+++ b/lib/Tooling/CompilationDatabase.cpp
@@ -32,7 +32,7 @@
 using namespace clang;
 using namespace tooling;
 
-CompilationDatabase::~CompilationDatabase() {}
+CompilationDatabase::~CompilationDatabase() = default;
 
 std::unique_ptr<CompilationDatabase>
 CompilationDatabase::loadFromDirectory(StringRef BuildDirectory,
@@ -106,7 +106,7 @@ CompilationDatabase::autoDetectFromDirectory(StringRef SourceDir,
   return DB;
 }
 
-CompilationDatabasePlugin::~CompilationDatabasePlugin() {}
+CompilationDatabasePlugin::~CompilationDatabasePlugin() = default;
 
 namespace {
 // Helper for recursively searching through a chain of actions and collecting
diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp
index 220b62558bfbcbc9036e5adb01f745a4d95ecc72..53f6e06101f7291de61d36ec4845f42fcf348fc1 100644
--- a/lib/Tooling/Tooling.cpp
+++ b/lib/Tooling/Tooling.cpp
@@ -37,9 +37,9 @@
 namespace clang {
 namespace tooling {
 
-ToolAction::~ToolAction() {}
+ToolAction::~ToolAction() = default;
 
-FrontendActionFactory::~FrontendActionFactory() {}
+FrontendActionFactory::~FrontendActionFactory() = default;
 
 // FIXME: This file contains structural duplication with other parts of the
 // code that sets up a compiler to run tools on it, and we should refactor
@@ -319,7 +319,7 @@ ClangTool::ClangTool(const CompilationDatabase &Compilations,
   appendArgumentsAdjuster(getClangSyntaxOnlyAdjuster());
 }
 
-ClangTool::~ClangTool() {}
+ClangTool::~ClangTool() = default;
 
 void ClangTool::mapVirtualFile(StringRef FilePath, StringRef Content) {
   MappedFileContents.push_back(std::make_pair(FilePath, Content));
diff --git a/tools/diagtool/DiagTool.cpp b/tools/diagtool/DiagTool.cpp
index 0e4d8088c6c2ed32bf98b7792b27c310e8a79f67..a8f4e1e37fb49cf20e805ead2071e7615bb89594 100644
--- a/tools/diagtool/DiagTool.cpp
+++ b/tools/diagtool/DiagTool.cpp
@@ -22,7 +22,7 @@ DiagTool::DiagTool(llvm::StringRef toolCmd,
                    llvm::StringRef toolDesc)
   : cmd(toolCmd), description(toolDesc) {}
 
-DiagTool::~DiagTool() {}
+DiagTool::~DiagTool() = default;
 
 typedef llvm::StringMap<DiagTool *> ToolMap;
 static inline ToolMap *getTools(void *v) { return static_cast<ToolMap*>(v); }
diff --git a/tools/libclang/CIndexDiagnostic.cpp b/tools/libclang/CIndexDiagnostic.cpp
index 9ba36a6a0f8a600ef5e6bfeec71e8214d0e8d788..68f03537149984ff77baa8803304bc425a0e634c 100644
--- a/tools/libclang/CIndexDiagnostic.cpp
+++ b/tools/libclang/CIndexDiagnostic.cpp
@@ -30,14 +30,14 @@ using namespace clang::cxloc;
 using namespace clang::cxdiag;
 using namespace llvm;
 
-CXDiagnosticSetImpl::~CXDiagnosticSetImpl() {}
+CXDiagnosticSetImpl::~CXDiagnosticSetImpl() = default;
 
 void
 CXDiagnosticSetImpl::appendDiagnostic(std::unique_ptr<CXDiagnosticImpl> D) {
   Diagnostics.push_back(std::move(D));
 }
 
-CXDiagnosticImpl::~CXDiagnosticImpl() {}
+CXDiagnosticImpl::~CXDiagnosticImpl() = default;
 
 namespace {
 class CXDiagnosticCustomNoteImpl : public CXDiagnosticImpl {
@@ -48,7 +48,7 @@ public:
     : CXDiagnosticImpl(CustomNoteDiagnosticKind),
       Message(Msg), Loc(L) {}
 
-  ~CXDiagnosticCustomNoteImpl() override {}
+  ~CXDiagnosticCustomNoteImpl() override = default;
 
   CXDiagnosticSeverity getSeverity() const override {
     return CXDiagnostic_Note;
@@ -92,7 +92,7 @@ public:
   : DiagnosticNoteRenderer(LangOpts, DiagOpts),
     CurrentSet(mainSet), MainSet(mainSet) {}
 
-  ~CXDiagnosticRenderer() override {}
+  ~CXDiagnosticRenderer() override = default;
 
   void beginDiagnostic(DiagOrStoredDiag D,
                        DiagnosticsEngine::Level Level) override {
diff --git a/tools/libclang/CIndexDiagnostic.h b/tools/libclang/CIndexDiagnostic.h
index 9f406987ebf1ab0c7bef433523c2c004dafe0273..4f005e5aecc203dc5f6d74d0bb954b1de8232e1f 100644
--- a/tools/libclang/CIndexDiagnostic.h
+++ b/tools/libclang/CIndexDiagnostic.h
@@ -117,7 +117,7 @@ struct CXStoredDiagnostic : public CXDiagnosticImpl {
     : CXDiagnosticImpl(StoredDiagnosticKind),
       Diag(Diag), LangOpts(LangOpts) { }
 
-  ~CXStoredDiagnostic() override {}
+  ~CXStoredDiagnostic() override = default;
 
   /// \brief Return the severity of the diagnostic.
   CXDiagnosticSeverity getSeverity() const override;
diff --git a/tools/libclang/CXLoadedDiagnostic.cpp b/tools/libclang/CXLoadedDiagnostic.cpp
index 2c10d34844b752bdf009fd31f49f66e1bdfbc360..7f45d85fe13a25159a524f25541c2e99109a7323 100644
--- a/tools/libclang/CXLoadedDiagnostic.cpp
+++ b/tools/libclang/CXLoadedDiagnostic.cpp
@@ -38,7 +38,7 @@ namespace {
 class CXLoadedDiagnosticSetImpl : public CXDiagnosticSetImpl {
 public:
   CXLoadedDiagnosticSetImpl() : CXDiagnosticSetImpl(true), FakeFiles(FO) {}
-  ~CXLoadedDiagnosticSetImpl() override {}
+  ~CXLoadedDiagnosticSetImpl() override = default;
 
   llvm::BumpPtrAllocator Alloc;
   Strings Categories;
@@ -63,7 +63,7 @@ public:
 // Cleanup.
 //===----------------------------------------------------------------------===//
 
-CXLoadedDiagnostic::~CXLoadedDiagnostic() {}
+CXLoadedDiagnostic::~CXLoadedDiagnostic() = default;
 
 //===----------------------------------------------------------------------===//
 // Public CXLoadedDiagnostic methods.
diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp
index 8a0498497e0d7de10be1186bc896ddc9b0f29a0b..c8b55e00d57ebe701a2e5783738ebec30ed4d051 100644
--- a/tools/libclang/Indexing.cpp
+++ b/tools/libclang/Indexing.cpp
@@ -151,9 +151,7 @@ class SessionSkipBodyData {
 
 public:
   SessionSkipBodyData() : Mux(/*recursive=*/false) {}
-  ~SessionSkipBodyData() {
-    //llvm::errs() << "RegionData: " << Skipped.size() << " - " << Skipped.getMemorySize() << "\n";
-  }
+  ~SessionSkipBodyData() = default;
 
   void copyTo(PPRegionSetTy &Set) {
     llvm::MutexGuard MG(Mux);
diff --git a/unittests/AST/EvaluateAsRValueTest.cpp b/unittests/AST/EvaluateAsRValueTest.cpp
index 820edbc7c3e888cda869780ea127ea3aca733920..4530bc95fb80e145e39299e04944734b9f209002 100644
--- a/unittests/AST/EvaluateAsRValueTest.cpp
+++ b/unittests/AST/EvaluateAsRValueTest.cpp
@@ -66,7 +66,7 @@ class EvaluateConstantInitializersAction : public clang::ASTFrontendAction {
  private:
   class Consumer : public clang::ASTConsumer {
    public:
-    ~Consumer() override {}
+    ~Consumer() override = default;
 
     void HandleTranslationUnit(clang::ASTContext &Ctx) override {
       VarInfoMap VarInfo;
diff --git a/unittests/ASTMatchers/ASTMatchersTest.h b/unittests/ASTMatchers/ASTMatchersTest.h
index 9ed7ef66e511945e7aca2ea0a80944ff00163856..b1456fd1050fc087ffbe819d40c9ad7506deddcb 100644
--- a/unittests/ASTMatchers/ASTMatchersTest.h
+++ b/unittests/ASTMatchers/ASTMatchersTest.h
@@ -26,7 +26,7 @@ using clang::tooling::FileContentMappings;
 
 class BoundNodesCallback {
 public:
-  virtual ~BoundNodesCallback() {}
+  virtual ~BoundNodesCallback() = default;
   virtual bool run(const BoundNodes *BoundNodes) = 0;
   virtual bool run(const BoundNodes *BoundNodes, ASTContext *Context) = 0;
   virtual void onEndOfTranslationUnit() {}
diff --git a/unittests/ASTMatchers/Dynamic/ParserTest.cpp b/unittests/ASTMatchers/Dynamic/ParserTest.cpp
index ef66a816aacdd1b8f22861d4b81ad2db780bd163..f181d6d19ee3f5027110be17070eb0847a71f530 100644
--- a/unittests/ASTMatchers/Dynamic/ParserTest.cpp
+++ b/unittests/ASTMatchers/Dynamic/ParserTest.cpp
@@ -23,7 +23,7 @@ namespace {
 
 class MockSema : public Parser::Sema {
 public:
-  ~MockSema() override {}
+  ~MockSema() override = default;
 
   uint64_t expectMatcher(StringRef MatcherName) {
     // Optimizations on the matcher framework make simple matchers like
diff --git a/unittests/Tooling/CompilationDatabaseTest.cpp b/unittests/Tooling/CompilationDatabaseTest.cpp
index 380d86fc5660d34f6e431f25f81a40d813cdfe9c..d45871f72967ffc40ab541033c3e9fbad7a8879a 100644
--- a/unittests/Tooling/CompilationDatabaseTest.cpp
+++ b/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -173,7 +173,7 @@ TEST(JSONCompilationDatabase, ArgumentsPreferredOverCommand) {
 }
 
 struct FakeComparator : public PathComparator {
-  ~FakeComparator() override {}
+  ~FakeComparator() override = default;
   bool equivalent(StringRef FileA, StringRef FileB) const override {
     return FileA.equals_lower(FileB);
   }
diff --git a/unittests/Tooling/RewriterTestContext.h b/unittests/Tooling/RewriterTestContext.h
index eee7ea1873b802bad1d7db951324b350095fd9bb..ae593f08a535aa716b3330c6e2dcd8df64909ac5 100644
--- a/unittests/Tooling/RewriterTestContext.h
+++ b/unittests/Tooling/RewriterTestContext.h
@@ -50,7 +50,7 @@ class RewriterTestContext {
     OverlayFileSystem->pushOverlay(InMemoryFileSystem);
   }
 
-  ~RewriterTestContext() {}
+  ~RewriterTestContext() = default;
 
   FileID createInMemoryFile(StringRef Name, StringRef Content) {
     std::unique_ptr<llvm::MemoryBuffer> Source =
diff --git a/unittests/Tooling/TestVisitor.h b/unittests/Tooling/TestVisitor.h
index f4a00394487bcfbe0e2e4ae460947246a0e0afe5..a69e18eee18910a4fa6c52f3a52ce41dc612fa81 100644
--- a/unittests/Tooling/TestVisitor.h
+++ b/unittests/Tooling/TestVisitor.h
@@ -35,9 +35,9 @@ namespace clang {
 template <typename T>
 class TestVisitor : public RecursiveASTVisitor<T> {
 public:
-  TestVisitor() { }
+  TestVisitor() = default;
 
-  virtual ~TestVisitor() { }
+  virtual ~TestVisitor() = default;
 
   enum Language {
     Lang_C,