if(!declaration)
{
const map<string, InterfaceBlock *> &blocks = stage->interface_blocks;
- map<string, InterfaceBlock *>::const_iterator i = blocks.find("_"+var.name);
+ map<string, InterfaceBlock *>::const_iterator i = blocks.find(var.name);
if(i!=blocks.end())
{
/* The name refers to an interface block with an instance name rather
void VariableResolver::visit(InterfaceBlockReference &iface)
{
- map<string, InterfaceBlock *>::iterator i = stage->interface_blocks.find("_"+iface.name);
+ map<string, InterfaceBlock *>::iterator i = stage->interface_blocks.find(iface.name);
InterfaceBlock *declaration = (i!=stage->interface_blocks.end() ? i->second : 0);
r_any_resolved |= (declaration!=iface.declaration);
iface.declaration = declaration;
TraversingVisitor::visit(memacc);
VariableDeclaration *declaration = 0;
+ int index = -1;
if(StructDeclaration *strct = dynamic_cast<StructDeclaration *>(memacc.left->type))
{
map<string, VariableDeclaration *>::iterator i = strct->members.variables.find(memacc.member);
if(i!=strct->members.variables.end())
{
declaration = i->second;
+ for(NodeList<Statement>::const_iterator j=strct->members.body.begin(); (j!=strct->members.body.end() && j->get()!=i->second); ++j)
+ ++index;
if(record_target)
- {
- unsigned index = 0;
- for(NodeList<Statement>::const_iterator j=strct->members.body.begin(); (j!=strct->members.body.end() && j->get()!=i->second); ++j)
- ++index;
-
add_to_chain(Assignment::Target::MEMBER, index);
- }
}
}
else if(BasicTypeDeclaration *basic = dynamic_cast<BasicTypeDeclaration *>(memacc.left->type))
}
}
- r_any_resolved |= (declaration!=memacc.declaration);
+ r_any_resolved |= (declaration!=memacc.declaration || index!=memacc.index);
memacc.declaration = declaration;
+ memacc.index = index;
}
void VariableResolver::visit(Swizzle &swizzle)
{
/* Block names can be reused in different interfaces. Prefix the name with
the first character of the interface to avoid conflicts. */
- stage->interface_blocks.insert(make_pair(iface.interface+iface.block_name, &iface));
+ stage->interface_blocks.insert(make_pair(format("%s %s", iface.interface, iface.block_name), &iface));
if(!iface.instance_name.empty())
- stage->interface_blocks.insert(make_pair("_"+iface.instance_name, &iface));
+ stage->interface_blocks.insert(make_pair(iface.instance_name, &iface));
TraversingVisitor::visit(iface);
}