void DeclarationValidator::visit(InterfaceBlock &iface)
{
- string key = iface.interface+iface.name;
+ string key = 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.name), iface, *i->second);
+ multiple_definition(format("interface block '%s %s'", iface.interface, iface.block_name), iface, *i->second);
else
interface_blocks.insert(make_pair(key, &iface));
- if(Statement *previous = find_definition(iface.name))
+ if(Statement *previous = find_definition(iface.block_name))
{
if(!dynamic_cast<InterfaceBlock *>(previous))
- multiple_definition(format("'%s'", iface.name), iface, *previous);
+ multiple_definition(format("'%s'", iface.block_name), iface, *previous);
}
else
- record_definition(iface.name, iface);
+ record_definition(iface.block_name, iface);
if(!iface.instance_name.empty())
check_definition(iface.instance_name, iface);
void ReferenceValidator::visit(FunctionCall &call)
{
- if(!call.declaration && !call.constructor)
+ if((!call.constructor && !call.declaration) || (call.constructor && !call.type))
{
- map<string, FunctionDeclaration *>::iterator i = stage->functions.lower_bound(call.name);
- if(i!=stage->functions.end() && i->second->name==call.name)
+ bool have_declaration = call.constructor;
+ if(!call.constructor)
+ {
+ map<string, FunctionDeclaration *>::iterator i = stage->functions.lower_bound(call.name);
+ have_declaration = (i!=stage->functions.end() && i->second->name==call.name);
+ }
+
+ if(have_declaration)
{
bool valid_types = true;
string signature;
}
if(valid_types)
- error(call, format("No matching overload found for call to '%s(%s)'", call.name, signature));
+ error(call, format("No matching %s found for '%s(%s)'", (call.constructor ? "constructor" : "overload"), call.name, signature));
}
else
error(call, format("Call to undeclared function '%s'", call.name));
void ReferenceValidator::visit(InterfaceBlock &iface)
{
if(!iface.struct_declaration)
- error(iface, format("Interface block '%s %s' lacks a struct declaration", iface.interface, iface.name));
+ error(iface, format("Interface block '%s %s' lacks a struct declaration", iface.interface, iface.block_name));
TraversingVisitor::visit(iface);
}