Use c++20 in GN build

Change-Id: I45d6b140f68e7e0bdd885420952e46e2576e960d
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/16200
Reviewed-by: David Turner <digit@google.com>
Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/build/gen.py b/build/gen.py
index 232e536..07b699b 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -466,7 +466,7 @@
         '-Wextra-semi',
         '-Wundef',
 
-        '-std=c++17'
+        '-std=c++20'
     ])
 
     # flags not supported by gcc/g++.
@@ -482,7 +482,7 @@
         ldflags.append('-static-libstdc++')
 
       if platform.is_mingw() or platform.is_msys():
-        cflags.remove('-std=c++17')
+        cflags.remove('-std=c++20')
         cflags.extend([
           '-Wno-deprecated-copy',
           '-Wno-implicit-fallthrough',
@@ -491,7 +491,7 @@
           '-Wno-format',             # Use of %llx, which is supported by _UCRT, false positive
           '-Wno-strict-aliasing',    # Dereferencing punned pointer
           '-Wno-cast-function-type', # Casting FARPROC to RegDeleteKeyExPtr
-          '-std=gnu++17',
+          '-std=gnu++20',
         ])
       else:
         # This is needed by libc++.
@@ -561,7 +561,7 @@
         '/wd4505',
         '/wd4838',
         '/wd4996',
-        '/std:c++17',
+        '/std:c++20',
         '/GR-',
         '/D_HAS_EXCEPTIONS=0',
     ])
diff --git a/src/base/files/file_path.cc b/src/base/files/file_path.cc
index 1959133..3b53abc 100644
--- a/src/base/files/file_path.cc
+++ b/src/base/files/file_path.cc
@@ -8,6 +8,7 @@
 
 #include <algorithm>
 #include <iterator>
+#include <string>
 #include <string_view>
 
 #include "base/logging.h"
@@ -623,8 +624,9 @@
 
 FilePath FilePath::NormalizePathSeparatorsTo(CharType separator) const {
 #if defined(FILE_PATH_USES_WIN_SEPARATORS)
-  DCHECK_NE(kSeparators + kSeparatorsLength,
-            std::find(kSeparators, kSeparators + kSeparatorsLength, separator));
+  DCHECK_NE(static_cast<const void*>(kSeparators + kSeparatorsLength),
+            static_cast<const void*>(std::find(
+                kSeparators, kSeparators + kSeparatorsLength, separator)));
   StringType copy = path_;
   for (size_t i = 0; i < kSeparatorsLength; ++i) {
     std::replace(copy.begin(), copy.end(), kSeparators[i], separator);
diff --git a/src/base/strings/string_util.cc b/src/base/strings/string_util.cc
index 5af7715..e1b494d 100644
--- a/src/base/strings/string_util.cc
+++ b/src/base/strings/string_util.cc
@@ -19,6 +19,7 @@
 #include <algorithm>
 #include <iterator>
 #include <limits>
+#include <string>
 #include <vector>
 
 #include "base/logging.h"
@@ -963,7 +964,7 @@
           --i;
         } else {
           if (*i < '1' || *i > '9') {
-            DLOG(ERROR) << "Invalid placeholder: $" << *i;
+            DLOG(ERROR) << "Invalid placeholder: $" << std::to_string(*i);
             continue;
           }
           uintptr_t index = *i - '1';
diff --git a/src/base/value_iterators.cc b/src/base/value_iterators.cc
index ba9c730..4765f73 100644
--- a/src/base/value_iterators.cc
+++ b/src/base/value_iterators.cc
@@ -4,6 +4,8 @@
 
 #include "base/value_iterators.h"
 
+#include "base/values.h"
+
 namespace base {
 
 namespace detail {
diff --git a/src/gn/substitution_type.h b/src/gn/substitution_type.h
index d359a30..2d0c3bc 100644
--- a/src/gn/substitution_type.h
+++ b/src/gn/substitution_type.h
@@ -15,8 +15,10 @@
 // Each pair here represents the string representation of the substitution in GN
 // and in Ninja.
 struct Substitution {
-  const char* name;
-  const char* ninja_name;
+  const char* name = nullptr;
+  const char* ninja_name = nullptr;
+  Substitution(const char* name, const char* ninja_name)
+      : name(name), ninja_name(ninja_name) {}
   Substitution(const Substitution&) = delete;
   Substitution& operator=(const Substitution&) = delete;
 };