diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-11-07 11:58:32 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-07 11:58:32 +0000 |
commit | d11a50eca3773fb29430db6d3ea3ccc2bb4335fa (patch) | |
tree | 6d459b779636d255a9539fd42508263f8836452d /gcc | |
parent | 57b10aef62e8759afc413df8882fcd4fb5f098bf (diff) | |
parent | bc858da45c3c0b445d57ed9f3bf9d2122076171e (diff) | |
download | gcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.zip gcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.tar.gz gcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.tar.bz2 |
Merge #798
798: Add missing const folding r=philberty a=philberty
Add some more missing constant-folding operations
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.h | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/gcc/rust/typecheck/rust-hir-const-fold.h b/gcc/rust/typecheck/rust-hir-const-fold.h index 2bf0f2c..b3a53eb 100644 --- a/gcc/rust/typecheck/rust-hir-const-fold.h +++ b/gcc/rust/typecheck/rust-hir-const-fold.h @@ -47,9 +47,33 @@ public: translated = backend->array_type (element_ty, type.get_capacity ()); } - void visit (TyTy::ReferenceType &) override { gcc_unreachable (); } + void visit (TyTy::ReferenceType &type) override + { + Btype *base_compiled_type = ConstFoldType::fold (type.get_base (), backend); + if (type.is_mutable ()) + { + translated = backend->reference_type (base_compiled_type); + } + else + { + auto base = backend->immutable_type (base_compiled_type); + translated = backend->reference_type (base); + } + } - void visit (TyTy::PointerType &) override { gcc_unreachable (); } + void visit (TyTy::PointerType &type) override + { + Btype *base_compiled_type = ConstFoldType::fold (type.get_base (), backend); + if (type.is_mutable ()) + { + translated = backend->pointer_type (base_compiled_type); + } + else + { + auto base = backend->immutable_type (base_compiled_type); + translated = backend->pointer_type (base); + } + } void visit (TyTy::ParamType &) override { gcc_unreachable (); } @@ -436,6 +460,38 @@ public: expr.get_locus ()); } + void visit (HIR::BorrowExpr &expr) override + { + Bexpression *main_expr = ConstFoldExpr::fold (expr.get_expr ().get ()); + + folded + = ctx->get_backend ()->address_expression (main_expr, expr.get_locus ()); + } + + void visit (HIR::DereferenceExpr &expr) override + { + Bexpression *main_expr = ConstFoldExpr::fold (expr.get_expr ().get ()); + + TyTy::BaseType *tyty = nullptr; + if (!tyctx->lookup_type (expr.get_mappings ().get_hirid (), &tyty)) + { + rust_fatal_error (expr.get_locus (), + "did not resolve type for this TupleExpr"); + return; + } + + Btype *expected_type = ConstFoldType::fold (tyty, ctx->get_backend ()); + bool known_valid = true; + folded = ctx->get_backend ()->indirect_expression (expected_type, main_expr, + known_valid, + expr.get_locus ()); + } + + void visit (HIR::GroupedExpr &expr) override + { + folded = ConstFoldExpr::fold (expr.get_expr_in_parens ().get ()); + } + private: ConstFoldExpr () : ConstFoldBase (), folded (ctx->get_backend ()->error_expression ()) |