X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=f8ecc5eeefd34aaad243accf7034d9cee8513ca0;hb=a1ba04add302e7712d127b46d8d11386987a0aea;hp=4523b7461730e4fadb6a2faec9d904cea70d1c42;hpb=4181ceb89a2d538712c81826da610e7e8583e9a5;p=libs%2Fgl.git diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index 4523b746..f8ecc5ee 100644 --- a/source/glsl/validate.cpp +++ b/source/glsl/validate.cpp @@ -11,17 +11,29 @@ namespace GL { namespace SL { Validator::Validator(): - stage(0) + stage(0), + last_provoker(0) { } -void Validator::diagnose(Node &node, Diagnostic::Severity severity, const string &message) +void Validator::diagnose(Node &node, Node &provoking_node, Diagnostic::Severity severity, const string &message) { Diagnostic diag; diag.severity = severity; diag.source = node.source; diag.line = node.line; + diag.provoking_source = provoking_node.source; + diag.provoking_line = provoking_node.line; diag.message = message; stage->diagnostics.push_back(diag); + + last_provoker = &provoking_node; +} + +void Validator::add_info(Node &node, const string &message) +{ + if(!last_provoker) + throw logic_error("Tried to add info without a previous provoker"); + diagnose(node, *last_provoker, Diagnostic::INFO, message); } @@ -83,7 +95,7 @@ DeclarationValidator::DeclarationValidator(): void DeclarationValidator::multiple_definition(const string &name, Statement &statement, Statement &previous) { error(statement, format("Multiple definition of %s", name)); - diagnose(previous, Diagnostic::INFO, "Previous definition is here"); + add_info(previous, "Previous definition is here"); } Statement *DeclarationValidator::find_definition(const string &name) @@ -163,15 +175,15 @@ void DeclarationValidator::visit(FunctionDeclaration &func) { if(Statement *previous = find_definition(func.name)) { - FunctionDeclaration *prev_func = dynamic_cast(previous); - if(prev_func && prev_func->definition==&func) - declarations[current_block][func.name] = &func; - else + if(!dynamic_cast(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); }