Changes in src/SymTab/GenImplicitCall.cpp [4e2f1b2:5bf685f]
- File:
-
- 1 edited
-
src/SymTab/GenImplicitCall.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/GenImplicitCall.cpp
r4e2f1b2 r5bf685f 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenImplicitCall. cpp -- Generate code for implicit operator calls.7 // GenImplicitCall.hpp -- 8 8 // 9 9 // Author : Andrew Beach … … 31 31 namespace { 32 32 33 using Inserter = std::back_insert_iterator<std::list<ast::ptr<ast::Stmt>>>; 34 33 template< typename OutIter > 35 34 ast::ptr< ast::Stmt > genCall( 36 35 InitTweak::InitExpander & srcParam, const ast::Expr * dstParam, 37 const CodeLocation & loc, const std::string & fname, Inserter && out,36 const CodeLocation & loc, const std::string & fname, OutIter && out, 38 37 const ast::Type * type, const ast::Type * addCast, LoopDirection forward = LoopForward ); 39 38 … … 42 41 /// optionally returns a statement which must be inserted prior to the containing loop, if 43 42 /// there is one 43 template< typename OutIter > 44 44 ast::ptr< ast::Stmt > genScalarCall( 45 45 InitTweak::InitExpander & srcParam, const ast::Expr * dstParam, 46 const CodeLocation & loc, std::string fname, Inserter && out, const ast::Type * type,46 const CodeLocation & loc, std::string fname, OutIter && out, const ast::Type * type, 47 47 const ast::Type * addCast = nullptr 48 48 ) { … … 97 97 /// Store in out a loop which calls fname on each element of the array with srcParam and 98 98 /// dstParam as arguments. If forward is true, loop goes from 0 to N-1, else N-1 to 0 99 template< typename OutIter > 99 100 void genArrayCall( 100 101 InitTweak::InitExpander & srcParam, const ast::Expr * dstParam, 101 const CodeLocation & loc, const std::string & fname, Inserter && out,102 const CodeLocation & loc, const std::string & fname, OutIter && out, 102 103 const ast::ArrayType * array, const ast::Type * addCast = nullptr, 103 104 LoopDirection forward = LoopForward … … 165 166 } 166 167 168 template< typename OutIter > 167 169 ast::ptr< ast::Stmt > genCall( 168 170 InitTweak::InitExpander & srcParam, const ast::Expr * dstParam, 169 const CodeLocation & loc, const std::string & fname, Inserter && out,171 const CodeLocation & loc, const std::string & fname, OutIter && out, 170 172 const ast::Type * type, const ast::Type * addCast, LoopDirection forward 171 173 ) { 172 174 if ( auto at = dynamic_cast< const ast::ArrayType * >( type ) ) { 173 175 genArrayCall( 174 srcParam, dstParam, loc, fname, std::forward< Inserter&& >( out), at, addCast,176 srcParam, dstParam, loc, fname, std::forward< OutIter >(out), at, addCast, 175 177 forward ); 176 178 return {}; 177 179 } else { 178 180 return genScalarCall( 179 srcParam, dstParam, loc, fname, std::forward< Inserter&&>( out ), type, addCast );181 srcParam, dstParam, loc, fname, std::forward< OutIter >( out ), type, addCast ); 180 182 } 181 183 } … … 183 185 } // namespace 184 186 185 const ast::Stmt *genImplicitCall(187 ast::ptr< ast::Stmt > genImplicitCall( 186 188 InitTweak::InitExpander & srcParam, const ast::Expr * dstParam, 187 189 const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj, … … 189 191 ) { 190 192 // unnamed bit fields are not copied as they cannot be accessed 191 if ( isUnnamedBitfield( obj ) ) return nullptr;193 if ( isUnnamedBitfield( obj ) ) return {}; 192 194 193 195 ast::ptr< ast::Type > addCast; … … 197 199 } 198 200 199 std:: list< ast::ptr< ast::Stmt > > stmts;201 std::vector< ast::ptr< ast::Stmt > > stmts; 200 202 genCall( 201 203 srcParam, dstParam, loc, fname, back_inserter( stmts ), obj->type, addCast, forward ); 202 204 203 if ( stmts.empty() ) return nullptr; 204 assert( stmts.size() == 1 ); 205 206 const ast::Stmt * callStmt = stmts.front().release(); 207 // Implicitly generated ctor/dtor calls should be wrapped so that 208 // later passes are aware they were generated. 209 if ( addCast ) { 210 callStmt = new ast::ImplicitCtorDtorStmt( callStmt->location, callStmt ); 211 } 212 return callStmt; 205 if ( stmts.empty() ) { 206 return {}; 207 } else if ( stmts.size() == 1 ) { 208 const ast::Stmt * callStmt = stmts.front(); 209 if ( addCast ) { 210 // implicitly generated ctor/dtor calls should be wrapped so that later passes are 211 // aware they were generated. 212 callStmt = new ast::ImplicitCtorDtorStmt( callStmt->location, callStmt ); 213 } 214 return callStmt; 215 } else { 216 assert( false ); 217 return {}; 218 } 213 219 } 214 220 … … 220 226 // compile-command: "make install" // 221 227 // End: // 228 229
Note:
See TracChangeset
for help on using the changeset viewer.