Changeset b2daebd4 for src/ResolvExpr
- Timestamp:
- Mar 29, 2017, 4:37:00 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:
- ee68e11
- Parents:
- 95448f1e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Unify.cc
r95448f1e rb2daebd4 134 134 case TypeDecl::Ftype: 135 135 return isFtype( type, indexer ); 136 136 case TypeDecl::Ttype: 137 137 // ttype unifies with any tuple type 138 138 return dynamic_cast< TupleType * >( type ) || Tuples::isTtype( type ); … … 592 592 for ( ; it != params.end() && jt != otherParams.end(); ++it, ++jt ) { 593 593 TypeExpr *param = dynamic_cast< TypeExpr* >(*it); 594 assert (param &&"Aggregate parameters should be type expressions");594 assertf(param, "Aggregate parameters should be type expressions"); 595 595 TypeExpr *otherParam = dynamic_cast< TypeExpr* >(*jt); 596 assert(otherParam && "Aggregate parameters should be type expressions"); 597 598 if ( ! unifyExact( param->get_type(), otherParam->get_type(), env, needAssertions, haveAssertions, openVars, WidenMode(false, false), indexer ) ) { 596 assertf(otherParam, "Aggregate parameters should be type expressions"); 597 598 Type* paramTy = param->get_type(); 599 Type* otherParamTy = otherParam->get_type(); 600 601 bool tupleParam = Tuples::isTtype( paramTy ); 602 bool otherTupleParam = Tuples::isTtype( otherParamTy ); 603 604 if ( tupleParam && otherTupleParam ) { 605 ++it; ++jt; // skip ttype parameters for break 606 } else if ( tupleParam ) { 607 // bundle other parameters into tuple to match 608 TupleType* binder = new TupleType{ paramTy->get_qualifiers() }; 609 610 do { 611 binder->get_types().push_back( otherParam->get_type()->clone() ); 612 ++jt; 613 614 if ( jt == otherParams.end() ) break; 615 616 otherParam = dynamic_cast< TypeExpr* >(*jt); 617 assertf(otherParam, "Aggregate parameters should be type expressions"); 618 } while (true); 619 620 otherParamTy = binder; 621 ++it; // skip ttype parameter for break 622 } else if ( otherTupleParam ) { 623 // bundle parameters into tuple to match other 624 TupleType* binder = new TupleType{ otherParamTy->get_qualifiers() }; 625 626 do { 627 binder->get_types().push_back( param->get_type()->clone() ); 628 ++it; 629 630 if ( it == params.end() ) break; 631 632 param = dynamic_cast< TypeExpr* >(*it); 633 assertf(param, "Aggregate parameters should be type expressions"); 634 } while (true); 635 636 paramTy = binder; 637 ++jt; // skip ttype parameter for break 638 } 639 640 if ( ! unifyExact( paramTy, otherParamTy, env, needAssertions, haveAssertions, openVars, WidenMode(false, false), indexer ) ) { 599 641 result = false; 600 642 return; 601 643 } 644 645 // ttype parameter should be last 646 if ( tupleParam || otherTupleParam ) break; 602 647 } 603 648 result = ( it == params.end() && jt == otherParams.end() );
Note: See TracChangeset
for help on using the changeset viewer.