Changeset 64071c2 for src/ResolvExpr
- Timestamp:
- Jun 6, 2016, 2:16:00 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:
- 7baed7d
- Parents:
- 321a2481
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r321a2481 r64071c2 516 516 517 517 void Resolver::visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) { 518 // this code is fairly gross. If VariableExpr didn't have its own results list then this could be cleaned up a bit 519 // by remembering the ObjectDecl in the ImplicitCtorDtorStmt and changing the ObjectDecl's type temporarily, but currently 520 // VariableExprs have their own type list which is manipulated in AlternativeFinder (e.g. in inferRecursive). 521 522 // before resolving ctor/dtor, need to remove type qualifiers from the first argument (the object being constructed) 518 // before resolving ctor/dtor, need to remove type qualifiers from the first argument (the object being constructed). 519 // Do this through a cast expression to greatly simplify the code. 523 520 Expression * callExpr = InitTweak::getCtorDtorCall( impCtorDtorStmt ); 524 521 assert( callExpr ); 525 Expression * constructee = InitTweak::getCallArg( callExpr, 0 );522 Expression *& constructee = InitTweak::getCallArg( callExpr, 0 ); 526 523 Type * type = 0; 524 525 // need to find the type of the first argument, which is unfortunately not uniform since array construction 526 // includes an untyped '+' expression. 527 527 if ( UntypedExpr * plusExpr = dynamic_cast< UntypedExpr * >( constructee ) ) { 528 528 // constructee is <array>+<index> … … 531 531 assert( dynamic_cast< VariableExpr * >( arr ) ); 532 532 assert( arr && arr->get_results().size() == 1 ); 533 type = InitTweak::getPointerBase( arr->get_results().front() ); 534 assert( type ); 533 type = arr->get_results().front()->clone(); 535 534 } else { 536 535 // otherwise, constructing a plain object, which means the object's address is being taken. … … 539 538 assert( constructee->get_results().size() == 1 ); 540 539 AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee ); 541 assert( addrExpr ); 542 VariableExpr * varExpr = dynamic_cast< VariableExpr * >( addrExpr->get_arg() ); 543 assert( varExpr && varExpr->get_results().size() == 1 ); 544 type = varExpr->get_results().front(); 545 } 546 // remember qualifiers so they can be replaced 547 Type::Qualifiers qualifiers = type->get_qualifiers(); 548 540 assert( addrExpr && addrExpr->get_results().size() == 1); 541 type = addrExpr->get_results().front()->clone(); 542 } 543 // cast to T* with qualifiers removed. 549 544 // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument 550 545 // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever 551 546 // remove lvalue as a qualifier, this can change to 552 547 // type->get_qualifiers() = Type::Qualifiers(); 553 type->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true); 548 Type * base = InitTweak::getPointerBase( type ); 549 assert( base ); 550 base->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true); 551 // if pointer has lvalue qualifier, cast won't appear in output 552 type->set_isLvalue( false ); 553 constructee = new CastExpr( constructee, type ); 554 554 555 555 // finally, resolve the ctor/dtor 556 556 impCtorDtorStmt->get_callStmt()->accept( *this ); 557 558 // reset type qualifiers, but first need to figure out where everything is again559 // 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 fixed566 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 object574 // replace qualifiers on AddressExpr and on inner VariableExpr575 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 }587 557 } 588 558 } // namespace ResolvExpr
Note: See TracChangeset
for help on using the changeset viewer.