Changes in / [704c9dd:b81096f]


Ignore:
Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Unify.cc

    r704c9dd rb81096f  
    508508                handleRefType( inst, other );
    509509                if ( ! result ) return;
    510                 // Check that parameters of type unify, if any
     510                // Check that parameters of types unify, if any
    511511                std::list< Expression* > params = inst->get_parameters();
    512                 if ( ! params.empty() ) {
    513                         std::list< TypeDecl* > *baseParams = inst->get_baseParameters();
    514                         if ( ! baseParams ) {
     512                std::list< Expression* > otherParams = ((RefType*)other)->get_parameters();
     513
     514                std::list< Expression* >::const_iterator it = params.begin(), jt = otherParams.begin();
     515                for ( ; it != params.end() && jt != otherParams.end(); ++it, ++jt ) {
     516                        TypeExpr *param = dynamic_cast< TypeExpr* >(*it);
     517                        assert(param && "Aggregate parameters should be type expressions");
     518                        TypeExpr *otherParam = dynamic_cast< TypeExpr* >(*jt);
     519                        assert(otherParam && "Aggregate parameters should be type expressions");
     520
     521                        if ( ! unifyExact( param->get_type(), otherParam->get_type(), env, needAssertions, haveAssertions, openVars, WidenMode(false, false), indexer ) ) {
    515522                                result = false;
    516523                                return;
    517524                        }
    518                         std::list< Expression* >::const_iterator it = params.begin();
    519                         std::list< TypeDecl* >::const_iterator baseIt = baseParams->begin();
    520                         while ( it != params.end() && baseIt != baseParams->end()) {
    521                                 TypeExpr *param = dynamic_cast< TypeExpr* >(*it);
    522                                 assert(param && "Aggregate parameters should be type expressions");
    523                                 TypeInstType baseType(Type::Qualifiers(), (*baseIt)->get_name(), *baseIt);
    524                                 if ( ! unifyExact( param->get_type(), &baseType, env, needAssertions, haveAssertions, openVars, WidenMode(false, false), indexer ) ) {
    525                                         result = false;
    526                                         return;
    527                                 }
    528                                
    529                                 ++it;
    530                                 ++baseIt;
    531                         }
    532                         if ( it != params.end() || baseIt != baseParams->end() ) {
    533                                 result = false;
    534                         }
    535525                }
     526                result = ( it == params.end() && jt == otherParams.end() );
    536527        }
    537528
  • src/SymTab/Validate.cc

    r704c9dd rb81096f  
    625625        }
    626626
     627        /// Clones a reference type, replacing any parameters it may have with a clone of the provided list
     628        template< typename GenericInstType >
     629        GenericInstType *cloneWithParams( GenericInstType *refType, const std::list< Expression* >& params ) {
     630                GenericInstType *clone = refType->clone();
     631                clone->get_parameters().clear();
     632                cloneAll( params, clone->get_parameters() );
     633                return clone;
     634        }
    627635
    628636        Declaration *makeStructAssignment( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting ) {
     
    631639                // Make function polymorphic in same parameters as generic struct, if applicable
    632640                std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();
     641                std::list< Expression* > structParams;  // List of matching parameters to put on types
    633642                for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
    634                         assignType->get_forall().push_back( (*param)->clone() );
     643                        TypeDecl *typeParam = (*param)->clone();
     644                        assignType->get_forall().push_back( typeParam );
     645                        structParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) );
    635646                }
    636647 
    637                 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
     648                ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, structParams ), 0 );
    638649                assignType->get_returnVals().push_back( returnVal );
    639650 
    640                 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
     651                ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, structParams ) ), 0 );
    641652                assignType->get_parameters().push_back( dstParam );
    642653 
    643                 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
     654                ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, structParams ), 0 );
    644655                assignType->get_parameters().push_back( srcParam );
    645656
     
    677688        Declaration *makeUnionAssignment( UnionDecl *aggregateDecl, UnionInstType *refType, unsigned int functionNesting ) {
    678689                FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
    679  
    680                 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
     690
     691                // Make function polymorphic in same parameters as generic union, if applicable
     692                std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();
     693                std::list< Expression* > unionParams;  // List of matching parameters to put on types
     694                for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
     695                        TypeDecl *typeParam = (*param)->clone();
     696                        assignType->get_forall().push_back( typeParam );
     697                        unionParams.push_back( new TypeExpr( new TypeInstType( Type::Qualifiers(), typeParam->get_name(), typeParam ) ) );
     698                }
     699 
     700                ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );
    681701                assignType->get_returnVals().push_back( returnVal );
    682702 
    683                 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
     703                ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), cloneWithParams( refType, unionParams ) ), 0 );
    684704                assignType->get_parameters().push_back( dstParam );
    685705 
    686                 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
     706                ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, cloneWithParams( refType, unionParams ), 0 );
    687707                assignType->get_parameters().push_back( srcParam );
    688708 
     
    695715                copy->get_args().push_back( new VariableExpr( dstParam ) );
    696716                copy->get_args().push_back( new AddressExpr( new VariableExpr( srcParam ) ) );
    697                 copy->get_args().push_back( new SizeofExpr( refType->clone() ) );
     717                copy->get_args().push_back( new SizeofExpr( cloneWithParams( refType, unionParams ) ) );
    698718
    699719                assignDecl->get_statements()->get_kids().push_back( new ExprStmt( noLabels, copy ) );
     
    714734        void AutogenerateRoutines::visit( StructDecl *structDecl ) {
    715735                if ( ! structDecl->get_members().empty() && structsDone.find( structDecl->get_name() ) == structsDone.end() ) {
    716                         StructInstType *structInst = new StructInstType( Type::Qualifiers(), structDecl->get_name() );
    717                         structInst->set_baseStruct( structDecl );
    718                         declsToAdd.push_back( makeStructAssignment( structDecl, structInst, functionNesting ) );
     736                        StructInstType structInst( Type::Qualifiers(), structDecl->get_name() );
     737                        structInst.set_baseStruct( structDecl );
     738                        declsToAdd.push_back( makeStructAssignment( structDecl, &structInst, functionNesting ) );
    719739                        structsDone.insert( structDecl->get_name() );
    720740                } // if
     
    723743        void AutogenerateRoutines::visit( UnionDecl *unionDecl ) {
    724744                if ( ! unionDecl->get_members().empty() ) {
    725                         UnionInstType *unionInst = new UnionInstType( Type::Qualifiers(), unionDecl->get_name() );
    726                         unionInst->set_baseUnion( unionDecl );
    727                         declsToAdd.push_back( makeUnionAssignment( unionDecl, unionInst, functionNesting ) );
     745                        UnionInstType unionInst( Type::Qualifiers(), unionDecl->get_name() );
     746                        unionInst.set_baseUnion( unionDecl );
     747                        declsToAdd.push_back( makeUnionAssignment( unionDecl, &unionInst, functionNesting ) );
    728748                } // if
    729749        }
Note: See TracChangeset for help on using the changeset viewer.