Changes in src/ResolvExpr/Resolver.cc [89e6ffc:906e24d]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r89e6ffc r906e24d 19 19 #include "RenameVars.h" 20 20 #include "ResolveTypeof.h" 21 #include "typeops.h" 21 22 #include "SynTree/Statement.h" 22 23 #include "SynTree/Type.h" … … 67 68 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 68 69 void fallbackInit( ConstructorInit * ctorInit ); 69 std::list< Type * >functionReturn;70 Type * functionReturn; 70 71 Type *initContext; 71 72 Type *switchType; … … 133 134 } else if ( BasicType *bt = dynamic_cast< BasicType * >( type ) ) { 134 135 return bt->isInteger(); 135 } else if ( dynamic_cast< ZeroType* >( type ) != nullptr || dynamic_cast< OneType* >( type ) != nullptr ) {136 return true;137 136 } else { 138 137 return false; … … 157 156 const TypeEnvironment *newEnv = 0; 158 157 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 159 if ( i->expr->get_result s().size() == 1 && isIntegralType( i->expr->get_results().front() ) ) {158 if ( i->expr->get_result()->size() == 1 && isIntegralType( i->expr->get_result() ) ) { 160 159 if ( newExpr ) { 161 160 throw SemanticError( "Too many interpretations for case control expression", untyped ); … … 234 233 Type *new_type = resolveTypeof( functionDecl->get_type(), *this ); 235 234 functionDecl->set_type( new_type ); 236 std::list< Type * > oldFunctionReturn = functionReturn; 237 functionReturn.clear(); 238 for ( std::list< DeclarationWithType * >::const_iterator i = functionDecl->get_functionType()->get_returnVals().begin(); i != functionDecl->get_functionType()->get_returnVals().end(); ++i ) { 239 functionReturn.push_back( (*i)->get_type() ); 240 } // for 235 ValueGuard< Type * > oldFunctionReturn( functionReturn ); 236 functionReturn = ResolvExpr::extractResultType( functionDecl->get_functionType() ); 241 237 SymTab::Indexer::visit( functionDecl ); 242 functionReturn = oldFunctionReturn;243 238 } 244 239 … … 338 333 void Resolver::visit( ReturnStmt *returnStmt ) { 339 334 if ( returnStmt->get_expr() ) { 340 CastExpr *castExpr = new CastExpr( returnStmt->get_expr() ); 341 cloneAll( functionReturn, castExpr->get_results() ); 335 CastExpr *castExpr = new CastExpr( returnStmt->get_expr(), functionReturn->clone() ); 342 336 Expression *newExpr = findSingleExpression( castExpr, *this ); 343 337 delete castExpr; … … 384 378 if ( isCharType( at->get_base() ) ) { 385 379 // check if the resolved type is char * 386 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result s().front() ) ) {380 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) { 387 381 if ( isCharType( pt->get_base() ) ) { 388 382 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; … … 461 455 } 462 456 } else { 463 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) 464 || dynamic_cast< ZeroType * >( initContext ) || dynamic_cast< OneType * >( initContext ) ); 457 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) ); 465 458 // basic types are handled here 466 459 Visitor::visit( listInit );
Note:
See TracChangeset
for help on using the changeset viewer.