diff options
| author | John Hodge <tpg@mutabah.net> | 2016-06-11 22:30:53 +0800 | 
|---|---|---|
| committer | John Hodge <tpg@mutabah.net> | 2016-06-11 22:31:16 +0800 | 
| commit | f9e2d4130f6936c302069cab2681bca3c0bb0f55 (patch) | |
| tree | 667a0b0f278584974446fa9324416e8c248addb8 /src | |
| parent | 353109b07cfaeee463b71ab47de8471e3d0280e1 (diff) | |
| download | mrust-f9e2d4130f6936c302069cab2681bca3c0bb0f55.tar.gz | |
HIR Typecheck - Insert i32/f64 defaults
Diffstat (limited to 'src')
| -rw-r--r-- | src/hir_typeck/expr.cpp | 2 | ||||
| -rw-r--r-- | src/hir_typeck/expr.hpp | 2 | ||||
| -rw-r--r-- | src/hir_typeck/expr_context.cpp | 25 | 
3 files changed, 28 insertions, 1 deletions
| diff --git a/src/hir_typeck/expr.cpp b/src/hir_typeck/expr.cpp index a11b5e7e..e6480a18 100644 --- a/src/hir_typeck/expr.cpp +++ b/src/hir_typeck/expr.cpp @@ -1798,7 +1798,7 @@ void Typecheck_Code(typeck::TypecheckContext context, const ::HIR::TypeRef& resu              DEBUG("==== PASS " << count << " ====");              visitor.visit_node_ptr(root_ptr);              context.compact_ivars(); -        } while( context.take_changed() ); +        } while( context.take_changed() || context.apply_defaults() );          DEBUG("==== STOPPED: " << count << " passes ====");      } diff --git a/src/hir_typeck/expr.hpp b/src/hir_typeck/expr.hpp index 18523823..c4e8cdc4 100644 --- a/src/hir_typeck/expr.hpp +++ b/src/hir_typeck/expr.hpp @@ -82,6 +82,8 @@ public:      }      void compact_ivars(); +    /// Apply defaults (i32 or f64), returns true if a default was applied +    bool apply_defaults();      /// Adds a local variable binding (type is mutable so it can be inferred if required)      void add_local(unsigned int index, const ::std::string& name, ::HIR::TypeRef type); diff --git a/src/hir_typeck/expr_context.cpp b/src/hir_typeck/expr_context.cpp index 5edf8b80..0cb67974 100644 --- a/src/hir_typeck/expr_context.cpp +++ b/src/hir_typeck/expr_context.cpp @@ -57,6 +57,31 @@ void typeck::TypecheckContext::compact_ivars()          v.type = this->get_type(v.type).clone();      }  } +bool typeck::TypecheckContext::apply_defaults() +{ +    bool rv = false; +    for(auto& v : m_ivars) +    { +        if( !v.is_alias() ) { +            TU_IFLET(::HIR::TypeRef::Data, v.type->m_data, Infer, e, +                switch(e.ty_class) +                { +                case ::HIR::InferClass::None: +                    break; +                case ::HIR::InferClass::Integer: +                    rv = true; +                    *v.type = ::HIR::TypeRef( ::HIR::CoreType::I32 ); +                    break; +                case ::HIR::InferClass::Float: +                    rv = true; +                    *v.type = ::HIR::TypeRef( ::HIR::CoreType::F64 ); +                    break; +                } +            ) +        } +    } +    return rv; +}  void typeck::TypecheckContext::add_local(unsigned int index, const ::std::string& name, ::HIR::TypeRef type)  { | 
