summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-03-07 17:12:27 +0800
committerJohn Hodge <tpg@mutabah.net>2016-03-07 17:12:27 +0800
commit8c53ebf221d750a19b0f860584f069b8c3b1733e (patch)
tree544de7b9c384017b012f892e94061672b6320a5c
parent30edd863f98df929326f2706c9a2ed32730a225b (diff)
downloadmrust-8c53ebf221d750a19b0f860584f069b8c3b1733e.tar.gz
AST - Correctly move item attributes
-rw-r--r--src/ast/ast.cpp3
-rw-r--r--src/ast/ast.hpp2
-rw-r--r--src/ast/generics.hpp2
-rw-r--r--src/expand/mod.cpp2
-rw-r--r--src/include/tagged_union.hpp42
5 files changed, 39 insertions, 12 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index a413c64e..35cab7a2 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -216,6 +216,7 @@ SERIALISE_TYPE_A(Module::, "AST_Module", {
void Module::add_item(bool is_pub, ::std::string name, Item it, MetaItems attrs) {
m_items.push_back( Named<Item>( mv$(name), mv$(it), is_pub ) );
m_items.back().data.attrs = mv$(attrs);
+ DEBUG("Item " << ::AST::Item::tag_to_str( m_items.back().data.tag() ) << " - attrs = " << m_items.back().data.attrs);
}
void Module::add_ext_crate(::std::string ext_name, ::std::string imp_name, MetaItems attrs) {
// TODO: Extern crates can be public
@@ -245,7 +246,7 @@ void Module::add_function(bool is_public, ::std::string name, Function item, Met
}
void Module::add_submod(bool is_public, Module mod, MetaItems attrs) {
auto name = mod.m_name;
- DEBUG("mod.m_name = " << name);
+ DEBUG("mod.m_name = " << name << ", attrs = " << attrs);
this->add_item( is_public, mv$(name), Item::make_Module({mv$(mod)}), mv$(attrs) );
}
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index 93652a9a..c0ab4b2f 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -551,6 +551,8 @@ TAGGED_UNION_EX(Item, (: public Serialisable), None,
Static e;
))
),
+
+ (, attrs(mv$(x.attrs))), (attrs = mv$(x.attrs);),
(
public:
MetaItems attrs;
diff --git a/src/ast/generics.hpp b/src/ast/generics.hpp
index c766fea6..ad205a21 100644
--- a/src/ast/generics.hpp
+++ b/src/ast/generics.hpp
@@ -64,6 +64,8 @@ TAGGED_UNION_EX( GenericBound, (: public Serialisable), Lifetime,
TypeRef replacement;
))
),
+
+ (), (),
(
public:
SERIALISABLE_PROTOTYPES();
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index cb7667f8..5c733e2b 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -108,7 +108,7 @@ void Expand_Mod(bool is_early, ::AST::Crate& crate, ::AST::Path modpath, ::AST::
DEBUG("Items");
for( auto& i : mod.items() )
{
- DEBUG("- " << i.name);
+ DEBUG("- " << i.name << " :: " << i.data.attrs);
::AST::Path path = modpath + i.name;
Expand_Attrs(i.data.attrs, (is_early ? AttrStage::EarlyPre : AttrStage::LatePre), crate, path, mod, i.data);
diff --git a/src/include/tagged_union.hpp b/src/include/tagged_union.hpp
index 045ecd96..d0d6ef7e 100644
--- a/src/include/tagged_union.hpp
+++ b/src/include/tagged_union.hpp
@@ -18,6 +18,7 @@
#define TU_FIRST(a, ...) a
// Argument iteration
+#define _DISP0(n)
#define _DISP1(n, _1) n _1
#define _DISP2(n, _1, _2) n _1 n _2
#define _DISP3(n, v, v2, v3) n v n v2 n v3
@@ -33,6 +34,22 @@
#define _DISP13(n, a1,a2,a3,a4,a5, b1,b2,b3,b4, c1,c2,c3,c4) _DISP5(n, a1,a2,a3,a4,a5) _DISP4(n, b1,b2,b3,b4) _DISP4(n, c1,c2,c3,c4)
#define _DISP14(n, a1,a2,a3,a4,a5, b1,b2,b3,b4,b5, c1,c2,c3,c4) _DISP5(n, a1,a2,a3,a4,a5) _DISP5(n, b1,b2,b3,b4,b5) _DISP4(n, c1,c2,c3,c4)
+#define _DISPO0(n)
+#define _DISPO1(n, _1) n(_1)
+#define _DISPO2(n, _1, _2) n(_1) n(_2)
+#define _DISPO3(n, v, v2, v3) n(v) n(v2) n(v3)
+#define _DISPO4(n, v, v2, v3, v4) n(v) n(v2) n(v3) n(v4)
+#define _DISPO5(n, v, ...) n v _DISPO4(n, __VA_ARGS__)
+#define _DISPO6(n, v, ...) n v _DISPO5(n, __VA_ARGS__)
+#define _DISPO7(n, v, ...) n v _DISPO6(n, __VA_ARGS__)
+#define _DISPO8(n, v, ...) n v _DISPO7(n, __VA_ARGS__)
+#define _DISPO9(n, a1,a2,a3,a4, b1,b2,b3,b4, c1) _DISPO4(n, a1,a2,a3,a4) _DISPO3(n, b1,b2,b3) _DISPO2(n, b4,c1)
+#define _DISPO10(n, a1,a2,a3,a4, b1,b2,b3,b4, c1,c2) _DISPO4(n, a1,a2,a3,a4) _DISPO4(n, b1,b2,b3,b4) _DISPO2(n, c1,c2)
+#define _DISPO11(n, a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3) _DISPO4(n, a1,a2,a3,a4) _DISPO4(n, b1,b2,b3,b4) _DISPO3(n, c1,c2,c3)
+#define _DISPO12(n, a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3,c4) _DISPO4(n, a1,a2,a3,a4) _DISPO4(n, b1,b2,b3,b4) _DISPO4(n, c1,c2,c3,c4)
+#define _DISPO13(n, a1,a2,a3,a4,a5, b1,b2,b3,b4, c1,c2,c3,c4) _DISPO5(n, a1,a2,a3,a4,a5) _DISPO4(n, b1,b2,b3,b4) _DISPO4(n, c1,c2,c3,c4)
+#define _DISPO14(n, a1,a2,a3,a4,a5, b1,b2,b3,b4,b5, c1,c2,c3,c4) _DISPO5(n, a1,a2,a3,a4,a5) _DISPO5(n, b1,b2,b3,b4,b5) _DISPO4(n, c1,c2,c3,c4)
+
#define TU_DISPA(n, a) n a
#define TU_DISPA1(n, a, _1) TU_DISPA(n, (TU_EXP a, TU_EXP _1))
#define TU_DISPA2(n, a, _1, _2) TU_DISPA(n, (TU_EXP a, TU_EXP _1))/*
@@ -56,10 +73,10 @@
// Macro to obtain a numbered macro for argument counts
// - Raw variant
#define TU_GM_I(SUF,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,COUNT,...) SUF##COUNT
-#define TU_GM(SUF,...) TU_GM_I(SUF,__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1)
+#define TU_GM(SUF,...) TU_GM_I(SUF, __VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
// - _DISP based variant (for iteration)
-#define TU_GMX(...) TU_GM(_DISP,__VA_ARGS__)
-#define TU_GMA(...) TU_GM(TU_DISPA,__VA_ARGS__)
+#define TU_GMX(...) TU_GM(_DISP, __VA_ARGS__)
+#define TU_GMA(...) TU_GM(TU_DISPA, __VA_ARGS__)
// Sizes of structures
#define TU_SO(name, _) sizeof(TU_DATANAME(name))
@@ -146,6 +163,11 @@
#define TU_TOSTR_CASES(...) TU_GMX(__VA_ARGS__)(TU_TOSTR_CASE ,__VA_ARGS__)
#define TU_FROMSTR_CASES(...) TU_GMX(__VA_ARGS__)(TU_FROMSTR_CASE,__VA_ARGS__)
+#define TU_MC_FIELD(_field) ,_field(::std::move(x._field))
+#define TU_MC_FIELDS(...) TU_GM(_DISPO ,## __VA_ARGS__)(TU_MC_FIELD ,## __VA_ARGS__)
+#define TU_MA_FIELD(_field) _field = ::std::move(x._field);
+#define TU_MA_FIELDS(...) TU_GM(_DISPO ,## __VA_ARGS__)(TU_MA_FIELD ,## __VA_ARGS__)
+
/**
* Define a new tagged union
*
@@ -159,8 +181,8 @@
* );
* ```
*/
-#define TAGGED_UNION(_name, _def, ...) TAGGED_UNION_EX(_name, (), _def, (__VA_ARGS__), ())
-#define TAGGED_UNION_EX(_name, _inherit, _def, _variants, _extra) \
+#define TAGGED_UNION(_name, _def, ...) TAGGED_UNION_EX(_name, (), _def, (__VA_ARGS__), (), (), ())
+#define TAGGED_UNION_EX(_name, _inherit, _def, _variants, _extra_move, _extra_assign, _extra) \
class _name TU_EXP _inherit { \
typedef _name self_t;/*
*/ TU_TYPEDEFS _variants/*
@@ -172,11 +194,11 @@ class _name TU_EXP _inherit { \
Tag m_tag; \
char m_data[MAXS _variants];/*
*/ public:\
- _name(): m_tag(TAG_##_def) { new((void*)m_data) TU_DATANAME(_def); }\
- _name(const _name&) = delete; \
- _name(_name&& x) noexcept: m_tag(x.m_tag) { switch(m_tag) { TU_MOVE_CASES _variants } } \
- _name& operator =(_name&& x) { this->~_name(); m_tag = x.m_tag; switch(m_tag) { TU_MOVE_CASES _variants }; return *this; } \
- ~_name() { switch(m_tag) { TU_DEST_CASES _variants } } \
+ _name(): m_tag(TAG_##_def) { new((void*)m_data) TU_DATANAME(_def); }/*
+*/ _name(const _name&) = delete;/*
+*/ _name(_name&& x) noexcept: m_tag(x.m_tag) TU_EXP _extra_move { switch(m_tag) { TU_MOVE_CASES _variants } }/*
+*/ _name& operator =(_name&& x) { this->~_name(); m_tag = x.m_tag; TU_EXP _extra_assign switch(m_tag) { TU_MOVE_CASES _variants }; return *this; }/*
+*/ ~_name() { switch(m_tag) { TU_DEST_CASES _variants } } \
\
Tag tag() const { return m_tag; }\
TU_CONSS(_name, TU_EXP _variants) \