diff options
author | John Hodge <tpg@mutabah.net> | 2016-03-07 17:12:27 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-03-07 17:12:27 +0800 |
commit | 8c53ebf221d750a19b0f860584f069b8c3b1733e (patch) | |
tree | 544de7b9c384017b012f892e94061672b6320a5c | |
parent | 30edd863f98df929326f2706c9a2ed32730a225b (diff) | |
download | mrust-8c53ebf221d750a19b0f860584f069b8c3b1733e.tar.gz |
AST - Correctly move item attributes
-rw-r--r-- | src/ast/ast.cpp | 3 | ||||
-rw-r--r-- | src/ast/ast.hpp | 2 | ||||
-rw-r--r-- | src/ast/generics.hpp | 2 | ||||
-rw-r--r-- | src/expand/mod.cpp | 2 | ||||
-rw-r--r-- | src/include/tagged_union.hpp | 42 |
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) \ |