}
}
+void TypeComparer::visit(FunctionCall &call)
+{
+ if(FunctionCall *call1 = multi_visit(call))
+ {
+ if(!call1->constructor || !call.constructor)
+ r_result = false;
+ else if(call1->name!=call.name)
+ r_result = false;
+ else if(call1->arguments.size()!=call.arguments.size())
+ r_result = false;
+ else
+ {
+ r_result = true;
+ for(unsigned i=0; (r_result && i<call.arguments.size()); ++i)
+ compare(*call1->arguments[i], *call.arguments[i]);
+ }
+ }
+}
+
void TypeComparer::visit(BasicTypeDeclaration &basic)
{
if(BasicTypeDeclaration *basic1 = multi_visit(basic))
{
if(image1->dimensions!=image.dimensions || image1->array!=image.array)
r_result = false;
- else if(image1->sampled!=image.sampled || image1->shadow!=image.shadow)
+ else if(image1->sampled!=image.sampled || image1->shadow!=image.shadow || image1->multisample!=image.multisample)
+ r_result = false;
+ else if(image1->format!=image.format)
r_result = false;
else if(image1->base_type && image.base_type)
compare(*image1->base_type, *image.base_type);
r_result = false;
if(var1->array_size && var.array_size)
compare(*var1->array_size, *var.array_size);
+ else if(!var1->array_size && !var.array_size)
+ r_result = true;
}
if(r_result && var1->type_declaration!=var.type_declaration)
compare(*var1->type_declaration, *var.type_declaration);
}
else if(basic.kind==BasicTypeDeclaration::ARRAY)
basic.base_type->visit(*this);
+
+ if(basic.extended_alignment)
+ r_alignment = (r_alignment+15)&~15U;
}
void MemoryRequirementsCalculator::visit(StructDeclaration &strct)
r_alignment = 1;
r_offset = -1;
s->visit(*this);
- if(r_offset)
+ if(r_offset>=0)
total = r_offset;
total += r_alignment-1;
total -= total%r_alignment;
}
r_size = total;
r_alignment = max_align;
+ if(strct.extended_alignment)
+ r_alignment = (r_alignment+15)&~15U;
r_size += r_alignment-1;
r_size -= r_size%r_alignment;
}
}
}
-void DependencyCollector::visit(InterfaceBlockReference &iface)
-{
- if(iface.declaration)
- {
- dependencies.insert(iface.declaration);
- iface.declaration->visit(*this);
- }
-}
-
void DependencyCollector::visit(FunctionCall &call)
{
if(call.declaration)
assigned_variables.insert(var.declaration);
}
-void AssignmentCollector::visit(InterfaceBlockReference &iface)
-{
- if(assignment_target)
- assigned_variables.insert(iface.declaration);
-}
-
void AssignmentCollector::visit(UnaryExpression &unary)
{
SetFlag set_assignment(assignment_target, (unary.oper->token[1]=='+' || unary.oper->token[1]=='-'));