summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-11 23:20:03 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-11 23:20:03 +0800
commit48560772db858bcd142886a0c277e2b2dae9cf14 (patch)
treeebbe8e995f17e173d6dbeaaa2f5f449d0f7aace9
parentf54b532f00e183dc0250435acdff3beec5d7ae51 (diff)
downloadmrust-48560772db858bcd142886a0c277e2b2dae9cf14.tar.gz
Misc twiddles for recent changes
-rw-r--r--src/hir_conv/bind.cpp37
-rw-r--r--src/hir_expand/const_eval_full.cpp5
-rw-r--r--src/trans/codegen_c.cpp11
-rw-r--r--src/trans/enumerate.cpp22
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,