@@ -71,8 +71,8 @@ void c_typecheck_baset::move_symbol(symbolt &symbol, symbolt *&new_symbol)
71
71
if (symbol_table.move (symbol, new_symbol))
72
72
{
73
73
err_location (symbol.location );
74
- str << " failed to move symbol `" << symbol.name
75
- << " ' into symbol table" ;
74
+ error () << " failed to move symbol `" << symbol.name
75
+ << " ' into symbol table" << eom ;
76
76
throw 0 ;
77
77
}
78
78
}
@@ -118,7 +118,7 @@ void c_typecheck_baset::typecheck_symbol(symbolt &symbol)
118
118
else if (!is_function && symbol.value .id ()==ID_code)
119
119
{
120
120
err_location (symbol.value );
121
- str << " only functions can have a function body" ;
121
+ error () << " only functions can have a function body" << eom ;
122
122
throw 0 ;
123
123
}
124
124
@@ -162,8 +162,8 @@ void c_typecheck_baset::typecheck_symbol(symbolt &symbol)
162
162
if (old_it->second .is_type !=symbol.is_type )
163
163
{
164
164
err_location (symbol.location );
165
- str << " redeclaration of `" << symbol.display_name ()
166
- << " ' as a different kind of symbol" ;
165
+ error () << " redeclaration of `" << symbol.display_name ()
166
+ << " ' as a different kind of symbol" << eom ;
167
167
throw 0 ;
168
168
}
169
169
@@ -275,9 +275,9 @@ void c_typecheck_baset::typecheck_redefinition_type(
275
275
else
276
276
{
277
277
err_location (new_symbol.location );
278
- str << " error: conflicting definition of type symbol `"
279
- << new_symbol.display_name ()
280
- << " '" ;
278
+ error () << " error: conflicting definition of type symbol `"
279
+ << new_symbol.display_name ()
280
+ << " '" << eom ;
281
281
throw 0 ;
282
282
}
283
283
}
@@ -296,9 +296,9 @@ void c_typecheck_baset::typecheck_redefinition_type(
296
296
{
297
297
// arg! new tag type
298
298
err_location (new_symbol.location );
299
- str << " error: conflicting definition of tag symbol `"
300
- << new_symbol.display_name ()
301
- << " '" ;
299
+ error () << " error: conflicting definition of tag symbol `"
300
+ << new_symbol.display_name ()
301
+ << " '" << eom ;
302
302
throw 0 ;
303
303
}
304
304
}
@@ -322,10 +322,10 @@ void c_typecheck_baset::typecheck_redefinition_type(
322
322
if (follow (new_symbol.type )!=follow (old_symbol.type ))
323
323
{
324
324
err_location (new_symbol.location );
325
- str << " error: type symbol `" << new_symbol. display_name ()
326
- << " ' defined twice:" << " \n " ;
327
- str << " Original: " << to_string (old_symbol.type ) << " \n " ;
328
- str << " New: " << to_string (new_symbol.type );
325
+ error () << " error: type symbol `"
326
+ << new_symbol. display_name () << " ' defined twice:\n "
327
+ << " Original: " << to_string (old_symbol.type ) << " \n "
328
+ << " New: " << to_string (new_symbol.type ) << eom ;
329
329
throw 0 ;
330
330
}
331
331
}
@@ -375,7 +375,8 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
375
375
if (final_new.id ()==ID_code)
376
376
{
377
377
err_location (new_symbol.location );
378
- str << " function type not allowed for K&R function parameter" ;
378
+ error () << " function type not allowed for K&R function parameter"
379
+ << eom;
379
380
throw 0 ;
380
381
}
381
382
@@ -393,10 +394,11 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
393
394
if (final_old.id ()!=ID_code)
394
395
{
395
396
err_location (new_symbol.location );
396
- str << " error: function symbol `" << new_symbol.display_name ()
397
- << " ' redefined with a different type:" << " \n " ;
398
- str << " Original: " << to_string (old_symbol.type ) << " \n " ;
399
- str << " New: " << to_string (new_symbol.type );
397
+ error () << " error: function symbol `"
398
+ << new_symbol.display_name ()
399
+ << " ' redefined with a different type:\n "
400
+ << " Original: " << to_string (old_symbol.type ) << " \n "
401
+ << " New: " << to_string (new_symbol.type ) << eom;
400
402
throw 0 ;
401
403
}
402
404
@@ -449,8 +451,8 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
449
451
else
450
452
{
451
453
err_location (new_symbol.location );
452
- str << " function body `" << new_symbol.display_name ()
453
- << " ' defined twice" ;
454
+ error () << " function body `" << new_symbol.display_name ()
455
+ << " ' defined twice" << eom ;
454
456
throw 0 ;
455
457
}
456
458
}
@@ -504,8 +506,9 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
504
506
if (s_it==symbol_table.symbols .end ())
505
507
{
506
508
err_location (old_symbol.location );
507
- str << " typecheck_redefinition_non_type: "
508
- " failed to find symbol `" << identifier << " '" ;
509
+ error () << " typecheck_redefinition_non_type: "
510
+ << " failed to find symbol `" << identifier << " '"
511
+ << eom;
509
512
throw 0 ;
510
513
}
511
514
@@ -547,10 +550,10 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
547
550
else
548
551
{
549
552
err_location (new_symbol.location );
550
- str << " error: symbol `" << new_symbol.display_name ()
551
- << " ' redefined with a different type:" << " \n " ;
552
- str << " Original: " << to_string (old_symbol.type ) << " \n " ;
553
- str << " New: " << to_string (new_symbol.type );
553
+ error () << " error: symbol `" << new_symbol.display_name ()
554
+ << " ' redefined with a different type:\n "
555
+ << " Original: " << to_string (old_symbol.type ) << " \n "
556
+ << " New: " << to_string (new_symbol.type ) << eom ;
554
557
throw 0 ;
555
558
}
556
559
}
@@ -587,8 +590,8 @@ void c_typecheck_baset::typecheck_redefinition_non_type(
587
590
else
588
591
{
589
592
err_location (new_symbol.value );
590
- str << " symbol `" << new_symbol.display_name ()
591
- << " ' already has an initial value" ;
593
+ error () << " symbol `" << new_symbol.display_name ()
594
+ << " ' already has an initial value" << eom ;
592
595
warning_msg ();
593
596
}
594
597
}
@@ -687,8 +690,8 @@ void c_typecheck_baset::typecheck_function_body(symbolt &symbol)
687
690
if (labels_defined.find (it->first )==labels_defined.end ())
688
691
{
689
692
err_location (it->second );
690
- str << " branching label `" << it->first
691
- << " ' is not defined in function" ;
693
+ error () << " branching label `" << it->first
694
+ << " ' is not defined in function" << eom ;
692
695
throw 0 ;
693
696
}
694
697
}
@@ -736,7 +739,9 @@ void c_typecheck_baset::apply_asm_label(
736
739
}
737
740
else
738
741
{
739
- str << " error: conflicting asm renaming" ;
742
+ error () << " replacing asm renaming "
743
+ << asm_label_map[orig_name] << " by "
744
+ << asm_label << eom;
740
745
throw 0 ;
741
746
}
742
747
}
@@ -847,16 +852,34 @@ void c_typecheck_baset::typecheck_declaration(
847
852
if (!full_spec.alias .empty ())
848
853
{
849
854
if (symbol.value .is_not_nil ())
850
- throw " alias attribute cannot be used with a body" ;
855
+ {
856
+ err_location (symbol.location );
857
+ error () << " alias attribute cannot be used with a body"
858
+ << eom;
859
+ throw 0 ;
860
+ }
851
861
852
862
// alias function need not have been declared yet, thus
853
863
// can't lookup
854
864
symbol.value =symbol_exprt (full_spec.alias );
855
865
symbol.is_macro =true ;
856
866
}
857
867
858
- apply_asm_label (full_spec.asm_label , symbol);
868
+ if (full_spec.section .empty ())
869
+ apply_asm_label (full_spec.asm_label , symbol);
870
+ else
871
+ {
872
+ std::string asm_name;
873
+ asm_name=id2string (full_spec.section )+" $$" ;
874
+ if (!full_spec.asm_label .empty ())
875
+ asm_name+=id2string (full_spec.asm_label );
876
+ else
877
+ asm_name+=id2string (symbol.name );
878
+
879
+ apply_asm_label (asm_name, symbol);
880
+ }
859
881
irep_idt identifier=symbol.name ;
882
+ d_it->set_name (identifier);
860
883
861
884
typecheck_symbol (symbol);
862
885
0 commit comments