@@ -217,6 +217,8 @@ void linkingt::detailed_conflict_report_rec(
217
217
const struct_union_typet::componentst &components2=
218
218
to_struct_union_type (t2).components ();
219
219
220
+ exprt conflict_path_before=conflict_path;
221
+
220
222
if (components1.size ()!=components2.size ())
221
223
{
222
224
msg=" number of members is different (" ;
@@ -238,11 +240,25 @@ void linkingt::detailed_conflict_report_rec(
238
240
}
239
241
else if (!base_type_eq (subtype1, subtype2, ns))
240
242
{
243
+ typedef hash_set_cont<typet, irep_hash> type_sett;
244
+ type_sett parent_types;
245
+
246
+ exprt e=conflict_path_before;
247
+ while (e.id ()==ID_dereference ||
248
+ e.id ()==ID_member ||
249
+ e.id ()==ID_index)
250
+ {
251
+ parent_types.insert (e.type ());
252
+ e=e.op0 ();
253
+ }
254
+
255
+ conflict_path=conflict_path_before;
241
256
conflict_path.type ()=t1;
242
257
conflict_path=
243
258
member_exprt (conflict_path, components1[i].get_name ());
244
259
245
- if (depth>0 )
260
+ if (depth>0 &&
261
+ parent_types.find (t1)==parent_types.end ())
246
262
detailed_conflict_report_rec (
247
263
old_symbol,
248
264
new_symbol,
@@ -251,11 +267,29 @@ void linkingt::detailed_conflict_report_rec(
251
267
depth-1 ,
252
268
conflict_path);
253
269
else
270
+ {
254
271
msg=" type of member " +
255
272
id2string (components1[i].get_name ())+
256
273
" differs" ;
274
+ if (depth>0 )
275
+ {
276
+ std::string msg_bak;
277
+ msg_bak.swap (msg);
278
+ symbol_exprt c (ID_C_this);
279
+ detailed_conflict_report_rec (
280
+ old_symbol,
281
+ new_symbol,
282
+ subtype1,
283
+ subtype2,
284
+ depth-1 ,
285
+ c);
286
+ msg.swap (msg_bak);
287
+ }
257
288
258
- break ;
289
+ }
290
+
291
+ if (parent_types.find (t1)==parent_types.end ())
292
+ break ;
259
293
}
260
294
}
261
295
}
@@ -563,6 +597,32 @@ void linkingt::duplicate_code_symbol(
563
597
old_symbol.location =new_symbol.location ;
564
598
}
565
599
}
600
+ // Linux kernel uses void f(void) as generic prototype
601
+ else if ((old_t .return_type ().id ()==ID_empty &&
602
+ old_t .parameters ().empty () &&
603
+ !old_t .has_ellipsis () &&
604
+ old_symbol.value .is_nil ()) ||
605
+ (new_t .return_type ().id ()==ID_empty &&
606
+ new_t .parameters ().empty () &&
607
+ !new_t .has_ellipsis () &&
608
+ new_symbol.value .is_nil ()))
609
+ {
610
+ // issue a warning
611
+ link_warning (
612
+ old_symbol,
613
+ new_symbol,
614
+ " ignoring conflicting void f(void) function declaration" );
615
+
616
+ if (old_t .return_type ().id ()==ID_empty &&
617
+ old_t .parameters ().empty () &&
618
+ !old_t .has_ellipsis () &&
619
+ old_symbol.value .is_nil ())
620
+ {
621
+ old_symbol.type =new_symbol.type ;
622
+ old_symbol.location =new_symbol.location ;
623
+ old_symbol.is_weak =new_symbol.is_weak ;
624
+ }
625
+ }
566
626
// mismatch on number of parameters is definitively an error
567
627
else if ((old_t .parameters ().size ()<new_t .parameters ().size () &&
568
628
!old_t .has_ellipsis ()) ||
@@ -1081,7 +1141,7 @@ Function: linkingt::do_type_dependencies
1081
1141
1082
1142
void linkingt::do_type_dependencies (id_sett &needs_to_be_renamed)
1083
1143
{
1084
- // Any type that uses a type that will be renamed also
1144
+ // Any type that uses a symbol that will be renamed also
1085
1145
// needs to be renamed, and so on, until saturation.
1086
1146
1087
1147
used_byt used_by;
@@ -1090,12 +1150,13 @@ void linkingt::do_type_dependencies(id_sett &needs_to_be_renamed)
1090
1150
{
1091
1151
if (s_it->second .is_type )
1092
1152
{
1093
- find_symbols_sett type_symbols_used;
1094
- find_type_symbols (s_it->second .type , type_symbols_used);
1153
+ // find type and array-size symbols
1154
+ find_symbols_sett symbols_used;
1155
+ find_type_and_expr_symbols (s_it->second .type , symbols_used);
1095
1156
1096
1157
for (find_symbols_sett::const_iterator
1097
- it=type_symbols_used .begin ();
1098
- it!=type_symbols_used .end ();
1158
+ it=symbols_used .begin ();
1159
+ it!=symbols_used .end ();
1099
1160
it++)
1100
1161
{
1101
1162
used_by[*it].insert (s_it->first );
0 commit comments