Changeset a61ad31 for src/ResolvExpr
- Timestamp:
- Jul 12, 2017, 4:53:25 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 49148d5
- Parents:
- 084fecc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r084fecc ra61ad31 305 305 std::cerr << std::endl << " to "; 306 306 formalType->print( std::cerr, 8 ); 307 std::cerr << std::endl << "environment is: "; 308 alt.env.print( std::cerr, 8 ); 309 std::cerr << std::endl; 307 310 ) 308 311 Cost newCost = conversionCost( actualType, formalType, indexer, alt.env ); … … 400 403 Expression * actual = actualIt->expr; 401 404 Type * actualType = actual->get_result(); 405 402 406 PRINT( 403 407 std::cerr << "formal type is "; … … 643 647 makeExprList( instantiatedActuals, appExpr->get_args() ); 644 648 PRINT( 649 std::cerr << "instantiate function success: " << appExpr << std::endl; 645 650 std::cerr << "need assertions:" << std::endl; 646 651 printAssertionSet( resultNeed, std::cerr, 8 ); … … 753 758 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 754 759 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 755 std::cerr << "Case +++++++++++++ "<< std::endl;760 std::cerr << "Case +++++++++++++ " << appExpr->get_function() << std::endl; 756 761 std::cerr << "formals are:" << std::endl; 757 762 printAll( function->get_parameters(), std::cerr, 8 ); … … 796 801 bool isLvalue( Expression *expr ) { 797 802 // xxx - recurse into tuples? 798 return expr->has_result() && expr->get_result()->get_lvalue();803 return expr->has_result() && ( expr->get_result()->get_lvalue() || dynamic_cast< ReferenceType * >( expr->get_result() ) ); 799 804 } 800 805 … … 882 887 funcFinder.findWithAdjustment( memberExpr->get_aggregate() ); 883 888 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 884 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() ) ) { 885 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 886 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) { 887 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 888 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( agg->expr->get_result() ) ) { 889 addTupleMembers( tupleType, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 889 // it's okay for the aggregate expression to have reference type -- cast it to the base type to treat the aggregate as the referenced value 890 std::unique_ptr<Expression> aggrExpr( agg->expr->clone() ); 891 Type * aggrType = aggrExpr->get_result(); 892 if ( dynamic_cast< ReferenceType * >( aggrType ) ) { 893 aggrType = aggrType->stripReferences(); 894 aggrExpr.reset( new CastExpr( aggrExpr.release(), aggrType->clone() ) ); 895 } 896 897 // find member of the given type 898 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) { 899 addAggMembers( structInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() ); 900 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) { 901 addAggMembers( unionInst, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() ); 902 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( aggrExpr->get_result() ) ) { 903 addTupleMembers( tupleType, aggrExpr.get(), agg->cost, agg->env, memberExpr->get_member() ); 890 904 } // if 891 905 } // for
Note: See TracChangeset
for help on using the changeset viewer.