Ignore:
Timestamp:
Feb 23, 2024, 11:41:10 PM (3 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
0a9b5c1, 1e93617
Parents:
3d5a8cb (diff), 1761046 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Peter A. Buhr <pabuhr@…> (02/23/24 18:54:24)
git-committer:
Peter A. Buhr <pabuhr@…> (02/23/24 23:41:10)
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/GenImplicitCall.cpp

    r3d5a8cb r46aa60e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenImplicitCall.hpp --
     7// GenImplicitCall.cpp -- Generate code for implicit operator calls.
    88//
    99// Author           : Andrew Beach
     
    3131namespace {
    3232
    33 template< typename OutIter >
     33using Inserter = std::back_insert_iterator<std::list<ast::ptr<ast::Stmt>>>;
     34
    3435ast::ptr< ast::Stmt > genCall(
    3536        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    36         const CodeLocation & loc, const std::string & fname, OutIter && out,
     37        const CodeLocation & loc, const std::string & fname, Inserter && out,
    3738        const ast::Type * type, const ast::Type * addCast, LoopDirection forward = LoopForward );
    3839
     
    4142/// optionally returns a statement which must be inserted prior to the containing loop, if
    4243/// there is one
    43 template< typename OutIter >
    4444ast::ptr< ast::Stmt > genScalarCall(
    4545        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    46         const CodeLocation & loc, std::string fname, OutIter && out, const ast::Type * type,
     46        const CodeLocation & loc, std::string fname, Inserter && out, const ast::Type * type,
    4747        const ast::Type * addCast = nullptr
    4848) {
     
    9797/// Store in out a loop which calls fname on each element of the array with srcParam and
    9898/// dstParam as arguments. If forward is true, loop goes from 0 to N-1, else N-1 to 0
    99 template< typename OutIter >
    10099void genArrayCall(
    101100        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    102         const CodeLocation & loc, const std::string & fname, OutIter && out,
     101        const CodeLocation & loc, const std::string & fname, Inserter && out,
    103102        const ast::ArrayType * array, const ast::Type * addCast = nullptr,
    104103        LoopDirection forward = LoopForward
     
    166165}
    167166
    168 template< typename OutIter >
    169167ast::ptr< ast::Stmt > genCall(
    170168        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    171         const CodeLocation & loc, const std::string & fname, OutIter && out,
     169        const CodeLocation & loc, const std::string & fname, Inserter && out,
    172170        const ast::Type * type, const ast::Type * addCast, LoopDirection forward
    173171) {
    174172        if ( auto at = dynamic_cast< const ast::ArrayType * >( type ) ) {
    175173                genArrayCall(
    176                         srcParam, dstParam, loc, fname, std::forward< OutIter >(out), at, addCast,
     174                        srcParam, dstParam, loc, fname, std::forward< Inserter&& >( out ), at, addCast,
    177175                        forward );
    178176                return {};
    179177        } else {
    180178                return genScalarCall(
    181                         srcParam, dstParam, loc, fname, std::forward< OutIter >( out ), type, addCast );
     179                        srcParam, dstParam, loc, fname, std::forward< Inserter&& >( out ), type, addCast );
    182180        }
    183181}
     
    185183} // namespace
    186184
    187 ast::ptr< ast::Stmt > genImplicitCall(
     185const ast::Stmt * genImplicitCall(
    188186        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    189187        const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj,
     
    191189) {
    192190        // unnamed bit fields are not copied as they cannot be accessed
    193         if ( isUnnamedBitfield( obj ) ) return {};
     191        if ( isUnnamedBitfield( obj ) ) return nullptr;
    194192
    195193        ast::ptr< ast::Type > addCast;
     
    199197        }
    200198
    201         std::vector< ast::ptr< ast::Stmt > > stmts;
     199        std::list< ast::ptr< ast::Stmt > > stmts;
    202200        genCall(
    203201                srcParam, dstParam, loc, fname, back_inserter( stmts ), obj->type, addCast, forward );
    204202
    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         }
     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;
    219213}
    220214
     
    226220// compile-command: "make install" //
    227221// End: //
    228 
    229 
Note: See TracChangeset for help on using the changeset viewer.