check_assignment_target(iface.declaration);
}
-void VariableResolver::add_to_chain(Assignment::Target::ChainType type, unsigned index)
-{
- if(r_assignment_target.chain_len<7)
- r_assignment_target.chain[r_assignment_target.chain_len] = type | min<unsigned>(index, 0x3F);
- ++r_assignment_target.chain_len;
-}
-
void VariableResolver::visit(MemberAccess &memacc)
{
TraversingVisitor::visit(memacc);
if(i!=strct->members.variables.end())
{
declaration = i->second;
+ index = 0;
for(NodeList<Statement>::const_iterator j=strct->members.body.begin(); (j!=strct->members.body.end() && j->get()!=i->second); ++j)
++index;
if(record_target)
- add_to_chain(Assignment::Target::MEMBER, index);
+ add_to_chain(r_assignment_target, Assignment::Target::MEMBER, index);
}
}
else if(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(memacc.left->type))
unsigned mask = 0;
for(unsigned i=0; i<swizzle.count; ++i)
mask |= 1<<swizzle.components[i];
- add_to_chain(Assignment::Target::SWIZZLE, mask);
+ add_to_chain(r_assignment_target, Assignment::Target::SWIZZLE, mask);
}
}
if(Literal *literal_subscript = dynamic_cast<Literal *>(binary.right.get()))
if(literal_subscript->value.check_type<int>())
index = literal_subscript->value.value<int>();
- add_to_chain(Assignment::Target::ARRAY, index);
+ add_to_chain(r_assignment_target, Assignment::Target::ARRAY, index);
}
}
else
if(!left_size || (left_size==1 && right_size!=1) || (left_size>1 && right_size!=1 && right_size!=left_size))
return;
+ /* If the left operand is a vector and right is scalar, convert the right
+ operand to a vector too. */
+ if(left_size>1 && right_size==1)
+ {
+ BasicTypeDeclaration *vec_right = find_type(*elem_right, basic_left->kind, basic_left->size);
+ if(!vec_right)
+ return;
+
+ convert_to(binary.right, *vec_right);
+ }
+
type = basic_left;
// Don't perform conversion even if the operands are of different sizes.
compat = SAME_TYPE;
map<string, TypeDeclaration *>::const_iterator i = stage->types.find(call.name);
if(i==stage->types.end())
return;
+ else if(call.arguments.size()==1 && i->second==call.arguments[0]->type)
+ ;
else if(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(i->second))
{
BasicTypeDeclaration *elem = get_element_type(*basic);