resolve(assign, assign.left->type, true);
}
+void ExpressionResolver::visit(TernaryExpression &ternary)
+{
+ TraversingVisitor::visit(ternary);
+
+ BasicTypeDeclaration *basic_cond = dynamic_cast<BasicTypeDeclaration *>(ternary.condition->type);
+ if(!basic_cond || basic_cond->kind!=BasicTypeDeclaration::BOOL)
+ return;
+
+ TypeDeclaration *type = 0;
+ if(ternary.true_expr->type==ternary.false_expr->type)
+ type = ternary.true_expr->type;
+ else
+ {
+ BasicTypeDeclaration *basic_true = dynamic_cast<BasicTypeDeclaration *>(ternary.true_expr->type);
+ BasicTypeDeclaration *basic_false = dynamic_cast<BasicTypeDeclaration *>(ternary.false_expr->type);
+ Compatibility compat = get_compatibility(*basic_true, *basic_false);
+ if(compat==NOT_COMPATIBLE)
+ return;
+
+ type = (compat==LEFT_CONVERTIBLE ? basic_true : basic_false);
+
+ if(compat==LEFT_CONVERTIBLE)
+ convert_to(ternary.true_expr, *basic_false);
+ else if(compat==RIGHT_CONVERTIBLE)
+ convert_to(ternary.false_expr, *basic_true);
+ }
+
+ resolve(ternary, type, false);
+}
+
void ExpressionResolver::visit(FunctionCall &call)
{
TraversingVisitor::visit(call);
iface_target_block->body.insert(iface_insert_point, iface_var);
iface_target_block->variables.insert(make_pair(name, iface_var));
+ if(iface_target_block==&stage->content && iface=="in")
+ declared_inputs.push_back(iface_var);
return iface_var;
}
}
}
}
- else if(var.interface=="in")
+ else if(var.interface=="in" && current_block==&stage->content)
{
+ declared_inputs.push_back(&var);
+
/* Try to link input variables in global scope with output variables from
previous stage. */
- if(current_block==&stage->content && !var.linked_declaration && stage->previous)
+ if(!var.linked_declaration && stage->previous)
{
const map<string, VariableDeclaration *> &prev_vars = stage->previous->content.variables;
map<string, VariableDeclaration *>::const_iterator i = prev_vars.find(var.name);
void InterfaceGenerator::visit(Passthrough &pass)
{
- vector<VariableDeclaration *> pass_vars;
-
- // Pass through all input variables of this stage.
- for(map<string, VariableDeclaration *>::const_iterator i=stage->content.variables.begin(); i!=stage->content.variables.end(); ++i)
- if(i->second->interface=="in")
- pass_vars.push_back(i->second);
+ // Pass through all input variables declared so far.
+ vector<VariableDeclaration *> pass_vars = declared_inputs;
if(stage->previous)
{