Changes in src/ResolvExpr/Resolver.cc [1869adf:843054c2]
- File:
-
- 1 edited
-
src/ResolvExpr/Resolver.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r1869adf r843054c2 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jun 24 16:20:35201513 // Update Count : 15611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun May 17 12:18:17 2015 13 // Update Count : 2 14 14 // 15 15 … … 38 38 virtual void visit( TypeDecl *typeDecl ); 39 39 40 virtual void visit( ArrayType * at );41 42 40 virtual void visit( ExprStmt *exprStmt ); 43 41 virtual void visit( IfStmt *ifStmt ); … … 47 45 virtual void visit( ChooseStmt *switchStmt ); 48 46 virtual void visit( CaseStmt *caseStmt ); 49 virtual void visit( BranchStmt *branchStmt );50 47 virtual void visit( ReturnStmt *returnStmt ); 51 48 … … 53 50 virtual void visit( ListInit *listInit ); 54 51 private: 55 typedef std::list< Initializer * >::iterator InitIterator;56 57 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );58 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );59 60 52 std::list< Type * > functionReturn; 61 53 Type *initContext; … … 166 158 SymTab::Indexer::visit( objectDecl ); 167 159 } 168 169 void Resolver::visit( ArrayType * at ) { 170 if ( at->get_dimension() ) { 171 BasicType arrayLenType = BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 172 CastExpr *castExpr = new CastExpr( at->get_dimension(), arrayLenType.clone() ); 173 Expression *newExpr = findSingleExpression( castExpr, *this ); 174 delete at->get_dimension(); 175 at->set_dimension( newExpr ); 176 } 177 Visitor::visit( at ); 178 } 179 160 180 161 void Resolver::visit( TypeDecl *typeDecl ) { 181 162 if ( typeDecl->get_base() ) { … … 185 166 SymTab::Indexer::visit( typeDecl ); 186 167 } 187 168 188 169 void Resolver::visit( FunctionDecl *functionDecl ) { 189 170 #if 0 … … 271 252 } 272 253 273 void Resolver::visit( BranchStmt *branchStmt ) {274 // must resolve the argument for a computed goto275 if ( branchStmt->get_type() == BranchStmt::Goto ) { // check for computed goto statement276 if ( NameExpr * arg = dynamic_cast< NameExpr * >( branchStmt->get_computedTarget() ) ) {277 VoidType v = Type::Qualifiers(); // cast to void * for the alternative finder278 PointerType pt( Type::Qualifiers(), v.clone() );279 CastExpr * castExpr = new CastExpr( arg, pt.clone() );280 Expression * newExpr = findSingleExpression( castExpr, *this ); // find best expression281 branchStmt->set_target( newExpr );282 } // if283 } // if284 }285 286 254 void Resolver::visit( ReturnStmt *returnStmt ) { 287 255 if ( returnStmt->get_expr() ) { … … 292 260 returnStmt->set_expr( newExpr ); 293 261 } // if 294 }295 296 template< typename T >297 bool isCharType( T t ) {298 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) {299 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar ||300 bt->get_kind() == BasicType::UnsignedChar;301 }302 return false;303 262 } 304 263 … … 327 286 delete castExpr; 328 287 singleInit->set_value( newExpr ); 329 330 // check if initializing type is char[]331 if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {332 if ( isCharType( at->get_base() ) ) {333 // check if the resolved type is char *334 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) {335 if ( isCharType( pt->get_base() ) ) {336 // strip cast if we're initializing a char[] with a char *, e.g.337 // char x[] = "hello";338 CastExpr *ce = dynamic_cast< CastExpr * >( newExpr );339 singleInit->set_value( ce->get_arg() );340 ce->set_arg( NULL );341 delete ce;342 }343 }344 }345 }346 288 } // if 347 289 // singleInit->get_value()->accept( *this ); 348 290 } 349 291 350 void Resolver::resolveSingleAggrInit( Declaration * dcl, InitIterator & init, InitIterator & initEnd ) { 351 DeclarationWithType * dt = dynamic_cast< DeclarationWithType * >( dcl ); 352 assert( dt ); 353 initContext = dt->get_type(); 354 try { 355 if ( init == initEnd ) return; // stop when there are no more initializers 356 (*init)->accept( *this ); 357 ++init; // made it past an initializer 358 } catch( SemanticError & ) { 359 // need to delve deeper, if you can 360 if ( StructInstType * sit = dynamic_cast< StructInstType * >( dt->get_type() ) ) { 361 resolveAggrInit( sit->get_baseStruct(), init, initEnd ); 362 } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( dt->get_type() ) ) { 363 resolveAggrInit( uit->get_baseUnion(), init, initEnd ); 364 } else { 365 // member is not an aggregate type, so can't go any deeper 366 367 // might need to rethink what is being thrown 368 throw; 369 } // if 370 } 371 } 372 373 void Resolver::resolveAggrInit( AggregateDecl * aggr, InitIterator & init, InitIterator & initEnd ) { 374 if ( StructDecl * st = dynamic_cast< StructDecl * >( aggr ) ) { 375 // want to resolve each initializer to the members of the struct, 376 // but if there are more initializers than members we should stop 377 list< Declaration * >::iterator it = st->get_members().begin(); 378 for ( ; it != st->get_members().end(); ++it) { 379 resolveSingleAggrInit( *it, init, initEnd ); 380 } 381 } else if ( UnionDecl * un = dynamic_cast< UnionDecl * >( aggr ) ) { 382 // only resolve to the first member of a union 383 resolveSingleAggrInit( *un->get_members().begin(), init, initEnd ); 384 } // if 385 } 386 387 void Resolver::visit( ListInit * listInit ) { 388 InitIterator iter = listInit->begin_initializers(); 389 InitIterator end = listInit->end_initializers(); 390 391 if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) { 392 // resolve each member to the base type of the array 393 for ( ; iter != end; ++iter ) { 394 initContext = at->get_base(); 395 (*iter)->accept( *this ); 396 } // for 397 } else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) { 398 resolveAggrInit( st->get_baseStruct(), iter, end ); 399 } else if ( UnionInstType *st = dynamic_cast< UnionInstType * >( initContext ) ) { 400 resolveAggrInit( st->get_baseUnion(), iter, end ); 401 } else { 402 // basic types are handled here 403 Visitor::visit( listInit ); 404 } 405 292 void Resolver::visit( ListInit *listInit ) { 293 Visitor::visit(listInit); 406 294 #if 0 407 295 if ( ArrayType *at = dynamic_cast<ArrayType*>(initContext) ) {
Note:
See TracChangeset
for help on using the changeset viewer.