summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common.hpp8
-rw-r--r--src/expand/mod.cpp69
-rw-r--r--src/hir/from_ast.cpp8
-rw-r--r--src/hir/from_ast_expr.cpp2
-rw-r--r--src/main.cpp4
5 files changed, 86 insertions, 5 deletions
diff --git a/src/common.hpp b/src/common.hpp
index bea299bf..35113670 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -34,6 +34,14 @@ template<typename T>
rv.push_back( mv$(v) );
return rv;
}
+template<typename T>
+::std::vector<T> make_vec2(T v1, T v2) {
+ ::std::vector<T> rv;
+ rv.reserve(2);
+ rv.push_back( mv$(v1) );
+ rv.push_back( mv$(v2) );
+ return rv;
+}
enum Ordering
{
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index dad84423..7f2dc06a 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -494,7 +494,7 @@ struct CExpandExpr:
}
void visit(::AST::ExprNode_UniOp& node) override {
this->visit_nodelete(node, node.m_value);
- // - Desugar question mark operator before resolve?
+ // - Desugar question mark operator before resolve so it can create names
if( node.m_type == ::AST::ExprNode_UniOp::QMARK ) {
auto core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? "" : "core");
auto path_Ok = ::AST::Path(core_crate, {::AST::PathNode("result"), ::AST::PathNode("Result"), ::AST::PathNode("Ok")});
@@ -537,6 +537,73 @@ struct CExpandExpr:
replacement.reset(new ::AST::ExprNode_Match( mv$(node.m_value), mv$(arms) ));
}
+ else if( node.m_type == ::AST::ExprNode_UniOp::BOX )
+ {
+ // TODO: Should this be a desugar, or a HIR/MIR operation?
+ // - The only avaliable language item is `exchange_malloc`
+ // TODO: These should be language items (but are not)
+ auto core_crate = (crate.m_load_std == ::AST::Crate::LOAD_NONE ? "" : "core");
+ auto path_Place = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("Place")});
+ auto path_BoxPlace = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("BoxPlace")});
+ auto path_Boxed = ::AST::Path(core_crate, {::AST::PathNode("ops"), ::AST::PathNode("Boxed")});
+ auto path_ptr_write= ::AST::Path(core_crate, {::AST::PathNode("intrinsics"), ::AST::PathNode("move_val_init")});
+ ::std::vector< ::AST::ExprNodeP> nodes;
+ // `let mut place = BoxPlace::make_place();`
+ nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding(
+ ::AST::Pattern(AST::Pattern::TagBind(), "place#box", ::AST::PatternBinding::Type::MOVE, true),
+ ::TypeRef(),
+ ::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_BoxPlace), {::AST::PathNode("make_place")}),
+ {}
+ ))
+ )));
+ // `let raw_place = Place::pointer(&mut place);`
+ nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding(
+ ::AST::Pattern(AST::Pattern::TagBind(), "raw_place#box", ::AST::PatternBinding::Type::MOVE, false),
+ ::TypeRef(),
+ ::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_Place), {::AST::PathNode("pointer")}),
+ ::make_vec1(
+ ::AST::ExprNodeP(new ::AST::ExprNode_UniOp(::AST::ExprNode_UniOp::REFMUT,
+ ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("place#box") ))
+ ))
+ )
+ ))
+ )));
+ // `let value = EXPR;`
+ nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_LetBinding(
+ ::AST::Pattern(AST::Pattern::TagBind(), "value#box", ::AST::PatternBinding::Type::MOVE, false),
+ ::TypeRef(),
+ mv$( node.m_value )
+ )));
+ // `unsafe {`
+ {
+ ::std::vector< ::AST::ExprNodeP> nodes_unsafe;
+ // `::std::ptr::write(raw_place, value);`
+ nodes_unsafe.push_back(::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
+ ::AST::Path(path_ptr_write),
+ ::make_vec2(
+ ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("raw_place#box") )),
+ ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("value#box") ))
+ )
+ )));
+ // `Boxed::finalize(place)`
+ nodes_unsafe.push_back(::AST::ExprNodeP(new ::AST::ExprNode_CallPath(
+ ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(path_Boxed), {::AST::PathNode("finalize")}),
+ ::make_vec1(
+ ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("place#box") ))
+ )
+ )));
+ // `}`
+ for(auto& n : nodes_unsafe)
+ n->set_pos( node.get_pos() );
+ nodes.push_back(::AST::ExprNodeP(new ::AST::ExprNode_Block( mv$(nodes_unsafe), nullptr )));
+ dynamic_cast< ::AST::ExprNode_Block&>(*nodes.back()).m_is_unsafe = true;
+ }
+ for(auto& n : nodes)
+ n->set_pos( node.get_pos() );
+ replacement.reset(new ::AST::ExprNode_Block( mv$(nodes), nullptr ));
+ }
}
};
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 359d6ed9..930c549f 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -200,6 +200,7 @@
BUG(pat.span(), "Encountered StructTuple pattern not pointing to a enum variant or a struct - " << e.path);
),
(EnumVar,
+ assert( pb.enum_ );
const auto& var = pb.enum_->variants()[pb.idx].m_data;
unsigned int field_count = var.as_Tuple().m_sub_types.size();
::std::vector<HIR::Pattern> sub_patterns;
@@ -239,6 +240,7 @@
};
),
(Struct,
+ assert( pb.struct_ );
unsigned int field_count = pb.struct_->m_data.as_Tuple().ents.size();
::std::vector<HIR::Pattern> sub_patterns;
@@ -674,7 +676,11 @@
::HIR::TypeRef::Data::Data_TraitObject v;
for(const auto& t : e.traits)
{
- if( t.binding().as_Trait().trait_->is_marker() ) {
+ const auto& tb = t.binding().as_Trait();
+ if( tb.trait_ && tb.trait_->is_marker() ) {
+ v.m_markers.push_back( LowerHIR_GenericPath(ty.span(), t) );
+ }
+ else if( tb.hir && tb.hir->m_is_marker ) {
v.m_markers.push_back( LowerHIR_GenericPath(ty.span(), t) );
}
else {
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index f8d3fd69..a2d0be99 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -188,7 +188,7 @@ struct LowerHIR_ExprNode_Visitor:
switch(v.m_type)
{
case ::AST::ExprNode_UniOp::BOX:
- TODO(v.get_pos(), "Desugar box");
+ BUG(v.get_pos(), "Encounterd box operator (should have been expanded in AST)");
break;
case ::AST::ExprNode_UniOp::QMARK:
BUG(v.get_pos(), "Encounterd question mark operator (should have been expanded in AST)");
diff --git a/src/main.cpp b/src/main.cpp
index 6361a3b0..6d056fd4 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -35,8 +35,8 @@ void init_debug_list()
g_debug_disable_map.insert( "Expand" );
g_debug_disable_map.insert( "Resolve Use" );
- //g_debug_disable_map.insert( "Resolve Index" );
- //g_debug_disable_map.insert( "Resolve Absolute" );
+ g_debug_disable_map.insert( "Resolve Index" );
+ g_debug_disable_map.insert( "Resolve Absolute" );
g_debug_disable_map.insert( "HIR Lower" );