Changes in src/ResolvExpr/Resolver.cc [21ae786:3cfe27f]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/Resolver.cc
r21ae786 r3cfe27f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Resolver.cc -- 7 // Resolver.cc -- 8 8 // 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 : T ue Apr 26 16:08:21 201613 // Update Count : 20311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 24 16:43:11 2016 13 // Update Count : 181 14 14 // 15 15 … … 33 33 public: 34 34 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 35 35 36 36 virtual void visit( FunctionDecl *functionDecl ); 37 37 virtual void visit( ObjectDecl *functionDecl ); … … 54 54 virtual void visit( SingleInit *singleInit ); 55 55 virtual void visit( ListInit *listInit ); 56 virtual void visit( ConstructorInit *ctorInit );57 56 private: 58 57 typedef std::list< Initializer * >::iterator InitIterator; … … 60 59 void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & ); 61 60 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 62 void fallbackInit( ConstructorInit * ctorInit ); 61 63 62 std::list< Type * > functionReturn; 64 63 Type *initContext; … … 83 82 } 84 83 85 86 84 namespace { 87 85 void finishExpr( Expression *expr, const TypeEnvironment &env ) { … … 89 87 env.makeSubstitution( *expr->get_env() ); 90 88 } 91 } // namespace 92 93 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 94 global_renamer.reset(); 95 TypeEnvironment env; 96 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 97 finishExpr( newExpr, env ); 98 return newExpr; 99 } 100 101 namespace { 89 90 Expression *findVoidExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 91 global_renamer.reset(); 92 TypeEnvironment env; 93 Expression *newExpr = resolveInVoidContext( untyped, indexer, env ); 94 finishExpr( newExpr, env ); 95 return newExpr; 96 } 97 102 98 Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 103 99 TypeEnvironment env; … … 130 126 } // if 131 127 } 132 128 133 129 Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) { 134 130 TypeEnvironment env; … … 163 159 return newExpr; 164 160 } 165 166 } 167 161 162 } 163 168 164 void Resolver::visit( ObjectDecl *objectDecl ) { 169 165 Type *new_type = resolveTypeof( objectDecl->get_type(), *this ); … … 262 258 forStmt->set_condition( newExpr ); 263 259 } // if 264 260 265 261 if ( forStmt->get_increment() ) { 266 262 Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this ); … … 276 272 delete switchStmt->get_condition(); 277 273 switchStmt->set_condition( newExpr ); 278 274 279 275 visitor.Visitor::visit( switchStmt ); 280 276 } … … 318 314 bool isCharType( T t ) { 319 315 if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) { 320 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 316 return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 321 317 bt->get_kind() == BasicType::UnsignedChar; 322 318 } … … 330 326 string n = ne->get_name(); 331 327 if (n == "0") { 332 initContext = new BasicType(Type::Qualifiers(), 328 initContext = new BasicType(Type::Qualifiers(), 333 329 BasicType::SignedInt); 334 330 } else { … … 336 332 initContext = decl->get_type(); 337 333 } 338 } else if (ConstantExpr * e = 334 } else if (ConstantExpr * e = 339 335 dynamic_cast<ConstantExpr*>(singleInit->get_value())) { 340 336 Constant *c = e->get_constant(); … … 359 355 singleInit->set_value( ce->get_arg() ); 360 356 ce->set_arg( NULL ); 361 delete ce; 357 delete ce; 362 358 } 363 359 } … … 475 471 #endif 476 472 } 477 478 // ConstructorInit - fall back on C-style initializer479 void Resolver::fallbackInit( ConstructorInit * ctorInit ) {480 // could not find valid constructor, or found an intrinsic constructor481 // fall back on C-style initializer482 delete ctorInit->get_ctor();483 ctorInit->set_ctor( NULL );484 maybeAccept( ctorInit->get_init(), *this );485 }486 487 void Resolver::visit( ConstructorInit *ctorInit ) {488 try {489 maybeAccept( ctorInit->get_ctor(), *this );490 maybeAccept( ctorInit->get_dtor(), *this );491 } catch ( SemanticError ) {492 // no alternatives for the constructor initializer - fallback on C-style initializer493 // xxx- not sure if this makes a ton of sense - should maybe never be able to have this situation?494 fallbackInit( ctorInit );495 return;496 }497 498 // found a constructor - can get rid of C-style initializer499 delete ctorInit->get_init();500 ctorInit->set_init( NULL );501 }502 473 } // namespace ResolvExpr 503 474
Note: See TracChangeset
for help on using the changeset viewer.