void DeclarationValidator::visit(FunctionDeclaration &func)
{
+ string key = func.name+func.signature;
+ map<string, FunctionDeclaration *>::const_iterator i = overloaded_functions.find(key);
+ if(i==overloaded_functions.end())
+ overloaded_functions.insert(make_pair(key, &func));
+ else if(func.return_type_declaration && i->second->return_type_declaration!=func.return_type_declaration)
+ {
+ error(func, format("Conflicting return type '%s' for function '%s'", func.return_type_declaration->name, func.name));
+ if(i->second->return_type_declaration)
+ add_info(*i->second, format("Previously declared as returning '%s'", i->second->return_type_declaration->name));
+ }
+
if(Statement *previous = find_definition(func.name))
{
- FunctionDeclaration *prev_func = dynamic_cast<FunctionDeclaration *>(previous);
- if(prev_func && prev_func->definition==&func)
- declarations[current_block][func.name] = &func;
- else
+ if(!dynamic_cast<FunctionDeclaration *>(previous))
multiple_definition(format("'%s'", func.name), func, *previous);
}
else
record_definition(func.name, func);
+ if(func.definition==&func)
+ check_definition(func.name+func.signature, func);
+
TraversingVisitor::visit(func);
}