From: Arthur Cohen <[email protected]>

gcc/rust/ChangeLog:

        * backend/rust-builtins.cc (BuiltinsContext::lookup_simple_builtin): 
Improve API
        to return an optional<tree> instead.
        (BuiltinsContext::lookup_gcc_builtin): Likewise.
        (BuiltinsContext::map_llvm_to_gcc_builtin): Return an expected<T> 
instead to avoid
        passing two parameters by pointer.
        * backend/rust-builtins.h (enum class LlvmBuiltinMappingResult): Rename 
and improve into...
        (struct LlvmBuiltinMappingError): ...This. In order to have a better 
interface, associated
        functions and an associated `emit` method on the error.
        * backend/rust-compile-extern.h: Use these new interfaces.
        * backend/rust-compile-intrinsic.cc (Intrinsics::compile): Likewise.
        * backend/rust-intrinsic-handlers.cc (expect): Likewise.
        (op_with_overflow): Likewise.
        (copy): Likewise.
        (atomic_store): Likewise.
        (atomic_load): Likewise.
        (ctlz_handler): Likewise.
        (cttz_handler): Likewise.
        (move_val_init): Likewise.
        (uninit): Likewise.
        (prefetch_data): Likewise.
        (bswap_handler): Likewise.
        (write_bytes_handler): Likewise.
        * rust-gcc.cc (fetch_overflow_builtins): Likewise.
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/3e2669c77156403468137a6f8d651d9e824dfb12

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4968

 gcc/rust/backend/rust-builtins.cc           |  35 +++---
 gcc/rust/backend/rust-builtins.h            |  58 ++++++++--
 gcc/rust/backend/rust-compile-extern.h      |  25 ++--
 gcc/rust/backend/rust-compile-intrinsic.cc  |   6 +-
 gcc/rust/backend/rust-intrinsic-handlers.cc | 119 ++++++++++----------
 gcc/rust/rust-gcc.cc                        |  13 +--
 6 files changed, 137 insertions(+), 119 deletions(-)

diff --git a/gcc/rust/backend/rust-builtins.cc 
b/gcc/rust/backend/rust-builtins.cc
index de2d97eb1..b7e766a50 100644
--- a/gcc/rust/backend/rust-builtins.cc
+++ b/gcc/rust/backend/rust-builtins.cc
@@ -14,6 +14,8 @@
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#include "expected.h"
+#include "optional.h"
 #include "rust-diagnostics.h"
 #include "rust-system.h"
 #include "rust-builtins.h"
@@ -36,8 +38,8 @@ BuiltinsContext::get ()
   return instance;
 }
 
-bool
-BuiltinsContext::lookup_simple_builtin (const std::string &name, tree *builtin)
+tl::optional<tree>
+BuiltinsContext::lookup_simple_builtin (const std::string &name)
 {
   auto *to_search = &name;
 
@@ -45,26 +47,20 @@ BuiltinsContext::lookup_simple_builtin (const std::string 
&name, tree *builtin)
   if (it != rust_intrinsic_to_gcc_builtin.end ())
     to_search = &it->second;
 
-  return lookup_gcc_builtin (*to_search, builtin);
+  return lookup_gcc_builtin (*to_search);
 }
 
-LlvmBuiltinMappingResult
-BuiltinsContext::map_llvm_to_gcc_builtin (const std::string &name,
-                                         tree *resolved,
-                                         LlvmBuiltinAdapter *adapter)
+tl::expected<std::pair<tree, LlvmBuiltinAdapter>, LlvmBuiltinMappingError>
+BuiltinsContext::map_llvm_to_gcc_builtin (const std::string &name)
 {
-  rust_assert (resolved != nullptr);
-
   auto mapping = llvm_to_gcc_builtin.find (name);
   if (mapping == llvm_to_gcc_builtin.end ())
-    return LlvmBuiltinMappingResult::NOT_MAPPED;
+    return tl::make_unexpected (LlvmBuiltinMappingError::NotMapped ());
 
-  *resolved = NULL_TREE;
-  if (!lookup_gcc_builtin (mapping->second.gcc_name, resolved))
-    return LlvmBuiltinMappingResult::TARGET_UNAVAILABLE;
+  if (auto lookup = lookup_gcc_builtin (mapping->second.gcc_name))
+    return std::make_pair (*lookup, mapping->second.adapter);
 
-  *adapter = mapping->second.adapter;
-  return LlvmBuiltinMappingResult::RESOLVED;
+  return tl::make_unexpected (LlvmBuiltinMappingError::TargetUnavailable ());
 }
 
 BuiltinsContext::BuiltinsContext () : setup_state (SetupState::UNINITIALIZED) 
{}
@@ -457,15 +453,14 @@ BuiltinsContext::setup ()
   setup_state = SetupState::READY;
 }
 
