- File:
-
- 1 edited
-
src/ResolvExpr/ConversionCost.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
r0c6596f r5ccb10d 15 15 16 16 #include "ConversionCost.h" 17 18 #include <cassert> // for assert 19 #include <list> // for list, list<>::const_iterator 20 #include <string> // for operator==, string 21 22 #include "ResolvExpr/Cost.h" // for Cost 23 #include "ResolvExpr/TypeEnvironment.h" // for EqvClass, TypeEnvironment 24 #include "SymTab/Indexer.h" // for Indexer 25 #include "SynTree/Declaration.h" // for TypeDecl, NamedTypeDecl 26 #include "SynTree/Type.h" // for Type, BasicType, TypeInstType 27 #include "typeops.h" // for typesCompatibleIgnoreQualifiers 17 #include "typeops.h" 18 #include "SynTree/Type.h" 19 #include "SynTree/Visitor.h" 20 #include "SymTab/Indexer.h" 28 21 29 22 namespace ResolvExpr { … … 40 33 #define PRINT(x) 41 34 #endif 35 42 36 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 43 37 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { … … 77 71 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 78 72 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 79 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer &){ 80 return ptrsAssignable( t1, t2, env ); 81 }); 73 return convertToReferenceCost( src, refType, indexer, env ); 82 74 } else { 83 75 ConversionCost converter( dest, indexer, env ); … … 91 83 } 92 84 93 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env , PtrsFunction func) {85 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 94 86 PRINT( std::cerr << "convert to reference cost..." << std::endl; ) 95 87 if ( diff > 0 ) { 96 88 // TODO: document this 97 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env , func);89 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env ); 98 90 cost.incReference(); 99 91 return cost; 100 92 } else if ( diff < -1 ) { 101 93 // TODO: document this 102 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env , func);94 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env ); 103 95 cost.incReference(); 104 96 return cost; … … 111 103 return Cost::safe; 112 104 } else { // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 113 int assignResult = func( srcAsRef->get_base(), destAsRef->get_base(), env, indexer);105 int assignResult = ptrsAssignable( srcAsRef->get_base(), destAsRef->get_base(), env ); 114 106 PRINT( std::cerr << "comparing references: " << assignResult << " " << srcAsRef << " " << destAsRef << std::endl; ) 115 107 if ( assignResult < 0 ) { … … 158 150 } 159 151 160 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env , PtrsFunction func) {152 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 161 153 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 162 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env , func);154 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env ); 163 155 } 164 156
Note:
See TracChangeset
for help on using the changeset viewer.