]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/compiler.cpp
Check that variable references refer do declared variables
[libs/gl.git] / source / glsl / compiler.cpp
index c2a0656d412265c94d789489a9f3099b8c352f84..0f608d6d600313682577df96a3c7e2cccd2e5226 100644 (file)
@@ -234,19 +234,21 @@ void Compiler::generate(Stage &stage, Mode mode)
                stage.required_features.glsl_version = module->shared.required_features.glsl_version;
 
        inject_block(stage.content, module->shared.content);
-       if(Stage *builtins = get_builtins(stage.type))
+       if(const Stage *builtins = get_builtins(stage.type))
                inject_block(stage.content, builtins->content);
-       if(Stage *builtins = get_builtins(Stage::SHARED))
+       if(const Stage *builtins = get_builtins(Stage::SHARED))
                inject_block(stage.content, builtins->content);
 
        // Initial resolving pass
        BlockHierarchyResolver().apply(stage);
+       TypeResolver().apply(stage);
        FunctionResolver().apply(stage);
        VariableResolver().apply(stage);
 
        /* All variables local to a stage have been resolved.  Resolve non-local
        variables through interfaces. */
        InterfaceGenerator().apply(stage);
+       TypeResolver().apply(stage);
        VariableResolver().apply(stage);
 
        FunctionResolver().apply(stage);
@@ -258,6 +260,7 @@ void Compiler::generate(Stage &stage, Mode mode)
 bool Compiler::validate(Stage &stage)
 {
        DeclarationValidator().apply(stage);
+       ReferenceValidator().apply(stage);
 
        for(vector<Diagnostic>::const_iterator i=stage.diagnostics.begin(); i!=stage.diagnostics.end(); ++i)
                if(i->severity==Diagnostic::ERR)
@@ -274,6 +277,7 @@ Compiler::OptimizeResult Compiler::optimize(Stage &stage)
        any_inlined |= ExpressionInliner().apply(stage);
        if(any_inlined)
        {
+               TypeResolver().apply(stage);
                VariableResolver().apply(stage);
                FunctionResolver().apply(stage);
        }