@@ -127,25 +127,30 @@ std::string linkingt::type_to_string_verbose(
127
127
return type_to_string (symbol.name , type);
128
128
}
129
129
130
- void linkingt::detailed_conflict_report_rec (
130
+ bool linkingt::detailed_conflict_report_rec (
131
131
const symbolt &old_symbol,
132
132
const symbolt &new_symbol,
133
133
const typet &type1,
134
134
const typet &type2,
135
135
unsigned depth,
136
136
exprt &conflict_path)
137
137
{
138
- #ifdef DEBUG
138
+ bool conclusive = false ;
139
+
140
+ #ifdef DEBUG
139
141
debug () << " <BEGIN DEPTH " << depth << " >" << eom;
140
- #endif
142
+ #endif
141
143
142
144
std::string msg;
143
145
144
146
const typet &t1=follow_tags_symbols (ns, type1);
145
147
const typet &t2=follow_tags_symbols (ns, type2);
146
148
147
149
if (t1.id ()!=t2.id ())
150
+ {
148
151
msg=" type classes differ" ;
152
+ conclusive = true ;
153
+ }
149
154
else if (t1.id ()==ID_pointer ||
150
155
t1.id ()==ID_array)
151
156
{
@@ -158,7 +163,7 @@ void linkingt::detailed_conflict_report_rec(
158
163
if (conflict_path.type ().id () == ID_pointer)
159
164
conflict_path = dereference_exprt (conflict_path);
160
165
161
- detailed_conflict_report_rec (
166
+ conclusive = detailed_conflict_report_rec (
162
167
old_symbol,
163
168
new_symbol,
164
169
to_type_with_subtype (t1).subtype (),
@@ -187,6 +192,7 @@ void linkingt::detailed_conflict_report_rec(
187
192
msg=" number of members is different (" ;
188
193
msg+=std::to_string (components1.size ())+' /' ;
189
194
msg+=std::to_string (components2.size ())+' )' ;
195
+ conclusive = true ;
190
196
}
191
197
else
192
198
{
@@ -200,7 +206,7 @@ void linkingt::detailed_conflict_report_rec(
200
206
msg=" names of member " +std::to_string (i)+" differ (" ;
201
207
msg+=id2string (components1[i].get_name ())+' /' ;
202
208
msg+=id2string (components2[i].get_name ())+' )' ;
203
- break ;
209
+ conclusive = true ;
204
210
}
205
211
else if (!base_type_eq (subtype1, subtype2, ns))
206
212
{
@@ -213,6 +219,7 @@ void linkingt::detailed_conflict_report_rec(
213
219
e.id ()==ID_index)
214
220
{
215
221
parent_types.insert (e.type ());
222
+ parent_types.insert (follow_tags_symbols (ns, e.type ()));
216
223
if (e.id () == ID_dereference)
217
224
e = to_dereference_expr (e).pointer ();
218
225
else if (e.id () == ID_member)
@@ -223,44 +230,32 @@ void linkingt::detailed_conflict_report_rec(
223
230
UNREACHABLE;
224
231
}
225
232
226
- conflict_path=conflict_path_before;
227
- conflict_path.type ()=t1;
228
- conflict_path=
229
- member_exprt (conflict_path, components1[i]);
230
-
231
- if (depth>0 &&
232
- parent_types.find (t1)==parent_types.end ())
233
- detailed_conflict_report_rec (
234
- old_symbol,
235
- new_symbol,
236
- subtype1,
237
- subtype2,
238
- depth-1 ,
239
- conflict_path);
240
- else
233
+ if (parent_types.find (subtype1) == parent_types.end ())
241
234
{
242
- msg=" type of member " +
243
- id2string (components1[i].get_name ())+
244
- " differs" ;
245
- if (depth>0 )
235
+ conflict_path = conflict_path_before;
236
+ conflict_path.type () = t1;
237
+ conflict_path = member_exprt (conflict_path, components1[i]);
238
+
239
+ if (depth > 0 )
246
240
{
247
- std::string msg_bak;
248
- msg_bak.swap (msg);
249
- symbol_exprt c = symbol_exprt::typeless (ID_C_this);
250
- detailed_conflict_report_rec (
241
+ conclusive = detailed_conflict_report_rec (
251
242
old_symbol,
252
243
new_symbol,
253
244
subtype1,
254
245
subtype2,
255
- depth-1 ,
256
- c);
257
- msg.swap (msg_bak);
246
+ depth - 1 ,
247
+ conflict_path);
258
248
}
259
249
}
260
-
261
- if (parent_types.find (t1)==parent_types.end ())
262
- break ;
250
+ else
251
+ {
252
+ msg = " type of member " + id2string (components1[i].get_name ()) +
253
+ " differs (recursive)" ;
254
+ }
263
255
}
256
+
257
+ if (conclusive)
258
+ break ;
264
259
}
265
260
}
266
261
}
@@ -283,12 +278,14 @@ void linkingt::detailed_conflict_report_rec(
283
278
msg +=
284
279
type_to_string (new_symbol.name , to_c_enum_type (t2).underlying_type ()) +
285
280
' )' ;
281
+ conclusive = true ;
286
282
}
287
283
else if (members1.size ()!=members2.size ())
288
284
{
289
285
msg=" number of enum members is different (" ;
290
286
msg+=std::to_string (members1.size ())+' /' ;
291
287
msg+=std::to_string (members2.size ())+' )' ;
288
+ conclusive = true ;
292
289
}
293
290
else
294
291
{
@@ -299,15 +296,18 @@ void linkingt::detailed_conflict_report_rec(
299
296
msg=" names of member " +std::to_string (i)+" differ (" ;
300
297
msg+=id2string (members1[i].get_base_name ())+' /' ;
301
298
msg+=id2string (members2[i].get_base_name ())+' )' ;
302
- break ;
299
+ conclusive = true ;
303
300
}
304
301
else if (members1[i].get_value ()!=members2[i].get_value ())
305
302
{
306
303
msg=" values of member " +std::to_string (i)+" differ (" ;
307
304
msg+=id2string (members1[i].get_value ())+' /' ;
308
305
msg+=id2string (members2[i].get_value ())+' )' ;
309
- break ;
306
+ conclusive = true ;
310
307
}
308
+
309
+ if (conclusive)
310
+ break ;
311
311
}
312
312
}
313
313
@@ -331,6 +331,7 @@ void linkingt::detailed_conflict_report_rec(
331
331
msg=" parameter counts differ (" ;
332
332
msg+=std::to_string (parameters1.size ())+' /' ;
333
333
msg+=std::to_string (parameters2.size ())+' )' ;
334
+ conclusive = true ;
334
335
}
335
336
else if (!base_type_eq (return_type1, return_type2, ns))
336
337
{
@@ -339,13 +340,15 @@ void linkingt::detailed_conflict_report_rec(
339
340
constant_exprt (std::to_string (-1 ), integer_typet ()));
340
341
341
342
if (depth>0 )
342
- detailed_conflict_report_rec (
343
+ {
344
+ conclusive = detailed_conflict_report_rec (
343
345
old_symbol,
344
346
new_symbol,
345
347
return_type1,
346
348
return_type2,
347
- depth- 1 ,
349
+ depth - 1 ,
348
350
conflict_path);
351
+ }
349
352
else
350
353
msg=" return types differ" ;
351
354
}
@@ -363,25 +366,31 @@ void linkingt::detailed_conflict_report_rec(
363
366
constant_exprt (std::to_string (i), integer_typet ()));
364
367
365
368
if (depth>0 )
366
- detailed_conflict_report_rec (
369
+ {
370
+ conclusive = detailed_conflict_report_rec (
367
371
old_symbol,
368
372
new_symbol,
369
373
subtype1,
370
374
subtype2,
371
- depth- 1 ,
375
+ depth - 1 ,
372
376
conflict_path);
377
+ }
373
378
else
374
379
msg=" parameter types differ" ;
380
+ }
375
381
382
+ if (conclusive)
376
383
break ;
377
- }
378
384
}
379
385
}
380
386
}
381
387
else
388
+ {
382
389
msg=" conflict on POD" ;
390
+ conclusive = true ;
391
+ }
383
392
384
- if (!msg.empty ())
393
+ if (conclusive && !msg.empty ())
385
394
{
386
395
error () << ' \n ' ;
387
396
error () << " reason for conflict at "
@@ -395,6 +404,8 @@ void linkingt::detailed_conflict_report_rec(
395
404
#ifdef DEBUG
396
405
debug () << " <END DEPTH " << depth << " >" << eom;
397
406
#endif
407
+
408
+ return conclusive;
398
409
}
399
410
400
411
void linkingt::link_error (
@@ -692,8 +703,16 @@ void linkingt::duplicate_code_symbol(
692
703
old_symbol.value .is_nil ()!=new_symbol.value .is_nil ())
693
704
{
694
705
if (warn_msg.empty ())
706
+ {
695
707
warn_msg=" pointer parameter types differ between "
696
708
" declaration and definition" ;
709
+ detailed_conflict_report (
710
+ old_symbol,
711
+ new_symbol,
712
+ conflicts.front ().first ,
713
+ conflicts.front ().second );
714
+ }
715
+
697
716
replace=new_symbol.value .is_not_nil ();
698
717
}
699
718
// transparent union with (or entirely without) implementation is
0 commit comments