diff options
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.cc | 10 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.h | 12 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.cc | 31 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-resolve-path.cc | 26 |
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}, |