-bool
-BuiltinsContext::lookup_gcc_builtin (const std::string &name, tree *builtin)
+tl::optional<tree>
+BuiltinsContext::lookup_gcc_builtin (const std::string &name)
 {
   auto it = builtin_functions.find (name);
   if (it == builtin_functions.end ())
-    return false;
+    return tl::nullopt;
 
-  *builtin = it->second;
-  return true;
+  return it->second;
 }
 
 } // namespace Compile
diff --git a/gcc/rust/backend/rust-builtins.h b/gcc/rust/backend/rust-builtins.h
index e2c7f9816..bf9c22a86 100644
--- a/gcc/rust/backend/rust-builtins.h
+++ b/gcc/rust/backend/rust-builtins.h
@@ -24,6 +24,10 @@
 #include "langhooks.h"
 #include "tree.h"
 #include "selftest.h"
+#include "util/expected.h"
+#include "util/optional.h"
+#include "util/rust-ggc.h"
+#include "rust-diagnostics.h"
 
 namespace Rust {
 namespace Compile {
@@ -79,11 +83,48 @@ namespace Compile {
 // };
 // Some(cx.get_intrinsic(&llvm_name))
 
-enum class LlvmBuiltinMappingResult
+/**
+ * Error type for Builtins::map_llvm_to_gcc_builtin
+ */
+struct LlvmBuiltinMappingError
 {
-  NOT_MAPPED,
-  TARGET_UNAVAILABLE,
-  RESOLVED,
+  enum class Kind
+  {
+    NOT_MAPPED,
+    TARGET_UNAVAILABLE,
+  } kind;
+
+  static LlvmBuiltinMappingError NotMapped ()
+  {
+    return LlvmBuiltinMappingError (Kind::NOT_MAPPED);
+  }
+
+  static LlvmBuiltinMappingError TargetUnavailable ()
+  {
+    return LlvmBuiltinMappingError (Kind::TARGET_UNAVAILABLE);
+  }
+
+  /**
+   * Emit the error for the missing intrinsic
+   */
+  void emit (const GGC::Ident &name, location_t loc)
+  {
+    switch (kind)
+      {
+      case LlvmBuiltinMappingError::Kind::TARGET_UNAVAILABLE:
+       rust_error_at (loc,
+                      "LLVM intrinsic %qs is not available for this target",
+                      name.c_str ());
+       return;
+      case LlvmBuiltinMappingError::Kind::NOT_MAPPED:
+       rust_sorry_at (loc, "LLVM intrinsic %qs is not supported at the moment",
+                      name.c_str ());
+       return;
+      }
+  }
+
+private:
+  LlvmBuiltinMappingError (Kind kind) : kind (kind) {}
 };
 
 enum class LlvmBuiltinAdapter
@@ -104,11 +145,10 @@ class BuiltinsContext
 public:
   static BuiltinsContext &get ();
 
-  bool lookup_simple_builtin (const std::string &name, tree *builtin);
+  tl::optional<tree> lookup_simple_builtin (const std::string &name);
 
-  LlvmBuiltinMappingResult
-  map_llvm_to_gcc_builtin (const std::string &name, tree *resolved,
-                          LlvmBuiltinAdapter *adapter);
+  tl::expected<std::pair<tree, LlvmBuiltinAdapter>, LlvmBuiltinMappingError>
+  map_llvm_to_gcc_builtin (const std::string &name);
 
   void register_builtin (tree decl);
 
@@ -235,7 +275,7 @@ private:
 
   void setup ();
 
-  bool lookup_gcc_builtin (const std::string &name, tree *builtin);
+  tl::optional<tree> lookup_gcc_builtin (const std::string &name);
 
   // A mapping of the GCC built-ins exposed to GCC Rust.
   std::map<std::string, tree> builtin_functions;
diff --git a/gcc/rust/backend/rust-compile-extern.h 
b/gcc/rust/backend/rust-compile-extern.h
index 824d31214..313be3852 100644
--- a/gcc/rust/backend/rust-compile-extern.h
+++ b/gcc/rust/backend/rust-compile-extern.h
@@ -132,30 +132,19 @@ public:
 
     if (fntype->get_abi () == ABI::UNADJUSTED)
       {
-       tree resolved;
-       LlvmBuiltinAdapter adapter;
-       auto mapping_res = BuiltinsContext::get ().map_llvm_to_gcc_builtin (
-         asm_name.as_string (), &resolved, &adapter);
+       auto res = BuiltinsContext::get ().map_llvm_to_gcc_builtin (
+         asm_name.as_string ());
 
-       switch (mapping_res)
+       if (!res)
          {
-         case LlvmBuiltinMappingResult::NOT_MAPPED:
-           rust_error_at (function.get_locus (),
-                          "LLVM intrinsic %qs is not supported at the moment",
-                          asm_name.c_str ());
-           reference = error_mark_node;
-           return;
-         case LlvmBuiltinMappingResult::TARGET_UNAVAILABLE:
-           rust_error_at (
-             function.get_locus (),
-             "LLVM intrinsic %qs is not available for this target",
-             asm_name.c_str ());
+           res.error ().emit (asm_name, function.get_locus ());
            reference = error_mark_node;
            return;
-         case LlvmBuiltinMappingResult::RESOLVED:
-           break;
          }
 
+       tree resolved = res->first;
+       LlvmBuiltinAdapter adapter = res->second;
+
        tree adapter_tree = error_mark_node;
 
        switch (adapter)
diff --git a/gcc/rust/backend/rust-compile-intrinsic.cc 
b/gcc/rust/backend/rust-compile-intrinsic.cc
index b13e721a8..872b53e70 100644
--- a/gcc/rust/backend/rust-compile-intrinsic.cc
+++ b/gcc/rust/backend/rust-compile-intrinsic.cc
@@ -99,11 +99,11 @@ Intrinsics::compile (TyTy::FnType *fntype, location_t 
expr_locus)
 {
   rust_assert (fntype->get_abi () == ABI::INTRINSIC);
 
-  tree builtin = error_mark_node;
   BuiltinsContext &builtin_ctx = BuiltinsContext::get ();
 
-  if (builtin_ctx.lookup_simple_builtin (fntype->get_identifier (), &builtin))
-    return builtin;
+  if (auto builtin
+      = builtin_ctx.lookup_simple_builtin (fntype->get_identifier ()))
+    return *builtin;
 
   // is it an generic builtin?
   auto it = generic_intrinsics.find (fntype->get_identifier ());
diff --git a/gcc/rust/backend/rust-intrinsic-handlers.cc 
b/gcc/rust/backend/rust-intrinsic-handlers.cc
index 127d0642e..d68e872af 100644
--- a/gcc/rust/backend/rust-intrinsic-handlers.cc
+++ b/gcc/rust/backend/rust-intrinsic-handlers.cc
@@ -303,11 +303,11 @@ expect (Context *ctx, TyTy::FnType *fntype, bool likely)
   std::vector<Bvariable *> param_vars;
   compile_fn_params (ctx, fntype, fndecl, &param_vars);
   tree expr = Backend::var_expression (param_vars[0], UNDEF_LOCATION);
-  tree expect_fn_raw = nullptr;
-  BuiltinsContext::get ().lookup_simple_builtin ("__builtin_expect",
-                                                &expect_fn_raw);
+  auto expect_fn_raw
+    = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_expect");
   rust_assert (expect_fn_raw);
-  auto expect_fn = build_fold_addr_expr_loc (BUILTINS_LOCATION, expect_fn_raw);
+
+  auto expect_fn = build_fold_addr_expr_loc (BUILTINS_LOCATION, 
*expect_fn_raw);
 
   // we need to convert the expression return type to long to match the 
expected
   // parameter type of __builtin_expect
@@ -521,35 +521,37 @@ op_with_overflow (Context *ctx, TyTy::FnType *fntype, 
tree_code op)
   auto x = Backend::var_expression (x_param, UNDEF_LOCATION);
   auto y = Backend::var_expression (y_param, UNDEF_LOCATION);
 
-  tree overflow_builtin = error_mark_node;
+  tl::optional<tree> overflow_builtin = tl::nullopt;
+  auto &builtins = BuiltinsContext::get ();
+
   switch (op)
     {
     case PLUS_EXPR:
-      BuiltinsContext::get ().lookup_simple_builtin ("__builtin_add_overflow",
-                                                    &overflow_builtin);
+      overflow_builtin
+       = builtins.lookup_simple_builtin ("__builtin_add_overflow");
       break;
 
     case MINUS_EXPR:
-      BuiltinsContext::get ().lookup_simple_builtin ("__builtin_sub_overflow",
-                                                    &overflow_builtin);
+      overflow_builtin
+       = builtins.lookup_simple_builtin ("__builtin_sub_overflow");
       break;
 
     case MULT_EXPR:
-      BuiltinsContext::get ().lookup_simple_builtin ("__builtin_mul_overflow",
-                                                    &overflow_builtin);
+      overflow_builtin
+       = builtins.lookup_simple_builtin ("__builtin_mul_overflow");
       break;
 
     default:
       rust_unreachable ();
       break;
     }
-  rust_assert (overflow_builtin != error_mark_node);
+  rust_assert (overflow_builtin);
 
   tree bool_decl = bool_variable->get_tree (BUILTINS_LOCATION);
   tree result_decl = result_variable->get_tree (BUILTINS_LOCATION);
   tree result_ref = build_fold_addr_expr_loc (BUILTINS_LOCATION, result_decl);
 
-  tree builtin_call = build_call_expr_loc (BUILTINS_LOCATION, overflow_builtin,
+  tree builtin_call = build_call_expr_loc (BUILTINS_LOCATION, 
*overflow_builtin,
                                           3, x, y, result_ref);
 
   tree overflow_assignment
@@ -620,12 +622,11 @@ copy (Context *ctx, TyTy::FnType *fntype, bool overlaps)
   tree size_expr
     = build2 (MULT_EXPR, size_type_node, TYPE_SIZE_UNIT (param_type), count);
 
-  tree memcpy_raw = nullptr;
-  BuiltinsContext::get ().lookup_simple_builtin (overlaps ? "__builtin_memmove"
-                                                         : "__builtin_memcpy",
-                                                &memcpy_raw);
+  auto memcpy_raw = BuiltinsContext::get ().lookup_simple_builtin (
+    overlaps ? "__builtin_memmove" : "__builtin_memcpy");
   rust_assert (memcpy_raw);
-  auto memcpy = build_fold_addr_expr_loc (UNKNOWN_LOCATION, memcpy_raw);
+
+  auto memcpy = build_fold_addr_expr_loc (UNKNOWN_LOCATION, *memcpy_raw);
 
   auto copy_call = Backend::call_expression (memcpy, {dst, src, size_expr},
                                             nullptr, UNDEF_LOCATION);
@@ -680,13 +681,12 @@ atomic_store (Context *ctx, TyTy::FnType *fntype, int 
ordering)
   if (builtin_name.empty ())
     return error_mark_node;
 
-  tree atomic_store_raw = nullptr;
-  BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
-                                                &atomic_store_raw);
+  auto atomic_store_raw
+    = BuiltinsContext::get ().lookup_simple_builtin (builtin_name);
   rust_assert (atomic_store_raw);
 
   auto atomic_store
-    = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_store_raw);
+    = build_fold_addr_expr_loc (UNKNOWN_LOCATION, *atomic_store_raw);
 
   auto store_call
     = Backend::call_expression (atomic_store, {dst, value, memorder}, nullptr,
@@ -739,13 +739,12 @@ atomic_load (Context *ctx, TyTy::FnType *fntype, int 
ordering)
   if (builtin_name.empty ())
     return error_mark_node;
 
-  tree atomic_load_raw = nullptr;
-  BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
-                                                &atomic_load_raw);
+  auto atomic_load_raw
+    = BuiltinsContext::get ().lookup_simple_builtin (builtin_name);
   rust_assert (atomic_load_raw);
 
   auto atomic_load
-    = build_fold_addr_expr_loc (UNKNOWN_LOCATION, atomic_load_raw);
+    = build_fold_addr_expr_loc (UNKNOWN_LOCATION, *atomic_load_raw);
 
   auto load_call = Backend::call_expression (atomic_load, {src, memorder},
                                             nullptr, UNDEF_LOCATION);
@@ -863,11 +862,11 @@ ctlz_handler (Context *ctx, TyTy::FnType *fntype, bool 
nonzero)
   // matches the builtin's operand width, so the subtraction is skipped.
   tree call_arg = fold_convert (cast_type, unsigned_arg);
 
-  tree builtin_decl = error_mark_node;
-  BuiltinsContext::get ().lookup_simple_builtin (builtin_name, &builtin_decl);
+  auto builtin_decl
+    = BuiltinsContext::get ().lookup_simple_builtin (builtin_name);
   rust_assert (builtin_decl != error_mark_node);
 
-  tree builtin_fn = build_fold_addr_expr_loc (locus, builtin_decl);
+  tree builtin_fn = build_fold_addr_expr_loc (locus, *builtin_decl);
   tree clz_expr
     = Backend::call_expression (builtin_fn, {call_arg}, nullptr, locus);
 
@@ -1000,11 +999,11 @@ cttz_handler (Context *ctx, TyTy::FnType *fntype, bool 
nonzero)
 
   tree call_arg = fold_convert (cast_type, unsigned_arg);
 
-  tree builtin_decl = error_mark_node;
-  BuiltinsContext::get ().lookup_simple_builtin (builtin_name, &builtin_decl);
-  rust_assert (builtin_decl != error_mark_node);
+  auto builtin_decl
+    = BuiltinsContext::get ().lookup_simple_builtin (builtin_name);
+  rust_assert (builtin_decl);
 
-  tree builtin_fn = build_fold_addr_expr_loc (locus, builtin_decl);
+  tree builtin_fn = build_fold_addr_expr_loc (locus, *builtin_decl);
   tree ctz_expr
     = Backend::call_expression (builtin_fn, {call_arg}, nullptr, locus);
 
@@ -1318,13 +1317,12 @@ move_val_init (Context *ctx, TyTy::FnType *fntype, 
location_t)
   tree src = Backend::var_expression (param_vars[1], UNDEF_LOCATION);
   tree size = TYPE_SIZE_UNIT (template_parameter_type);
 
-  tree memcpy_builtin = error_mark_node;
-  BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memcpy",
-                                                &memcpy_builtin);
-  rust_assert (memcpy_builtin != error_mark_node);
+  auto memcpy_builtin
+    = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memcpy");
+  rust_assert (memcpy_builtin);
 
   src = build_fold_addr_expr_loc (BUILTINS_LOCATION, src);
-  tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memcpy_builtin, 3,
+  tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, *memcpy_builtin, 
3,
                                          dst, src, size);
 
   ctx->add_statement (memset_call);
@@ -1374,10 +1372,9 @@ uninit (Context *ctx, TyTy::FnType *fntype, location_t)
 
   // BUILTIN size_of FN BODY BEGIN
 
-  tree memset_builtin = error_mark_node;
-  BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset",
-                                                &memset_builtin);
-  rust_assert (memset_builtin != error_mark_node);
+  auto memset_builtin
+    = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset");
+  rust_assert (memset_builtin);
 
   // call memset with 0x01 and size of the thing see
   // https://github.com/Rust-GCC/gccrs/issues/1899
@@ -1387,7 +1384,7 @@ uninit (Context *ctx, TyTy::FnType *fntype, location_t)
   tree constant_byte = build_int_cst (integer_type_node, 0x01);
   tree size_expr = TYPE_SIZE_UNIT (template_parameter_type);
 
-  tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, memset_builtin, 3,
+  tree memset_call = build_call_expr_loc (BUILTINS_LOCATION, *memset_builtin, 
3,
                                          dst_addr, constant_byte, size_expr);
   ctx->add_statement (memset_call);
 
@@ -1453,11 +1450,11 @@ prefetch_data (Context *ctx, TyTy::FnType *fntype, 
Prefetch kind)
 
   auto rw_flag = make_unsigned_long_tree (kind == Prefetch::Write ? 1 : 0);
 
-  auto prefetch_raw = NULL_TREE;
-  auto ok = BuiltinsContext::get ().lookup_simple_builtin 
("__builtin_prefetch",
-                                                          &prefetch_raw);
-  rust_assert (ok);
-  auto prefetch = build_fold_addr_expr_loc (UNKNOWN_LOCATION, prefetch_raw);
+  auto prefetch_raw
+    = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_prefetch");
+  rust_assert (prefetch_raw);
+
+  auto prefetch = build_fold_addr_expr_loc (UNKNOWN_LOCATION, *prefetch_raw);
 
   auto prefetch_call = Backend::call_expression (prefetch,
                                                 {addr, rw_flag,
@@ -1994,13 +1991,12 @@ bswap_handler (Context *ctx, TyTy::FnType *fntype, 
location_t)
          return error_mark_node;
        }
 
-      tree bswap_raw = nullptr;
-      auto ok = BuiltinsContext::get ().lookup_simple_builtin (builtin_name,
-                                                              &bswap_raw);
+      auto bswap_raw
+       = BuiltinsContext::get ().lookup_simple_builtin (builtin_name);
 
-      if (ok)
+      if (bswap_raw)
        {
-         tree bswap_fn = build_fold_addr_expr_loc (locus, bswap_raw);
+         tree bswap_fn = build_fold_addr_expr_loc (locus, *bswap_raw);
 
          auto bswap_x = build1 (CONVERT_EXPR, target_type, expr_x);
 
@@ -2011,11 +2007,11 @@ bswap_handler (Context *ctx, TyTy::FnType *fntype, 
location_t)
        }
       else
        {
-         auto ok2 = BuiltinsContext::get ().lookup_simple_builtin (
-           "__builtin_bswap64", &bswap_raw);
-         rust_assert (ok2);
+         bswap_raw = BuiltinsContext::get ().lookup_simple_builtin (
+           "__builtin_bswap64");
+         rust_assert (bswap_raw);
 
-         tree bswap_fn = build_fold_addr_expr_loc (locus, bswap_raw);
+         tree bswap_fn = build_fold_addr_expr_loc (locus, *bswap_raw);
 
          tree tmp_in_stmt = error_mark_node;
          Bvariable *in_var
@@ -2152,13 +2148,12 @@ write_bytes_handler (Context *ctx, TyTy::FnType 
*fntype, location_t)
                       fold_convert_loc (locus, size_type_node, expr_count),
                       fold_convert_loc (locus, size_type_node, dst_size_expr));
 
-  tree write_bytes_raw = nullptr;
   // void* memset( void* dest, int ch, size_t count );
-  bool ok = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset",
-                                                          &write_bytes_raw);
-  rust_assert (ok);
+  auto write_bytes_raw
+    = BuiltinsContext::get ().lookup_simple_builtin ("__builtin_memset");
+  rust_assert (write_bytes_raw);
 
-  tree write_bytes_fn = build_fold_addr_expr_loc (locus, write_bytes_raw);
+  tree write_bytes_fn = build_fold_addr_expr_loc (locus, *write_bytes_raw);
   tree write_bytes_call
     = Backend::call_expression (write_bytes_fn,
                                {expr_dst, expr_val, expr_count_final},
diff --git a/gcc/rust/rust-gcc.cc b/gcc/rust/rust-gcc.cc
index bb9aee2c5..88781f52b 100644
--- a/gcc/rust/rust-gcc.cc
+++ b/gcc/rust/rust-gcc.cc
@@ -1168,31 +1168,30 @@ fetch_overflow_builtins (ArithmeticOrLogicalOperator op)
 {
   auto builtin_ctx = Rust::Compile::BuiltinsContext::get ();
 
-  auto builtin = NULL_TREE;
-  auto abort = NULL_TREE;
+  tl::optional<tree> builtin = NULL_TREE;
 
   switch (op)
     {
     case ArithmeticOrLogicalOperator::ADD:
-      builtin_ctx.lookup_simple_builtin ("__builtin_add_overflow", &builtin);
+      builtin = builtin_ctx.lookup_simple_builtin ("__builtin_add_overflow");
       break;
     case ArithmeticOrLogicalOperator::SUBTRACT:
-      builtin_ctx.lookup_simple_builtin ("__builtin_sub_overflow", &builtin);
+      builtin = builtin_ctx.lookup_simple_builtin ("__builtin_sub_overflow");
       break;
     case ArithmeticOrLogicalOperator::MULTIPLY:
-      builtin_ctx.lookup_simple_builtin ("__builtin_mul_overflow", &builtin);
+      builtin = builtin_ctx.lookup_simple_builtin ("__builtin_mul_overflow");
       break;
     default:
       rust_unreachable ();
       break;
     };
 
-  builtin_ctx.lookup_simple_builtin ("__builtin_abort", &abort);
+  auto abort = builtin_ctx.lookup_simple_builtin ("__builtin_abort");
 
   rust_assert (abort);
   rust_assert (builtin);
 
-  return {abort, builtin};
+  return {*abort, *builtin};
 }
 
 // Return an expression for the arithmetic or logical operation LEFT OP RIGHT

base-commit: 81eeb6894c0c1eed16db720c75d558d4ea3f3487
-- 
2.55.0

Reply via email to