|
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