Changeset 10a7775 for src/ResolvExpr
- Timestamp:
- Jun 3, 2016, 2:02:29 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- e365cb5
- Parents:
- e01bfbc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
re01bfbc r10a7775 531 531 assert( dynamic_cast< VariableExpr * >( arr ) ); 532 532 assert( arr && arr->get_results().size() == 1 ); 533 ArrayType * arrType = dynamic_cast< ArrayType * >( arr->get_results().front() ); 534 assert( arrType ); 535 type = arrType->get_base(); 533 type = InitTweak::getPointerBase( arr->get_results().front() ); 534 assert( type ); 536 535 } else { 537 536 // otherwise, constructing a plain object, which means the object's address is being taken. … … 557 556 impCtorDtorStmt->get_callStmt()->accept( *this ); 558 557 559 // and reset type qualifiers after resolving 560 type->get_qualifiers() = qualifiers; 558 // reset type qualifiers, but first need to figure out where everything is again 559 // because the expressions are often changed by the resolver. 560 callExpr = InitTweak::getCtorDtorCall( impCtorDtorStmt ); 561 assert( callExpr ); 562 constructee = InitTweak::getCallArg( callExpr, 0 ); 563 if ( ApplicationExpr * plusExpr = dynamic_cast< ApplicationExpr * >( constructee ) ) { 564 // constructee is <array>+<index> 565 // get Variable <array>, then get the base type of the VariableExpr - this is the type that needs to be fixed 566 Expression * arr = InitTweak::getCallArg( plusExpr, 0 ); 567 assert( dynamic_cast< VariableExpr * >( arr ) ); 568 assert( arr && arr->get_results().size() == 1 ); 569 type = InitTweak::getPointerBase( arr->get_results().front() ); 570 assert( type ); 571 type->get_qualifiers() = qualifiers; 572 } else { 573 // otherwise constructing a plain object 574 // replace qualifiers on AddressExpr and on inner VariableExpr 575 assert( constructee->get_results().size() == 1 ); 576 AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee ); 577 assert( addrExpr ); 578 type = InitTweak::getPointerBase( addrExpr->get_results().front() ); 579 assert( type ); 580 type->get_qualifiers() = qualifiers; 581 582 VariableExpr * varExpr = dynamic_cast< VariableExpr * >( addrExpr->get_arg() ); 583 assert( varExpr && varExpr->get_results().size() == 1 ); 584 type = varExpr->get_results().front(); 585 type->get_qualifiers() = qualifiers; 586 } 561 587 } 562 588 } // namespace ResolvExpr
Note: See TracChangeset
for help on using the changeset viewer.