aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc10
-rw-r--r--gcc/rust/backend/rust-compile-expr.h12
-rw-r--r--gcc/rust/backend/rust-compile-pattern.cc31
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.cc26
4 files changed, 19 insertions, 60 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index 1048027..ae4a841 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -397,13 +397,11 @@ CompileExpr::visit (HIR::CallExpr &expr)
std::vector<tree> ctor_arguments;
if (adt->is_enum ())
{
- HirId variant_id = variant->get_id ();
- mpz_t val;
- mpz_init_set_ui (val, variant_id);
+ HIR::Expr *discrim_expr = variant->get_discriminant ();
+ tree discrim_expr_node = CompileExpr::Compile (discrim_expr, ctx);
+ tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
+ tree qualifier = folded_discrim_expr;
- tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx);
- tree qualifier
- = double_int_to_tree (t, mpz_get_double_int (t, val, true));
ctor_arguments.push_back (qualifier);
}
for (auto &arg : arguments)
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 4cc4dfc..43eff72 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -24,6 +24,7 @@
#include "rust-compile-resolve-path.h"
#include "rust-compile-block.h"
#include "rust-compile-struct-field-expr.h"
+#include "rust-constexpr.h"
namespace Rust {
namespace Compile {
@@ -488,13 +489,10 @@ public:
std::vector<tree> ctor_arguments;
if (adt->is_enum ())
{
- HirId variant_id = variant->get_id ();
- mpz_t val;
- mpz_init_set_ui (val, variant_id);
-
- tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx);
- tree qualifier
- = double_int_to_tree (t, mpz_get_double_int (t, val, true));
+ HIR::Expr *discrim_expr = variant->get_discriminant ();
+ tree discrim_expr_node = CompileExpr::Compile (discrim_expr, ctx);
+ tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
+ tree qualifier = folded_discrim_expr;
ctor_arguments.push_back (qualifier);
}
diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc
index b255dc6..d715c7c 100644
--- a/gcc/rust/backend/rust-compile-pattern.cc
+++ b/gcc/rust/backend/rust-compile-pattern.cc
@@ -48,33 +48,10 @@ CompilePatternCaseLabelExpr::visit (HIR::PathInExpression &pattern)
ok = adt->lookup_variant_by_id (variant_id, &variant);
rust_assert (ok);
- tree case_low = error_mark_node;
- if (variant->is_specified_discriminant_node ())
- {
- auto discrim_node = variant->get_discriminant_node ();
- auto &discrim_expr = discrim_node->get_discriminant_expression ();
-
- tree discrim_expr_node = CompileExpr::Compile (discrim_expr.get (), ctx);
- tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
- case_low = folded_discrim_expr;
- }
- else
- {
- mpz_t disciminantl;
- if (variant->get_variant_type () == TyTy::VariantDef::VariantType::NUM)
- {
- mpz_init_set_ui (disciminantl, variant->get_discriminant ());
- }
- else
- {
- HirId variant_id = variant->get_id ();
- mpz_init_set_ui (disciminantl, variant_id);
- }
-
- tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx);
- case_low
- = double_int_to_tree (t, mpz_get_double_int (t, disciminantl, true));
- }
+ HIR::Expr *discrim_expr = variant->get_discriminant ();
+ tree discrim_expr_node = CompileExpr::Compile (discrim_expr, ctx);
+ tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
+ tree case_low = folded_discrim_expr;
case_label_expr
= build_case_label (case_low, NULL_TREE, associated_case_label);
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index ddb6c91..c624046 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -86,8 +86,8 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment,
&union_disriminator))
return ctx->get_backend ()->error_expression ();
- // FIXME should really return error_mark_node and or rust_internal_error
- // error_mark_node
+ // this can only be for discriminant variants the others are built up
+ // using call-expr or struct-init
rust_assert (variant->get_variant_type ()
== TyTy::VariantDef::VariantType::NUM);
@@ -95,24 +95,10 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment,
tree compiled_adt_type = TyTyResolveCompile::compile (ctx, adt);
// make the ctor for the union
- tree qualifier = error_mark_node;
- if (variant->is_specified_discriminant_node ())
- {
- auto discrim_node = variant->get_discriminant_node ();
- auto &discrim_expr = discrim_node->get_discriminant_expression ();
-
- tree discrim_expr_node
- = CompileExpr::Compile (discrim_expr.get (), ctx);
- tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
- qualifier = folded_discrim_expr;
- }
- else
- {
- mpz_t val;
- mpz_init_set_ui (val, variant->get_discriminant ());
- tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx);
- qualifier = double_int_to_tree (t, mpz_get_double_int (t, val, true));
- }
+ HIR::Expr *discrim_expr = variant->get_discriminant ();
+ tree discrim_expr_node = CompileExpr::Compile (discrim_expr, ctx);
+ tree folded_discrim_expr = ConstCtx::fold (discrim_expr_node);
+ tree qualifier = folded_discrim_expr;
return ctx->get_backend ()->constructor_expression (compiled_adt_type,
true, {qualifier},