diff options
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;/* | 
