]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/resolve.cpp
Apply implicit conversion to return expressions in GLSL functions
[libs/gl.git] / source / glsl / resolve.cpp
index b80ae2176f5c8fae81a3c36cdaaf22a383f59256..eb99bec2ab57d9c801724b8803a3397e270ae363 100644 (file)
@@ -1141,6 +1141,28 @@ void ExpressionResolver::visit(VariableDeclaration &var)
                convert_to(var.init_expression, *var_basic);
 }
 
+void ExpressionResolver::visit(FunctionDeclaration &func)
+{
+       SetForScope<const FunctionDeclaration *> set_func(current_function, &func);
+       TraversingVisitor::visit(func);
+}
+
+void ExpressionResolver::visit(Return &ret)
+{
+       TraversingVisitor::visit(ret);
+       if(!current_function || !ret.expression)
+               return;
+
+       BasicTypeDeclaration *ret_basic = dynamic_cast<BasicTypeDeclaration *>(current_function->return_type_declaration);
+       BasicTypeDeclaration *expr_basic = dynamic_cast<BasicTypeDeclaration *>(ret.expression->type);
+       if(!ret_basic || !expr_basic)
+               return;
+
+       Compatibility compat = get_compatibility(*ret_basic, *expr_basic);
+       if(compat==RIGHT_CONVERTIBLE)
+               convert_to(ret.expression, *ret_basic);
+}
+
 
 bool FunctionResolver::apply(Stage &s)
 {