summaryrefslogtreecommitdiff
path: root/src/parse/paths.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/paths.cpp')
-rw-r--r--src/parse/paths.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/parse/paths.cpp b/src/parse/paths.cpp
index 26311d83..2a2437ca 100644
--- a/src/parse/paths.cpp
+++ b/src/parse/paths.cpp
@@ -41,6 +41,7 @@ AST::Path Parse_Path(TokenStream& lex, eParsePathGenericMode generic_mode)
case TOK_RWORD_CRATE:
GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
+ return Parse_Path(lex, true, generic_mode);
case TOK_DOUBLE_COLON:
return Parse_Path(lex, true, generic_mode);
@@ -82,7 +83,13 @@ AST::Path Parse_Path(TokenStream& lex, bool is_abs, eParsePathGenericMode generi
Token tok;
if( is_abs )
{
- if( GET_TOK(tok, lex) == TOK_STRING ) {
+ // QUIRK: `::crate::foo` is valid (semi-surprisingly)
+ if( LOOK_AHEAD(lex) == TOK_RWORD_CRATE ) {
+ GET_CHECK_TOK(tok, lex, TOK_RWORD_CRATE);
+ GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
+ return AST::Path("", Parse_PathNodes(lex, generic_mode));
+ }
+ else if( GET_TOK(tok, lex) == TOK_STRING ) {
::std::string cratename = tok.str();
GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
return AST::Path(cratename, Parse_PathNodes(lex, generic_mode));