summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-30 19:17:35 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-30 19:17:35 +0800
commitd7cd1cfdc413f0a317c399fc31884d7e94674b7b (patch)
tree7d5a06a07490a2b46f4884f9d2b7c3b746727f8b /src
parent49c99b869f9745a29b2081b52307a8451edbca4c (diff)
downloadmrust-d7cd1cfdc413f0a317c399fc31884d7e94674b7b.tar.gz
Expand concat! - Fix a few edge cases
Diffstat (limited to 'src')
-rw-r--r--src/expand/concat.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/expand/concat.cpp b/src/expand/concat.cpp
index 71c7e262..c15be18b 100644
--- a/src/expand/concat.cpp
+++ b/src/expand/concat.cpp
@@ -1,4 +1,9 @@
/*
+ * MRustC - Rust Compiler
+ * - By John Hodge (Mutabah/thePowersGang)
+ *
+ * expand/concat.cpp
+ * - concat! handler
*/
#include <synext.hpp>
#include "../parse/common.hpp"
@@ -20,6 +25,11 @@ class CConcatExpander:
::std::string rv;
do {
+ if( LOOK_AHEAD(lex) == TOK_EOF ) {
+ GET_TOK(tok, lex);
+ break ;
+ }
+
auto v = Parse_Expr0(lex);
DEBUG("concat - v=" << *v);
Expand_BareExpr(crate, mod, v);
@@ -30,11 +40,24 @@ class CConcatExpander:
}
else if( auto* vp = dynamic_cast<AST::ExprNode_Integer*>(v.get()) )
{
+ if( vp->m_datatype == CORETYPE_CHAR ) {
+ rv += Codepoint { static_cast<uint32_t>(vp->m_value) };
+ }
+ else {
+ rv += FMT(vp->m_value);
+ }
+ }
+ else if( auto* vp = dynamic_cast<AST::ExprNode_Float*>(v.get()) )
+ {
rv += FMT(vp->m_value);
}
+ else if( auto* vp = dynamic_cast<AST::ExprNode_Bool*>(v.get()) )
+ {
+ rv += (vp->m_value ? "true" : "false");
+ }
else
{
- ERROR(sp, E0000, "Unexpected expression type");
+ ERROR(sp, E0000, "Unexpected expression type in concat! argument");
}
} while( GET_TOK(tok, lex) == TOK_COMMA );
if( tok.type() != TOK_EOF )