diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-pattern.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile-pattern.cc | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc index 27ee487..ffda652 100644 --- a/gcc/rust/backend/rust-compile-pattern.cc +++ b/gcc/rust/backend/rust-compile-pattern.cc @@ -17,6 +17,8 @@ // <http://www.gnu.org/licenses/>. #include "rust-compile-pattern.h" +#include "rust-compile-expr.h" +#include "rust-constexpr.h" namespace Rust { namespace Compile { @@ -46,20 +48,33 @@ CompilePatternCaseLabelExpr::visit (HIR::PathInExpression &pattern) ok = adt->lookup_variant_by_id (variant_id, &variant); rust_assert (ok); - mpz_t disciminantl; - if (variant->get_variant_type () == TyTy::VariantDef::VariantType::NUM) + tree case_low = error_mark_node; + if (variant->is_specified_discriminant_node ()) { - mpz_init_set_ui (disciminantl, variant->get_discriminant ()); + 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 { - HirId variant_id = variant->get_id (); - mpz_init_set_ui (disciminantl, variant_id); - } + 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); - tree case_low - = double_int_to_tree (t, mpz_get_double_int (t, disciminantl, true)); + tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx); + case_low + = double_int_to_tree (t, mpz_get_double_int (t, disciminantl, true)); + } case_label_expr = build_case_label (case_low, NULL_TREE, associated_case_label); |