void InlineableFunctionLocator::visit(FunctionCall &call)
{
FunctionDeclaration *def = call.declaration;
- if(def && def->definition!=def)
+ if(def)
def = def->definition;
if(def)
visit_and_inline(*i);
FunctionDeclaration *def = call.declaration;
- if(def && def->definition!=def)
+ if(def)
def = def->definition;
if(def && inlineable.count(def))
void ConstantConditionEliminator::visit(VariableDeclaration &var)
{
- if(var.constant || current_block->parent)
+ bool constant = var.constant;
+ if(constant && var.layout)
+ {
+ for(vector<Layout::Qualifier>::const_iterator i=var.layout->qualifiers.begin(); (constant && i!=var.layout->qualifiers.end()); ++i)
+ constant = (i->name!="constant_id");
+ }
+ if((constant || current_block->parent) && var.init_expression)
variable_values[&var] = var.init_expression.get();
}
if(var.declaration && !assignment_target)
{
VariableInfo &var_info = variables.back()[var.declaration];
- var_info.assignments.clear();
+ clear_assignments(var_info, false);
var_info.referenced = true;
}
}
+void UnusedVariableRemover::visit(InterfaceBlockReference &iface)
+{
+ unused_nodes.erase(iface.declaration);
+}
+
void UnusedVariableRemover::visit(MemberAccess &memacc)
{
TraversingVisitor::visit(memacc);
BlockVariableMap &block_variables = variables.back();
for(BlockVariableMap::iterator i=block_variables.begin(); i!=block_variables.end(); ++i)
if(!i->second.local && i->second.referenced)
- i->second.assignments.clear();
+ clear_assignments(i->second, false);
merge_down_variables();
}