Remove ImplResult.

The ImplResult type is the same as ConstEval::Result after recent
changes. This CL replaces all usages and removes ImplResult.

Bug: tint:1718
Change-Id: If424f3d00f953d97a339de8ae18c94083f3346bf
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/114162
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/resolver/const_eval.cc b/src/tint/resolver/const_eval.cc
index 27d2592..0481b4a 100644
--- a/src/tint/resolver/const_eval.cc
+++ b/src/tint/resolver/const_eval.cc
@@ -232,25 +232,22 @@
     return count;
 }
 
-/// A result templated with a constant::Constant.
-using ImplResult = utils::Result<const constant::Constant*>;
-
 // Forward declaration
 const constant::Constant* CreateComposite(ProgramBuilder& builder,
                                           const type::Type* type,
                                           utils::VectorRef<const constant::Constant*> elements);
 
 template <typename T>
-ImplResult ScalarConvert(const constant::Scalar<T>* scalar,
-                         ProgramBuilder& builder,
-                         const type::Type* target_ty,
-                         const Source& source) {
+ConstEval::Result ScalarConvert(const constant::Scalar<T>* scalar,
+                                ProgramBuilder& builder,
+                                const type::Type* target_ty,
+                                const Source& source) {
     TINT_BEGIN_DISABLE_WARNING(UNREACHABLE_CODE);
     if (target_ty == scalar->type) {
         // If the types are identical, then no conversion is needed.
         return scalar;
     }
-    return ZeroTypeDispatch(target_ty, [&](auto zero_to) -> ImplResult {
+    return ZeroTypeDispatch(target_ty, [&](auto zero_to) -> ConstEval::Result {
         // `value` is the source value.
         // `FROM` is the source type.
         // `TO` is the target type.
@@ -299,15 +296,15 @@
 }
 
 // Forward declare
-ImplResult ConvertInternal(const constant::Constant* c,
-                           ProgramBuilder& builder,
-                           const type::Type* target_ty,
-                           const Source& source);
+ConstEval::Result ConvertInternal(const constant::Constant* c,
+                                  ProgramBuilder& builder,
+                                  const type::Type* target_ty,
+                                  const Source& source);
 
-ImplResult SplatConvert(const constant::Splat* splat,
-                        ProgramBuilder& builder,
-                        const type::Type* target_ty,
-                        const Source& source) {
+ConstEval::Result SplatConvert(const constant::Splat* splat,
+                               ProgramBuilder& builder,
+                               const type::Type* target_ty,
+                               const Source& source) {
     // Convert the single splatted element type.
     auto conv_el = ConvertInternal(splat->el, builder, type::Type::ElementOf(target_ty), source);
     if (!conv_el) {
@@ -319,10 +316,10 @@
     return builder.create<constant::Splat>(target_ty, conv_el.Get(), splat->count);
 }
 
-ImplResult CompositeConvert(const constant::Composite* composite,
-                            ProgramBuilder& builder,
-                            const type::Type* target_ty,
-                            const Source& source) {
+ConstEval::Result CompositeConvert(const constant::Composite* composite,
+                                   ProgramBuilder& builder,
+                                   const type::Type* target_ty,
+                                   const Source& source) {
     // Convert each of the composite element types.
     utils::Vector<const constant::Constant*, 4> conv_els;
     conv_els.Reserve(composite->elements.Length());
@@ -353,10 +350,10 @@
     return CreateComposite(builder, target_ty, std::move(conv_els));
 }
 
-ImplResult ConvertInternal(const constant::Constant* c,
-                           ProgramBuilder& builder,
-                           const type::Type* target_ty,
-                           const Source& source) {
+ConstEval::Result ConvertInternal(const constant::Constant* c,
+                                  ProgramBuilder& builder,
+                                  const type::Type* target_ty,
+                                  const Source& source) {
     return Switch(
         c,
         [&](const constant::Scalar<tint::AFloat>* val) {
@@ -388,7 +385,10 @@
 
 /// CreateScalar constructs and returns an constant::Scalar<T>.
 template <typename T>
-ImplResult CreateScalar(ProgramBuilder& builder, const Source& source, const type::Type* t, T v) {
+ConstEval::Result CreateScalar(ProgramBuilder& builder,
+                               const Source& source,
+                               const type::Type* t,
+                               T v) {
     static_assert(IsNumber<T> || std::is_same_v<T, bool>, "T must be a Number or bool");
     TINT_ASSERT(Resolver, t->is_scalar());
 
@@ -544,11 +544,11 @@
 namespace detail {
 /// Implementation of TransformElements
 template <typename F, typename... CONSTANTS>
-ImplResult TransformElements(ProgramBuilder& builder,
-                             const type::Type* composite_ty,
-                             F&& f,
-                             size_t index,
-                             CONSTANTS&&... cs) {
+ConstEval::Result TransformElements(ProgramBuilder& builder,
+                                    const type::Type* composite_ty,
+                                    F&& f,
+                                    size_t index,
+                                    CONSTANTS&&... cs) {
     uint32_t n = 0;
     auto* ty = First(cs...)->Type();
     auto* el_ty = type::Type::ElementOf(ty, &n);
@@ -581,10 +581,10 @@
 /// If `f`'s last argument is a `size_t`, then the index of the most deeply nested element inside
 /// the most deeply nested aggregate type will be passed in.
 template <typename F, typename... CONSTANTS>
-ImplResult TransformElements(ProgramBuilder& builder,
-                             const type::Type* composite_ty,
-                             F&& f,
-                             CONSTANTS&&... cs) {
+ConstEval::Result TransformElements(ProgramBuilder& builder,
+                                    const type::Type* composite_ty,
+                                    F&& f,
+                                    CONSTANTS&&... cs) {
     return detail::TransformElements(builder, composite_ty, f, 0, cs...);
 }
 
@@ -593,11 +593,11 @@
 /// Unlike TransformElements, this function handles the constants being of different arity, e.g.
 /// vector-scalar, scalar-vector.
 template <typename F>
-ImplResult TransformBinaryElements(ProgramBuilder& builder,
-                                   const type::Type* composite_ty,
-                                   F&& f,
-                                   const constant::Constant* c0,
-                                   const constant::Constant* c1) {
+ConstEval::Result TransformBinaryElements(ProgramBuilder& builder,
+                                          const type::Type* composite_ty,
+                                          F&& f,
+                                          const constant::Constant* c0,
+                                          const constant::Constant* c1) {
     uint32_t n0 = 0;
     type::Type::ElementOf(c0->Type(), &n0);
     uint32_t n1 = 0;
@@ -1027,7 +1027,7 @@
 }
 
 auto ConstEval::SqrtFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto v) -> ImplResult {
+    return [=](auto v) -> ConstEval::Result {
         if (auto r = Sqrt(source, v)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1041,7 +1041,7 @@
 }
 
 auto ConstEval::ClampFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto e, auto low, auto high) -> ImplResult {
+    return [=](auto e, auto low, auto high) -> ConstEval::Result {
         if (auto r = Clamp(source, e, low, high)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1050,7 +1050,7 @@
 }
 
 auto ConstEval::AddFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2) -> ImplResult {
+    return [=](auto a1, auto a2) -> ConstEval::Result {
         if (auto r = Add(source, a1, a2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1059,7 +1059,7 @@
 }
 
 auto ConstEval::SubFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2) -> ImplResult {
+    return [=](auto a1, auto a2) -> ConstEval::Result {
         if (auto r = Sub(source, a1, a2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1068,7 +1068,7 @@
 }
 
 auto ConstEval::MulFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2) -> ImplResult {
+    return [=](auto a1, auto a2) -> ConstEval::Result {
         if (auto r = Mul(source, a1, a2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1077,7 +1077,7 @@
 }
 
 auto ConstEval::DivFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2) -> ImplResult {
+    return [=](auto a1, auto a2) -> ConstEval::Result {
         if (auto r = Div(source, a1, a2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1086,7 +1086,7 @@
 }
 
 auto ConstEval::ModFunc(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2) -> ImplResult {
+    return [=](auto a1, auto a2) -> ConstEval::Result {
         if (auto r = Mod(source, a1, a2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1095,7 +1095,7 @@
 }
 
 auto ConstEval::Dot2Func(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2, auto b1, auto b2) -> ImplResult {
+    return [=](auto a1, auto a2, auto b1, auto b2) -> ConstEval::Result {
         if (auto r = Dot2(source, a1, a2, b1, b2)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1104,7 +1104,7 @@
 }
 
 auto ConstEval::Dot3Func(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a1, auto a2, auto a3, auto b1, auto b2, auto b3) -> ImplResult {
+    return [=](auto a1, auto a2, auto a3, auto b1, auto b2, auto b3) -> ConstEval::Result {
         if (auto r = Dot3(source, a1, a2, a3, b1, b2, b3)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1113,13 +1113,13 @@
 }
 
 auto ConstEval::Dot4Func(const Source& source, const type::Type* elem_ty) {
-    return
-        [=](auto a1, auto a2, auto a3, auto a4, auto b1, auto b2, auto b3, auto b4) -> ImplResult {
-            if (auto r = Dot4(source, a1, a2, a3, a4, b1, b2, b3, b4)) {
-                return CreateScalar(builder, source, elem_ty, r.Get());
-            }
-            return utils::Failure;
-        };
+    return [=](auto a1, auto a2, auto a3, auto a4, auto b1, auto b2, auto b3,
+               auto b4) -> ConstEval::Result {
+        if (auto r = Dot4(source, a1, a2, a3, a4, b1, b2, b3, b4)) {
+            return CreateScalar(builder, source, elem_ty, r.Get());
+        }
+        return utils::Failure;
+    };
 }
 
 ConstEval::Result ConstEval::Dot(const Source& source,
@@ -1191,7 +1191,7 @@
 }
 
 auto ConstEval::Det2Func(const Source& source, const type::Type* elem_ty) {
-    return [=](auto a, auto b, auto c, auto d) -> ImplResult {
+    return [=](auto a, auto b, auto c, auto d) -> ConstEval::Result {
         if (auto r = Det2(source, a, b, c, d)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1200,18 +1200,18 @@
 }
 
 auto ConstEval::Det3Func(const Source& source, const type::Type* elem_ty) {
-    return
-        [=](auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h, auto i) -> ImplResult {
-            if (auto r = Det3(source, a, b, c, d, e, f, g, h, i)) {
-                return CreateScalar(builder, source, elem_ty, r.Get());
-            }
-            return utils::Failure;
-        };
+    return [=](auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h,
+               auto i) -> ConstEval::Result {
+        if (auto r = Det3(source, a, b, c, d, e, f, g, h, i)) {
+            return CreateScalar(builder, source, elem_ty, r.Get());
+        }
+        return utils::Failure;
+    };
 }
 
 auto ConstEval::Det4Func(const Source& source, const type::Type* elem_ty) {
     return [=](auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h, auto i, auto j,
-               auto k, auto l, auto m, auto n, auto o, auto p) -> ImplResult {
+               auto k, auto l, auto m, auto n, auto o, auto p) -> ConstEval::Result {
         if (auto r = Det4(source, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) {
             return CreateScalar(builder, source, elem_ty, r.Get());
         }
@@ -1226,7 +1226,7 @@
         [&](const ast::BoolLiteralExpression* lit) {
             return CreateScalar(builder, source, ty, lit->value);
         },
-        [&](const ast::IntLiteralExpression* lit) -> ImplResult {
+        [&](const ast::IntLiteralExpression* lit) -> ConstEval::Result {
             switch (lit->suffix) {
                 case ast::IntLiteralExpression::Suffix::kNone:
                     return CreateScalar(builder, source, ty, AInt(lit->value));
@@ -1237,7 +1237,7 @@
             }
             return nullptr;
         },
-        [&](const ast::FloatLiteralExpression* lit) -> ImplResult {
+        [&](const ast::FloatLiteralExpression* lit) -> ConstEval::Result {
             switch (lit->suffix) {
                 case ast::FloatLiteralExpression::Suffix::kNone:
                     return CreateScalar(builder, source, ty, AFloat(lit->value));
@@ -1500,7 +1500,7 @@
     auto* elem_ty = vec_ty->type();
 
     auto dot = [&](const constant::Constant* m, size_t row, const constant::Constant* v) {
-        ImplResult result;
+        ConstEval::Result result;
         switch (mat_ty->columns()) {
             case 2:
                 result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty),  //
@@ -1550,7 +1550,7 @@
     auto* elem_ty = vec_ty->type();
 
     auto dot = [&](const constant::Constant* v, const constant::Constant* m, size_t col) {
-        ImplResult result;
+        ConstEval::Result result;
         switch (mat_ty->rows()) {
             case 2:
                 result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty),  //
@@ -1607,7 +1607,7 @@
         auto m1e = [&](size_t r, size_t c) { return m1->Index(c)->Index(r); };
         auto m2e = [&](size_t r, size_t c) { return m2->Index(c)->Index(r); };
 
-        ImplResult result;
+        ConstEval::Result result;
         switch (mat1_ty->columns()) {
             case 2:
                 result = Dispatch_fa_f32_f16(Dot2Func(source, elem_ty),  //
@@ -1682,7 +1682,7 @@
                                      utils::VectorRef<const constant::Constant*> args,
                                      const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i == j);
         };
         return Dispatch_fia_fiu32_f16_bool(create, c0, c1);
@@ -1695,7 +1695,7 @@
                                         utils::VectorRef<const constant::Constant*> args,
                                         const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i != j);
         };
         return Dispatch_fia_fiu32_f16_bool(create, c0, c1);
@@ -1708,7 +1708,7 @@
                                         utils::VectorRef<const constant::Constant*> args,
                                         const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i < j);
         };
         return Dispatch_fia_fiu32_f16(create, c0, c1);
@@ -1721,7 +1721,7 @@
                                            utils::VectorRef<const constant::Constant*> args,
                                            const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i > j);
         };
         return Dispatch_fia_fiu32_f16(create, c0, c1);
@@ -1734,7 +1734,7 @@
                                              utils::VectorRef<const constant::Constant*> args,
                                              const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i <= j);
         };
         return Dispatch_fia_fiu32_f16(create, c0, c1);
@@ -1747,7 +1747,7 @@
                                                 utils::VectorRef<const constant::Constant*> args,
                                                 const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), i >= j);
         };
         return Dispatch_fia_fiu32_f16(create, c0, c1);
@@ -1776,7 +1776,7 @@
                                    utils::VectorRef<const constant::Constant*> args,
                                    const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             using T = decltype(i);
             T result;
             if constexpr (std::is_same_v<T, bool>) {
@@ -1796,7 +1796,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             using T = decltype(i);
             T result;
             if constexpr (std::is_same_v<T, bool>) {
@@ -1816,7 +1816,7 @@
                                    utils::VectorRef<const constant::Constant*> args,
                                    const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto i, auto j) -> ImplResult {
+        auto create = [&](auto i, auto j) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty),
                                 decltype(i){i ^ j});
         };
@@ -1830,7 +1830,7 @@
                                          utils::VectorRef<const constant::Constant*> args,
                                          const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto e1, auto e2) -> ImplResult {
+        auto create = [&](auto e1, auto e2) -> ConstEval::Result {
             using NumberT = decltype(e1);
             using T = UnwrapNumber<NumberT>;
             using UT = std::make_unsigned_t<T>;
@@ -1916,7 +1916,7 @@
                                           utils::VectorRef<const constant::Constant*> args,
                                           const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto e1, auto e2) -> ImplResult {
+        auto create = [&](auto e1, auto e2) -> ConstEval::Result {
             using NumberT = decltype(e1);
             using T = UnwrapNumber<NumberT>;
             using UT = std::make_unsigned_t<T>;
@@ -2005,7 +2005,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             if (i < NumberT(-1.0) || i > NumberT(1.0)) {
                 AddError("acos must be called with a value in the range [-1 .. 1] (inclusive)",
@@ -2023,7 +2023,7 @@
                                    utils::VectorRef<const constant::Constant*> args,
                                    const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             if (i < NumberT(1.0)) {
                 AddError("acosh must be called with a value >= 1.0", source);
@@ -2053,7 +2053,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             if (i < NumberT(-1.0) || i > NumberT(1.0)) {
                 AddError("asin must be called with a value in the range [-1 .. 1] (inclusive)",
@@ -2096,7 +2096,7 @@
                                    utils::VectorRef<const constant::Constant*> args,
                                    const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             if (i <= NumberT(-1.0) || i >= NumberT(1.0)) {
                 AddError("atanh must be called with a value in the range (-1 .. 1) (exclusive)",
@@ -2150,7 +2150,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::cos(i.value)));
         };
@@ -2163,7 +2163,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::cosh(i.value)));
         };
@@ -2273,7 +2273,7 @@
                                      utils::VectorRef<const constant::Constant*> args,
                                      const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e) -> ImplResult {
+        auto create = [&](auto e) -> ConstEval::Result {
             using NumberT = decltype(e);
             using T = UnwrapNumber<NumberT>;
 
@@ -2334,7 +2334,7 @@
 ConstEval::Result ConstEval::distance(const type::Type* ty,
                                       utils::VectorRef<const constant::Constant*> args,
                                       const Source& source) {
-    auto err = [&]() -> ImplResult {
+    auto err = [&]() -> ConstEval::Result {
         AddNote("when calculating distance", source);
         return utils::Failure;
     };
@@ -2365,7 +2365,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e0) -> ImplResult {
+        auto create = [&](auto e0) -> ConstEval::Result {
             using NumberT = decltype(e0);
             auto val = NumberT(std::exp(e0));
             if (!std::isfinite(val.value)) {
@@ -2383,7 +2383,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e0) -> ImplResult {
+        auto create = [&](auto e0) -> ConstEval::Result {
             using NumberT = decltype(e0);
             auto val = NumberT(std::exp2(e0));
             if (!std::isfinite(val.value)) {
@@ -2401,7 +2401,7 @@
                                          utils::VectorRef<const constant::Constant*> args,
                                          const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto in_e) -> ImplResult {
+        auto create = [&](auto in_e) -> ConstEval::Result {
             using NumberT = decltype(in_e);
             using T = UnwrapNumber<NumberT>;
             using UT = std::make_unsigned_t<T>;
@@ -2558,7 +2558,7 @@
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c1, const constant::Constant* c2,
                          const constant::Constant* c3) {
-        auto create = [&](auto e1, auto e2, auto e3) -> ImplResult {
+        auto create = [&](auto e1, auto e2, auto e3) -> ConstEval::Result {
             auto err_msg = [&] {
                 AddNote("when calculating fma", source);
                 return utils::Failure;
@@ -2584,7 +2584,7 @@
                                    utils::VectorRef<const constant::Constant*> args,
                                    const Source& source) {
     auto transform = [&](const constant::Constant* c1) {
-        auto create = [&](auto e) -> ImplResult {
+        auto create = [&](auto e) -> ConstEval::Result {
             using NumberT = decltype(e);
             auto r = e - std::floor(e);
             return CreateScalar(builder, source, c1->Type(), NumberT{r});
@@ -2600,8 +2600,8 @@
     auto* arg = args[0];
 
     struct FractExp {
-        ImplResult fract;
-        ImplResult exp;
+        ConstEval::Result fract;
+        ConstEval::Result exp;
     };
 
     auto scalar = [&](const constant::Constant* s) {
@@ -2671,7 +2671,7 @@
                                         utils::VectorRef<const constant::Constant*> args,
                                         const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto in_e, auto in_newbits) -> ImplResult {
+        auto create = [&](auto in_e, auto in_newbits) -> ConstEval::Result {
             using NumberT = decltype(in_e);
             using T = UnwrapNumber<NumberT>;
             using UT = std::make_unsigned_t<T>;
@@ -2723,7 +2723,7 @@
                                          utils::VectorRef<const constant::Constant*> args,
                                          const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e) -> ImplResult {
+        auto create = [&](auto e) -> ConstEval::Result {
             using NumberT = decltype(e);
 
             if (e <= NumberT(0)) {
@@ -2767,7 +2767,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto v) -> ImplResult {
+        auto create = [&](auto v) -> ConstEval::Result {
             using NumberT = decltype(v);
             if (v <= NumberT(0)) {
                 AddError("log must be called with a value > 0", source);
@@ -2784,7 +2784,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto v) -> ImplResult {
+        auto create = [&](auto v) -> ConstEval::Result {
             using NumberT = decltype(v);
             if (v <= NumberT(0)) {
                 AddError("log2 must be called with a value > 0", source);
@@ -2825,7 +2825,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1, size_t index) {
-        auto create = [&](auto e1, auto e2) -> ImplResult {
+        auto create = [&](auto e1, auto e2) -> ConstEval::Result {
             using NumberT = decltype(e1);
             // e3 is either a vector or a scalar
             NumberT e3;
@@ -3019,7 +3019,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto e1, auto e2) -> ImplResult {
+        auto create = [&](auto e1, auto e2) -> ConstEval::Result {
             auto r = CheckedPow(e1, e2);
             if (!r) {
                 AddError(OverflowErrorMessage(e1, "^", e2), source);
@@ -3036,7 +3036,7 @@
                                      utils::VectorRef<const constant::Constant*> args,
                                      const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e) -> ImplResult {
+        auto create = [&](auto e) -> ConstEval::Result {
             using NumberT = decltype(e);
             using T = UnwrapNumber<NumberT>;
 
@@ -3076,7 +3076,7 @@
         }
 
         // 2 * dot(e2, e1)
-        auto mul2 = [&](auto v) -> ImplResult {
+        auto mul2 = [&](auto v) -> ConstEval::Result {
             using NumberT = decltype(v);
             return CreateScalar(builder, source, el_ty, NumberT{NumberT{2} * v});
         };
@@ -3203,7 +3203,7 @@
                                          utils::VectorRef<const constant::Constant*> args,
                                          const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto in_e) -> ImplResult {
+        auto create = [&](auto in_e) -> ConstEval::Result {
             using NumberT = decltype(in_e);
             using T = UnwrapNumber<NumberT>;
             using UT = std::make_unsigned_t<T>;
@@ -3281,7 +3281,7 @@
                                          const Source& source) {
     auto cond = args[2]->As<bool>();
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto f, auto t) -> ImplResult {
+        auto create = [&](auto f, auto t) -> ConstEval::Result {
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), cond ? t : f);
         };
         return Dispatch_fia_fiu32_f16_bool(create, c0, c1);
@@ -3294,7 +3294,7 @@
                                             utils::VectorRef<const constant::Constant*> args,
                                             const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1, size_t index) {
-        auto create = [&](auto f, auto t) -> ImplResult {
+        auto create = [&](auto f, auto t) -> ConstEval::Result {
             // Get corresponding bool value at the current vector value index
             auto cond = args[2]->Index(index)->As<bool>();
             return CreateScalar(builder, source, type::Type::DeepestElementOf(ty), cond ? t : f);
@@ -3309,7 +3309,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto e) -> ImplResult {
+        auto create = [&](auto e) -> ConstEval::Result {
             using NumberT = decltype(e);
             NumberT result;
             NumberT zero{0.0};
@@ -3331,7 +3331,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::sin(i.value)));
         };
@@ -3344,7 +3344,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::sinh(i.value)));
         };
@@ -3358,7 +3358,7 @@
                                         const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1,
                          const constant::Constant* c2) {
-        auto create = [&](auto low, auto high, auto x) -> ImplResult {
+        auto create = [&](auto low, auto high, auto x) -> ConstEval::Result {
             using NumberT = decltype(low);
 
             auto err = [&] {
@@ -3408,7 +3408,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0, const constant::Constant* c1) {
-        auto create = [&](auto edge, auto x) -> ImplResult {
+        auto create = [&](auto edge, auto x) -> ConstEval::Result {
             using NumberT = decltype(edge);
             NumberT result = x.value < edge.value ? NumberT(0.0) : NumberT(1.0);
             return CreateScalar(builder, source, c0->Type(), result);
@@ -3432,7 +3432,7 @@
                                  utils::VectorRef<const constant::Constant*> args,
                                  const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::tan(i.value)));
         };
@@ -3445,7 +3445,7 @@
                                   utils::VectorRef<const constant::Constant*> args,
                                   const Source& source) {
     auto transform = [&](const constant::Constant* c0) {
-        auto create = [&](auto i) -> ImplResult {
+        auto create = [&](auto i) -> ConstEval::Result {
             using NumberT = decltype(i);
             return CreateScalar(builder, source, c0->Type(), NumberT(std::tanh(i.value)));
         };
@@ -3591,7 +3591,7 @@
 ConstEval::Result ConstEval::quantizeToF16(const type::Type* ty,
                                            utils::VectorRef<const constant::Constant*> args,
                                            const Source& source) {
-    auto transform = [&](const constant::Constant* c) -> ImplResult {
+    auto transform = [&](const constant::Constant* c) -> ConstEval::Result {
         auto value = c->As<f32>();
         auto conv = CheckedConvert<f32>(f16(value));
         if (!conv) {