diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-18 13:53:56 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-18 13:53:56 +0800 |
commit | 2983a5f8a6b08acc34413a85f7e554ec7ceaad2d (patch) | |
tree | e6037516690d64cebdebaf33071da359349fb96d /src | |
parent | 8f1a4e56874b0321081161aedfa4da768ffcc65e (diff) | |
download | mrust-2983a5f8a6b08acc34413a85f7e554ec7ceaad2d.tar.gz |
Enable full optimisation (and fix compiler errors from that)
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/from_ast.cpp | 2 | ||||
-rw-r--r-- | src/include/rustic.hpp | 5 | ||||
-rw-r--r-- | src/include/tagged_union.hpp | 8 |
3 files changed, 10 insertions, 5 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 2c97b550..552a3bcb 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -61,7 +61,7 @@ ::HIR::PatternBinding binding; if( pat.binding() != "" ) { - ::HIR::PatternBinding::Type bt; + ::HIR::PatternBinding::Type bt = ::HIR::PatternBinding::Type::Move; switch(pat.binding_type()) { case ::AST::Pattern::BIND_MOVE: bt = ::HIR::PatternBinding::Type::Move; break; diff --git a/src/include/rustic.hpp b/src/include/rustic.hpp index 3b4a0386..5d768152 100644 --- a/src/include/rustic.hpp +++ b/src/include/rustic.hpp @@ -73,6 +73,9 @@ class option { char m_data[ sizeof(T) ]; bool m_set; + + void* data_ptr() { return m_data; } + const void* data_ptr() const { return m_data; } public: option(T ent): m_set(true) @@ -84,7 +87,7 @@ public: {} ~option() { if( m_set ) { - reinterpret_cast<T*>(m_data)->~T(); + reinterpret_cast<T*>(data_ptr())->~T(); } } diff --git a/src/include/tagged_union.hpp b/src/include/tagged_union.hpp index f247f226..67e5643e 100644 --- a/src/include/tagged_union.hpp +++ b/src/include/tagged_union.hpp @@ -126,9 +126,9 @@ return __name( ::std::move(v) );\ }\ bool is_##__tag() const { return m_tag == TAG_##__tag; } \ - const __type& as_##__tag() const { assert(m_tag == TAG_##__tag); return reinterpret_cast<const __type&>(m_data); } \ - __type& as_##__tag() { assert(m_tag == TAG_##__tag); return reinterpret_cast<__type&>(m_data); } \ - __type unwrap_##__tag() { assert(m_tag == TAG_##__tag); return ::std::move(reinterpret_cast<__type&>(m_data)); } \ + const __type& as_##__tag() const { assert(m_tag == TAG_##__tag); return *reinterpret_cast<const __type*>(this->data_ptr()); } \ + __type& as_##__tag() { assert(m_tag == TAG_##__tag); return *reinterpret_cast<__type*>(this->data_ptr()); } \ + __type unwrap_##__tag() { return ::std::move(this->as_##__tag()); } \ // Define a tagged union constructor #define TU_CONS(__name, name, ...) TU_CONS_I(__name, name, TU_DATANAME(name)) @@ -193,6 +193,8 @@ class _name TU_EXP _inherit { \ */ private:\ Tag m_tag; \ char m_data[MAXS _variants];/* +*/ const void* data_ptr() const { return m_data; } /* +*/ void* data_ptr() { return m_data; } /* */ public:\ _name(): m_tag(TAG_##_def) { new((void*)m_data) TU_DATANAME(_def); }/* */ _name(const _name&) = delete;/* |