[common] Use the absl version of overload directly in MatchVariant

In MatchVariant, we previously used base::Overloaded from Chromium, but
now base::Overloaded is about to be completely removed, so we need to
change the usage to the absl version.

Bug: chromium:392929829
Change-Id: I83ab22fe94af28bd4cc6328c37bdf4e8b2922dc8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/246554
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Ho Cheung <hocheung@chromium.org>
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/dawn/common/BUILD.gn b/src/dawn/common/BUILD.gn
index a2fa395..461d726 100644
--- a/src/dawn/common/BUILD.gn
+++ b/src/dawn/common/BUILD.gn
@@ -251,6 +251,7 @@
       "${dawn_root}/third_party/gn/abseil-cpp:flat_hash_set",
       "${dawn_root}/third_party/gn/abseil-cpp:inlined_vector",
       "${dawn_root}/third_party/gn/abseil-cpp:no_destructor",
+      "${dawn_root}/third_party/gn/abseil-cpp:overload",
     ]
   }
 }
diff --git a/src/dawn/common/CMakeLists.txt b/src/dawn/common/CMakeLists.txt
index bbf2ccd..0360786 100644
--- a/src/dawn/common/CMakeLists.txt
+++ b/src/dawn/common/CMakeLists.txt
@@ -181,6 +181,7 @@
     PRIVATE_DEPENDS
         absl::inlined_vector
         absl::no_destructor
+        absl::overload
         dawn::partition_alloc
         dawn_shared_utils
         ${conditional_private_depends}
diff --git a/src/dawn/common/MatchVariant.h b/src/dawn/common/MatchVariant.h
index e691893..f36f7951 100644
--- a/src/dawn/common/MatchVariant.h
+++ b/src/dawn/common/MatchVariant.h
@@ -30,53 +30,17 @@
 
 #include <variant>
 
+#include "absl/functional/overload.h"
+
 namespace dawn {
 
-// This is the `Overloaded` template in chromium/src/base/functional/Overloaded.h.
-// std::visit() needs to be called with a functor object, such as
-//
-//  struct Visitor {
-//    std::string operator()(const PackageA& source) {
-//      return "PackageA";
-//    }
-//
-//    std::string operator()(const PackageB& source) {
-//      return "PackageB";
-//    }
-//  };
-//
-//  std::variant<PackageA, PackageB> var = PackageA();
-//  return std::visit(Visitor(), var);
-//
-// `Overloaded` enables the above code to be written as:
-//
-//  std::visit(
-//     Overloaded{
-//         [](const PackageA& pack) { return "PackageA"; },
-//         [](const PackageB& pack) { return "PackageB"; },
-//     }, var);
-//
-// Note: Overloads must be implemented for all the variant options. Otherwise, there will be a
-// compilation error.
-//
-// This struct inherits operator() method from all its base classes. Introduces operator() method
-// from all its base classes into its definition.
-template <typename... Callables>
-struct Overloaded : Callables... {
-    using Callables::operator()...;
-};
-
-// Uses template argument deduction so that the `Overloaded` struct can be used without specifying
-// its template argument. This allows anonymous lambdas passed into the `Overloaded` constructor.
-template <typename... Callables>
-Overloaded(Callables...) -> Overloaded<Callables...>;
-
-// With this template we can simplify the call of std::visit(Overloaded{...}, variant).
+// With this template we can simplify the call of
+// std::visit(absl::Overload{...}, variant).
 template <typename Variant, typename... Callables>
 auto MatchVariant(const Variant& v, Callables... args) {
-    return std::visit(Overloaded{args...}, v);
+    return std::visit(absl::Overload{args...}, v);
 }
 
 }  // namespace dawn
 
-#endif
+#endif  // SRC_DAWN_COMMON_MATCHVARIANT_H_
diff --git a/third_party/gn/abseil-cpp/BUILD.gn b/third_party/gn/abseil-cpp/BUILD.gn
index fc03573..4e34b8d 100644
--- a/third_party/gn/abseil-cpp/BUILD.gn
+++ b/third_party/gn/abseil-cpp/BUILD.gn
@@ -920,6 +920,14 @@
   ]
 }
 
+absl_source_set("overload") {
+  public = [ "${dawn_abseil_dir}/absl/functional/overload.h" ]
+  deps = [
+    ":config",
+    ":type_traits",
+  ]
+}
+
 absl_source_set("utf8_for_code_point") {
   sources =
       [ "${dawn_abseil_dir}/absl/debugging/internal/utf8_for_code_point.cc" ]