summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-09-02 15:24:40 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-09-02 15:24:40 +0800
commit8f96a8752fbeaabb6c091185d2098a65e4dd2511 (patch)
treea1819a5127153b23c29bb4965b86ca42f18250df /src
parent4398f36c4913966dfb866373bb1db1942b721dd4 (diff)
downloadmrust-8f96a8752fbeaabb6c091185d2098a65e4dd2511.tar.gz
Resolve - Fix a minor lookup bug around self:: paths
Diffstat (limited to 'src')
-rw-r--r--src/expand/derive.cpp2
-rw-r--r--src/hir_typeck/expr_cs.cpp2
-rw-r--r--src/parse/paths.cpp2
-rw-r--r--src/resolve/absolute.cpp20
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");