@@ -125,25 +125,30 @@ std::string linkingt::type_to_string_verbose(
125
125
return type_to_string (symbol.name , type);
126
126
}
127
127
128
- void linkingt::detailed_conflict_report_rec (
128
+ bool linkingt::detailed_conflict_report_rec (
129
129
const symbolt &old_symbol,
130
130
const symbolt &new_symbol,
131
131
const typet &type1,
132
132
const typet &type2,
133
133
unsigned depth,
134
134
exprt &conflict_path)
135
135
{
136
- #ifdef DEBUG
136
+ bool conclusive = false ;
137
+
138
+ #ifdef DEBUG
137
139
debug () << " <BEGIN DEPTH " << depth << " >" << eom;
138
- #endif
140
+ #endif
139
141
140
142
std::string msg;
141
143
142
144
const typet &t1=follow_tags_symbols (ns, type1);
143
145
const typet &t2=follow_tags_symbols (ns, type2);
144
146
145
147
if (t1.id ()!=t2.id ())
148
+ {
146
149
msg=" type classes differ" ;
150
+ conclusive = true ;
151
+ }
147
152
else if (t1.id ()==ID_pointer ||
148
153
t1.id ()==ID_array)
149
154
{
@@ -153,12 +158,12 @@ void linkingt::detailed_conflict_report_rec(
153
158
if (conflict_path.type ().id () == ID_pointer)
154
159
conflict_path = dereference_exprt (conflict_path);
155
160
156
- detailed_conflict_report_rec (
161
+ conclusive = detailed_conflict_report_rec (
157
162
old_symbol,
158
163
new_symbol,
159
164
t1.subtype (),
160
165
t2.subtype (),
161
- depth- 1 ,
166
+ depth - 1 ,
162
167
conflict_path);
163
168
}
164
169
else if (t1.id ()==ID_pointer)
@@ -182,6 +187,7 @@ void linkingt::detailed_conflict_report_rec(
182
187
msg=" number of members is different (" ;
183
188
msg+=std::to_string (components1.size ())+' /' ;
184
189
msg+=std::to_string (components2.size ())+' )' ;
190
+ conclusive = true ;
185
191
}
186
192
else
187
193
{
@@ -195,7 +201,7 @@ void linkingt::detailed_conflict_report_rec(
195
201
msg=" names of member " +std::to_string (i)+" differ (" ;
196
202
msg+=id2string (components1[i].get_name ())+' /' ;
197
203
msg+=id2string (components2[i].get_name ())+' )' ;
198
- break ;
204
+ conclusive = true ;
199
205
}
200
206
else if (!base_type_eq (subtype1, subtype2, ns))
201
207
{
@@ -208,6 +214,7 @@ void linkingt::detailed_conflict_report_rec(
208
214
e.id ()==ID_index)
209
215
{
210
216
parent_types.insert (e.type ());
217
+ parent_types.insert (follow_tags_symbols (ns, e.type ()));
211
218
if (e.id () == ID_dereference)
212
219
e = to_dereference_expr (e).pointer ();
213
220
else if (e.id () == ID_member)
@@ -218,44 +225,32 @@ void linkingt::detailed_conflict_report_rec(
218
225
UNREACHABLE;
219
226
}
220
227
221
- conflict_path=conflict_path_before;
222
- conflict_path.type ()=t1;
223
- conflict_path=
224
- member_exprt (conflict_path, components1[i]);
225
-
226
- if (depth>0 &&
227
- parent_types.find (t1)==parent_types.end ())
228
- detailed_conflict_report_rec (
229
- old_symbol,
230
- new_symbol,
231
- subtype1,
232
- subtype2,
233
- depth-1 ,
234
- conflict_path);
235
- else
228
+ if (parent_types.find (subtype1) == parent_types.end ())
236
229
{
237
- msg=" type of member " +
238
- id2string (components1[i].get_name ())+
239
- " differs" ;
240
- if (depth>0 )
230
+ conflict_path = conflict_path_before;
231
+ conflict_path.type () = t1;
232
+ conflict_path = member_exprt (conflict_path, components1[i]);
233
+
234
+ if (depth > 0 )
241
235
{
242
- std::string msg_bak;
243
- msg_bak.swap (msg);
244
- symbol_exprt c = symbol_exprt::typeless (ID_C_this);
245
- detailed_conflict_report_rec (
236
+ conclusive = detailed_conflict_report_rec (
246
237
old_symbol,
247
238
new_symbol,
248
239
subtype1,
249
240
subtype2,
250
- depth-1 ,
251
- c);
252
- msg.swap (msg_bak);
241
+ depth - 1 ,
242
+ conflict_path);
253
243
}
254
244
}
255
-
256
- if (parent_types.find (t1)==parent_types.end ())
257
- break ;
245
+ else
246
+ {
247
+ msg = " type of member " + id2string (components1[i].get_name ()) +
248
+ " differs (recursive)" ;
249
+ }
258
250
}
251
+
252
+ if (conclusive)
253
+ break ;
259
254
}
260
255
}
261
256
}
@@ -272,12 +267,14 @@ void linkingt::detailed_conflict_report_rec(
272
267
msg=" enum value types are different (" ;
273
268
msg += type_to_string (old_symbol.name , t1.subtype ()) + ' /' ;
274
269
msg += type_to_string (new_symbol.name , t2.subtype ()) + ' )' ;
270
+ conclusive = true ;
275
271
}
276
272
else if (members1.size ()!=members2.size ())
277
273
{
278
274
msg=" number of enum members is different (" ;
279
275
msg+=std::to_string (members1.size ())+' /' ;
280
276
msg+=std::to_string (members2.size ())+' )' ;
277
+ conclusive = true ;
281
278
}
282
279
else
283
280
{
@@ -288,15 +285,18 @@ void linkingt::detailed_conflict_report_rec(
288
285
msg=" names of member " +std::to_string (i)+" differ (" ;
289
286
msg+=id2string (members1[i].get_base_name ())+' /' ;
290
287
msg+=id2string (members2[i].get_base_name ())+' )' ;
291
- break ;
288
+ conclusive = true ;
292
289
}
293
290
else if (members1[i].get_value ()!=members2[i].get_value ())
294
291
{
295
292
msg=" values of member " +std::to_string (i)+" differ (" ;
296
293
msg+=id2string (members1[i].get_value ())+' /' ;
297
294
msg+=id2string (members2[i].get_value ())+' )' ;
298
- break ;
295
+ conclusive = true ;
299
296
}
297
+
298
+ if (conclusive)
299
+ break ;
300
300
}
301
301
}
302
302
@@ -320,6 +320,7 @@ void linkingt::detailed_conflict_report_rec(
320
320
msg=" parameter counts differ (" ;
321
321
msg+=std::to_string (parameters1.size ())+' /' ;
322
322
msg+=std::to_string (parameters2.size ())+' )' ;
323
+ conclusive = true ;
323
324
}
324
325
else if (!base_type_eq (return_type1, return_type2, ns))
325
326
{
@@ -328,13 +329,15 @@ void linkingt::detailed_conflict_report_rec(
328
329
constant_exprt (std::to_string (-1 ), integer_typet ()));
329
330
330
331
if (depth>0 )
331
- detailed_conflict_report_rec (
332
+ {
333
+ conclusive = detailed_conflict_report_rec (
332
334
old_symbol,
333
335
new_symbol,
334
336
return_type1,
335
337
return_type2,
336
- depth- 1 ,
338
+ depth - 1 ,
337
339
conflict_path);
340
+ }
338
341
else
339
342
msg=" return types differ" ;
340
343
}
@@ -352,25 +355,31 @@ void linkingt::detailed_conflict_report_rec(
352
355
constant_exprt (std::to_string (i), integer_typet ()));
353
356
354
357
if (depth>0 )
355
- detailed_conflict_report_rec (
358
+ {
359
+ conclusive = detailed_conflict_report_rec (
356
360
old_symbol,
357
361
new_symbol,
358
362
subtype1,
359
363
subtype2,
360
- depth- 1 ,
364
+ depth - 1 ,
361
365
conflict_path);
366
+ }
362
367
else
363
368
msg=" parameter types differ" ;
369
+ }
364
370
371
+ if (conclusive)
365
372
break ;
366
- }
367
373
}
368
374
}
369
375
}
370
376
else
377
+ {
371
378
msg=" conflict on POD" ;
379
+ conclusive = true ;
380
+ }
372
381
373
- if (!msg.empty ())
382
+ if (conclusive && !msg.empty ())
374
383
{
375
384
error () << ' \n ' ;
376
385
error () << " reason for conflict at "
@@ -384,6 +393,8 @@ void linkingt::detailed_conflict_report_rec(
384
393
#ifdef DEBUG
385
394
debug () << " <END DEPTH " << depth << " >" << eom;
386
395
#endif
396
+
397
+ return conclusive;
387
398
}
388
399
389
400
void linkingt::link_error (
@@ -681,8 +692,16 @@ void linkingt::duplicate_code_symbol(
681
692
old_symbol.value .is_nil ()!=new_symbol.value .is_nil ())
682
693
{
683
694
if (warn_msg.empty ())
695
+ {
684
696
warn_msg=" pointer parameter types differ between "
685
697
" declaration and definition" ;
698
+ detailed_conflict_report (
699
+ old_symbol,
700
+ new_symbol,
701
+ conflicts.front ().first ,
702
+ conflicts.front ().second );
703
+ }
704
+
686
705
replace=new_symbol.value .is_not_nil ();
687
706
}
688
707
// transparent union with (or entirely without) implementation is
0 commit comments