diff -r 9371f058625a -r f9c4371d59d4 src/compiler/SemanticAnalysis.cpp --- a/src/compiler/SemanticAnalysis.cpp Thu Dec 27 20:44:50 2012 -0800 +++ b/src/compiler/SemanticAnalysis.cpp Thu Dec 27 21:07:03 2012 -0800 @@ -744,6 +744,8 @@ } HIR *hir = eval(node->expression()); + if (!hir) + return; if ((hir = coerce(hir, lval->type(), Coerce_Assign)) == NULL) return; @@ -1090,35 +1092,56 @@ void SemanticAnalysis::visitUnaryExpression(UnaryExpression *node) { + HIR *hir = eval(node->expression()); + if (!hir) + return; + switch (node->token()) { - case TOK_LABEL: + case TOK_MINUS: { - assert(node->token() == TOK_LABEL); - HIR *hir = eval(node->expression()); - if (!hir) - return; - - TypeSymbol *sym = node->tag()->sym()->asType(); - if (!sym) { - cc_.reportError(node->pos(), Message_IdentifierIsNotAType, - sym->name()->chars()); + if (hir->type()->isInt32() || hir->type()->isEnum()) { + Local type(zone_, zone_->types()->getPrimitive(PrimitiveType_Int32)); + hir_ = new (pool_) HUnary(node, type, TOK_MINUS, hir); + return; + } + if (hir->type()->isFloat()) { + hir_ = new (pool_) HUnary(node, hir->type(), TOK_MINUS, hir); return; } - if (!IsValidUncheckedType(sym->type())) { - char name[255]; - cc_.reportError(node->pos(), Message_InvalidUncheckedCastTo, - GetTypeName(hir->type(), name, sizeof(name))); - return; - } - if (!IsValidUncheckedType(hir->type())) { - char name[255]; - cc_.reportError(node->pos(), Message_InvalidUncheckedCastFrom, - GetTypeName(hir->type(), name, sizeof(name))); - return; - } + char name[255]; + cc_.reportError(node->pos(), Message_InvalidUnaryType, + "-", + GetTypeName(hir->type(), name, sizeof(name))); + break; + } + + default: + { + assert(node->token() == TOK_LABEL); - break; + TypeSymbol *sym = node->tag()->sym()->asType(); + if (!sym) { + cc_.reportError(node->pos(), Message_IdentifierIsNotAType, + sym->name()->chars()); + return; + } + + if (!IsValidUncheckedType(sym->type())) { + char name[255]; + cc_.reportError(node->pos(), Message_InvalidUncheckedCastTo, + GetTypeName(hir->type(), name, sizeof(name))); + return; + } + if (!IsValidUncheckedType(hir->type())) { + char name[255]; + cc_.reportError(node->pos(), Message_InvalidUncheckedCastFrom, + GetTypeName(hir->type(), name, sizeof(name))); + return; + } + + hir_ = new (pool_) HUnary(node, hir->type(), TOK_LABEL, hir); + break; } } }