1.1 --- a/src/compiler/SemanticAnalysis.cpp Thu Dec 27 20:44:50 2012 -0800
1.2 +++ b/src/compiler/SemanticAnalysis.cpp Thu Dec 27 21:07:03 2012 -0800
1.3 @@ -744,6 +744,8 @@
1.4 }
1.5
1.6 HIR *hir = eval(node->expression());
1.7 + if (!hir)
1.8 + return;
1.9 if ((hir = coerce(hir, lval->type(), Coerce_Assign)) == NULL)
1.10 return;
1.11
1.12 @@ -1090,35 +1092,56 @@
1.13 void
1.14 SemanticAnalysis::visitUnaryExpression(UnaryExpression *node)
1.15 {
1.16 + HIR *hir = eval(node->expression());
1.17 + if (!hir)
1.18 + return;
1.19 +
1.20 switch (node->token()) {
1.21 - case TOK_LABEL:
1.22 + case TOK_MINUS:
1.23 {
1.24 - assert(node->token() == TOK_LABEL);
1.25 - HIR *hir = eval(node->expression());
1.26 - if (!hir)
1.27 - return;
1.28 -
1.29 - TypeSymbol *sym = node->tag()->sym()->asType();
1.30 - if (!sym) {
1.31 - cc_.reportError(node->pos(), Message_IdentifierIsNotAType,
1.32 - sym->name()->chars());
1.33 + if (hir->type()->isInt32() || hir->type()->isEnum()) {
1.34 + Local<Type> type(zone_, zone_->types()->getPrimitive(PrimitiveType_Int32));
1.35 + hir_ = new (pool_) HUnary(node, type, TOK_MINUS, hir);
1.36 + return;
1.37 + }
1.38 + if (hir->type()->isFloat()) {
1.39 + hir_ = new (pool_) HUnary(node, hir->type(), TOK_MINUS, hir);
1.40 return;
1.41 }
1.42
1.43 - if (!IsValidUncheckedType(sym->type())) {
1.44 - char name[255];
1.45 - cc_.reportError(node->pos(), Message_InvalidUncheckedCastTo,
1.46 - GetTypeName(hir->type(), name, sizeof(name)));
1.47 - return;
1.48 - }
1.49 - if (!IsValidUncheckedType(hir->type())) {
1.50 - char name[255];
1.51 - cc_.reportError(node->pos(), Message_InvalidUncheckedCastFrom,
1.52 - GetTypeName(hir->type(), name, sizeof(name)));
1.53 - return;
1.54 - }
1.55 + char name[255];
1.56 + cc_.reportError(node->pos(), Message_InvalidUnaryType,
1.57 + "-",
1.58 + GetTypeName(hir->type(), name, sizeof(name)));
1.59 + break;
1.60 + }
1.61 +
1.62 + default:
1.63 + {
1.64 + assert(node->token() == TOK_LABEL);
1.65
1.66 - break;
1.67 + TypeSymbol *sym = node->tag()->sym()->asType();
1.68 + if (!sym) {
1.69 + cc_.reportError(node->pos(), Message_IdentifierIsNotAType,
1.70 + sym->name()->chars());
1.71 + return;
1.72 + }
1.73 +
1.74 + if (!IsValidUncheckedType(sym->type())) {
1.75 + char name[255];
1.76 + cc_.reportError(node->pos(), Message_InvalidUncheckedCastTo,
1.77 + GetTypeName(hir->type(), name, sizeof(name)));
1.78 + return;
1.79 + }
1.80 + if (!IsValidUncheckedType(hir->type())) {
1.81 + char name[255];
1.82 + cc_.reportError(node->pos(), Message_InvalidUncheckedCastFrom,
1.83 + GetTypeName(hir->type(), name, sizeof(name)));
1.84 + return;
1.85 + }
1.86 +
1.87 + hir_ = new (pool_) HUnary(node, hir->type(), TOK_LABEL, hir);
1.88 + break;
1.89 }
1.90 }
1.91 }