Changeset 3d5701e for src/ResolvExpr
- Timestamp:
- Feb 25, 2020, 1:17:33 PM (6 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 7dc2e015
- Parents:
- 9fb8f01 (diff), dd9e1ca (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. - Location:
- src/ResolvExpr
- Files:
-
- 7 edited
-
AdjustExprType.cc (modified) (2 diffs)
-
AlternativeFinder.cc (modified) (2 diffs)
-
ConversionCost.cc (modified) (1 diff)
-
PtrsCastable.cc (modified) (2 diffs)
-
ResolveAssertions.cc (modified) (1 diff)
-
Resolver.cc (modified) (5 diffs)
-
Unify.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AdjustExprType.cc
r9fb8f01 r3d5701e 10 10 // Created On : Sat May 16 23:41:42 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:34:53 201613 // Update Count : 412 // Last Modified On : Wed Dec 11 21:43:56 2019 13 // Update Count : 6 14 14 // 15 15 … … 133 133 // replace known function-type-variables with pointer-to-function 134 134 if ( const ast::EqvClass * eqvClass = tenv.lookup( inst->name ) ) { 135 if ( eqvClass->data.kind == ast::Type Var::Ftype ) {135 if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) { 136 136 return new ast::PointerType{ inst }; 137 137 } 138 138 } else if ( const ast::NamedTypeDecl * ntDecl = symtab.lookupType( inst->name ) ) { 139 139 if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( ntDecl ) ) { 140 if ( tyDecl->kind == ast::Type Var::Ftype ) {140 if ( tyDecl->kind == ast::TypeDecl::Ftype ) { 141 141 return new ast::PointerType{ inst }; 142 142 } -
src/ResolvExpr/AlternativeFinder.cc
r9fb8f01 r3d5701e 69 69 void postvisit( CastExpr * castExpr ); 70 70 void postvisit( VirtualCastExpr * castExpr ); 71 void postvisit( KeywordCastExpr * castExpr ); 71 72 void postvisit( UntypedMemberExpr * memberExpr ); 72 73 void postvisit( MemberExpr * memberExpr ); … … 1255 1256 } 1256 1257 1258 void AlternativeFinder::Finder::postvisit( KeywordCastExpr * castExpr ) { 1259 assertf( castExpr->get_result(), "Cast target should have been set in Validate." ); 1260 auto ref = dynamic_cast<ReferenceType*>(castExpr->get_result()); 1261 assert(ref); 1262 auto inst = dynamic_cast<StructInstType*>(ref->base); 1263 assert(inst); 1264 auto target = inst->baseStruct; 1265 1266 AlternativeFinder finder( indexer, env ); 1267 1268 auto pick_alternatives = [target, this](AltList & found, bool expect_ref) { 1269 for(auto & alt : found) { 1270 Type * expr = alt.expr->get_result(); 1271 if(expect_ref) { 1272 auto res = dynamic_cast<ReferenceType*>(expr); 1273 if(!res) { continue; } 1274 expr = res->base; 1275 } 1276 1277 if(auto insttype = dynamic_cast<TypeInstType*>(expr)) { 1278 auto td = alt.env.lookup(insttype->name); 1279 if(!td) { continue; } 1280 expr = td->type; 1281 } 1282 1283 if(auto base = dynamic_cast<StructInstType*>(expr)) { 1284 if(base->baseStruct == target) { 1285 alternatives.push_back( 1286 std::move(alt) 1287 ); 1288 } 1289 } 1290 } 1291 }; 1292 1293 try { 1294 // Attempt 1 : turn (thread&)X into ($thread&)X.__thrd 1295 // Clone is purely for memory management 1296 std::unique_ptr<Expression> tech1 { new UntypedMemberExpr(new NameExpr(castExpr->concrete_target.field), castExpr->arg->clone()) }; 1297 1298 // don't prune here, since it's guaranteed all alternatives will have the same type 1299 finder.findWithoutPrune( tech1.get() ); 1300 pick_alternatives(finder.alternatives, false); 1301 1302 return; 1303 } catch(SemanticErrorException & ) {} 1304 1305 // Fallback : turn (thread&)X into ($thread&)get_thread(X) 1306 std::unique_ptr<Expression> fallback { UntypedExpr::createDeref( new UntypedExpr(new NameExpr(castExpr->concrete_target.getter), { castExpr->arg->clone() })) }; 1307 // don't prune here, since it's guaranteed all alternatives will have the same type 1308 finder.findWithoutPrune( fallback.get() ); 1309 1310 pick_alternatives(finder.alternatives, true); 1311 1312 // Whatever happens here, we have no more fallbacks 1313 } 1314 1257 1315 namespace { 1258 1316 /// Gets name from untyped member expression (member must be NameExpr) -
src/ResolvExpr/ConversionCost.cc
r9fb8f01 r3d5701e 157 157 if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) { 158 158 PRINT( std::cerr << "converting compatible base type" << std::endl; ) 159 assert( src->get_lvalue() == srcIsLvalue );160 159 if ( srcIsLvalue ) { 161 160 PRINT( -
src/ResolvExpr/PtrsCastable.cc
r9fb8f01 r3d5701e 10 10 // Created On : Sun May 17 11:48:00 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:36:18 201613 // Update Count : 812 // Last Modified On : Wed Dec 11 21:48:33 2019 13 // Update Count : 9 14 14 // 15 15 … … 176 176 if ( const ast::NamedTypeDecl * named = symtab.lookupType( inst->name ) ) { 177 177 if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( named ) ) { 178 if ( tyDecl->kind == ast::Type Var::Ftype ) {178 if ( tyDecl->kind == ast::TypeDecl::Ftype ) { 179 179 return -1; 180 180 } 181 181 } 182 182 } else if ( const ast::EqvClass * eqvClass = env.lookup( inst->name ) ) { 183 if ( eqvClass->data.kind == ast::Type Var::Ftype ) {183 if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) { 184 184 return -1; 185 185 } -
src/ResolvExpr/ResolveAssertions.cc
r9fb8f01 r3d5701e 156 156 for ( const auto& assn : x.assns ) { 157 157 // compute conversion cost from satisfying decl to assertion 158 assert( !assn.match.adjType->get_lvalue() );159 158 k += computeConversionCost( 160 159 assn.match.adjType, assn.decl->get_type(), false, indexer, x.env ); -
src/ResolvExpr/Resolver.cc
r9fb8f01 r3d5701e 84 84 void previsit( ThrowStmt * throwStmt ); 85 85 void previsit( CatchStmt * catchStmt ); 86 void postvisit( CatchStmt * catchStmt ); 86 87 void previsit( WaitForStmt * stmt ); 87 88 … … 485 486 visit_children = false; 486 487 findVoidExpression( asmExpr->operand, indexer ); 487 if ( asmExpr->get_inout() ) {488 findVoidExpression( asmExpr->inout, indexer );489 } // if490 488 } 491 489 … … 570 568 571 569 void Resolver_old::previsit( CatchStmt * catchStmt ) { 570 // Until we are very sure this invarent (ifs that move between passes have thenPart) 571 // holds, check it. This allows a check for when to decode the mangling. 572 if ( IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body ) ) { 573 assert( ifStmt->thenPart ); 574 } 575 // Encode the catchStmt so the condition can see the declaration. 572 576 if ( catchStmt->cond ) { 573 findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer ); 577 IfStmt * ifStmt = new IfStmt( catchStmt->cond, nullptr, catchStmt->body ); 578 catchStmt->cond = nullptr; 579 catchStmt->body = ifStmt; 580 } 581 } 582 583 void Resolver_old::postvisit( CatchStmt * catchStmt ) { 584 // Decode the catchStmt so everything is stored properly. 585 IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body ); 586 if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) { 587 assert( ifStmt->condition ); 588 assert( ifStmt->elsePart ); 589 catchStmt->cond = ifStmt->condition; 590 catchStmt->body = ifStmt->elsePart; 591 ifStmt->condition = nullptr; 592 ifStmt->elsePart = nullptr; 593 delete ifStmt; 574 594 } 575 595 } … … 1366 1386 asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) ); 1367 1387 1368 if ( asmExpr->inout ) {1369 asmExpr = ast::mutate_field(1370 asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) );1371 }1372 1373 1388 return asmExpr; 1374 1389 } … … 1474 1489 1475 1490 const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) { 1491 // TODO: This will need a fix for the decl/cond scoping problem. 1476 1492 if ( catchStmt->cond ) { 1477 1493 ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool }; -
src/ResolvExpr/Unify.cc
r9fb8f01 r3d5701e 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:27:10 2015 11 // Last Modified By : Aaron B. Moss12 // Last Modified On : Mon Jun 18 11:58:00 201813 // Update Count : 4 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Dec 13 23:43:05 2019 13 // Update Count : 46 14 14 // 15 15 … … 32 32 #include "Common/PassVisitor.h" // for PassVisitor 33 33 #include "FindOpenVars.h" // for findOpenVars 34 #include " Parser/LinkageSpec.h"// for C34 #include "SynTree/LinkageSpec.h" // for C 35 35 #include "SynTree/Constant.h" // for Constant 36 36 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Data, Declarati... … … 278 278 #endif 279 279 if ( ( common = commonType( type1, type2, widen.first, widen.second, indexer, env, openVars ) ) ) { 280 common-> get_qualifiers() = tq1 | tq2;280 common->tq = tq1.unify( tq2 ); 281 281 #ifdef DEBUG 282 282 std::cerr << "unifyInexact: common type is "; … … 295 295 if ( ( tq1 > tq2 || widen.first ) && ( tq2 > tq1 || widen.second ) ) { 296 296 common = type1->clone(); 297 common-> get_qualifiers() = tq1 | tq2;297 common->tq = tq1.unify( tq2 ); 298 298 result = true; 299 299 } else { … … 302 302 } else { 303 303 common = type1->clone(); 304 common-> get_qualifiers() = tq1 | tq2;304 common->tq = tq1.unify( tq2 ); 305 305 result = true; 306 306 } // if … … 781 781 if ( const ast::EqvClass * clz = tenv.lookup( typeInst->name ) ) { 782 782 // expand ttype parameter into its actual type 783 if ( clz->data.kind == ast::Type Var::Ttype && clz->bound ) {783 if ( clz->data.kind == ast::TypeDecl::Ttype && clz->bound ) { 784 784 return clz->bound; 785 785 }
Note:
See TracChangeset
for help on using the changeset viewer.