|
11 | 11 |
|
12 | 12 | #include "c_typecheck_base.h" |
13 | 13 |
|
| 14 | +#include <util/invariant.h> |
14 | 15 | #include <util/std_types.h> |
15 | 16 | #include <util/prefix.h> |
16 | 17 | #include <util/config.h> |
@@ -256,6 +257,16 @@ void c_typecheck_baset::typecheck_redefinition_non_type( |
256 | 257 | // this is ok, just use old type |
257 | 258 | new_symbol.type=old_symbol.type; |
258 | 259 | } |
| 260 | + else if(final_old.id()==ID_array && |
| 261 | + to_array_type(final_old).size().is_nil() && |
| 262 | + initial_new.id()==ID_array && |
| 263 | + to_array_type(initial_new).size().is_not_nil() && |
| 264 | + final_old.subtype()==initial_new.subtype()) |
| 265 | + { |
| 266 | + // update the type to enable the use of sizeof(x) on the |
| 267 | + // right-hand side of a definition of x |
| 268 | + old_symbol.type=new_symbol.type; |
| 269 | + } |
259 | 270 |
|
260 | 271 | // do initializer, this may change the type |
261 | 272 | if(follow(new_symbol.type).id()!=ID_code && |
@@ -386,36 +397,14 @@ void c_typecheck_baset::typecheck_redefinition_non_type( |
386 | 397 | if(final_old!=final_new) |
387 | 398 | { |
388 | 399 | if(final_old.id()==ID_array && |
389 | | - to_array_type(final_old).size().is_nil() && |
390 | | - final_new.id()==ID_array && |
391 | | - to_array_type(final_new).size().is_not_nil() && |
392 | | - final_old.subtype()==final_new.subtype()) |
| 400 | + to_array_type(final_old).size().is_nil() && |
| 401 | + final_new.id()==ID_array && |
| 402 | + to_array_type(final_new).size().is_not_nil() && |
| 403 | + final_old.subtype()==final_new.subtype()) |
393 | 404 | { |
394 | | - // this is also ok |
395 | | - if(old_symbol.type.id()==ID_symbol) |
396 | | - { |
397 | | - // fix the symbol, not just the type |
398 | | - const irep_idt identifier= |
399 | | - to_symbol_type(old_symbol.type).get_identifier(); |
400 | | - |
401 | | - symbol_tablet::symbolst::iterator s_it= |
402 | | - symbol_table.symbols.find(identifier); |
403 | | - |
404 | | - if(s_it==symbol_table.symbols.end()) |
405 | | - { |
406 | | - error().source_location=old_symbol.location; |
407 | | - error() << "typecheck_redefinition_non_type: " |
408 | | - << "failed to find symbol `" << identifier << "'" |
409 | | - << eom; |
410 | | - throw 0; |
411 | | - } |
412 | | - |
413 | | - symbolt &symbol=s_it->second; |
414 | | - |
415 | | - symbol.type=final_new; |
416 | | - } |
417 | | - else |
418 | | - old_symbol.type=new_symbol.type; |
| 405 | + // we don't do symbol types for arrays anymore |
| 406 | + PRECONDITION(old_symbol.type.id()!=ID_symbol); |
| 407 | + old_symbol.type=new_symbol.type; |
419 | 408 | } |
420 | 409 | else if((final_old.id()==ID_incomplete_c_enum || |
421 | 410 | final_old.id()==ID_c_enum) && |
|
0 commit comments