diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-09-02 15:24:40 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-09-02 15:24:40 +0800 |
commit | 8f96a8752fbeaabb6c091185d2098a65e4dd2511 (patch) | |
tree | a1819a5127153b23c29bb4965b86ca42f18250df /src | |
parent | 4398f36c4913966dfb866373bb1db1942b721dd4 (diff) | |
download | mrust-8f96a8752fbeaabb6c091185d2098a65e4dd2511.tar.gz |
Resolve - Fix a minor lookup bug around self:: paths
Diffstat (limited to 'src')
-rw-r--r-- | src/expand/derive.cpp | 2 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 2 | ||||
-rw-r--r-- | src/parse/paths.cpp | 2 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 20 |
4 files changed, 23 insertions, 3 deletions
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index 30adadc1..173e2771 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -804,6 +804,8 @@ public: )); } + // TODO: Compare the discriminants using the `discriminant_value` intrinsic + // - Requires a way of emitting said intrinsic into the AST for(unsigned int a = 0; a < enm.variants().size(); a ++ ) { for(unsigned int b = 0; b < enm.variants().size(); b ++ ) diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp index fff42abe..54e0b12d 100644 --- a/src/hir_typeck/expr_cs.cpp +++ b/src/hir_typeck/expr_cs.cpp @@ -1095,7 +1095,7 @@ namespace { assert(fields_ptr); const ::HIR::t_tuple_fields& fields = *fields_ptr; if( fields.size() != node.m_args.size() ) { - ERROR(node.span(), E0000, "Tuple variant constructor argument count doesn't match type - " << ty); + ERROR(node.span(), E0000, "Tuple variant constructor argument count doesn't match type - " << node.m_path); } const auto& ty_params = node.m_path.m_params.m_types; diff --git a/src/parse/paths.cpp b/src/parse/paths.cpp index 360c630f..59b6b939 100644 --- a/src/parse/paths.cpp +++ b/src/parse/paths.cpp @@ -26,7 +26,7 @@ AST::Path Parse_Path(TokenStream& lex, eParsePathGenericMode generic_mode) case TOK_RWORD_SELF: GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON); - return Parse_Path(lex, false, generic_mode); + return AST::Path(AST::Path::TagSelf(), Parse_PathNodes(lex, generic_mode)); case TOK_RWORD_SUPER: { GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON); diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp index 9b75dd98..f21dc77d 100644 --- a/src/resolve/absolute.cpp +++ b/src/resolve/absolute.cpp @@ -1375,7 +1375,25 @@ void Resolve_Absolute_Path(/*const*/ Context& context, const Span& sp, Context:: ), (Self, DEBUG("- Self"); - TODO(sp, "Resolve_Absolute_Path - Self-relative paths - " << path); + const auto& mp_nodes = context.m_mod.path().nodes(); + // Ignore any leading anon modules + unsigned int start_len = mp_nodes.size(); + while( start_len > 0 && mp_nodes[start_len-1].name()[0] == '#' ) + start_len --; + + // - Create a new path + ::AST::Path np("", {}); + auto& np_nodes = np.nodes(); + np_nodes.reserve( start_len + e.nodes.size() ); + for(unsigned int i = 0; i < start_len; i ++ ) + np_nodes.push_back( mp_nodes[i] ); + for(auto& en : e.nodes) + np_nodes.push_back( mv$(en) ); + + if( !path.is_trivial() ) + Resolve_Absolute_PathNodes(context, sp, np_nodes); + + path = mv$(np); ), (Super, DEBUG("- Super"); |