void c_typecheck_baset::increment_designator(designatort &designator) { assert(!designator.empty()); while(true) { designatort::entryt &entry=designator[designator.size()-1]; const typet &full_type=follow(entry.type); entry.index++; if(full_type.id()==ID_array && to_array_type(full_type).size().is_nil()) return; // we will keep going forever if(full_type.id()==ID_struct && entry.index<entry.size) { // need to adjust subtype const struct_typet &struct_type= to_struct_type(full_type); const struct_typet::componentst &components= struct_type.components(); assert(components.size()==entry.size); // we skip over any padding or code while(entry.index<entry.size && (components[entry.index].get_is_padding() || components[entry.index].type().id()==ID_code)) entry.index++; if(entry.index<entry.size) entry.subtype=components[entry.index].type(); } if(entry.index<entry.size) return; // done if(designator.size()==1) return; // done // pop entry designator.pop_entry(); assert(!designator.empty()); } }
void c_typecheck_baset::increment_designator(designatort &designator) { assert(!designator.empty()); while(true) { designatort::entryt &entry=designator[designator.size()-1]; entry.index++; if(entry.type.id()==ID_incomplete_array) return; // we will keep going forever if(entry.type.id()==ID_struct && entry.index<entry.size) { // need to adjust subtype const struct_typet &struct_type= to_struct_type(entry.type); const struct_typet::componentst &components= struct_type.components(); assert(components.size()==entry.size); // we skip over padding if(components[entry.index].get_is_padding()) entry.index++; if(entry.index<entry.size) entry.subtype=components[entry.index].type(); } if(entry.index<entry.size) return; // done if(designator.size()==1) return; // done // pop entry designator.pop_entry(); assert(!designator.empty()); } }