Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Unify.cc

    ref9988b r07de76b  
    2525#include <vector>
    2626
    27 #include "AST/Copy.hpp"
    2827#include "AST/Decl.hpp"
    2928#include "AST/Node.hpp"
    3029#include "AST/Pass.hpp"
    31 #include "AST/Print.hpp"
    3230#include "AST/Type.hpp"
    3331#include "AST/TypeEnvironment.hpp"
     
    137135                findOpenVars( newSecond, open, closed, need, have, FirstOpen );
    138136
    139                 return unifyExact(newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab );
     137                return unifyExact(
     138                        newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab );
    140139        }
    141140
     
    149148                newFirst->get_qualifiers() = Type::Qualifiers();
    150149                newSecond->get_qualifiers() = Type::Qualifiers();
    151 
     150///   std::cerr << "first is ";
     151///   first->print( std::cerr );
     152///   std::cerr << std::endl << "second is ";
     153///   second->print( std::cerr );
     154///   std::cerr << std::endl << "newFirst is ";
     155///   newFirst->print( std::cerr );
     156///   std::cerr << std::endl << "newSecond is ";
     157///   newSecond->print( std::cerr );
     158///   std::cerr << std::endl;
    152159                bool result = unifyExact( newFirst, newSecond, newEnv, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
    153160                delete newFirst;
     
    163170                ast::AssertionSet need, have;
    164171
    165                 ast::Type * newFirst  = shallowCopy( first  );
    166                 ast::Type * newSecond = shallowCopy( second );
    167                 newFirst ->qualifiers = {};
    168                 newSecond->qualifiers = {};
    169                 ast::ptr< ast::Type > t1_(newFirst );
    170                 ast::ptr< ast::Type > t2_(newSecond);
    171 
    172                 ast::ptr< ast::Type > subFirst = env.apply(newFirst).node;
    173                 ast::ptr< ast::Type > subSecond = env.apply(newSecond).node;
     172                ast::ptr<ast::Type> newFirst{ first }, newSecond{ second };
     173                env.apply( newFirst );
     174                env.apply( newSecond );
     175                reset_qualifiers( newFirst );
     176                reset_qualifiers( newSecond );
    174177
    175178                return unifyExact(
    176                         subFirst,
    177                         subSecond,
    178                         newEnv, need, have, open, noWiden(), symtab );
     179                        newFirst, newSecond, newEnv, need, have, open, noWiden(), symtab );
    179180        }
    180181
     
    325326
    326327        void markAssertionSet( AssertionSet &assertions, DeclarationWithType *assert ) {
     328///   std::cerr << "assertion set is" << std::endl;
     329///   printAssertionSet( assertions, std::cerr, 8 );
     330///   std::cerr << "looking for ";
     331///   assert->print( std::cerr );
     332///   std::cerr << std::endl;
    327333                AssertionSet::iterator i = assertions.find( assert );
    328334                if ( i != assertions.end() ) {
     335///     std::cerr << "found it!" << std::endl;
    329336                        i->second.isUsed = true;
    330337                } // if
     
    702709                const ast::SymbolTable & symtab;
    703710        public:
    704                 static size_t traceId;
    705711                bool result;
    706712
     
    791797                        for ( const ast::DeclWithType * d : src ) {
    792798                                ast::Pass<TtypeExpander_new> expander{ env };
    793                                 // TtypeExpander pass is impure (may mutate nodes in place)
    794                                 // need to make nodes shared to prevent accidental mutation
    795                                 ast::ptr<ast::DeclWithType> dc = d;
    796                                 dc = dc->accept( expander );
    797                                 auto types = flatten( dc->get_type() );
     799                                d = d->accept( expander );
     800                                auto types = flatten( d->get_type() );
    798801                                for ( ast::ptr< ast::Type > & t : types ) {
    799802                                        // outermost const, volatile, _Atomic qualifiers in parameters should not play
     
    804807                                        // requirements than a non-mutex function
    805808                                        remove_qualifiers( t, ast::CV::Const | ast::CV::Volatile | ast::CV::Atomic );
    806                                         dst.emplace_back( new ast::ObjectDecl{ dc->location, "", t } );
     809                                        dst.emplace_back( new ast::ObjectDecl{ d->location, "", t } );
    807810                                }
    808811                        }
     
    940943
    941944        private:
    942                 // Returns: other, cast as XInstType
    943                 // Assigns this->result: whether types are compatible (up to generic parameters)
    944                 template< typename XInstType >
    945                 const XInstType * handleRefType( const XInstType * inst, const ast::Type * other ) {
     945                template< typename RefType >
     946                const RefType * handleRefType( const RefType * inst, const ast::Type * other ) {
    946947                        // check that the other type is compatible and named the same
    947                         auto otherInst = dynamic_cast< const XInstType * >( other );
    948                         this->result = otherInst && inst->name == otherInst->name;
     948                        auto otherInst = dynamic_cast< const RefType * >( other );
     949                        result = otherInst && inst->name == otherInst->name;
    949950                        return otherInst;
    950951                }
     
    967968                }
    968969
    969                 template< typename XInstType >
    970                 void handleGenericRefType( const XInstType * inst, const ast::Type * other ) {
     970                template< typename RefType >
     971                void handleGenericRefType( const RefType * inst, const ast::Type * other ) {
    971972                        // check that other type is compatible and named the same
    972                         const XInstType * otherInst = handleRefType( inst, other );
    973                         if ( ! this->result ) return;
     973                        const RefType * inst2 = handleRefType( inst, other );
     974                        if ( ! inst2 ) return;
    974975
    975976                        // check that parameters of types unify, if any
    976977                        const std::vector< ast::ptr< ast::Expr > > & params = inst->params;
    977                         const std::vector< ast::ptr< ast::Expr > > & params2 = otherInst->params;
     978                        const std::vector< ast::ptr< ast::Expr > > & params2 = inst2->params;
    978979
    979980                        auto it = params.begin();
     
    11131114
    11141115                        ast::Pass<TtypeExpander_new> expander{ tenv };
    1115 
    1116                         ast::ptr<ast::TupleType> tuplec = tuple;
    1117                         ast::ptr<ast::TupleType> tuple2c = tuple2;
    1118                         const ast::Type * flat = tuplec->accept( expander );
    1119                         const ast::Type * flat2 = tuple2c->accept( expander );
     1116                        const ast::Type * flat = tuple->accept( expander );
     1117                        const ast::Type * flat2 = tuple2->accept( expander );
    11201118
    11211119                        auto types = flatten( flat );
     
    11421140        };
    11431141
    1144         // size_t Unify_new::traceId = Stats::Heap::new_stacktrace_id("Unify_new");
    11451142        bool unify(
    11461143                        const ast::ptr<ast::Type> & type1, const ast::ptr<ast::Type> & type2,
     
    11911188                        ast::Pass<Unify_new> comparator{ type2, env, need, have, open, widen, symtab };
    11921189                        type1->accept( comparator );
    1193                         return comparator.core.result;
     1190                        return comparator.pass.result;
    11941191                }
    11951192        }
     
    12051202                // force t1 and t2 to be cloned if their qualifiers must be stripped, so that type1 and
    12061203                // type2 are left unchanged; calling convention forces type{1,2}->strong_ref >= 1
    1207                 ast::Type * t1 = shallowCopy(type1.get());
    1208                 ast::Type * t2 = shallowCopy(type2.get());
    1209                 t1->qualifiers = {};
    1210                 t2->qualifiers = {};
    1211                 ast::ptr< ast::Type > t1_(t1);
    1212                 ast::ptr< ast::Type > t2_(t2);
     1204                ast::ptr<ast::Type> t1{ type1 }, t2{ type2 };
     1205                reset_qualifiers( t1 );
     1206                reset_qualifiers( t2 );
    12131207
    12141208                if ( unifyExact( t1, t2, env, need, have, open, widen, symtab ) ) {
     1209                        t1 = nullptr; t2 = nullptr; // release t1, t2 to avoid spurious clones
     1210
    12151211                        // if exact unification on unqualified types, try to merge qualifiers
    12161212                        if ( q1 == q2 || ( ( q1 > q2 || widen.first ) && ( q2 > q1 || widen.second ) ) ) {
    1217                                 t1->qualifiers = q1 | q2;
    1218                                 common = t1;
     1213                                common = type1;
     1214                                reset_qualifiers( common, q1 | q2 );
    12191215                                return true;
    12201216                        } else {
     
    12231219
    12241220                } else if (( common = commonType( t1, t2, widen, symtab, env, open ) )) {
     1221                        t1 = nullptr; t2 = nullptr; // release t1, t2 to avoid spurious clones
     1222
    12251223                        // no exact unification, but common type
    1226                         auto c = shallowCopy(common.get());
    1227                         c->qualifiers = q1 | q2;
    1228                         common = c;
     1224                        reset_qualifiers( common, q1 | q2 );
    12291225                        return true;
    12301226                } else {
Note: See TracChangeset for help on using the changeset viewer.