Changeset 5ccb10d for src/ResolvExpr/ConversionCost.cc
- Timestamp:
- Aug 22, 2017, 6:41:28 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:
- 0b5d871
- Parents:
- d104b02
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ConversionCost.cc
rd104b02 r5ccb10d 28 28 const Cost Cost::reference = Cost( 0, 0, 0, 1 ); 29 29 30 #if 0 31 #define PRINT(x) x 32 #else 33 #define PRINT(x) 34 #endif 30 35 31 36 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { … … 33 38 EqvClass eqvClass; 34 39 NamedTypeDecl *namedType; 35 /// std::cout << "type inst " << destAsTypeInst->get_name(); 40 PRINT( std::cerr << "type inst " << destAsTypeInst->get_name(); ) 36 41 if ( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) { 37 42 if ( eqvClass.type ) { … … 41 46 } 42 47 } else if ( ( namedType = indexer.lookupType( destAsTypeInst->get_name() ) ) ) { 43 /// std::cout << " found" << std::endl; 48 PRINT( std::cerr << " found" << std::endl; ) 44 49 TypeDecl *type = dynamic_cast< TypeDecl* >( namedType ); 45 50 // all typedefs should be gone by this point … … 49 54 } // if 50 55 } // if 51 /// std::cout << " not found" << std::endl; 52 } // if 53 /// std::cout << "src is "; 54 /// src->print( std::cout ); 55 /// std::cout << std::endl << "dest is "; 56 /// dest->print( std::cout ); 57 /// std::cout << std::endl << "env is" << std::endl; 58 /// env.print( std::cout, 8 ); 56 PRINT( std::cerr << " not found" << std::endl; ) 57 } // if 58 PRINT( 59 std::cerr << "src is "; 60 src->print( std::cerr ); 61 std::cerr << std::endl << "dest is "; 62 dest->print( std::cerr ); 63 std::cerr << std::endl << "env is" << std::endl; 64 env.print( std::cerr, 8 ); 65 ) 59 66 if ( typesCompatibleIgnoreQualifiers( src, dest, indexer, env ) ) { 60 /// std::cout << "compatible!" << std::endl; 67 PRINT( std::cerr << "compatible!" << std::endl; ) 61 68 return Cost::zero; 62 69 } else if ( dynamic_cast< VoidType* >( dest ) ) { 63 70 return Cost::safe; 64 71 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 65 // std::cerr << "conversionCost: dest is reference" << std::endl;72 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 66 73 return convertToReferenceCost( src, refType, indexer, env ); 67 74 } else { … … 77 84 78 85 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 79 // std::cerr << "convert to reference cost..." << std::endl;86 PRINT( std::cerr << "convert to reference cost..." << std::endl; ) 80 87 if ( diff > 0 ) { 81 88 // TODO: document this … … 92 99 ReferenceType * destAsRef = dynamic_cast< ReferenceType * >( dest ); 93 100 if ( srcAsRef && destAsRef ) { // pointer-like conversions between references 94 // std::cerr << "converting between references" << std::endl;101 PRINT( std::cerr << "converting between references" << std::endl; ) 95 102 if ( srcAsRef->get_base()->get_qualifiers() <= destAsRef->get_base()->get_qualifiers() && typesCompatibleIgnoreQualifiers( srcAsRef->get_base(), destAsRef->get_base(), indexer, env ) ) { 96 103 return Cost::safe; 97 104 } else { // xxx - this discards reference qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 98 105 int assignResult = ptrsAssignable( srcAsRef->get_base(), destAsRef->get_base(), env ); 106 PRINT( std::cerr << "comparing references: " << assignResult << " " << srcAsRef << " " << destAsRef << std::endl; ) 99 107 if ( assignResult < 0 ) { 100 108 return Cost::safe; … … 104 112 } // if 105 113 } else { 106 // std::cerr << "reference to rvalue conversion" << std::endl;114 PRINT( std::cerr << "reference to rvalue conversion" << std::endl; ) 107 115 ConversionCost converter( dest, indexer, env ); 108 116 src->accept( converter ); … … 113 121 assert( diff == -1 && destAsRef ); 114 122 if ( typesCompatibleIgnoreQualifiers( src, destAsRef->get_base(), indexer, env ) ) { 115 // std::cerr << "converting compatible base type" << std::endl;123 PRINT( std::cerr << "converting compatible base type" << std::endl; ) 116 124 if ( src->get_lvalue() ) { 117 // std::cerr << "lvalue to reference conversion" << std::endl; 125 PRINT( 126 std::cerr << "lvalue to reference conversion" << std::endl; 127 std::cerr << src << " => " << destAsRef << std::endl; 128 ) 118 129 // lvalue-to-reference conversion: cv lvalue T => cv T & 119 130 if ( src->get_qualifiers() == destAsRef->get_base()->get_qualifiers() ) { … … 125 136 } // if 126 137 } else if ( destAsRef->get_base()->get_const() ) { 127 // std::cerr << "rvalue to const ref conversion" << std::endl;138 PRINT( std::cerr << "rvalue to const ref conversion" << std::endl; ) 128 139 // rvalue-to-const-reference conversion: T => const T & 129 140 return Cost::safe; 130 141 } else { 131 // std::cerr << "rvalue to non-const reference conversion" << std::endl;142 PRINT( std::cerr << "rvalue to non-const reference conversion" << std::endl; ) 132 143 // rvalue-to-reference conversion: T => T & 133 144 return Cost::unsafe; 134 145 } // if 135 146 } // if 136 // std::cerr << "attempting to convert from incompatible base type -- fail" << std::endl;147 PRINT( std::cerr << "attempting to convert from incompatible base type -- fail" << std::endl; ) 137 148 } 138 149 return Cost::infinity; … … 248 259 void ConversionCost::visit(PointerType *pointerType) { 249 260 if ( PointerType *destAsPtr = dynamic_cast< PointerType* >( dest ) ) { 250 // std::cerr << pointerType << " ===> " << destAsPtr;261 PRINT( std::cerr << pointerType << " ===> " << destAsPtr; ) 251 262 Type::Qualifiers tq1 = pointerType->get_base()->get_qualifiers(); 252 263 Type::Qualifiers tq2 = destAsPtr->get_base()->get_qualifiers(); … … 257 268 } else { 258 269 // types are the same, except otherPointer has more qualifiers 259 // std::cerr << " :: compatible and good qualifiers" << std::endl;270 PRINT( std::cerr << " :: compatible and good qualifiers" << std::endl; ) 260 271 cost = Cost::safe; 261 272 } 262 273 } else { // xxx - this discards qualifiers from consideration -- reducing qualifiers is a safe conversion; is this right? 263 274 int assignResult = ptrsAssignable( pointerType->get_base(), destAsPtr->get_base(), env ); 264 // std::cerr << " :: " << assignResult << std::endl;275 PRINT( std::cerr << " :: " << assignResult << std::endl; ) 265 276 if ( assignResult < 0 && pointerType->get_base()->get_qualifiers() <= destAsPtr->get_qualifiers() ) { 266 277 cost = Cost::safe; … … 291 302 cost.incUnsafe(); // lose qualifiers as last resort 292 303 } 293 // std::cerr << refType << " ==> " << dest << " " << cost << std::endl;304 PRINT( std::cerr << refType << " ==> " << dest << " " << cost << std::endl; ) 294 305 } 295 306
Note: See TracChangeset
for help on using the changeset viewer.