diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-11 23:20:03 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-11 23:20:03 +0800 |
commit | 48560772db858bcd142886a0c277e2b2dae9cf14 (patch) | |
tree | ebbe8e995f17e173d6dbeaaa2f5f449d0f7aace9 | |
parent | f54b532f00e183dc0250435acdff3beec5d7ae51 (diff) | |
download | mrust-48560772db858bcd142886a0c277e2b2dae9cf14.tar.gz |
Misc twiddles for recent changes
-rw-r--r-- | src/hir_conv/bind.cpp | 37 | ||||
-rw-r--r-- | src/hir_expand/const_eval_full.cpp | 5 | ||||
-rw-r--r-- | src/trans/codegen_c.cpp | 11 | ||||
-rw-r--r-- | src/trans/enumerate.cpp | 22 |
4 files changed, 55 insertions, 20 deletions
diff --git a/src/hir_conv/bind.cpp b/src/hir_conv/bind.cpp index f2295ee6..198b8ea1 100644 --- a/src/hir_conv/bind.cpp +++ b/src/hir_conv/bind.cpp @@ -146,6 +146,32 @@ namespace { ::HIR::Visitor::visit_trait_path(p); } + void visit_literal(const Span& sp, ::HIR::Literal& lit) + { + TU_MATCH(::HIR::Literal, (lit), (e), + (Invalid, + ), + (List, + for(auto& val : e) { + visit_literal(sp, val); + } + ), + (Variant, + for(auto& val : e.vals) { + visit_literal(sp, val); + } + ), + (Integer, + ), + (Float, + ), + (BorrowOf, + visit_path(e, ::HIR::Visitor::PathContext::VALUE); + ), + (String, + ) + ) + } void visit_pattern_Value(const Span& sp, ::HIR::Pattern& pat, ::HIR::Pattern::Value& val) { @@ -404,6 +430,17 @@ namespace { ::HIR::Visitor::visit_type(ty); } + void visit_static(::HIR::ItemPath p, ::HIR::Static& i) override + { + ::HIR::Visitor::visit_static(p, i); + visit_literal(Span(), i.m_value_res); + } + void visit_constant(::HIR::ItemPath p, ::HIR::Constant& i) override + { + ::HIR::Visitor::visit_constant(p, i); + visit_literal(Span(), i.m_value_res); + } + void visit_expr(::HIR::ExprPtr& expr) override { struct ExprVisitor: diff --git a/src/hir_expand/const_eval_full.cpp b/src/hir_expand/const_eval_full.cpp index 9411e1c7..ba8be303 100644 --- a/src/hir_expand/const_eval_full.cpp +++ b/src/hir_expand/const_eval_full.cpp @@ -663,7 +663,10 @@ namespace { vals.reserve( e.vals.size() ); for(const auto& v : e.vals) vals.push_back( read_lval(v) ); - val = ::HIR::Literal::make_List( mv$(vals) ); + if( e.variant_idx == ~0u ) + val = ::HIR::Literal::make_List( mv$(vals) ); + else + val = ::HIR::Literal::make_Variant({ e.variant_idx, mv$(vals) }); ) ) diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp index 6aead22b..a676bb29 100644 --- a/src/trans/codegen_c.cpp +++ b/src/trans/codegen_c.cpp @@ -223,6 +223,7 @@ namespace { m_of << "\n"; } void emit_literal(const ::HIR::TypeRef& ty, const ::HIR::Literal& lit, const Trans_Params& params) { + TRACE_FUNCTION_F("ty=" << ty << ", lit=" << lit); Span sp; ::HIR::TypeRef tmp; auto monomorph_with = [&](const ::HIR::PathParams& pp, const ::HIR::TypeRef& ty)->const ::HIR::TypeRef& { @@ -242,12 +243,12 @@ namespace { else TU_IFLET(::HIR::TypeRef::Data, ty.m_data, Path, te, const auto& pp = te.path.m_data.as_Generic().m_params; TU_MATCHA((te.binding), (pbe), - (Unbound, throw"";), - (Opaque, throw"";), + (Unbound, BUG(sp, "Unbound type path " << ty); ), + (Opaque, BUG(sp, "Opaque type path " << ty); ), (Struct, TU_MATCHA( (pbe->m_data), (se), (Unit, - throw ""; + BUG(sp, "Unit struct " << ty); ), (Tuple, return monomorph_with(pp, se.at(idx).ent); @@ -264,10 +265,10 @@ namespace { const auto& evar = pbe->m_variants.at(var); TU_MATCHA( (evar.second), (se), (Unit, - throw ""; + BUG(sp, "Unit enum var " << ty << " #" << var << " - fld " << idx); ), (Value, - throw ""; + BUG(sp, "Value enum var " << ty << " #" << var << " - fld " << idx); ), (Tuple, return monomorph_with(pp, se.at(idx).ent); diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index 85bb7474..cb63bcc8 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -96,7 +96,7 @@ TransList Trans_Enumerate_Public(const ::HIR::Crate& crate) namespace { TAGGED_UNION(EntPtr, NotFound, (NotFound, struct{}), - (VTable, struct{}), + (AutoGenerate, struct{}), (Function, const ::HIR::Function*), (Static, const ::HIR::Static*) ); @@ -139,6 +139,8 @@ namespace { (StructConstant, ), (StructConstructor, + // TODO: What to do with these? + return EntPtr::make_AutoGenerate({}); ), (Function, return EntPtr { &e }; @@ -196,11 +198,6 @@ namespace { ASSERT_BUG(sp, trait_vi_it != trait_ref.m_values.end(), "Couldn't find item " << e.item << " in trait " << e.trait.m_path); const auto& trait_vi = trait_vi_it->second; - - //if( e.item == "#vtable" ) { - // return EntPtr::make_VTable({}); - //} - bool is_dynamic = false; ::std::vector<::HIR::TypeRef> best_impl_params; const ::HIR::TraitImpl* best_impl = nullptr; @@ -254,7 +251,7 @@ namespace { return false; }); if( is_dynamic ) - return EntPtr::make_VTable( {} ); + return EntPtr::make_AutoGenerate( {} ); if( !best_impl ) return EntPtr {}; const auto& impl = *best_impl; @@ -324,14 +321,11 @@ void Trans_Enumerate_FillFrom_Path(TransList& out, const ::HIR::Crate& crate, co (NotFound, BUG(sp, "Item not found for " << path_mono); ), - (VTable, + (AutoGenerate, // This is returned either if the item is <T as U>::#vtable or if it's <(Trait) as Trait>::method - if( path_mono.m_data.as_UfcsKnown().item == "#vtable" ) + if( path_mono.m_data.is_Generic() ) { - // TODO: Vtable generation - //if( auto* ptr = out.add_vtable(mv$(path_mono)) ) - //{ - //} + // TODO: Generate struct constructors? } else if( path_mono.m_data.as_UfcsKnown().type->m_data.is_TraitObject() ) { @@ -343,7 +337,7 @@ void Trans_Enumerate_FillFrom_Path(TransList& out, const ::HIR::Crate& crate, co } else { - BUG(sp, "VTable returned for unknown path type - " << path_mono); + BUG(sp, "AutoGenerate returned for unknown path type - " << path_mono); } ), (Function, |