Changeset 9c23f31 for src/ResolvExpr
- Timestamp:
- Sep 24, 2016, 12:19:33 PM (9 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, stuck-waitfor-destruct, with_gc
- Children:
- 3b5e3aa
- Parents:
- 2298f728 (diff), 7ae930a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/ResolvExpr
- Files:
-
- 12 edited
-
AdjustExprType.cc (modified) (2 diffs)
-
AlternativeFinder.cc (modified) (6 diffs)
-
AlternativeFinder.h (modified) (3 diffs)
-
CommonType.cc (modified) (5 diffs)
-
ConversionCost.cc (modified) (3 diffs)
-
ConversionCost.h (modified) (1 diff)
-
PtrsAssignable.cc (modified) (2 diffs)
-
PtrsCastable.cc (modified) (2 diffs)
-
RenameVars.cc (modified) (1 diff)
-
RenameVars.h (modified) (1 diff)
-
Resolver.cc (modified) (2 diffs)
-
Unify.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AdjustExprType.cc
r2298f728 r9c23f31 37 37 virtual Type* mutate( TupleType *tupleType ); 38 38 virtual Type* mutate( VarArgsType *varArgsType ); 39 virtual Type* mutate( ZeroType *zeroType ); 40 virtual Type* mutate( OneType *oneType ); 39 41 40 42 const TypeEnvironment &env; … … 117 119 return varArgsType; 118 120 } 121 122 Type *AdjustExprType::mutate( ZeroType *zeroType ) { 123 return zeroType; 124 } 125 126 Type *AdjustExprType::mutate( OneType *oneType ) { 127 return oneType; 128 } 119 129 } // namespace ResolvExpr 120 130 -
src/ResolvExpr/AlternativeFinder.cc
r2298f728 r9c23f31 197 197 } 198 198 199 void AlternativeFinder::find( Expression *expr, bool adjust ) {199 void AlternativeFinder::find( Expression *expr, bool adjust, bool prune ) { 200 200 expr->accept( *this ); 201 201 if ( alternatives.empty() ) { … … 207 207 } 208 208 } 209 PRINT( 210 std::cerr << "alternatives before prune:" << std::endl; 211 printAlts( alternatives, std::cerr ); 212 ) 213 AltList::iterator oldBegin = alternatives.begin(); 214 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 215 if ( alternatives.begin() == oldBegin ) { 216 std::ostringstream stream; 217 stream << "Can't choose between alternatives for expression "; 218 expr->print( stream ); 219 stream << "Alternatives are:"; 220 AltList winners; 221 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 222 printAlts( winners, stream, 8 ); 223 throw SemanticError( stream.str() ); 224 } 225 alternatives.erase( oldBegin, alternatives.end() ); 226 PRINT( 227 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 228 ) 209 if ( prune ) { 210 PRINT( 211 std::cerr << "alternatives before prune:" << std::endl; 212 printAlts( alternatives, std::cerr ); 213 ) 214 AltList::iterator oldBegin = alternatives.begin(); 215 pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer ); 216 if ( alternatives.begin() == oldBegin ) { 217 std::ostringstream stream; 218 stream << "Can't choose between alternatives for expression "; 219 expr->print( stream ); 220 stream << "Alternatives are:"; 221 AltList winners; 222 findMinCost( alternatives.begin(), alternatives.end(), back_inserter( winners ) ); 223 printAlts( winners, stream, 8 ); 224 throw SemanticError( stream.str() ); 225 } 226 alternatives.erase( oldBegin, alternatives.end() ); 227 PRINT( 228 std::cerr << "there are " << alternatives.size() << " alternatives after elimination" << std::endl; 229 ) 230 } 229 231 230 232 // Central location to handle gcc extension keyword for all expression types. … … 234 236 } 235 237 236 void AlternativeFinder::findWithAdjustment( Expression *expr ) {237 find( expr, true );238 void AlternativeFinder::findWithAdjustment( Expression *expr, bool prune ) { 239 find( expr, true, prune ); 238 240 } 239 241 240 242 template< typename StructOrUnionType > 241 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const std::string &name ) {243 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ) { 242 244 std::list< Declaration* > members; 243 245 aggInst->lookup( name, members ); … … 760 762 if ( agg->expr->get_results().size() == 1 ) { 761 763 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_results().front() ) ) { 762 addAggMembers( structInst, agg->expr, agg->cost, memberExpr->get_member() );764 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 763 765 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_results().front() ) ) { 764 addAggMembers( unionInst, agg->expr, agg->cost, memberExpr->get_member() );766 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 765 767 } // if 766 768 } // if … … 789 791 renameTypes( alternatives.back().expr ); 790 792 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 791 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), "" );793 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 792 794 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 793 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), "" );795 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 794 796 } // if 795 797 } // for … … 1012 1014 alternatives.push_back( Alternative( impCpCtorExpr->clone(), env, Cost::zero ) ); 1013 1015 } 1016 1017 void AlternativeFinder::visit( ConstructorExpr * ctorExpr ) { 1018 AlternativeFinder finder( indexer, env ); 1019 // don't prune here, since it's guaranteed all alternatives will have the same type 1020 // (giving the alternatives different types is half of the point of ConstructorExpr nodes) 1021 finder.findWithAdjustment( ctorExpr->get_callExpr(), false ); 1022 for ( Alternative & alt : finder.alternatives ) { 1023 alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) ); 1024 } 1025 } 1014 1026 } // namespace ResolvExpr 1015 1027 -
src/ResolvExpr/AlternativeFinder.h
r2298f728 r9c23f31 29 29 public: 30 30 AlternativeFinder( const SymTab::Indexer &indexer, const TypeEnvironment &env ); 31 void find( Expression *expr, bool adjust = false );31 void find( Expression *expr, bool adjust = false, bool prune = true ); 32 32 /// Calls find with the adjust flag set; adjustment turns array and function types into equivalent pointer types 33 void findWithAdjustment( Expression *expr );33 void findWithAdjustment( Expression *expr, bool prune = true ); 34 34 AltList &get_alternatives() { return alternatives; } 35 35 … … 66 66 virtual void visit( TupleExpr *tupleExpr ); 67 67 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 68 virtual void visit( ConstructorExpr * ctorExpr ); 68 69 public: // xxx - temporary hack - should make Tuples::TupleAssignment a friend 69 70 template< typename InputIterator, typename OutputIterator > … … 72 73 private: 73 74 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 74 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const std::string &name );75 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ); 75 76 /// Adds alternatives for offsetof expressions, given the base type and name of the member 76 77 template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name ); -
src/ResolvExpr/CommonType.cc
r2298f728 r9c23f31 39 39 virtual void visit( TupleType *tupleType ); 40 40 virtual void visit( VarArgsType *varArgsType ); 41 virtual void visit( ZeroType *zeroType ); 42 virtual void visit( OneType *oneType ); 41 43 42 44 template< typename RefType > void handleRefType( RefType *inst, Type *other ); … … 134 136 result = new BasicType( basicType->get_qualifiers() + otherBasic->get_qualifiers(), newType ); 135 137 } // if 136 } else if ( EnumInstType *enumInstType = dynamic_cast< EnumInstType * >( type2 ) ) {137 // use signed int in lieu of the enum type138 } else if ( dynamic_cast< EnumInstType * > ( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) { 139 // use signed int in lieu of the enum/zero/one type 138 140 BasicType::Kind newType = combinedType[ basicType->get_kind() ][ BasicType::SignedInt ]; 139 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= enumInstType->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= enumInstType->get_qualifiers() ) || widenSecond ) ) {140 result = new BasicType( basicType->get_qualifiers() + enumInstType->get_qualifiers(), newType );141 if ( ( ( newType == basicType->get_kind() && basicType->get_qualifiers() >= type2->get_qualifiers() ) || widenFirst ) && ( ( newType != basicType->get_kind() && basicType->get_qualifiers() <= type2->get_qualifiers() ) || widenSecond ) ) { 142 result = new BasicType( basicType->get_qualifiers() + type2->get_qualifiers(), newType ); 141 143 } // if 142 144 } // if … … 171 173 otherPointer->get_base()->get_qualifiers() = tq2; 172 174 } // if 175 } else if ( widenSecond && dynamic_cast< ZeroType* >( type2 ) ) { 176 result = pointerType->clone(); 177 result->get_qualifiers() += type2->get_qualifiers(); 173 178 } // if 174 179 } … … 190 195 191 196 void CommonType::visit( EnumInstType *enumInstType ) { 192 if ( dynamic_cast< BasicType * >( type2 ) ) {197 if ( dynamic_cast< BasicType * >( type2 ) || dynamic_cast< ZeroType* >( type2 ) || dynamic_cast< OneType* >( type2 ) ) { 193 198 // reuse BasicType, EnumInstType code by swapping type2 with enumInstType 194 199 Type * temp = type2; … … 230 235 void CommonType::visit( VarArgsType *varArgsType ) { 231 236 } 237 238 void CommonType::visit( ZeroType *zeroType ) { 239 if ( widenFirst ) { 240 if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< PointerType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) { 241 if ( widenSecond || zeroType->get_qualifiers() <= type2->get_qualifiers() ) { 242 result = type2->clone(); 243 result->get_qualifiers() += zeroType->get_qualifiers(); 244 } 245 } 246 } 247 } 248 249 void CommonType::visit( OneType *oneType ) { 250 if ( widenFirst ) { 251 if ( dynamic_cast< BasicType* >( type2 ) || dynamic_cast< EnumInstType* >( type2 ) ) { 252 if ( widenSecond || oneType->get_qualifiers() <= type2->get_qualifiers() ) { 253 result = type2->clone(); 254 result->get_qualifiers() += oneType->get_qualifiers(); 255 } 256 } 257 } 258 } 232 259 } // namespace ResolvExpr 233 260 -
src/ResolvExpr/ConversionCost.cc
r2298f728 r9c23f31 160 160 // xxx - not positive this is correct, but appears to allow casting int => enum 161 161 cost = Cost( 1, 0, 0 ); 162 } // if 162 } else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) { 163 cost = Cost( 1, 0, 0 ); 164 } // if 163 165 } 164 166 … … 175 177 } // if 176 178 } // if 179 } else if ( dynamic_cast< ZeroType* >( dest ) != nullptr || dynamic_cast< OneType* >( dest ) != nullptr ) { 180 cost = Cost( 1, 0, 0 ); 177 181 } // if 178 182 } … … 256 260 } 257 261 } 262 263 void ConversionCost::visit(ZeroType *zeroType) { 264 if ( dynamic_cast< ZeroType* >( dest ) ) { 265 cost = Cost::zero; 266 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 267 // copied from visit(BasicType*) for signed int, but +1 for safe conversions 268 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ]; 269 if ( tableResult == -1 ) { 270 cost = Cost( 1, 0, 0 ); 271 } else { 272 cost = Cost( 0, 0, tableResult + 1 ); 273 } 274 } else if ( dynamic_cast< PointerType* >( dest ) ) { 275 cost = Cost( 0, 0, 1 ); 276 } 277 } 278 279 void ConversionCost::visit(OneType *oneType) { 280 if ( dynamic_cast< OneType* >( dest ) ) { 281 cost = Cost::zero; 282 } else if ( BasicType *destAsBasic = dynamic_cast< BasicType* >( dest ) ) { 283 // copied from visit(BasicType*) for signed int, but +1 for safe conversions 284 int tableResult = costMatrix[ BasicType::SignedInt ][ destAsBasic->get_kind() ]; 285 if ( tableResult == -1 ) { 286 cost = Cost( 1, 0, 0 ); 287 } else { 288 cost = Cost( 0, 0, tableResult + 1 ); 289 } 290 } 291 } 258 292 } // namespace ResolvExpr 259 293 -
src/ResolvExpr/ConversionCost.h
r2298f728 r9c23f31 41 41 virtual void visit(TupleType *tupleType); 42 42 virtual void visit(VarArgsType *varArgsType); 43 virtual void visit(ZeroType *zeroType); 44 virtual void visit(OneType *oneType); 43 45 protected: 44 46 Type *dest; -
src/ResolvExpr/PtrsAssignable.cc
r2298f728 r9c23f31 39 39 virtual void visit( TupleType *tupleType ); 40 40 virtual void visit( VarArgsType *varArgsType ); 41 virtual void visit( ZeroType *zeroType ); 42 virtual void visit( OneType *oneType ); 41 43 private: 42 44 Type *dest; … … 141 143 void PtrsAssignable::visit( VarArgsType *varArgsType ) { 142 144 } 145 146 void PtrsAssignable::visit( ZeroType *zeroType ) { 147 } 148 149 void PtrsAssignable::visit( OneType *oneType ) { 150 } 151 143 152 } // namespace ResolvExpr 144 153 -
src/ResolvExpr/PtrsCastable.cc
r2298f728 r9c23f31 40 40 virtual void visit(TupleType *tupleType); 41 41 virtual void visit(VarArgsType *varArgsType); 42 virtual void visit(ZeroType *zeroType); 43 virtual void visit(OneType *oneType); 42 44 private: 43 45 Type *dest; … … 144 146 result = objectCast( dest, env, indexer ); 145 147 } 148 149 void PtrsCastable::visit(ZeroType *zeroType) { 150 result = objectCast( dest, env, indexer ); 151 } 152 153 void PtrsCastable::visit(OneType *oneType) { 154 result = objectCast( dest, env, indexer ); 155 } 146 156 } // namespace ResolvExpr 147 157 -
src/ResolvExpr/RenameVars.cc
r2298f728 r9c23f31 110 110 } 111 111 112 void RenameVars::visit( ZeroType *zeroType ) { 113 typeBefore( zeroType ); 114 typeAfter( zeroType ); 115 } 116 117 void RenameVars::visit( OneType *oneType ) { 118 typeBefore( oneType ); 119 typeAfter( oneType ); 120 } 121 112 122 void RenameVars::typeBefore( Type *type ) { 113 123 if ( ! type->get_forall().empty() ) { -
src/ResolvExpr/RenameVars.h
r2298f728 r9c23f31 44 44 virtual void visit( TupleType *tupleType ); 45 45 virtual void visit( VarArgsType *varArgsType ); 46 virtual void visit( ZeroType *zeroType ); 47 virtual void visit( OneType *oneType ); 46 48 47 49 void typeBefore( Type *type ); -
src/ResolvExpr/Resolver.cc
r2298f728 r9c23f31 133 133 } else if ( BasicType *bt = dynamic_cast< BasicType * >( type ) ) { 134 134 return bt->isInteger(); 135 } else if ( dynamic_cast< ZeroType* >( type ) != nullptr || dynamic_cast< OneType* >( type ) != nullptr ) { 136 return true; 135 137 } else { 136 138 return false; … … 459 461 } 460 462 } else { 461 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) ); 463 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) 464 || dynamic_cast< ZeroType * >( initContext ) || dynamic_cast< OneType * >( initContext ) ); 462 465 // basic types are handled here 463 466 Visitor::visit( listInit ); -
src/ResolvExpr/Unify.cc
r2298f728 r9c23f31 60 60 virtual void visit(TupleType *tupleType); 61 61 virtual void visit(VarArgsType *varArgsType); 62 virtual void visit(ZeroType *zeroType); 63 virtual void visit(OneType *oneType); 62 64 63 65 template< typename RefType > void handleRefType( RefType *inst, Type *other ); … … 588 590 } 589 591 592 void Unify::visit(ZeroType *zeroType) { 593 result = dynamic_cast< ZeroType* >( type2 ); 594 } 595 596 void Unify::visit(OneType *oneType) { 597 result = dynamic_cast< OneType* >( type2 ); 598 } 599 590 600 } // namespace ResolvExpr 591 601
Note:
See TracChangeset
for help on using the changeset viewer.