Changeset 8e18b8e for src/ResolvExpr/Unify.cc
- Timestamp:
- May 31, 2018, 4:24:49 PM (6 years ago)
- Branches:
- new-env, with_gc
- Children:
- 0182bfa, 1d7b0a8
- Parents:
- 75308bcc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Unify.cc
r75308bcc r8e18b8e 19 19 #include <set> // for set 20 20 #include <string> // for string, operator==, operator!=, bas... 21 #include <utility> // for pair 21 #include <utility> // for pair, move 22 22 23 23 #include "Common/PassVisitor.h" // for PassVisitor … … 159 159 return false; 160 160 } // if 161 EqvClass curClass; 162 if ( env.lookup( typeInst->get_name(), curClass ) ) { 163 if ( curClass.type ) { 161 if ( const EqvClass *curClass = env.lookup( typeInst->get_name() ) ) { 162 if ( curClass->type ) { 164 163 Type *common = 0; 165 164 // attempt to unify equivalence class type (which has qualifiers stripped, so they must be restored) with the type to bind to 166 Type* newType = curClass .type->clone();165 Type* newType = curClass->type->clone(); 167 166 newType->get_qualifiers() = typeInst->get_qualifiers(); 168 if ( unifyInexact( newType, other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass .allowWidening, true ), indexer, common ) ) {167 if ( unifyInexact( newType, other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass->allowWidening, true ), indexer, common ) ) { 169 168 if ( common ) { 170 169 common->get_qualifiers() = Type::Qualifiers(); 171 curClass.type = common; 172 env.add( curClass ); 170 EqvClass newClass = *curClass; 171 newClass.type = common; 172 env.add( std::move(newClass) ); 173 173 } // if 174 174 return true; … … 177 177 } // if 178 178 } else { 179 curClass.type = other->clone(); 180 curClass.type->get_qualifiers() = Type::Qualifiers(); 181 curClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond; 182 env.add( curClass ); 179 EqvClass newClass = *curClass; 180 newClass.type = other->clone(); 181 newClass.type->get_qualifiers() = Type::Qualifiers(); 182 newClass.allowWidening = widenMode.widenFirst && widenMode.widenSecond; 183 env.add( std::move(newClass) ); 183 184 } // if 184 185 } else { … … 196 197 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 ) { 197 198 bool result = true; 198 EqvClass class1, class2;199 bool hasClass1 = false, hasClass2 = false;199 const EqvClass *class1 = env.lookup( var1->get_name() ); 200 const EqvClass *class2 = env.lookup( var2->get_name() ); 200 201 bool widen1 = false, widen2 = false; 201 Type *type1 = 0, *type2 = 0; 202 203 if ( env.lookup( var1->get_name(), class1 ) ) { 204 hasClass1 = true; 205 if ( class1.type ) { 206 if ( occurs( class1.type, var2->get_name(), env ) ) { 202 Type *type1 = nullptr, *type2 = nullptr; 203 204 if ( class1 ) { 205 if ( class1->type ) { 206 if ( occurs( class1->type, var2->get_name(), env ) ) { 207 207 return false; 208 208 } // if 209 type1 = class1.type->clone(); 210 } // if 211 widen1 = widenMode.widenFirst && class1.allowWidening; 212 } // if 213 if ( env.lookup( var2->get_name(), class2 ) ) { 214 hasClass2 = true; 215 if ( class2.type ) { 216 if ( occurs( class2.type, var1->get_name(), env ) ) { 209 type1 = class1->type->clone(); 210 } // if 211 widen1 = widenMode.widenFirst && class1->allowWidening; 212 } // if 213 if ( class2 ) { 214 if ( class2->type ) { 215 if ( occurs( class2->type, var1->get_name(), env ) ) { 217 216 return false; 218 217 } // if 219 type2 = class2 .type->clone();220 } // if 221 widen2 = widenMode.widenSecond && class2 .allowWidening;218 type2 = class2->type->clone(); 219 } // if 220 widen2 = widenMode.widenSecond && class2->allowWidening; 222 221 } // if 223 222 … … 227 226 Type *common = 0; 228 227 if ( unifyInexact( type1, type2, env, needAssertions, haveAssertions, openVars, newWidenMode, indexer, common ) ) { 229 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 230 class1.allowWidening = widen1 && widen2; 228 EqvClass newClass1 = *class1; 229 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 230 newClass1.allowWidening = widen1 && widen2; 231 231 if ( common ) { 232 232 common->get_qualifiers() = Type::Qualifiers(); 233 class1.type = common;233 newClass1.type = common; 234 234 } // if 235 env.add( class1);235 env.add( std::move(newClass1) ); 236 236 } else { 237 237 result = false; 238 238 } // if 239 } else if ( hasClass1 && hasClass2 ) {239 } else if ( class1 && class2 ) { 240 240 if ( type1 ) { 241 class1.vars.insert( class2.vars.begin(), class2.vars.end() ); 242 class1.allowWidening = widen1; 243 env.add( class1 ); 241 EqvClass newClass1 = *class1; 242 newClass1.vars.insert( class2->vars.begin(), class2->vars.end() ); 243 newClass1.allowWidening = widen1; 244 env.add( std::move(newClass1) ); 244 245 } else { 245 class2.vars.insert( class1.vars.begin(), class1.vars.end() ); 246 class2.allowWidening = widen2; 247 env.add( class2 ); 248 } // if 249 } else if ( hasClass1 ) { 250 class1.vars.insert( var2->get_name() ); 251 class1.allowWidening = widen1; 252 env.add( class1 ); 253 } else if ( hasClass2 ) { 254 class2.vars.insert( var1->get_name() ); 255 class2.allowWidening = widen2; 256 env.add( class2 ); 246 EqvClass newClass2 = *class2; 247 newClass2.vars.insert( class1->vars.begin(), class1->vars.end() ); 248 newClass2.allowWidening = widen2; 249 env.add( std::move(newClass2) ); 250 } // if 251 } else if ( class1 ) { 252 EqvClass newClass1 = *class1; 253 newClass1.vars.insert( var2->get_name() ); 254 newClass1.allowWidening = widen1; 255 env.add( std::move(newClass1) ); 256 } else if ( class2 ) { 257 EqvClass newClass2 = *class2; 258 newClass2.vars.insert( var1->get_name() ); 259 newClass2.allowWidening = widen2; 260 env.add( std::move(newClass2) ); 257 261 } else { 258 262 EqvClass newClass; … … 521 525 void premutate( TypeInstType * ) { visit_children = false; } 522 526 Type * postmutate( TypeInstType * typeInst ) { 523 EqvClass eqvClass; 524 if ( tenv.lookup( typeInst->get_name(), eqvClass ) ) { 525 if ( eqvClass.data.kind == TypeDecl::Ttype ) { 526 // expand ttype parameter into its actual type 527 if ( eqvClass.type ) { 528 return eqvClass.type->clone(); 529 } 527 if ( const EqvClass *eqvClass = tenv.lookup( typeInst->get_name() ) ) { 528 // expand ttype parameter into its actual type 529 if ( eqvClass->data.kind == TypeDecl::Ttype && eqvClass->type ) { 530 return eqvClass->type->clone(); 530 531 } 531 532 }
Note: See TracChangeset
for help on using the changeset viewer.