diff options
Diffstat (limited to 'src/macro_rules')
-rw-r--r-- | src/macro_rules/eval.cpp | 9 | ||||
-rw-r--r-- | src/macro_rules/macro_rules.hpp | 1 | ||||
-rw-r--r-- | src/macro_rules/mod.cpp | 2 | ||||
-rw-r--r-- | src/macro_rules/parse.cpp | 14 |
4 files changed, 25 insertions, 1 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index e864537c..fd0f5648 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -654,9 +654,11 @@ bool Macro_TryPatternCap(TokenStream& lex, MacroPatEnt::Type type) case MacroPatEnt::PAT_META: return LOOK_AHEAD(lex) == TOK_IDENT || LOOK_AHEAD(lex) == TOK_INTERPOLATED_META; case MacroPatEnt::PAT_ITEM: - return is_token_item( LOOK_AHEAD(lex) ) || LOOK_AHEAD(lex) == TOK_IDENT; + return is_token_item( LOOK_AHEAD(lex) ) || LOOK_AHEAD(lex) == TOK_IDENT; // Huh? Ident? case MacroPatEnt::PAT_VIS: return is_token_vis( LOOK_AHEAD(lex) ); + case MacroPatEnt::PAT_LIFETIME: + return LOOK_AHEAD(lex) == TOK_LIFETIME; } BUG(lex.point_span(), "Fell through"); } @@ -727,6 +729,9 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type return InterpolatedFragment( TokenTree(lex.getHygiene(), tok) ); case MacroPatEnt::PAT_VIS: return InterpolatedFragment( Parse_Publicity(lex, /*allow_restricted=*/true) ); + case MacroPatEnt::PAT_LIFETIME: + GET_CHECK_TOK(tok, lex, TOK_LIFETIME); + return InterpolatedFragment( TokenTree(lex.getHygiene(), tok) ); } throw ""; } @@ -1950,6 +1955,8 @@ namespace return consume_item(lex); case MacroPatEnt::PAT_VIS: return consume_vis(lex); + case MacroPatEnt::PAT_LIFETIME: + return lex.consume_if(TOK_LIFETIME); } return true; } diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp index 9ec6a6bb..29c4f93d 100644 --- a/src/macro_rules/macro_rules.hpp +++ b/src/macro_rules/macro_rules.hpp @@ -61,6 +61,7 @@ struct MacroPatEnt PAT_META, PAT_ITEM, // :item PAT_VIS, + PAT_LIFETIME, } type; MacroPatEnt(): diff --git a/src/macro_rules/mod.cpp b/src/macro_rules/mod.cpp index 3297a139..04f1577a 100644 --- a/src/macro_rules/mod.cpp +++ b/src/macro_rules/mod.cpp @@ -200,6 +200,7 @@ MacroRulesPtr::~MacroRulesPtr() case MacroPatEnt::PAT_META: os << "meta"; break; case MacroPatEnt::PAT_ITEM: os << "item"; break; case MacroPatEnt::PAT_VIS: os << "vis"; break; + case MacroPatEnt::PAT_LIFETIME: os << "lifetime"; break; } break; } @@ -222,6 +223,7 @@ MacroRulesPtr::~MacroRulesPtr() case MacroPatEnt::PAT_META: os << "PAT_META"; break; case MacroPatEnt::PAT_ITEM: os << "PAT_ITEM"; break; case MacroPatEnt::PAT_VIS: os << "PAT_VIS"; break; + case MacroPatEnt::PAT_LIFETIME: os << "PAT_LIFETIME"; break; } return os; } diff --git a/src/macro_rules/parse.cpp b/src/macro_rules/parse.cpp index e6d9d7ae..8af9bd07 100644 --- a/src/macro_rules/parse.cpp +++ b/src/macro_rules/parse.cpp @@ -84,6 +84,8 @@ public: ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_ITEM) ); else if( /*TARGETVER_1_29 && */ type == "vis" ) // TODO: Should this be selective? ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_VIS) ); + else if( /*TARGETVER_1_29 && */ type == "lifetime" ) // TODO: Should this be selective? + ret.push_back( MacroPatEnt(name, idx, MacroPatEnt::PAT_LIFETIME) ); else ERROR(lex.point_span(), E0000, "Unknown fragment type '" << type << "'"); break; } @@ -443,6 +445,18 @@ bool patterns_are_same(const Span& sp, const MacroPatEnt& left, const MacroPatEn default: ERROR(sp, E0000, "Incompatible macro fragments " << right << " used with " << left); } + case MacroPatEnt::PAT_LIFETIME: + switch(left.type) + { + case MacroPatEnt::PAT_TOKEN: + if( left.tok.type() == TOK_LIFETIME ) + ERROR(sp, E0000, "Incompatible macro fragments"); + return false; + case MacroPatEnt::PAT_LIFETIME: + return true; + default: + ERROR(sp, E0000, "Incompatible macro fragments " << right << " used with " << left); + } } throw ""; } |