summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
authorJohn Hodge (bugs) <tpg@mutabah.net>2017-06-04 21:23:24 +0800
committerJohn Hodge (bugs) <tpg@mutabah.net>2017-06-04 21:23:24 +0800
commit83dbb728f62306d2e43b2688dd0f2d320fd5b038 (patch)
treea064267bdf8d0455ed725140abfcbed3e04b2d4a /src/parse
parent0b9fd0014c8f32ecf299dae2ad1811dfb484af46 (diff)
parentf19c75571c48588fb3816e8eb5b96f03474fbdf5 (diff)
downloadmrust-83dbb728f62306d2e43b2688dd0f2d320fd5b038.tar.gz
Merge branch 'master' of https://github.com/thepowersgang/mrustc
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/expr.cpp15
-rw-r--r--src/parse/lex.cpp2
-rw-r--r--src/parse/root.cpp8
3 files changed, 20 insertions, 5 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index bc17ea9e..28729b93 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -999,9 +999,18 @@ ExprNodeP Parse_ExprVal_StructLiteral(TokenStream& lex, AST::Path path)
while( GET_TOK(tok, lex) == TOK_IDENT )
{
auto name = mv$(tok.str());
- GET_CHECK_TOK(tok, lex, TOK_COLON);
- ExprNodeP val = Parse_Stmt(lex);
- items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) );
+
+ if( lex.lookahead(0) != TOK_COLON )
+ {
+ ExprNodeP val = NEWNODE( AST::ExprNode_NamedValue, ::AST::Path(name) );
+ items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) );
+ }
+ else
+ {
+ GET_CHECK_TOK(tok, lex, TOK_COLON);
+ ExprNodeP val = Parse_Stmt(lex);
+ items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) );
+ }
if( GET_TOK(tok,lex) == TOK_BRACE_CLOSE )
break;
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp
index a92753d8..0587e443 100644
--- a/src/parse/lex.cpp
+++ b/src/parse/lex.cpp
@@ -466,11 +466,13 @@ Token Lexer::getTokenInt()
else if(suffix == "i16") num_type = CORETYPE_I16;
else if(suffix == "i32") num_type = CORETYPE_I32;
else if(suffix == "i64") num_type = CORETYPE_I64;
+ else if(suffix == "i128") num_type = CORETYPE_I128;
else if(suffix == "isize") num_type = CORETYPE_INT;
else if(suffix == "u8") num_type = CORETYPE_U8;
else if(suffix == "u16") num_type = CORETYPE_U16;
else if(suffix == "u32") num_type = CORETYPE_U32;
else if(suffix == "u64") num_type = CORETYPE_U64;
+ else if(suffix == "u128") num_type = CORETYPE_U128;
else if(suffix == "usize") num_type = CORETYPE_UINT;
else if(suffix == "f32") num_type = CORETYPE_F32;
else if(suffix == "f64") num_type = CORETYPE_F64;
diff --git a/src/parse/root.cpp b/src/parse/root.cpp
index 3bdd34b1..5f8ed0a3 100644
--- a/src/parse/root.cpp
+++ b/src/parse/root.cpp
@@ -563,7 +563,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items)
else if(tok.type() == TOK_SEMICOLON)
{
// Unit-like struct
- return AST::Struct(mv$(params), ::std::vector<AST::TupleItem>());
+ return AST::Struct(mv$(params));
}
else if(tok.type() == TOK_BRACE_OPEN)
{
@@ -594,7 +594,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items)
}
//if( items.size() == 0 )
// WARNING( , W000, "Use 'struct Name;' instead of 'struct Nam { };' ... ning-nong");
- return AST::Struct(::std::move(params), ::std::move(items));
+ return AST::Struct(mv$(params), mv$(items));
}
else
{
@@ -824,6 +824,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items)
CHECK_TOK(tok, TOK_IDENT);
::std::string name = mv$(tok.str());
+ // Tuple-like variants
if( GET_TOK(tok, lex) == TOK_PAREN_OPEN )
{
::std::vector<TypeRef> types;
@@ -850,6 +851,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items)
GET_TOK(tok, lex);
variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(types)) );
}
+ // Struct-like variants
else if( tok.type() == TOK_BRACE_OPEN )
{
::std::vector<::AST::StructItem> fields;
@@ -880,12 +882,14 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items)
variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(fields)) );
}
+ // Value variants
else if( tok.type() == TOK_EQUAL )
{
auto node = Parse_Expr(lex);
variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(node)) );
GET_TOK(tok, lex);
}
+ // Unit variants
else
{
variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), ::AST::Expr()) );