Changeset 46aa60e


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

Files:
10 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cpp

    r3d5a8cb r46aa60e  
    11091109        );
    11101110
    1111         for ( auto group : group_iterate( realType->assertions,
    1112                         adapterType->assertions, adaptee->assertions ) ) {
    1113                 auto assertArg = std::get<0>( group );
    1114                 auto assertParam = std::get<1>( group );
    1115                 auto assertReal = std::get<2>( group );
     1111        for ( auto const & [assertArg, assertParam, assertReal] : group_iterate(
     1112                        realType->assertions, adapterType->assertions, adaptee->assertions ) ) {
    11161113                adapteeApp->args.push_back( makeAdapterArg(
    11171114                        assertParam->var, assertArg->var->get_type(),
     
    19701967        bool hasDynamicLayout = false;
    19711968
    1972         for ( auto pair : group_iterate( baseParams, typeParams ) ) {
    1973                 auto baseParam = std::get<0>( pair );
    1974                 auto typeParam = std::get<1>( pair );
     1969        for ( auto const & [baseParam, typeParam] : group_iterate(
     1970                        baseParams, typeParams ) ) {
    19751971                if ( !baseParam->isComplete() ) continue;
    19761972                ast::TypeExpr const * typeExpr = typeParam.as<ast::TypeExpr>();
  • src/InitTweak/FixInit.cpp

    r3d5a8cb r46aa60e  
    11341134                        ast::Expr * thisExpr = new ast::CastExpr(funcDecl->location, new ast::VariableExpr(funcDecl->location, thisParam ), thisParam->get_type()->stripReferences());
    11351135                        ast::Expr * memberDest = new ast::MemberExpr(funcDecl->location, field, thisExpr );
    1136                         ast::ptr<ast::Stmt> callStmt = SymTab::genImplicitCall( srcParam, memberDest, loc, function->name, field, static_cast<SymTab::LoopDirection>(isCtor) );
     1136                        const ast::Stmt * callStmt = SymTab::genImplicitCall( srcParam, memberDest, loc, function->name, field, static_cast<SymTab::LoopDirection>(isCtor) );
    11371137
    11381138                        if ( callStmt ) {
  • src/InitTweak/GenInit.cc

    r3d5a8cb r46aa60e  
    239239                                        if ( varExpr->var == retVal ) return stmt;
    240240                                }
    241                                 ast::ptr<ast::Stmt> ctorStmt = genCtorDtor(
     241                                const ast::Stmt * ctorStmt = genCtorDtor(
    242242                                        retVal->location, "?{}", retVal, stmt->expr );
    243243                                assertf( ctorStmt,
     
    327327void ManagedTypes::endScope() { managedTypes.endScope(); }
    328328
    329 ast::ptr<ast::Stmt> genCtorDtor (const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * objDecl, const ast::Expr * arg) {
     329const ast::Stmt * genCtorDtor( const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * objDecl, const ast::Expr * arg ) {
    330330        assertf(objDecl, "genCtorDtor passed null objDecl");
    331331        InitExpander srcParam(arg);
  • src/InitTweak/GenInit.h

    r3d5a8cb r46aa60e  
    3333
    3434/// generates a single ctor/dtor statement using objDecl as the 'this' parameter and arg as the optional argument
    35 ast::ptr<ast::Stmt> genCtorDtor (const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * objDecl, const ast::Expr * arg = nullptr);
     35const ast::Stmt * genCtorDtor( const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * objDecl, const ast::Expr * arg = nullptr );
    3636
    3737/// creates an appropriate ConstructorInit node which contains a constructor, destructor, and C-initializer
  • src/Parser/parser.yy

    r3d5a8cb r46aa60e  
    10811081        | logical_OR_expression '?' comma_expression ':' conditional_expression
    10821082                { $$ = new ExpressionNode( build_cond( yylloc, $1, $3, $5 ) ); }
    1083                 // FIX ME: computes $1 twice
    10841083        | logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
    1085                 { $$ = new ExpressionNode( build_cond( yylloc, $1, $1->clone(), $4 ) ); }
     1084                { $$ = new ExpressionNode( build_cond( yylloc, $1, nullptr, $4 ) ); }
    10861085        ;
    10871086
  • src/ResolvExpr/CandidateFinder.cpp

    r3d5a8cb r46aa60e  
    15121512        void Finder::postvisit( const ast::ConditionalExpr * conditionalExpr ) {
    15131513                // candidates for condition
     1514                ast::ptr<ast::Expr> arg1 = notZeroExpr( conditionalExpr->arg1 );
    15141515                CandidateFinder finder1( context, tenv );
    1515                 ast::ptr<ast::Expr> arg1 = notZeroExpr( conditionalExpr->arg1 );
    15161516                finder1.find( arg1, ResolveMode::withAdjustment() );
    15171517                if ( finder1.candidates.empty() ) return;
    15181518
    15191519                // candidates for true result
     1520                // FIX ME: resolves and runs arg1 twice when arg2 is missing.
     1521                ast::Expr const * arg2 = conditionalExpr->arg2;
     1522                arg2 = arg2 ? arg2 : conditionalExpr->arg1.get();
    15201523                CandidateFinder finder2( context, tenv );
    15211524                finder2.allowVoid = true;
    1522                 finder2.find( conditionalExpr->arg2, ResolveMode::withAdjustment() );
     1525                finder2.find( arg2, ResolveMode::withAdjustment() );
    15231526                if ( finder2.candidates.empty() ) return;
    15241527
  • 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 
  • src/SymTab/GenImplicitCall.hpp

    r3d5a8cb r46aa60e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // GenImplicitCall.hpp --
     7// GenImplicitCall.hpp -- Generate code for implicit operator calls.
    88//
    99// Author           : Andrew Beach
     
    2525/// Returns a generated call expression to function fname with srcParam and
    2626/// dstParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
    27 ast::ptr<ast::Stmt> genImplicitCall(
     27const ast::Stmt * genImplicitCall(
    2828        InitTweak::InitExpander & srcParam, const ast::Expr * dstParam,
    2929        const CodeLocation & loc, const std::string & fname, const ast::ObjectDecl * obj,
  • src/Validate/Autogen.cpp

    r3d5a8cb r46aa60e  
    133133        /// Generates a single struct member operation.
    134134        /// (constructor call, destructor call, assignment call)
    135         // This is managed because it uses another helper that returns a ast::ptr.
    136         ast::ptr<ast::Stmt> makeMemberOp(
     135        const ast::Stmt * makeMemberOp(
    137136                const CodeLocation& location,
    138137                const ast::ObjectDecl * dstParam, const ast::Expr * src,
     
    524523}
    525524
    526 ast::ptr<ast::Stmt> StructFuncGenerator::makeMemberOp(
     525const ast::Stmt * StructFuncGenerator::makeMemberOp(
    527526                const CodeLocation& location, const ast::ObjectDecl * dstParam,
    528527                const ast::Expr * src, const ast::ObjectDecl * field,
     
    539538                )
    540539        );
    541         auto stmt = genImplicitCall(
     540        const ast::Stmt * stmt = genImplicitCall(
    542541                srcParam, dstSelect, location, func->name,
    543542                field, direction
     
    597596                        location, field, new ast::VariableExpr( location, srcParam )
    598597                ) : nullptr;
    599                 ast::ptr<ast::Stmt> stmt =
     598                const ast::Stmt * stmt =
    600599                        makeMemberOp( location, dstParam, srcSelect, field, func, direction );
    601600
    602601                if ( nullptr != stmt ) {
    603                         stmts->kids.push_back( stmt );
     602                        stmts->kids.emplace_back( stmt );
    604603                }
    605604        }
     
    622621        for ( auto param = params.begin() + 1 ; current != end ; ++current ) {
    623622                const ast::ptr<ast::Decl> & member = *current;
    624                 ast::ptr<ast::Stmt> stmt = nullptr;
     623                const ast::Stmt * stmt = nullptr;
    625624                auto field = member.as<ast::ObjectDecl>();
    626625                // Not sure why it could be null.
     
    640639
    641640                if ( nullptr != stmt ) {
    642                         stmts->kids.push_back( stmt );
     641                        stmts->kids.emplace_back( stmt );
    643642                }
    644643        }
  • tests/errors/.expect/declaration.txt

    r3d5a8cb r46aa60e  
    88  with members
    99    i: int
    10    with body
     10  with body
    1111
    1212
     
    1414  with members
    1515    i: int
    16    with body
     16  with body
    1717
    1818
Note: See TracChangeset for help on using the changeset viewer.