}
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)
{
void IdentifierValidator::visit(InterfaceBlock &iface)
{
- string key = iface.interface+iface.block_name;
+ string key = format("%s %s", iface.interface, iface.block_name);
map<string, InterfaceBlock *>::const_iterator i = interface_blocks.find(key);
if(i!=interface_blocks.end())
multiple_definition(format("interface block '%s %s'", iface.interface, iface.block_name), iface, *i->second);