+ {
+ for(unsigned i=0; i<call.arguments.size(); ++i)
+ {
+ TypeDeclaration *arg_type = call.arguments[i]->type;
+ TypeDeclaration *param_type = call.declaration->parameters[i]->type_declaration;
+ if(arg_type==param_type)
+ continue;
+ else if(!arg_type || !param_type)
+ return;
+
+ BasicTypeDeclaration *arg_basic = dynamic_cast<BasicTypeDeclaration *>(arg_type);
+ BasicTypeDeclaration *param_basic = dynamic_cast<BasicTypeDeclaration *>(param_type);
+ if(arg_basic && param_basic)
+ {
+ Compatibility compat = get_compatibility(*param_basic, *arg_basic);
+ if(compat==RIGHT_CONVERTIBLE)
+ convert_to(call.arguments[i], *param_basic);
+ else if(compat!=SAME_TYPE)
+ return;
+ }
+ else
+ {
+ ImageTypeDeclaration *arg_image = dynamic_cast<ImageTypeDeclaration *>(arg_type);
+ ImageTypeDeclaration *param_image = dynamic_cast<ImageTypeDeclaration *>(param_type);
+ if(!arg_image || !param_image || arg_image->base_image!=param_image)
+ return;
+ }
+ }