Changeset 64ac636 for src/Tuples
- Timestamp:
- Mar 17, 2017, 1:14:07 PM (8 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:
- b2f5082
- Parents:
- 1fbab5a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Tuples/TupleExpansion.cc ¶
r1fbab5a r64ac636 126 126 /// given a expression representing the member and an expression representing the aggregate, 127 127 /// reconstructs a flattened UntypedMemberExpr with the right precedence 128 Expression * reconstructMemberExpr( Expression * member, Expression * aggr ) {128 Expression * reconstructMemberExpr( Expression * member, Expression * aggr, CodeLocation & loc ) { 129 129 if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) { 130 130 // construct a new UntypedMemberExpr with the correct structure , and recursively 131 131 // expand that member expression. 132 132 MemberTupleExpander expander; 133 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) ); 134 133 UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ); 134 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), inner ); 135 inner->location = newMemberExpr->location = loc; 135 136 memberExpr->set_member(nullptr); 136 137 memberExpr->set_aggregate(nullptr); … … 139 140 } else { 140 141 // not a member expression, so there is nothing to do but attach and return 141 return new UntypedMemberExpr( member, aggr->clone() ); 142 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( member, aggr->clone() ); 143 newMemberExpr->location = loc; 144 return newMemberExpr; 142 145 } 143 146 } … … 152 155 aggr = new UniqueExpr( aggr ); 153 156 for ( Expression *& expr : tupleExpr->get_exprs() ) { 154 expr = reconstructMemberExpr( expr, aggr ); 157 expr = reconstructMemberExpr( expr, aggr, memberExpr->location ); 158 expr->location = memberExpr->location; 155 159 } 156 160 delete aggr; 161 tupleExpr->location = memberExpr->location; 157 162 return tupleExpr; 158 163 } else { 159 164 // there may be a tuple expr buried in the aggregate 160 165 // xxx - this is a memory leak 161 return new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) ); 166 UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) ); 167 newMemberExpr->location = memberExpr->location; 168 return newMemberExpr; 162 169 } 163 170 }
Note: See TracChangeset
for help on using the changeset viewer.