diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-resolve-path.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile-resolve-path.cc | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc index 07133b9..c1d0778 100644 --- a/gcc/rust/backend/rust-compile-resolve-path.cc +++ b/gcc/rust/backend/rust-compile-resolve-path.cc @@ -95,11 +95,24 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment, tree compiled_adt_type = TyTyResolveCompile::compile (ctx, adt); // make the ctor for the union - mpz_t val; - mpz_init_set_ui (val, variant->get_discriminant ()); - tree t = TyTyResolveCompile::get_implicit_enumeral_node_type (ctx); - tree qualifier - = double_int_to_tree (t, mpz_get_double_int (t, val, true)); + 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)); + } return ctx->get_backend ()->constructor_expression (compiled_adt_type, true, {qualifier}, |