diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 4 | ||||
-rw-r--r-- | src/mir/check.cpp | 102 | ||||
-rw-r--r-- | src/mir/from_hir.cpp | 8 | ||||
-rw-r--r-- | src/mir/main_bindings.hpp | 1 |
4 files changed, 108 insertions, 7 deletions
diff --git a/src/main.cpp b/src/main.cpp index 488cafaa..14fa1c2e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -248,7 +248,9 @@ int main(int argc, char *argv[]) });
// Validate the MIR
- // TODO: ^
+ CompilePhaseV("MIR Validate", [&]() {
+ MIR_CheckCrate(*hir_crate);
+ });
CompilePhaseV("Dump MIR", [&]() {
::std::ofstream os (FMT(params.outfile << "_3_mir.rs"));
diff --git a/src/mir/check.cpp b/src/mir/check.cpp new file mode 100644 index 00000000..01e9e05e --- /dev/null +++ b/src/mir/check.cpp @@ -0,0 +1,102 @@ +/* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * mir/check.cpp + * - MIR Correctness validation + */ +#include "main_bindings.hpp" +#include "mir.hpp" +#include <hir/visitor.hpp> +#include <hir_typeck/static.hpp> + +void MIR_Validate(const StaticTraitResolve& resolve, const ::MIR::Function& fcn) +{ + +} + +namespace { + // TODO: Create visitor that handles setting up a StaticTraitResolve? + class OuterVisitor: + public ::HIR::Visitor + { + StaticTraitResolve m_resolve; + public: + OuterVisitor(const ::HIR::Crate& crate): + m_resolve(crate) + {} + + // NOTE: This is left here to ensure that any expressions that aren't handled by higher code cause a failure + void visit_expr(::HIR::ExprPtr& exp) override { + BUG(Span(), "visit_expr hit in OuterVisitor"); + } + + void visit_type(::HIR::TypeRef& ty) override + { + TU_IFLET(::HIR::TypeRef::Data, ty.m_data, Array, e, + this->visit_type( *e.inner ); + DEBUG("Array size " << ty); + if( e.size ) { + MIR_Validate(m_resolve, *e.size.m_mir); + } + ) + else { + ::HIR::Visitor::visit_type(ty); + } + } + + // ------ + // Code-containing items + // ------ + void visit_function(::HIR::ItemPath p, ::HIR::Function& item) override { + auto _ = this->m_resolve.set_item_generics(item.m_params); + if( item.m_code ) { + DEBUG("Function code " << p); + MIR_Validate(m_resolve, *item.m_code.m_mir); + } + } + void visit_static(::HIR::ItemPath p, ::HIR::Static& item) override { + if( item.m_value ) { + DEBUG("`static` value " << p); + MIR_Validate(m_resolve, *item.m_value.m_mir); + } + } + void visit_constant(::HIR::ItemPath p, ::HIR::Constant& item) override { + if( item.m_value ) { + DEBUG("`const` value " << p); + MIR_Validate(m_resolve, *item.m_value.m_mir); + } + } + void visit_enum(::HIR::ItemPath p, ::HIR::Enum& item) override { + auto _ = this->m_resolve.set_item_generics(item.m_params); + for(auto& var : item.m_variants) + { + TU_IFLET(::HIR::Enum::Variant, var.second, Value, e, + MIR_Validate(m_resolve, *e.m_mir); + ) + } + } + + // Boilerplate + void visit_trait(::HIR::ItemPath p, ::HIR::Trait& item) override { + auto _ = this->m_resolve.set_impl_generics(item.m_params); + ::HIR::Visitor::visit_trait(p, item); + } + void visit_type_impl(::HIR::TypeImpl& impl) override { + auto _ = this->m_resolve.set_impl_generics(impl.m_params); + ::HIR::Visitor::visit_type_impl(impl); + } + void visit_trait_impl(const ::HIR::SimplePath& trait_path, ::HIR::TraitImpl& impl) override { + auto _ = this->m_resolve.set_impl_generics(impl.m_params); + ::HIR::Visitor::visit_trait_impl(trait_path, impl); + } + }; +} + +// -------------------------------------------------------------------- + +void MIR_CheckCrate(/*const*/ ::HIR::Crate& crate) +{ + OuterVisitor ov(crate); + ov.visit_crate( crate ); +} diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index ba8bb7a1..9d647540 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -1394,15 +1394,11 @@ namespace { } } void visit_enum(::HIR::ItemPath p, ::HIR::Enum& item) override { - //auto _ = this->m_resolve.set_item_generics(item.m_params); - //auto enum_type = ::HIR::TypeRef(::HIR::CoreType::Isize); + auto _ = this->m_resolve.set_item_generics(item.m_params); for(auto& var : item.m_variants) { TU_IFLET(::HIR::Enum::Variant, var.second, Value, e, - //DEBUG("Enum value " << p << " - " << var.first); - //::std::vector< ::HIR::TypeRef> tmp; - //ExprVisitor_Extract ev(m_resolve, tmp, m_new_trait_impls); - //ev.visit_root(*e); + e.m_mir = LowerMIR(m_resolve, e, {}); ) } } diff --git a/src/mir/main_bindings.hpp b/src/mir/main_bindings.hpp index c2169b31..89301a54 100644 --- a/src/mir/main_bindings.hpp +++ b/src/mir/main_bindings.hpp @@ -14,3 +14,4 @@ class Crate; extern void HIR_GenerateMIR(::HIR::Crate& crate); extern void MIR_Dump(::std::ostream& sink, const ::HIR::Crate& crate); +extern void MIR_CheckCrate(/*const*/ ::HIR::Crate& crate); |