summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-18 13:53:56 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-18 13:53:56 +0800
commit2983a5f8a6b08acc34413a85f7e554ec7ceaad2d (patch)
treee6037516690d64cebdebaf33071da359349fb96d /src
parent8f1a4e56874b0321081161aedfa4da768ffcc65e (diff)
downloadmrust-2983a5f8a6b08acc34413a85f7e554ec7ceaad2d.tar.gz
Enable full optimisation (and fix compiler errors from that)
Diffstat (limited to 'src')
-rw-r--r--src/hir/from_ast.cpp2
-rw-r--r--src/include/rustic.hpp5
-rw-r--r--src/include/tagged_union.hpp8
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;/*