UIntLiteralNode::UIntLiteralNode (int lineNumber, const LContext &lcontext, unsigned int value) : LiteralNode (lineNumber), value (value) { type = lcontext.newUIntType (); }
void UnaryOpNode::computeType (LContext &lcontext, const SymbolInfoPtr &initInfo) { if (!operand) return; operand->computeType (lcontext, initInfo); if (!operand->type) return; if (op == TK_BITNOT) { // // Operator ~ can only be applied to operands of type bool int, or // unsigned int. The operator produces a result of the same type as // the operand. // BoolTypePtr boolType = lcontext.newBoolType (); if (boolType->isSameTypeAs (operand->type)) { type = boolType; return; } IntTypePtr intType = lcontext.newIntType (); if (intType->isSameTypeAs (operand->type)) { type = intType; return; } UIntTypePtr uIntType = lcontext.newUIntType (); if (uIntType->isSameTypeAs (operand->type)) { type = uIntType; return; } } else if (op == TK_MINUS) { // // Operator - can only be applied to operands of type int, unsigned // int, half or float. The operator produces a result of the same // type as the operand, except for unsigned int where it produces a // result of type int. // IntTypePtr intType = lcontext.newIntType (); if (intType->isSameTypeAs (operand->type)) { type = intType; return; } UIntTypePtr uIntType = lcontext.newUIntType (); if (uIntType->isSameTypeAs (operand->type)) { type = intType; // not uIntType! return; } HalfTypePtr halfType = lcontext.newHalfType (); if (halfType->isSameTypeAs (operand->type)) { type = halfType; return; } FloatTypePtr floatType = lcontext.newFloatType (); if (floatType->isSameTypeAs (operand->type)) { type = floatType; return; } } else if (op == TK_NOT) { // // Operator ! can be applied to operands that can be converted // to type bool. The operator produces a result of type bool. // BoolTypePtr boolType = lcontext.newBoolType (); if (boolType->canCastFrom (operand->type)) { type = boolType; return; } } MESSAGE_LE (lcontext, ERR_OP_TYPE, lineNumber, "Invalid operand type for " << tokenAsString (op) << " operator " "(" << tokenAsString (op) << operand->type->asString() << ")."); }