}
TypeDeclaration *type = var.type_declaration;
+ BasicTypeDeclaration::Kind kind = BasicTypeDeclaration::ALIAS;
while(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(type))
+ {
+ kind = basic->kind;
type = basic->base_type;
+ }
if(dynamic_cast<ImageTypeDeclaration *>(type))
{
if(scope!=GLOBAL && scope!=FUNCTION_PARAM)
else if(scope==GLOBAL && var.interface!="uniform")
error(var, format("Type '%s' only allowed with uniform interface", type->name));
}
+ else if(kind==BasicTypeDeclaration::VOID)
+ error(var, "Type 'void' not allowed on variable");
+ else if(kind==BasicTypeDeclaration::BOOL && !var.interface.empty() && var.source!=BUILTIN_SOURCE)
+ error(var, "Type 'bool' not allowed on interface variable");
if(var.init_expression)
{
TraversingVisitor::visit(func);
}
+void ExpressionValidator::visit(Conditional &cond)
+{
+ if(cond.condition->type)
+ {
+ BasicTypeDeclaration *basic_cond = dynamic_cast<BasicTypeDeclaration *>(cond.condition->type);
+ if(!basic_cond || basic_cond->kind!=BasicTypeDeclaration::BOOL)
+ error(cond, "Condition is not a boolean");
+ }
+ TraversingVisitor::visit(cond);
+}
+
+void ExpressionValidator::visit(Iteration &iter)
+{
+ if(iter.condition->type)
+ {
+ BasicTypeDeclaration *basic_cond = dynamic_cast<BasicTypeDeclaration *>(iter.condition->type);
+ if(!basic_cond || basic_cond->kind!=BasicTypeDeclaration::BOOL)
+ error(iter, "Loop condition is not a boolean");
+ }
+ TraversingVisitor::visit(iter);
+}
+
void ExpressionValidator::visit(Return &ret)
{
if(current_function && current_function->return_type_declaration)