- File:
-
- 1 edited
-
src/ResolvExpr/AlternativeFinder.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r033ff37 r6f096d2 10 10 // Created On : Sat May 16 23:52:08 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:37:46 201913 // Update Count : 3 712 // Last Modified On : Thu Nov 1 21:00:56 2018 13 // Update Count : 35 14 14 // 15 15 … … 79 79 void postvisit( OffsetofExpr * offsetofExpr ); 80 80 void postvisit( OffsetPackExpr * offsetPackExpr ); 81 void postvisit( AttrExpr * attrExpr ); 81 82 void postvisit( LogicalExpr * logicalExpr ); 82 83 void postvisit( ConditionalExpr * conditionalExpr ); … … 1403 1404 } 1404 1405 1406 namespace { 1407 void resolveAttr( SymTab::Indexer::IdData data, const FunctionType * function, Type * argType, const TypeEnvironment &env, AlternativeFinder & finder ) { 1408 // assume no polymorphism 1409 // assume no implicit conversions 1410 assert( function->parameters.size() == 1 ); 1411 PRINT( 1412 std::cerr << "resolvAttr: funcDecl is "; 1413 data.id->print( std::cerr ); 1414 std::cerr << " argType is "; 1415 argType->print( std::cerr ); 1416 std::cerr << std::endl; 1417 ) 1418 const SymTab::Indexer & indexer = finder.get_indexer(); 1419 AltList & alternatives = finder.get_alternatives(); 1420 if ( typesCompatibleIgnoreQualifiers( argType, function->parameters.front()->get_type(), indexer, env ) ) { 1421 Cost cost = Cost::zero; 1422 Expression * newExpr = data.combine( cost ); 1423 alternatives.push_back( Alternative{ 1424 new AttrExpr{ newExpr, argType->clone() }, env, OpenVarSet{}, 1425 AssertionList{}, Cost::zero, cost } ); 1426 for ( DeclarationWithType * retVal : function->returnVals ) { 1427 alternatives.back().expr->result = retVal->get_type()->clone(); 1428 } // for 1429 } // if 1430 } 1431 } 1432 1433 void AlternativeFinder::Finder::postvisit( AttrExpr * attrExpr ) { 1434 // assume no 'pointer-to-attribute' 1435 NameExpr * nameExpr = dynamic_cast< NameExpr* >( attrExpr->get_attr() ); 1436 assert( nameExpr ); 1437 std::list< SymTab::Indexer::IdData > attrList; 1438 indexer.lookupId( nameExpr->get_name(), attrList ); 1439 if ( attrExpr->get_isType() || attrExpr->get_expr() ) { 1440 for ( auto & data : attrList ) { 1441 const DeclarationWithType * id = data.id; 1442 // check if the type is function 1443 if ( const FunctionType * function = dynamic_cast< const FunctionType * >( id->get_type() ) ) { 1444 // assume exactly one parameter 1445 if ( function->parameters.size() == 1 ) { 1446 if ( attrExpr->get_isType() ) { 1447 resolveAttr( data, function, attrExpr->get_type(), env, altFinder); 1448 } else { 1449 AlternativeFinder finder( indexer, env ); 1450 finder.find( attrExpr->get_expr() ); 1451 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 1452 if ( choice->expr->get_result()->size() == 1 ) { 1453 resolveAttr(data, function, choice->expr->get_result(), choice->env, altFinder ); 1454 } // fi 1455 } // for 1456 } // if 1457 } // if 1458 } // if 1459 } // for 1460 } else { 1461 for ( auto & data : attrList ) { 1462 Cost cost = Cost::zero; 1463 Expression * newExpr = data.combine( cost ); 1464 alternatives.push_back( Alternative{ 1465 newExpr, env, OpenVarSet{}, AssertionList{}, Cost::zero, cost } ); 1466 renameTypes( alternatives.back().expr ); 1467 } // for 1468 } // if 1469 } 1470 1405 1471 void AlternativeFinder::Finder::postvisit( LogicalExpr * logicalExpr ) { 1406 1472 AlternativeFinder firstFinder( indexer, env );
Note:
See TracChangeset
for help on using the changeset viewer.