Changes in / [1cb758f2:eca3d10a]
- Location:
- src
- Files:
-
- 10 edited
-
GenPoly/Box.cc (modified) (2 diffs)
-
InitTweak/InitTweak.cc (modified) (2 diffs)
-
ResolvExpr/AlternativeFinder.cc (modified) (4 diffs)
-
ResolvExpr/CastCost.cc (modified) (1 diff)
-
ResolvExpr/ConversionCost.cc (modified) (5 diffs)
-
ResolvExpr/ConversionCost.h (modified) (3 diffs)
-
SymTab/Indexer.cc (modified) (1 diff)
-
SymTab/Validate.cc (modified) (1 diff)
-
SynTree/Expression.cc (modified) (1 diff)
-
tests/multiDimension.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r1cb758f2 reca3d10a 756 756 Type * newType = arg->get_result()->clone(); 757 757 if ( env ) env->apply( newType ); 758 std:: unique_ptr<Type> manager( newType );758 std::auto_ptr<Type> manager( newType ); 759 759 if ( isPolyType( newType ) ) { 760 760 // if the argument's type is polymorphic, we don't need to box again! … … 774 774 newObj->get_type()->get_qualifiers() = Type::Qualifiers(); // TODO: is this right??? 775 775 stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) ); 776 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); // TODO: why doesn't this just use initialization syntax?776 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 777 777 assign->get_args().push_back( new VariableExpr( newObj ) ); 778 778 assign->get_args().push_back( arg ); -
src/InitTweak/InitTweak.cc
r1cb758f2 reca3d10a 418 418 assertf( ! tuple->get_exprs().empty(), "TupleAssignExpr somehow has empty tuple expr." ); 419 419 return getCallArg( tuple->get_exprs().front(), pos ); 420 } else if ( ImplicitCopyCtorExpr * copyCtor = dynamic_cast< ImplicitCopyCtorExpr * >( callExpr ) ) {421 return getCallArg( copyCtor->callExpr, pos );422 420 } else { 423 421 assertf( false, "Unexpected expression type passed to getCallArg: %s", toString( callExpr ).c_str() ); … … 452 450 } else if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( func ) ) { 453 451 return handleDerefName( appExpr ); 454 } else if ( ConstructorExpr * ctorExpr = dynamic_cast< ConstructorExpr * >( func ) ) {455 return funcName( getCallArg( ctorExpr->get_callExpr(), 0 ) );456 452 } else { 457 assertf( false, "Unexpected expression type being called as a function in call expression : %s", toString( func ).c_str());453 assertf( false, "Unexpected expression type being called as a function in call expression" ); 458 454 } 459 455 } -
src/ResolvExpr/AlternativeFinder.cc
r1cb758f2 reca3d10a 698 698 699 699 void AlternativeFinder::visit( UntypedExpr *untypedExpr ) { 700 bool doneInit = false; 701 AlternativeFinder funcOpFinder( indexer, env ); 702 703 AlternativeFinder funcFinder( indexer, env ); 704 700 705 { 701 706 std::string fname = InitTweak::getFunctionName( untypedExpr ); … … 710 715 } 711 716 712 AlternativeFinder funcFinder( indexer, env );713 717 funcFinder.findWithAdjustment( untypedExpr->get_function() ); 714 // if there are no function alternatives, then proceeding is a waste of time.715 if ( funcFinder.alternatives.empty() ) return;716 717 718 std::list< AlternativeFinder > argAlternatives; 718 719 findSubExprs( untypedExpr->begin_args(), untypedExpr->end_args(), back_inserter( argAlternatives ) ); … … 724 725 // if not tuple assignment, assignment is taken care of as a normal function call 725 726 Tuples::handleTupleAssignment( *this, untypedExpr, possibilities ); 726 727 // find function operators728 AlternativeFinder funcOpFinder( indexer, env );729 NameExpr *opExpr = new NameExpr( "?()" );730 try {731 funcOpFinder.findWithAdjustment( opExpr );732 } catch( SemanticError &e ) {733 // it's ok if there aren't any defined function ops734 }735 PRINT(736 std::cerr << "known function ops:" << std::endl;737 printAlts( funcOpFinder.alternatives, std::cerr, 8 );738 )739 727 740 728 AltList candidates; … … 766 754 } // if 767 755 } // if 768 } 769 770 // try each function operator ?() with the current function alternative and each of the argument combinations 771 for ( AltList::iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 772 // check if the type is pointer to function 773 if ( PointerType *pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result()->stripReferences() ) ) { 774 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 775 referenceToRvalueConversion( funcOp->expr ); 776 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 777 AltList currentAlt; 778 currentAlt.push_back( *func ); 779 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 780 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 781 } // for 756 } else { 757 // seek a function operator that's compatible 758 if ( ! doneInit ) { 759 doneInit = true; 760 NameExpr *opExpr = new NameExpr( "?()" ); 761 try { 762 funcOpFinder.findWithAdjustment( opExpr ); 763 } catch( SemanticError &e ) { 764 // it's ok if there aren't any defined function ops 765 } 766 PRINT( 767 std::cerr << "known function ops:" << std::endl; 768 printAlts( funcOpFinder.alternatives, std::cerr, 8 ); 769 ) 770 } 771 772 for ( AltList::iterator funcOp = funcOpFinder.alternatives.begin(); funcOp != funcOpFinder.alternatives.end(); ++funcOp ) { 773 // check if the type is pointer to function 774 if ( PointerType *pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result()->stripReferences() ) ) { 775 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 776 referenceToRvalueConversion( funcOp->expr ); 777 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { 778 AltList currentAlt; 779 currentAlt.push_back( *func ); 780 currentAlt.insert( currentAlt.end(), actualAlt->begin(), actualAlt->end() ); 781 makeFunctionAlternatives( *funcOp, function, currentAlt, std::back_inserter( candidates ) ); 782 } // for 783 } // if 782 784 } // if 783 } // if784 } // for785 } // for 786 } // if 785 787 } catch ( SemanticError &e ) { 786 788 errors.append( e ); -
src/ResolvExpr/CastCost.cc
r1cb758f2 reca3d10a 58 58 return Cost::safe; 59 59 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 60 return convertToReferenceCost( src, refType, indexer, env, [](Type * t1, Type * t2, const TypeEnvironment & env, const SymTab::Indexer & indexer) { 61 return ptrsCastable( t1, t2, env, indexer ); 62 }); 60 return convertToReferenceCost( src, refType, indexer, env ); 63 61 } else { 64 62 CastCost converter( dest, indexer, env ); -
src/ResolvExpr/ConversionCost.cc
r1cb758f2 reca3d10a 40 40 #define PRINT(x) 41 41 #endif 42 42 43 Cost conversionCost( Type *src, Type *dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 43 44 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { … … 77 78 } else if ( ReferenceType * refType = dynamic_cast< ReferenceType * > ( dest ) ) { 78 79 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 }); 80 return convertToReferenceCost( src, refType, indexer, env ); 82 81 } else { 83 82 ConversionCost converter( dest, indexer, env ); … … 91 90 } 92 91 93 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env , PtrsFunction func) {92 Cost convertToReferenceCost( Type * src, Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 94 93 PRINT( std::cerr << "convert to reference cost..." << std::endl; ) 95 94 if ( diff > 0 ) { 96 95 // TODO: document this 97 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env , func);96 Cost cost = convertToReferenceCost( safe_dynamic_cast< ReferenceType * >( src )->get_base(), dest, diff-1, indexer, env ); 98 97 cost.incReference(); 99 98 return cost; 100 99 } else if ( diff < -1 ) { 101 100 // TODO: document this 102 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env , func);101 Cost cost = convertToReferenceCost( src, safe_dynamic_cast< ReferenceType * >( dest )->get_base(), diff+1, indexer, env ); 103 102 cost.incReference(); 104 103 return cost; … … 111 110 return Cost::safe; 112 111 } 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);112 int assignResult = ptrsAssignable( srcAsRef->get_base(), destAsRef->get_base(), env ); 114 113 PRINT( std::cerr << "comparing references: " << assignResult << " " << srcAsRef << " " << destAsRef << std::endl; ) 115 114 if ( assignResult < 0 ) { … … 158 157 } 159 158 160 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env , PtrsFunction func) {159 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 161 160 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 162 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env , func);161 return convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env ); 163 162 } 164 163 -
src/ResolvExpr/ConversionCost.h
r1cb758f2 reca3d10a 16 16 #pragma once 17 17 18 #include <functional> // for function19 20 18 #include "Cost.h" // for Cost 21 19 #include "SynTree/Visitor.h" // for Visitor … … 23 21 24 22 namespace SymTab { 25 class Indexer;23 class Indexer; 26 24 } // namespace SymTab 27 25 28 26 namespace ResolvExpr { 29 class TypeEnvironment;27 class TypeEnvironment; 30 28 31 29 class ConversionCost : public Visitor { … … 57 55 }; 58 56 59 typedef std::function<int(Type *, Type *, const TypeEnvironment &, const SymTab::Indexer &)> PtrsFunction; 60 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 57 Cost convertToReferenceCost( Type * src, ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 61 58 } // namespace ResolvExpr 62 59 -
src/SymTab/Indexer.cc
r1cb758f2 reca3d10a 345 345 leaveScope(); 346 346 347 debugPrint( "Adding trait " << aggregateDecl->get_name() << std::endl );347 debugPrint( "Adding context " << aggregateDecl->get_name() << std::endl ); 348 348 addTrait( aggregateDecl ); 349 349 } -
src/SymTab/Validate.cc
r1cb758f2 reca3d10a 467 467 return; 468 468 } 469 470 // handle other traits471 469 TraitDecl *traitDecl = indexer->lookupTrait( traitInst->get_name() ); 472 470 if ( ! traitDecl ) { -
src/SynTree/Expression.cc
r1cb758f2 reca3d10a 645 645 } 646 646 } 647 // ensure that StmtExpr has a result type648 if ( ! result ) {649 set_result( new VoidType( Type::Qualifiers() ) );650 }651 647 } 652 648 StmtExpr::StmtExpr( const StmtExpr &other ) : Expression( other ), statements( other.statements->clone() ) { -
src/tests/multiDimension.c
r1cb758f2 reca3d10a 59 59 } 60 60 61 // ensure constructed const arrays continue to compile62 const int global[1] = { -2 };63 64 61 int main() { 65 62 X abc[4][4] = {
Note:
See TracChangeset
for help on using the changeset viewer.