summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-02-25 14:44:53 +0800
committerJohn Hodge <tpg@mutabah.net>2016-02-25 14:44:53 +0800
commita9eada64ea769fa661920d529964323e3cc1f312 (patch)
tree24031de79e3e7afc78329640f731a66a876b63ec
parentb6aa089ef86e45e3a0f1c81f2f7a4d78765342d0 (diff)
downloadmrust-a9eada64ea769fa661920d529964323e3cc1f312.tar.gz
Handle unsafe fn types with hrls
-rw-r--r--src/parse/types.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/parse/types.cpp b/src/parse/types.cpp
index 22f5acf2..33307dea 100644
--- a/src/parse/types.cpp
+++ b/src/parse/types.cpp
@@ -13,7 +13,7 @@
// === PROTOTYPES ===
TypeRef Parse_Type(TokenStream& lex);
TypeRef Parse_Type_Int(TokenStream& lex);
-TypeRef Parse_Type_Fn(TokenStream& lex);
+TypeRef Parse_Type_Fn(TokenStream& lex, ::std::vector<::std::string> hrls = {});
TypeRef Parse_Type_Path(TokenStream& lex, ::std::vector<::std::string> hrls);
// === CODE ===
@@ -39,18 +39,16 @@ TypeRef Parse_Type_Int(TokenStream& lex)
// '_' = Wildcard (type inferrence variable)
case TOK_UNDERSCORE:
return TypeRef();
+
// 'unsafe' - An unsafe function type
case TOK_RWORD_UNSAFE:
- lex.putback(tok);
- return Parse_Type_Fn(lex);
// 'extern' - A function type with an ABI
case TOK_RWORD_EXTERN:
- lex.putback(tok);
- return Parse_Type_Fn(lex);
// 'fn' - Rust function
case TOK_RWORD_FN:
lex.putback(tok);
return Parse_Type_Fn(lex);
+
// '<' - An associated type cast
case TOK_LT:
case TOK_DOUBLE_LT:
@@ -65,11 +63,14 @@ TypeRef Parse_Type_Int(TokenStream& lex)
hrls.push_back( mv$(tok.str()) );
} while( GET_TOK(tok, lex) == TOK_COMMA );
CHECK_TOK(tok, TOK_GT);
- if( LOOK_AHEAD(lex) == TOK_RWORD_FN || LOOK_AHEAD(lex) == TOK_RWORD_EXTERN ) {
+ switch(LOOK_AHEAD(lex))
+ {
+ case TOK_RWORD_UNSAFE:
+ case TOK_RWORD_EXTERN:
+ case TOK_RWORD_FN:
// TODO: Handle HRLS in fn types
- return Parse_Type_Fn(lex);
- }
- else {
+ return Parse_Type_Fn(lex, hrls);
+ default:
return Parse_Type_Path(lex, hrls);
}
}
@@ -193,8 +194,9 @@ TypeRef Parse_Type_Int(TokenStream& lex)
throw ParseError::BugCheck("Reached end of Parse_Type");
}
-TypeRef Parse_Type_Fn(TokenStream& lex)
+TypeRef Parse_Type_Fn(TokenStream& lex, ::std::vector<::std::string> hrls)
{
+ // TODO: HRLs
TRACE_FUNCTION;
Token tok;