X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=676dd9e808792867458d8c59d03a62d47ceb8e88;hp=e6f0c653e45f4ad9e62c108084867dc4374c11c9;hb=50ab5ca;hpb=e97feb2fdd27af970412eea6a03cc7270032a80b diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index e6f0c653..676dd9e8 100644 --- a/source/glsl/validate.cpp +++ b/source/glsl/validate.cpp @@ -208,6 +208,45 @@ void ReferenceValidator::visit(FunctionDeclaration &func) TraversingVisitor::visit(func); } + +void ExpressionValidator::visit(UnaryExpression &unary) +{ + if(unary.expression->type) + { + if(!unary.type) + error(unary, format("No matching operator '%s' found for '%s'", unary.oper->token, unary.expression->type->name)); + else if((unary.oper->token[1]=='+' || unary.oper->token[1]=='-') && !unary.expression->lvalue) + error(unary, format("Operand of '%s' is not an lvalue", unary.oper->token)); + } + TraversingVisitor::visit(unary); +} + +void ExpressionValidator::visit(BinaryExpression &binary) +{ + if(!binary.type && binary.left->type && binary.right->type) + error(binary, format("No matching operator '%s' found for '%s' and '%s'", + binary.oper->token, binary.left->type->name, binary.right->type->name)); + TraversingVisitor::visit(binary); +} + +void ExpressionValidator::visit(Assignment &assign) +{ + if(assign.left->type && !assign.left->lvalue) + error(assign, "Target of assignment is not an lvalue"); + if(assign.left->type && assign.right->type && assign.left->type!=assign.right->type) + error(assign, format("Assignment to variable of type '%s' from expression of type '%s'", + assign.left->type->name, assign.right->type->name)); + TraversingVisitor::visit(assign); +} + +void ExpressionValidator::visit(VariableDeclaration &var) +{ + if(var.init_expression && var.init_expression->type && var.type_declaration && var.init_expression->type!=var.type_declaration) + error(var, format("Initializing a variable of type '%s' with an expression of type '%s'", + var.type_declaration->name, var.init_expression->type->name)); + TraversingVisitor::visit(var); +} + } // namespace SL } // namespace GL } // namespace Msp