tools/gn: Add out-of-line copy ctors for complex classes.

This patch adds out of line copy constructors for classes that our
clang-plugin considers heavy. This is an effort to enable copy
constructor checks by default.

BUG=436357
R=brettw@chromium.org, dcheng@chromium.org, thakis@chromium.org

Review URL: https://codereview.chromium.org/1728303003

Cr-Original-Commit-Position: refs/heads/master@{#377375}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 7d50ff54f4c5fd2a1a4cf52a919f9eb15d5d5469
diff --git a/tools/gn/err.cc b/tools/gn/err.cc
index 378fb7e..56e93bd 100644
--- a/tools/gn/err.cc
+++ b/tools/gn/err.cc
@@ -144,6 +144,8 @@
   }
 }
 
+Err::Err(const Err& other) = default;
+
 Err::~Err() {
 }
 
diff --git a/tools/gn/err.h b/tools/gn/err.h
index 3e077e9..eeec31a 100644
--- a/tools/gn/err.h
+++ b/tools/gn/err.h
@@ -54,6 +54,8 @@
       const std::string msg,
       const std::string& help_text = std::string());
 
+  Err(const Err& other);
+
   ~Err();
 
   bool has_error() const { return has_error_; }
diff --git a/tools/gn/label.cc b/tools/gn/label.cc
index 7c13ed2..94c0e71 100644
--- a/tools/gn/label.cc
+++ b/tools/gn/label.cc
@@ -214,6 +214,8 @@
   name_.assign(name.data(), name.size());
 }
 
+Label::Label(const Label& other) = default;
+
 Label::~Label() {
 }
 
diff --git a/tools/gn/label.h b/tools/gn/label.h
index 469e8b6..cbeb177 100644
--- a/tools/gn/label.h
+++ b/tools/gn/label.h
@@ -29,6 +29,7 @@
 
   // Makes a label with an empty toolchain.
   Label(const SourceDir& dir, const base::StringPiece& name);
+  Label(const Label& other);
   ~Label();
 
   // Resolives a string from a build file that may be relative to the
diff --git a/tools/gn/label_pattern.cc b/tools/gn/label_pattern.cc
index 98a4138..e107ba4 100644
--- a/tools/gn/label_pattern.cc
+++ b/tools/gn/label_pattern.cc
@@ -61,6 +61,8 @@
   name.CopyToString(&name_);
 }
 
+LabelPattern::LabelPattern(const LabelPattern& other) = default;
+
 LabelPattern::~LabelPattern() {
 }
 
diff --git a/tools/gn/label_pattern.h b/tools/gn/label_pattern.h
index 5c03260..7d0768c 100644
--- a/tools/gn/label_pattern.h
+++ b/tools/gn/label_pattern.h
@@ -31,6 +31,7 @@
                const SourceDir& dir,
                const base::StringPiece& name,
                const Label& toolchain_label);
+  LabelPattern(const LabelPattern& other);
   ~LabelPattern();
 
   // Converts the given input string to a pattern. This does special stuff
diff --git a/tools/gn/pattern.cc b/tools/gn/pattern.cc
index 4b14d2a..3de96a3 100644
--- a/tools/gn/pattern.cc
+++ b/tools/gn/pattern.cc
@@ -60,6 +60,8 @@
        subranges_[1].type == Subrange::LITERAL);
 }
 
+Pattern::Pattern(const Pattern& other) = default;
+
 Pattern::~Pattern() {
 }
 
@@ -151,6 +153,8 @@
 PatternList::PatternList() {
 }
 
+PatternList::PatternList(const PatternList& other) = default;
+
 PatternList::~PatternList() {
 }
 
diff --git a/tools/gn/pattern.h b/tools/gn/pattern.h
index 1aa7097..f141f3e 100644
--- a/tools/gn/pattern.h
+++ b/tools/gn/pattern.h
@@ -47,6 +47,7 @@
   };
 
   explicit Pattern(const std::string& s);
+  Pattern(const Pattern& other);
   ~Pattern();
 
   // Returns true if the current pattern matches the given string.
@@ -70,6 +71,7 @@
 class PatternList {
  public:
   PatternList();
+  PatternList(const PatternList& other);
   ~PatternList();
 
   bool is_empty() const { return patterns_.empty(); }
diff --git a/tools/gn/substitution_list.cc b/tools/gn/substitution_list.cc
index 4004286..517f327 100644
--- a/tools/gn/substitution_list.cc
+++ b/tools/gn/substitution_list.cc
@@ -12,6 +12,8 @@
 SubstitutionList::SubstitutionList() {
 }
 
+SubstitutionList::SubstitutionList(const SubstitutionList& other) = default;
+
 SubstitutionList::~SubstitutionList() {
 }
 
diff --git a/tools/gn/substitution_list.h b/tools/gn/substitution_list.h
index f3e3c01..7273ece 100644
--- a/tools/gn/substitution_list.h
+++ b/tools/gn/substitution_list.h
@@ -14,6 +14,7 @@
 class SubstitutionList {
  public:
   SubstitutionList();
+  SubstitutionList(const SubstitutionList& other);
   ~SubstitutionList();
 
   bool Parse(const Value& value, Err* err);
diff --git a/tools/gn/substitution_pattern.cc b/tools/gn/substitution_pattern.cc
index dd703d7..c8e5489 100644
--- a/tools/gn/substitution_pattern.cc
+++ b/tools/gn/substitution_pattern.cc
@@ -28,6 +28,9 @@
 SubstitutionPattern::SubstitutionPattern() : origin_(nullptr) {
 }
 
+SubstitutionPattern::SubstitutionPattern(const SubstitutionPattern& other) =
+    default;
+
 SubstitutionPattern::~SubstitutionPattern() {
 }
 
diff --git a/tools/gn/substitution_pattern.h b/tools/gn/substitution_pattern.h
index 76edf8c..5389806 100644
--- a/tools/gn/substitution_pattern.h
+++ b/tools/gn/substitution_pattern.h
@@ -34,6 +34,7 @@
   };
 
   SubstitutionPattern();
+  SubstitutionPattern(const SubstitutionPattern& other);
   ~SubstitutionPattern();
 
   // Parses the given string and fills in the pattern. The pattern must only
diff --git a/tools/gn/token.cc b/tools/gn/token.cc
index 70ce2a1..6721619 100644
--- a/tools/gn/token.cc
+++ b/tools/gn/token.cc
@@ -17,6 +17,8 @@
       location_(location) {
 }
 
+Token::Token(const Token& other) = default;
+
 bool Token::IsIdentifierEqualTo(const char* v) const {
   return type_ == IDENTIFIER && value_ == v;
 }
diff --git a/tools/gn/token.h b/tools/gn/token.h
index bf87283..24c4e9c 100644
--- a/tools/gn/token.h
+++ b/tools/gn/token.h
@@ -58,6 +58,7 @@
 
   Token();
   Token(const Location& location, Type t, const base::StringPiece& v);
+  Token(const Token& other);
 
   Type type() const { return type_; }
   const base::StringPiece& value() const { return value_; }