src/compiler/SemanticAnalysis.cpp
changeset 246 f9c4371d59d4
parent 245 9371f058625a
child 247 7721042bdb67
     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  }