Changeset 00ac42e for src/ResolvExpr/Unify.cc
- Timestamp:
- Jun 1, 2018, 2:54:55 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, with_gc
- Children:
- 262bd63
- Parents:
- 41e16b1
- git-author:
- Aaron Moss <a3moss@…> (05/31/18 16:24:49)
- git-committer:
- Aaron Moss <a3moss@…> (06/01/18 14:54:55)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Unify.cc
r41e16b1 r00ac42e 20 20 #include <set> // for set 21 21 #include <string> // for string, operator==, operator!=, bas... 22 #include <utility> // for pair 22 #include <utility> // for pair, move 23 23 24 24 #include "Common/PassVisitor.h" // for PassVisitor … … 166 166 return false; 167 167 } // if 168 EqvClass curClass; 169 if ( env.lookup( typeInst->get_name(), curClass ) ) { 170 if ( curClass.type ) { 168 if ( const EqvClass *curClass = env.lookup( typeInst->get_name() ) ) { 169 if ( curClass->type ) { 171 170 Type *common = 0; 172 171 // attempt to unify equivalence class type (which has qualifiers stripped, so they must be restored) with the type to bind to 173 std::unique_ptr< Type > newType( curClass .type->clone() );172 std::unique_ptr< Type > newType( curClass->type->clone() ); 174 173 newType->get_qualifiers() = typeInst->get_qualifiers(); 175 if ( unifyInexact( newType.get(), other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass .allowWidening, true ), indexer, common ) ) {174 if ( unifyInexact( newType.get(), other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass->allowWidening, true ), indexer, common ) ) { 176 175 if ( common ) { 177 176 common->get_qualifiers() = Type::Qualifiers(); 178 delete curClass.type; 179 curClass.type = common; 180 env.add( curClass ); 177 env.add( EqvClass{ *curClass, common } ); 181 178 } // if 182 179 return true; … … 185 182 } // if 186 183 } else { 187 curClass.type = other->clone();188 curClass.type->get_qualifiers() = Type::Qualifiers();189 curClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond;190 env.add( curClass);184 EqvClass newClass { *curClass, other }; 185 newClass.type->get_qualifiers() = Type::Qualifiers(); 186 newClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond; 187 env.add( std::move(newClass) ); 191 188 } // if 192 189 } else { … … 204 201 bool bindVarToVar( TypeInstType *var1, TypeInstType *var2, const TypeDecl::Data & data, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer ) { 205 202 bool result = true; 206 EqvClass class1, class2;207 bool hasClass1 = false, hasClass2 = false;203 const EqvClass *class1 = env.lookup( var1->get_name() ); 204 const EqvClass *class2 = env.lookup( var2->get_name() ); 208 205 bool widen1 = false, widen2 = false; 209 Type *type1 = 0, *type2 = 0; 210 211 if ( env.lookup( var1->get_name(), class1 ) ) { 212 hasClass1 = true; 213 if ( class1.type ) { 214 if ( occurs( class1.type, var2->get_name(), env ) ) { 206 Type *type1 = nullptr, *type2 = nullptr; 207 208 if ( class1 ) { 209 if ( class1->type ) { 210 if ( occurs( class1->type, var2->get_name(), env ) ) { 215 211 return false; 216 212 } // if 217 type1 = class1.type->clone(); 218 } // if 219 widen1 = widenMode.widenFirst && class1.allowWidening; 220 } // if 221 if ( env.lookup( var2->get_name(), class2 ) ) { 222 hasClass2 = true; 223 if ( class2.type ) { 224 if ( occurs( class2.type, var1->get_name(), env ) ) { 213 type1 = class1->type->clone(); 214 } // if 215 widen1 = widenMode.widenFirst && class1->allowWidening; 216 } // if 217 if ( class2 ) { 218 if ( class2->type ) { 219 if ( occurs( class2->type, var1->get_name(), env ) ) { 225 220 return false; 226 221 } // if 227 type2 = class2 .type->clone();228 } // if 229 widen2 = widenMode.widenSecond && class2 .allowWidening;222 type2 = class2->type->clone(); 223 } // if 224 widen2 = widenMode.widenSecond && class2->allowWidening; 230 225 } // if 231 226 … … 235 230 Type *common = 0; 236 231 if ( unifyInexact( type1, type2, env, needAssertions, haveAssertions, openVars, newWidenMode, indexer, common ) ) { 237 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 238 class1.allowWidening = widen1 && widen2; 232 EqvClass newClass1 = *class1; 233 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 234 newClass1.allowWidening = widen1 && widen2; 239 235 if ( common ) { 240 236 common->get_qualifiers() = Type::Qualifiers(); 241 delete class1.type;242 class1.type = common;237 delete newClass1.type; 238 newClass1.type = common; 243 239 } // if 244 env.add( class1);240 env.add( std::move(newClass1) ); 245 241 } else { 246 242 result = false; 247 243 } // if 248 } else if ( hasClass1 && hasClass2 ) {244 } else if ( class1 && class2 ) { 249 245 if ( type1 ) { 250 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 251 class1.allowWidening = widen1; 252 env.add( class1 ); 246 EqvClass newClass1 = *class1; 247 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 248 newClass1.allowWidening = widen1; 249 env.add( std::move(newClass1) ); 253 250 } else { 254 class2.vars.insert( class1.vars.begin(), class1.vars.end() ); 255 class2.allowWidening = widen2; 256 env.add( class2 ); 257 } // if 258 } else if ( hasClass1 ) { 259 class1.vars.insert( var2->get_name() ); 260 class1.allowWidening = widen1; 261 env.add( class1 ); 262 } else if ( hasClass2 ) { 263 class2.vars.insert( var1->get_name() ); 264 class2.allowWidening = widen2; 265 env.add( class2 ); 251 EqvClass newClass2 = *class2; 252 newClass2.vars.insert( class1->vars.begin(), class1->vars.end() ); 253 newClass2.allowWidening = widen2; 254 env.add( std::move(newClass2) ); 255 } // if 256 } else if ( class1 ) { 257 EqvClass newClass1 = *class1; 258 newClass1.vars.insert( var2->get_name() ); 259 newClass1.allowWidening = widen1; 260 env.add( std::move(newClass1) ); 261 } else if ( class2 ) { 262 EqvClass newClass2 = *class2; 263 newClass2.vars.insert( var1->get_name() ); 264 newClass2.allowWidening = widen2; 265 env.add( std::move(newClass2) ); 266 266 } else { 267 267 EqvClass newClass; … … 539 539 void premutate( TypeInstType * ) { visit_children = false; } 540 540 Type * postmutate( TypeInstType * typeInst ) { 541 EqvClass eqvClass; 542 if ( tenv.lookup( typeInst->get_name(), eqvClass ) ) { 543 if ( eqvClass.data.kind == TypeDecl::Ttype ) { 544 // expand ttype parameter into its actual type 545 if ( eqvClass.type ) { 546 delete typeInst; 547 return eqvClass.type->clone(); 548 } 541 if ( const EqvClass *eqvClass = tenv.lookup( typeInst->get_name() ) ) { 542 // expand ttype parameter into its actual type 543 if ( eqvClass->data.kind == TypeDecl::Ttype && eqvClass->type ) { 544 delete typeInst; 545 return eqvClass->type->clone(); 549 546 } 550 547 }
Note: See TracChangeset
for help on using the changeset viewer.