Added AMBuild support.
1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of JITCraft.
7 * JITCraft is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * JITCraft. If not, see http://www.gnu.org/licenses/.
19 #include "SemanticAnalysis.h"
22 #include "TypeManager.h"
24 #include "NameBinding.h"
31 IsPrimitiveType(Type *type, PrimitiveType primitive)
36 if (!type->isPrimitive())
39 return primitive == type->primitive();
43 EvaluateBinaryOperation(TokenKind kind, const BoxedPrimitive &left, const BoxedPrimitive &right,
48 *out = BoxedPrimitive::Int(left.toInt() + right.toInt());
52 *out = BoxedPrimitive::Int(left.toInt() << right.toInt());
61 EvaluateForConstant(Expression *expression, BoxedPrimitive *out)
63 switch (expression->kind()) {
64 case AstNode::kBinaryExpression:
68 BinaryExpression *b = expression->toBinaryExpression();
69 if (!EvaluateForConstant(b->left(), &left) ||
70 !EvaluateForConstant(b->right(), &right))
74 return EvaluateBinaryOperation(b->token(), left, right, out);
77 case AstNode::kNameProxy:
79 NameProxy *proxy = expression->toNameProxy();
80 if (proxy->binding()->kind() != BoundName::CONSTANT)
83 NamedConstant *c = proxy->binding()->toNamedConstant();
84 if (!IsPrimitiveType(c->type(), PrimitiveType_Int32))
91 case AstNode::kIntegerLiteral:
92 *out = BoxedPrimitive::Int(expression->toIntegerLiteral()->value());
100 SemanticAnalysis::SemanticAnalysis(Zone *zone, CompileContext &cc, ParseTree *tree)
110 SemanticAnalysis::analyze()
115 scope_ = tree_->scope();
117 for (size_t i = 0; i < tree_->statements()->length(); i++) {
118 Statement *statement = tree_->statements()->at(i);
119 if (statement->isFunctionStatement()) {
120 FunctionStatement *funstmt = statement->toFunctionStatement();
121 if (!preanalyze(funstmt))
126 for (size_t i = 0; i < tree_->statements()->length(); i++) {
127 Statement *statement = tree_->statements()->at(i);
128 statement->accept(this);
131 return !cc_.failures();
135 SemanticAnalysis::visitAndApplyType(Expression *expression)
137 expression->accept(this);
138 return expression->type();
142 SemanticAnalysis::visitForLoad(Expression *expression)
144 Local<Type> type(zone_, visitAndApplyType(expression));
148 if (type->isReference()) {
149 expression->setType(type->contained());
150 } else if (expression->isIndexExpression()) {
152 expression->setType(type->contained());
153 } else if (expression->isCallExpression()) {
154 if (type->isVoid()) {
155 CallExpression *call = expression->toCallExpression();
156 cc_.reportError(call->callee()->pos(), Message_FunctionDoesNotReturnValue);
161 return expression->type();
164 // :TODO: this leaks an interior pointer.
165 static inline const char *
166 GetTypeName(Type *type)
170 if (type->isFunction())
172 if (type->isReference())
173 type = type->contained();
175 return type->tag()->chars();
180 SemanticAnalysis::unaryTypeError(AstNode *node, TokenKind token, Handle<Type> type)
182 const char *op = TokenNames[token];
183 const char *name = GetTypeName(type);
185 cc_.reportError(node->pos(), Message_UnaryTypeError, op, name);
189 SemanticAnalysis::binaryTypeError(AstNode *node, TokenKind token, Handle<Type> left, Handle<Type> right)
191 const char *op = TokenNames[token];
192 const char *leftName = GetTypeName(left);
193 const char *rightName = GetTypeName(right);
195 cc_.reportError(node->pos(), Message_BinaryTypeError, op, leftName, rightName);
199 SemanticAnalysis::typeCheckBinary(AstNode *node, TokenKind token, Handle<Type> left, Handle<Type> right)
201 if ((token >= TOK_PLUS && token <= TOK_SLASH) ||
202 (token >= TOK_ASSIGN_ADD && token <= TOK_ASSIGN_DIV))
204 // If either side is a float, the other side must be a float or int.
205 if (left->isFloat() || right->isFloat()) {
206 Type *floatType = left->isFloat() ? left : right;
207 Type *other = left->isFloat() ? right : left;
208 if (other->isFloat() || (other->isInt32() && !other->tag()))
213 if (token == TOK_OR || token == TOK_AND) {
214 if (!canTest(node, left) || !canTest(node, right))
216 return zone_->types()->getPrimitive(PrimitiveType_Int32);
219 if (token >= TOK_EQUALS && token <= TOK_GE) {
220 if ((left->isFloat() || (left->isInt32() && !left->tag())) &&
221 (right->isFloat() || (right->isInt32() && !right->tag())))
223 return zone_->types()->getPrimitive(PrimitiveType_Int32);
225 binaryTypeError(node, token, left, right);
229 if ((!left->isInt32() || left->tag()) ||
230 (!right->isInt32() || right->tag()))
232 binaryTypeError(node, token, left, right);
240 SemanticAnalysis::canTest(AstNode *node, Handle<Type> type)
242 if (type->isArray() || (type->isInt32() && type->tag())) {
243 cc_.reportError(node->pos(), Message_ArrayIsNotBoolean);
250 SemanticAnalysis::visitForLValue(Expression *expression)
252 if (expression->isIndexExpression()) {
253 Type *type = visitAndApplyType(expression);
257 if (type->isConst()) {
258 cc_.reportError(expression->pos(), Message_ReferenceIsConstant);
262 return type->contained();
265 if (!expression->isNameProxy()) {
266 cc_.reportError(expression->pos(), Message_ExpectedLValue);
270 NameProxy *proxy = expression->toNameProxy();
271 if (!proxy->binding()->kind() == BoundName::VARIABLE) {
272 cc_.reportError(expression->pos(), Message_ExpectedLValue);
276 Variable *var = proxy->binding()->toVariable();
280 if (var->type()->isReference()) {
281 if (var->type()->isConst()) {
282 cc_.reportError(expression->pos(), Message_ReferenceIsConstant);
285 return var->type()->contained();
290 SemanticAnalysis::ControlStatus
291 SemanticAnalysis::visitForControl(Statement *statement)
293 ControlScope scope(&control_);
294 statement->accept(this);
295 return scope.status();
299 SemanticAnalysis::visit(NameProxy *name)
301 name->setType(name->binding()->type());
305 SemanticAnalysis::visit(Assignment *node)
307 Local<Type> exprType(zone_, visitForLoad(node->expression()));
311 Local<Type> type(zone_, visitForLValue(node->lvalue()));
315 if (node->token() != TOK_ASSIGN) {
316 if (!typeCheckBinary(node, node->token(), type, exprType))
320 if (!typeCheckAssignment(node, exprType, type, true))
327 SemanticAnalysis::visit(IncDecExpression *node)
329 Local<Type> type(zone_, visitForLValue(node->expression()));
333 assert(!type->isReference());
335 if ((!type->isInt32() || (type->isInt32() && type->tag())) && !type->isFloat()) {
336 unaryTypeError(node, node->token(), type);
344 SemanticAnalysis::visit(UnaryExpression *node)
346 Local<Type> type(zone_, visitForLoad(node->expression()));
350 switch (node->token())
353 if (!canTest(node->expression(), type))
355 type = zone_->types()->getPrimitive(PrimitiveType_Int32);
362 if (!type->isFloat() && (!type->isInt32() || type->tag())) {
363 unaryTypeError(node, node->token(), type);
370 assert(node->token() == TOK_TILDE);
371 if (!type->isInt32() || type->tag()) {
372 unaryTypeError(node, node->token(), type);
381 SemanticAnalysis::visit(TernaryExpression *node)
383 Local<Type> type(zone_, visitForLoad(node->condition()));
387 if (!canTest(node->condition(), type))
390 Local<Type> left(zone_, visitForLoad(node->left()));
391 Local<Type> right(zone_, visitForLoad(node->right()));
396 binaryTypeError(node, TOK_QMARK, left, right);
402 SemanticAnalysis::visit(BinaryExpression *node)
404 Local<Type> left(zone_, visitForLoad(node->left()));
405 Local<Type> right(zone_, visitForLoad(node->right()));
409 Local<Type> result(zone_, typeCheckBinary(node, node->token(), left, right));
413 node->setType(result);
417 SemanticAnalysis::visit(ReturnStatement *node)
419 // Set this early, so if we error we don't get more errors.
420 control_->returns(Returns_Always);
422 if (!node->expression()) {
423 if (!function_->returnType()->isVoid())
424 cc_.reportError(node->pos(), Message_NotAllPathsReturnValue);
428 Local<Type> type(zone_, visitForLoad(node->expression()));
432 Local<Type> returnType(zone_, function_->returnType());
433 if (!typeCheckAssignment(node, type, returnType, true))
438 SemanticAnalysis::visit(ForStatement *node)
440 LoopScope loop(&loop_);
443 scope_ = node->scope();
445 if (node->initialization())
446 node->initialization()->accept(this);
448 if (node->condition()) {
449 Local<Type> type(zone_, visitForLoad(node->condition()));
450 if (!type || !canTest(node->condition(), type)) {
456 node->update()->accept(this);
458 ControlStatus status = visitForControl(node->body());
460 // If there is a condition, we treat this like a while loop. Otherwise,
461 // join point is only reachable if the loop contains a break. The
462 // termination status doesn't tell us anything yet.
463 if (node->condition() || loop.breaks())
464 control_->merge(status, ControlStatus(false, Returns_Never));
466 control_->terminate(status.returns());
469 scope_ = scope_->enclosing();
473 SemanticAnalysis::visit(WhileStatement *node)
475 LoopScope loop(&loop_);
477 Local<Type> type(zone_, visitForLoad(node->condition()));
478 if (!type || !canTest(node->condition(), type)) {
482 ControlStatus status = visitForControl(node->body());
484 // Detect loops that will always have a fork in the control-flow graph.
485 // This will be a |while| loop, or a |do-while| loop whose body does
488 // For now, we treat these as an |if| regardless of the direction the
489 // branch can take. That means the control-flow is always conditional.
490 if (node->token() == TOK_WHILE ||
491 !status.terminates() ||
494 control_->merge(status, ControlStatus(false, Returns_Never));
496 // At this point, we've got a do-while loop with a |return| or
497 // |continue|, meaning that the rest of the block is unreachable.
498 control_->terminate(status.returns());
503 SemanticAnalysis::visit(BlockStatement *node)
506 scope_ = node->scope();
507 for (size_t i = 0; i < node->statements()->length(); i++) {
508 Statement *statement = node->statements()->at(i);
509 statement->accept(this);
512 scope_ = scope_->enclosing();
516 SemanticAnalysis::visit(VariableDeclaration *node)
518 Local<String> tag(zone_, node->tag());
519 Local<Type> type(zone_, zone_->types()->getPrimitiveForTag(tag));
523 if (node->postDimensions()) {
524 Local<Type> init(zone_);
525 if (node->initialization()) {
526 if ((init = visitForLoad(node->initialization())) == NULL)
530 if (node->postDimensions()->length() > Type::MAX_UNSAFE_ARRAY_DEPTH) {
531 cc_.reportError(node->pos(), Message_MaximumArrayDepth);
535 // If we have an initializer, make sure it's the same type.
536 if (init && node->postDimensions()->length() != init->levels()) {
537 cc_.reportError(node->pos(), Message_ArrayInitializerDepth);
541 Local<Type> check(zone_, init);
542 for (size_t i = node->postDimensions()->length() - 1; i < node->postDimensions()->length(); i--) {
543 Expression *expr = node->postDimensions()->at(i);
547 Local<Type> exprType(zone_, visitForLoad(expr));
551 if (!IsPrimitiveType(exprType, PrimitiveType_Int32)) {
552 cc_.reportError(expr->pos(), Message_ArrayDimensionNotInteger);
557 if (EvaluateForConstant(expr, &box) && box.type() == PrimitiveType_Int32) {
560 cc_.reportError(expr->pos(), Message_BadArraySize);
563 if (size >= INT_MAX / sizeof(int)) {
564 cc_.reportError(expr->pos(), Message_ArraySizeTooBig);
569 if (check->elements() == -1) {
570 cc_.reportError(expr->pos(), Message_ArraySizeCannotBeDetermined);
574 if (check->isCharArray()) {
575 if (check->elements() > size) {
576 cc_.reportError(node->pos(), Message_ArrayAssignmentTooBig);
579 } else if (check->elements() != size) {
580 cc_.reportError(node->pos(), Message_ArrayDimensionSizeMismatch, unsigned(i));
586 cc_.reportError(node->pos(), Message_DynamicArrayHasInitializer);
590 // here until we get dynamic array support.
591 cc_.reportError(expr->pos(), Message_ArrayDimensionNotInteger);
595 // Infer the size from the initializer.
597 cc_.reportError(node->pos(), Message_ArraySizeNotSpecified);
600 if (init->elements() == -1) {
601 cc_.reportError(node->pos(), Message_ArraySizeCannotBeDetermined);
604 size = init->elements();
607 type = zone_->types()->unsafeArray(type, size, false);
612 check = check->contained();
615 // If this variable is stack allocated, we could use the LIFO heap
616 // to allocate it. If that's the case, make sure to reserve a slot
617 // so we can unwind the LIFO heap at the end of this scope.
618 if (!node->variable()->needsHeapAllocation())
619 scope_->setUsesLifoHeap();
621 if (node->initialization()) {
622 Local<Type> right(zone_, visitForLoad(node->initialization()));
625 if (!typeCheckAssignment(node, type, right, true))
628 if (type->primitive() == PrimitiveType_Char) {
629 cc_.reportError(node->pos(), Message_CannotDeclareStringCell);
634 node->variable()->setType(type);
638 SemanticAnalysis::visit(IntegerLiteral *node)
640 node->setType(zone_->types()->getPrimitive(PrimitiveType_Int32));
644 SemanticAnalysis::visit(ExpressionStatement *node)
646 visitAndApplyType(node->expression());
650 SemanticAnalysis::preanalyze(FunctionStatement *node)
652 Local<FixedArray> args(zone_, FixedArray::New(zone_, node->parameters()->length(), Heap::Tenure_Old));
656 // Apply types to arguments.
657 for (size_t i = 0; i < node->parameters()->length(); i++) {
658 Parameter *parameter = node->parameters()->at(i);
660 Local<String> tag(zone_, parameter->tag());
661 Local<Type> type(zone_, zone_->types()->getPrimitiveForTag(tag));
665 if (parameter->reference()) {
666 if (parameter->dimensions()) {
667 cc_.reportError(parameter->variable()->pos(), Message_ArrayCantBeReference);
671 type = zone_->types()->getReference(type, parameter->isConst());
674 } else if (parameter->dimensions()) {
675 if (parameter->dimensions()->length() > Type::MAX_UNSAFE_ARRAY_DEPTH) {
676 cc_.reportError(parameter->variable()->pos(), Message_MaximumArrayDepth);
680 if (node->fun()->isNative() && parameter->dimensions()->length() > 1) {
681 cc_.reportError(parameter->variable()->pos(), Message_MultiArrayInNative);
685 for (size_t i = parameter->dimensions()->length() - 1;
686 i < parameter->dimensions()->length();
689 int size = Type::UNKNOWN_SIZE;
690 if (Expression *expr = parameter->dimensions()->at(i)) {
692 if (!EvaluateForConstant(expr, &box)) {
693 cc_.reportError(expr->pos(), Message_ArraySizeMustBeConstant);
699 type = zone_->types()->unsafeArray(type, size, parameter->isConst());
705 if ((type->isPrimitive() && type->primitive() == PrimitiveType_Char) ||
706 (type->isReference() && type->contained()->primitive() == PrimitiveType_Char))
708 cc_.reportError(node->pos(), Message_CannotDeclareStringCell);
712 args->set(zone_, i, type);
713 parameter->variable()->setType(type);
716 Local<Type> returnType(zone_);
717 if (node->hasExplicitReturn() || node->fun()->isNative())
718 returnType = zone_->types()->getPrimitive(PrimitiveType_Int32);
720 returnType = zone_->types()->getVoid();
724 Local<Type> funtype(zone_);
725 if (node->fun()->isNative())
726 funtype = zone_->types()->newNative(returnType, args, node->fun()->isNativeVariadic());
728 funtype = zone_->types()->newFunction(returnType, args);
732 // If the function already has a type, it was forward declared before, and
733 // now this is our chance to type check the second declaration.
734 if (node->fun()->type()) {
735 Local<Type> forward(zone_, node->fun()->type());
736 if (!Type::Compare(funtype, forward)) {
737 cc_.reportError(node->pos(), Message_ForwardDeclareMismatches);
740 node->fun()->setForwardType(forward);
743 node->fun()->setType(funtype);
749 SemanticAnalysis::visit(FunctionStatement *node)
751 function_ = node->fun()->type();
752 scope_ = node->scope();
754 ControlScope control(&control_);
756 node->body()->accept(this);
758 ControlStatus status = control.status();
759 if (status.returns() == Returns_Sometimes) {
760 cc_.reportError(node->pos(), Message_NotAllPathsReturnValue);
761 } else if (status.returns() == Returns_Never) {
762 if (!function_->returnType()->isVoid())
763 cc_.reportError(node->pos(), Message_MissingReturnValue);
772 SemanticAnalysis::typeCheckArrayAssignment(AstNode *node, Handle<Type> argGiven, Handle<Type> argActual, bool forAssign)
774 Local<Type> actual(zone_, argActual);
775 Local<Type> given(zone_, argGiven);
777 if (!given->isArray()) {
778 cc_.reportError(node->pos(), Message_ExpectedArray);
781 if (given->levels() != actual->levels()) {
782 cc_.reportError(node->pos(), Message_ArrayDimensionsMismatch);
787 while (given->isArray()) {
788 if (actual->elements() != -1) {
790 if (given->elements() == -1 || actual->elements() == -1) {
791 cc_.reportError(node->pos(), Message_ArraySizeNotKnown);
795 if (actual->isCharArray()) {
796 // String assignment can have a truncated |given|.
797 if (given->elements() > actual->elements()) {
798 cc_.reportError(node->pos(), Message_ArrayAssignmentTooBig);
802 if (given->elements() != actual->elements()) {
803 cc_.reportError(node->pos(), Message_ArrayDimensionSizeMismatch, level);
808 if (actual->elements() != -1 && given->elements() != actual->elements()) {
809 cc_.reportError(node->pos(), Message_ArrayDimensionSizeMismatch, level);
814 given = given->contained();
815 actual = actual->contained();
818 if (given->primitive() != actual->primitive()) {
819 // :TODO: leaks an interior pointer.
820 const char *givenTag = given->tag() ? given->tag()->chars() : "_";
821 const char *actualTag = given->tag() ? given->tag()->chars() : "_";
822 cc_.reportError(node->pos(), Message_TagMismatch, actualTag, givenTag);
830 SemanticAnalysis::typeCheckAssignment(AstNode *node, Handle<Type> argGiven, Handle<Type> argActual, bool forAssign)
832 Local<Type> actual(zone_, argActual);
833 Local<Type> given(zone_, argGiven);
835 if (actual->isArray())
836 return typeCheckArrayAssignment(node, given, actual, forAssign);
838 if (given->isArray()) {
839 cc_.reportError(node->pos(), Message_CannotAssignArrayToScalar);
843 // The given type may not have been dereferenced.
844 if (given->isReference())
845 given = given->contained();
846 if (actual->isReference())
847 actual = actual->contained();
849 if (!given->isPrimitive() || !actual->isPrimitive()) {
850 cc_.reportError(node->pos(), Message_UnsupportedType);
854 if (given->primitive() != actual->primitive()) {
855 // :TODO: leaks an interior pointer
856 const char *givenTag = given->tag() ? given->tag()->chars() : "_";
857 const char *actualTag = actual->tag() ? actual->tag()->chars() : "_";
858 cc_.reportError(node->pos(), Message_TagMismatch, actualTag, givenTag);
866 SemanticAnalysis::typeCheckParameter(AstNode *node, Handle<Type> given, Handle<Type> actual)
868 return typeCheckAssignment(node, given, actual, false);
872 SemanticAnalysis::visit(CallExpression *node)
874 Local<Type> type(zone_, visitForLoad(node->callee()));
878 if (!type->isFunction()) {
879 cc_.reportError(node->pos(), Message_CalleeNotFunction);
882 if (node->arguments()->length() != type->parameters()->length()) {
883 if (!type->isNative() ||
884 !type->isNativeVariadic() ||
885 node->arguments()->length() < type->parameters()->length())
887 cc_.reportError(node->pos(), Message_ArgumentCountMismatch);
892 // Currently, only calls from a NameProxy are possible.
893 NamedFunction *fun = node->callee()->toNameProxy()->binding()->toNamedFunction();
894 if (fun->isForward()) {
895 cc_.reportError(node->pos(), Message_ForwardNotImplemented, fun->name()->chars());
899 for (unsigned i = 0; i < node->arguments()->length(); i++) {
900 // Note: we don't compute references unless the callee needs a
902 Expression *expression = node->arguments()->at(i);
903 Local<Type> given(zone_, visitAndApplyType(expression));
907 // Since we skip a load, check for a call expression that returns void.
908 if (given->isVoid()) {
909 assert(expression->isCallExpression());
910 CallExpression *call = expression->toCallExpression();
911 cc_.reportError(call->callee()->pos(), Message_FunctionDoesNotReturnValue);
915 // If it's an IndexExpression, we special case the ability to compute
917 if (expression->isIndexExpression())
918 given = given->contained();
920 bool mustComputeReference;
921 if (i >= type->parameters()->length()) {
922 // Special handling for natives. Arguments past the formal must
923 // always have references computed. However, arrays are already
924 // references for natives.
925 assert(type->isNative() && type->isNativeVariadic());
926 mustComputeReference = !given->isReference() && !given->isArray();
928 Local<Type> actual(zone_, type->parameterAt(i));
929 if (!typeCheckParameter(expression, given, actual))
931 mustComputeReference = actual->isReference() && !given->isReference();
934 // If the actual is a reference, and the given is not, we'll need to
935 // compute a reference, which may be allocated on the stack.
936 if (mustComputeReference)
937 scope_->setUsesLifoHeap();
940 node->setType(fun->type()->returnType());
944 SemanticAnalysis::ControlScope::merge(const ControlStatus &left, const ControlStatus &right)
946 // If both sides terminate in a return, we consider this a return as well.
947 if (left.returns() == Returns_Always && right.returns() == Returns_Always) {
948 terminate(Returns_Always);
952 ReturnStatus status = (left.returns() == Returns_Never && right.returns() == Returns_Never)
956 if (left.terminates() && right.terminates())
963 SemanticAnalysis::visit(IfStatement *node)
965 Local<Type> type(zone_, visitForLoad(node->condition()));
969 if (!canTest(node, type))
972 ControlStatus trueBranch = visitForControl(node->ifTrue());
973 ControlStatus falseBranch = ControlStatus(false, Returns_Never);
976 falseBranch = visitForControl(node->ifFalse());
978 control_->merge(trueBranch, falseBranch);
982 SemanticAnalysis::visit(IndexExpression *node)
984 Local<Type> left(zone_, visitForLoad(node->left()));
985 Local<Type> right(zone_, visitForLoad(node->right()));
990 if (!right->isInt32()) {
991 cc_.reportError(node->right()->pos(), Message_IndexMustBeInteger);
994 if (!left->isArray()) {
995 cc_.reportError(node->left()->pos(), Message_IndexBaseMustBeArray);
1002 SemanticAnalysis::visit(EnumStatement *node)
1004 // Forbid the blessed types.
1005 Local<String> tag(zone_, node->name());
1006 if (!strcmp(tag->chars(), "Float") ||
1007 !strcmp(tag->chars(), "String") ||
1008 !strcmp(tag->chars(), "any") ||
1009 !strcmp(tag->chars(), "bool"))
1011 cc_.reportError(node->pos(), Message_InvalidEnumName);
1015 Local<Type> type(zone_, zone_->types()->getPrimitiveForTag(tag));
1020 for (size_t i = 0; i < node->entries()->length(); i++) {
1021 EnumStatement::Entry &entry = node->entries()->at(i);
1023 BoxedPrimitive box = BoxedPrimitive::Int(value);
1025 entry.expr->accept(this);
1026 if (!EvaluateForConstant(entry.expr, &box)) {
1027 cc_.reportError(entry.expr->pos(), Message_EnumFieldNotConstant);
1031 assert(box.type() == PrimitiveType_Int32);
1032 value = box.toInt();
1035 entry.name->set(type, box);
1041 SemanticAnalysis::visit(StringLiteral *node)
1043 Local<Type> type(zone_, zone_->types()->getPrimitive(PrimitiveType_Char));
1047 type = Type::NewArray(zone_, type, node->string()->length() + 1, true);
1051 node->setType(type);
1055 SemanticAnalysis::visit(FloatLiteral *node)
1057 Local<Type> type(zone_, zone_->types()->getPrimitive(PrimitiveType_Float));
1061 node->setType(type);
1065 SemanticAnalysis::visit(BreakStatement *node)
1068 cc_.reportError(node->pos(), Message_BreakOutsideLoop);
1072 // Note: ignore breaks that occur in unreachable control-flow.
1073 if (!control_->status().terminates())
1076 control_->terminate(Returns_Never);
1080 SemanticAnalysis::visit(ContinueStatement *node)
1083 cc_.reportError(node->pos(), Message_ContinueOutsideLoop);
1087 // Note: ignore continues that occur in unreachable control-flow.
1088 if (!control_->status().terminates())
1089 loop_->addContinue();
1091 control_->terminate(Returns_Never);