Changes in src/ResolvExpr/Resolver.cc [906e24d:1ba88a0]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r906e24d r1ba88a0 19 19 #include "RenameVars.h" 20 20 #include "ResolveTypeof.h" 21 #include "typeops.h"22 21 #include "SynTree/Statement.h" 23 22 #include "SynTree/Type.h" … … 68 67 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 69 68 void fallbackInit( ConstructorInit * ctorInit ); 70 Type *functionReturn;69 std::list< Type * > functionReturn; 71 70 Type *initContext; 72 71 Type *switchType; … … 156 155 const TypeEnvironment *newEnv = 0; 157 156 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 158 if ( i->expr->get_result ()->size() == 1 && isIntegralType( i->expr->get_result() ) ) {157 if ( i->expr->get_results().size() == 1 && isIntegralType( i->expr->get_results().front() ) ) { 159 158 if ( newExpr ) { 160 159 throw SemanticError( "Too many interpretations for case control expression", untyped ); … … 233 232 Type *new_type = resolveTypeof( functionDecl->get_type(), *this ); 234 233 functionDecl->set_type( new_type ); 235 ValueGuard< Type * > oldFunctionReturn( functionReturn ); 236 functionReturn = ResolvExpr::extractResultType( functionDecl->get_functionType() ); 234 std::list< Type * > oldFunctionReturn = functionReturn; 235 functionReturn.clear(); 236 for ( std::list< DeclarationWithType * >::const_iterator i = functionDecl->get_functionType()->get_returnVals().begin(); i != functionDecl->get_functionType()->get_returnVals().end(); ++i ) { 237 functionReturn.push_back( (*i)->get_type() ); 238 } // for 237 239 SymTab::Indexer::visit( functionDecl ); 240 functionReturn = oldFunctionReturn; 238 241 } 239 242 … … 333 336 void Resolver::visit( ReturnStmt *returnStmt ) { 334 337 if ( returnStmt->get_expr() ) { 335 CastExpr *castExpr = new CastExpr( returnStmt->get_expr(), functionReturn->clone() ); 338 CastExpr *castExpr = new CastExpr( returnStmt->get_expr() ); 339 cloneAll( functionReturn, castExpr->get_results() ); 336 340 Expression *newExpr = findSingleExpression( castExpr, *this ); 337 341 delete castExpr; … … 378 382 if ( isCharType( at->get_base() ) ) { 379 383 // check if the resolved type is char * 380 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result () ) ) {384 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) { 381 385 if ( isCharType( pt->get_base() ) ) { 382 386 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello";
Note:
See TracChangeset
for help on using the changeset viewer.