X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=99e2dfe86c954d31a5a8e734a78b92a9ea3bc283;hp=4b38c5b755e935f0e3f477c0ecd092202e411c7f;hb=d8bdf61007978e2c3670a22a58e2f105e8347537;hpb=ff3b43b6c15c3331d156b147b559892ee7ccdacb diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index 4b38c5b7..99e2dfe8 100644 --- a/source/glsl/validate.cpp +++ b/source/glsl/validate.cpp @@ -145,20 +145,20 @@ void DeclarationValidator::visit(VariableDeclaration &var) void DeclarationValidator::visit(InterfaceBlock &iface) { - string key = iface.interface+iface.name; + string key = iface.interface+iface.block_name; map::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(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); @@ -239,10 +239,16 @@ void ReferenceValidator::visit(InterfaceBlockReference &iface) void ReferenceValidator::visit(FunctionCall &call) { - if(!call.declaration && !call.constructor) + if((!call.constructor && !call.declaration) || (call.constructor && !call.type)) { - map::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::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; @@ -255,7 +261,7 @@ void ReferenceValidator::visit(FunctionCall &call) } 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)); @@ -273,7 +279,7 @@ void ReferenceValidator::visit(VariableDeclaration &var) 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); }