Changeset 3f7e12cb for src/ResolvExpr/Unify.cc
- Timestamp:
- Nov 8, 2017, 5:43:33 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:
- 954908d
- Parents:
- 78315272 (diff), e35f30a (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Unify.cc
r78315272 r3f7e12cb 17 17 #include <iterator> // for back_insert_iterator, back_inserter 18 18 #include <map> // for _Rb_tree_const_iterator, _Rb_tree_i... 19 #include <memory> // for unique_ptr , auto_ptr19 #include <memory> // for unique_ptr 20 20 #include <set> // for set 21 21 #include <string> // for string, operator==, operator!=, bas... 22 22 #include <utility> // for pair 23 23 24 #include "Common/PassVisitor.h" // for PassVisitor 24 25 #include "FindOpenVars.h" // for findOpenVars 25 26 #include "Parser/LinkageSpec.h" // for C … … 137 138 bool tyVarCompatible( const TypeDecl::Data & data, Type *type ) { 138 139 switch ( data.kind ) { 139 case TypeDecl::Any:140 140 case TypeDecl::Dtype: 141 141 // to bind to an object type variable, the type must not be a function type. … … 169 169 Type *common = 0; 170 170 // attempt to unify equivalence class type (which has qualifiers stripped, so they must be restored) with the type to bind to 171 std:: auto_ptr< Type > newType( curClass.type->clone() );171 std::unique_ptr< Type > newType( curClass.type->clone() ); 172 172 newType->get_qualifiers() = typeInst->get_qualifiers(); 173 173 if ( unifyInexact( newType.get(), other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass.allowWidening, true ), indexer, common ) ) { … … 458 458 if ( otherArray && arrayType->get_isVarLen() == otherArray->get_isVarLen() ) { 459 459 460 // not positive this is correct in all cases, but it's needed for typedefs461 if ( arrayType->get_isVarLen() || otherArray->get_isVarLen() ) {462 return;463 }464 465 460 if ( ! arrayType->get_isVarLen() && ! otherArray->get_isVarLen() && 466 461 arrayType->get_dimension() != 0 && otherArray->get_dimension() != 0 ) { … … 537 532 /// If this isn't done then argument lists can have wildly different 538 533 /// size and structure, when they should be compatible. 539 struct TtypeExpander : public Mutator { 540 TypeEnvironment & env; 541 TtypeExpander( TypeEnvironment & env ) : env( env ) {} 542 Type * mutate( TypeInstType * typeInst ) { 534 struct TtypeExpander : public WithShortCircuiting { 535 TypeEnvironment & tenv; 536 TtypeExpander( TypeEnvironment & tenv ) : tenv( tenv ) {} 537 void premutate( TypeInstType * ) { visit_children = false; } 538 Type * postmutate( TypeInstType * typeInst ) { 543 539 EqvClass eqvClass; 544 if ( env.lookup( typeInst->get_name(), eqvClass ) ) {540 if ( tenv.lookup( typeInst->get_name(), eqvClass ) ) { 545 541 if ( eqvClass.data.kind == TypeDecl::Ttype ) { 546 542 // expand ttype parameter into its actual type … … 560 556 dst.clear(); 561 557 for ( DeclarationWithType * dcl : src ) { 562 TtypeExpanderexpander( env );558 PassVisitor<TtypeExpander> expander( env ); 563 559 dcl->acceptMutator( expander ); 564 560 std::list< Type * > types; … … 750 746 std::list<Type *> types1, types2; 751 747 752 TtypeExpanderexpander( env );748 PassVisitor<TtypeExpander> expander( env ); 753 749 flat1->acceptMutator( expander ); 754 750 flat2->acceptMutator( expander );
Note:
See TracChangeset
for help on using the changeset viewer.