X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fvalidate.cpp;h=ea2e956d023f1e02d66b44b7771186542076dd28;hb=d18df036b247f7f0978b547bb8ea1d624af2c4b2;hp=c4e0a9bda8aa6b21d80fca7e92a5b393217d4a53;hpb=f526938b407e061c7424adedc34af4d1ff687f90;p=libs%2Fgl.git diff --git a/source/glsl/validate.cpp b/source/glsl/validate.cpp index c4e0a9bd..ea2e956d 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) @@ -196,6 +208,13 @@ void ReferenceValidator::visit(VariableReference &var) error(var, format("Use of unlinked input variable '%s'", var.name)); } +void ReferenceValidator::visit(MemberAccess &memacc) +{ + if(memacc.left->type && !memacc.declaration) + error(memacc, format("Use of undeclared member '%s'", memacc.member)); + TraversingVisitor::visit(memacc); +} + void ReferenceValidator::visit(InterfaceBlockReference &iface) { /* An interface block reference without a declaration should be impossible