Changeset 95eec2c


Ignore:
Timestamp:
Jan 4, 2021, 3:49:19 PM (3 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
ed1a6374
Parents:
c04a19e (diff), 1958fec (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.
Message:

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

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/memory.cfa

    rc04a19e r95eec2c  
    6666forall(dtype T | sized(T), ttype Args | { void ?{}(T&, Args); })
    6767void ?{}(counter_ptr(T) & this, Args args) {
    68         this.data = new(args);
     68        this.data = (counter_data(T)*)new(args);
    6969}
    7070
     
    126126forall(dtype T | sized(T), ttype Args | { void ?{}(T &, Args); })
    127127void ?{}(unique_ptr(T) & this, Args args) {
    128         this.data = new(args);
     128        this.data = (T *)new(args);
    129129}
    130130
  • libcfa/src/stdlib.hfa

    rc04a19e r95eec2c  
    267267static inline forall( dtype T | sized(T), ttype TT | { void ?{}( T &, TT ); } )
    268268T * new( TT p ) {
    269         return &(*malloc()){ p };                                                       // run constructor
     269        return &(*(T *)malloc()){ p };                                                  // run constructor
    270270} // new
    271271
  • src/ResolvExpr/RenameVars.cc

    rc04a19e r95eec2c  
    186186}
    187187
    188 const ast::Type * renameTyVars( const ast::Type * t, RenameMode mode ) {
     188const ast::Type * renameTyVars( const ast::Type * t, RenameMode mode, bool reset ) {
    189189        // ast::Type *tc = ast::deepCopy(t);
    190190        ast::Pass<RenameVars_new> renamer;
    191191        renamer.core.mode = mode;
    192         if (mode == GEN_USAGE) {
     192        if (mode == GEN_USAGE && reset) {
    193193                renaming.nextUsage();
    194194        }
     
    198198void resetTyVarRenaming() {
    199199        renaming.reset();
     200        renaming.nextUsage();
    200201}
    201202
  • src/ResolvExpr/RenameVars.h

    rc04a19e r95eec2c  
    3535                GEN_EXPR_ID // for type in decl
    3636        };
    37         const ast::Type * renameTyVars( const ast::Type *, RenameMode mode = GEN_USAGE );
     37        const ast::Type * renameTyVars( const ast::Type *, RenameMode mode = GEN_USAGE, bool reset = true );
     38       
    3839
    3940        /// resets internal state of renamer to avoid overflow
  • src/ResolvExpr/Resolver.cc

    rc04a19e r95eec2c  
    11511151                        const ast::Expr * untyped, const ast::SymbolTable & symtab
    11521152                ) {
    1153                         resetTyVarRenaming();
    11541153                        ast::TypeEnvironment env;
    11551154                        ast::ptr< ast::Expr > newExpr = resolveInVoidContext( untyped, symtab, env );
  • src/ResolvExpr/SatisfyAssertions.cpp

    rc04a19e r95eec2c  
    202202                        ast::ptr< ast::Type > toType = assn.first->result;
    203203                        ast::ptr< ast::Type > adjType =
    204                                 renameTyVars( adjustExprType( candidate->get_type(), newEnv, sat.symtab ) );
     204                                renameTyVars( adjustExprType( candidate->get_type(), newEnv, sat.symtab ), GEN_USAGE, false );
    205205
    206206                        // only keep candidates which unify
     
    385385
    386386        /// Limit to depth of recursion of assertion satisfaction
    387         static const int recursionLimit = 4;
     387        static const int recursionLimit = 8;
    388388        /// Maximum number of simultaneously-deferred assertions to attempt concurrent satisfaction of
    389389        static const int deferLimit = 10;
     
    417417                        if ( it != thresholds.end() && it->second < sat.costs ) goto nextSat;
    418418
    419                         // make initial pass at matching assertions
    420                         for ( auto & assn : sat.need ) {
    421                                 // fail early if any assertion is not satisfiable
    422                                 if ( ! satisfyAssertion( assn, sat ) ) {
     419                        // should a limit be imposed? worst case here is O(n^2) but very unlikely to happen.
     420                        for (unsigned resetCount = 0; ; ++resetCount) {
     421                                ast::AssertionList next;
     422                                resetTyVarRenaming();
     423                                // make initial pass at matching assertions
     424                                for ( auto & assn : sat.need ) {
     425                                        // fail early if any assertion is not satisfiable
     426                                        if ( ! satisfyAssertion( assn, sat ) ) {
     427                                                next.emplace_back(assn);
     428                                                // goto nextSat;
     429                                        }
     430                                }
     431                                // success
     432                                if (next.empty()) break;
     433                                // fail if nothing resolves
     434                                else if (next.size() == sat.need.size()) {
    423435                                        Indenter tabs{ 3 };
    424436                                        std::ostringstream ss;
     
    426438                                        print( ss, *sat.cand, ++tabs );
    427439                                        ss << (tabs-1) << "Could not satisfy assertion:\n";
    428                                         ast::print( ss, assn.first, tabs );
     440                                        ast::print( ss, next[0].first, tabs );
    429441
    430442                                        errors.emplace_back( ss.str() );
    431443                                        goto nextSat;
    432444                                }
     445                                sat.need = std::move(next);
    433446                        }
    434447
Note: See TracChangeset for help on using the changeset viewer.