summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp4
-rw-r--r--src/mir/check.cpp102
-rw-r--r--src/mir/from_hir.cpp8
-rw-r--r--src/mir/main_bindings.hpp1
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);