void
CompileFnParam::visit (HIR::StructPattern &pattern)
{
- // generate the anon param
- tree tmp_ident = create_tmp_var_name ("RSTPRM");
- std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
-
- decl_type = ctx->get_backend ()->immutable_type (decl_type);
- compiled_param
- = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
- decl_type, locus);
-
- // setup the pattern bindings
- tree anon_param = ctx->get_backend ()->var_expression (compiled_param, locus);
- CompilePatternBindings::Compile (&pattern, anon_param, ctx);
+ tree tmp_param_var = create_tmp_param_var (decl_type);
+ CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
}
void
CompileFnParam::visit (HIR::TupleStructPattern &pattern)
{
- // generate the anon param
- tree tmp_ident = create_tmp_var_name ("RSTPRM");
- std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
-
- decl_type = ctx->get_backend ()->immutable_type (decl_type);
- compiled_param
- = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
- decl_type, locus);
+ tree tmp_param_var = create_tmp_param_var (decl_type);
+ CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
+}
- // setup the pattern bindings
- tree anon_param = ctx->get_backend ()->var_expression (compiled_param, locus);
- CompilePatternBindings::Compile (&pattern, anon_param, ctx);
+void
+CompileFnParam::visit (HIR::ReferencePattern &pattern)
+{
+ tree tmp_param_var = create_tmp_param_var (decl_type);
+ CompilePatternBindings::Compile (&pattern, tmp_param_var, ctx);
}
Bvariable *
locus);
}
+tree
+CompileFnParam::create_tmp_param_var (tree decl_type)
+{
+ // generate the anon param
+ tree tmp_ident = create_tmp_var_name ("RSTPRM");
+ std::string cpp_str_identifier = std::string (IDENTIFIER_POINTER (tmp_ident));
+
+ decl_type = ctx->get_backend ()->immutable_type (decl_type);
+ compiled_param
+ = ctx->get_backend ()->parameter_variable (fndecl, cpp_str_identifier,
+ decl_type, locus);
+
+ return ctx->get_backend ()->var_expression (compiled_param, locus);
+}
+
} // namespace Compile
} // namespace Rust
void visit (HIR::WildcardPattern &pattern) override;
void visit (HIR::StructPattern &) override;
void visit (HIR::TupleStructPattern &) override;
+ void visit (HIR::ReferencePattern &) override;
// Empty visit for unused Pattern HIR nodes.
void visit (HIR::AltPattern &) override {}
void visit (HIR::PathInExpression &) override {}
void visit (HIR::QualifiedPathInExpression &) override {}
void visit (HIR::RangePattern &) override {}
- void visit (HIR::ReferencePattern &) override {}
void visit (HIR::SlicePattern &) override {}
void visit (HIR::TuplePattern &) override {}
private:
CompileFnParam (Context *ctx, tree fndecl, tree decl_type, Location locus);
+ tree create_tmp_param_var (tree decl_type);
+
tree fndecl;
tree decl_type;
Location locus;
}
}
+void
+CompilePatternBindings::visit (HIR::ReferencePattern &pattern)
+{
+ tree derefed
+ = indirect_expression (match_scrutinee_expr, pattern.get_locus ());
+
+ CompilePatternBindings::Compile (pattern.get_referenced_pattern ().get (),
+ derefed, ctx);
+}
+
+void
+CompilePatternBindings::visit (HIR::IdentifierPattern &pattern)
+{
+ ctx->insert_pattern_binding (pattern.get_pattern_mappings ().get_hirid (),
+ match_scrutinee_expr);
+}
+
void
CompilePatternLet::visit (HIR::IdentifierPattern &pattern)
{
void visit (HIR::StructPattern &pattern) override;
void visit (HIR::TupleStructPattern &pattern) override;
+ void visit (HIR::ReferencePattern &pattern) override;
+ void visit (HIR::IdentifierPattern &) override;
// unsupported
void visit (HIR::AltPattern &pattern) override
}
// Empty visit for unused Pattern HIR nodes.
- void visit (HIR::IdentifierPattern &) override {}
void visit (HIR::LiteralPattern &) override {}
void visit (HIR::PathInExpression &) override {}
void visit (HIR::QualifiedPathInExpression &) override {}
void visit (HIR::RangePattern &) override {}
- void visit (HIR::ReferencePattern &) override {}
void visit (HIR::SlicePattern &) override {}
void visit (HIR::TuplePattern &) override {}
void visit (HIR::WildcardPattern &) override {}