Ignore:
Timestamp:
Jul 12, 2017, 4:57:23 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
c5e3208
Parents:
a61ad31
Message:

Update autogen to generate ctor/dtor/assign with references

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Autogen.cc

    ra61ad31 r49148d5  
    125125        FunctionType * genDefaultType( Type * paramType ) {
    126126                FunctionType *ftype = new FunctionType( Type::Qualifiers(), false );
    127                 ObjectDecl *dstParam = new ObjectDecl( "_dst", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), paramType->clone() ), nullptr );
     127                ObjectDecl *dstParam = new ObjectDecl( "_dst", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), paramType->clone() ), nullptr );
    128128                ftype->get_parameters().push_back( dstParam );
    129129
     
    298298        /// generates a single struct member operation (constructor call, destructor call, assignment call)
    299299        void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, bool isDynamicLayout, bool forward = true ) {
    300                 ObjectDecl * returnVal = NULL;
    301                 if ( ! func->get_functionType()->get_returnVals().empty() ) {
    302                         returnVal = dynamic_cast<ObjectDecl*>( func->get_functionType()->get_returnVals().front() );
    303                 }
    304 
    305300                InitTweak::InitExpander srcParam( src );
    306301
    307                 // assign to destination (and return value if generic)
    308                 UntypedExpr *derefExpr = UntypedExpr::createDeref( new VariableExpr( dstParam ) );
    309                 Expression *dstselect = new MemberExpr( field, derefExpr );
     302                // assign to destination
     303                Expression *dstselect = new MemberExpr( field, new CastExpr( new VariableExpr( dstParam ), safe_dynamic_cast< ReferenceType* >( dstParam->get_type() )->get_base()->clone() ) );
    310304                genImplicitCall( srcParam, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
    311 
    312                 if ( isDynamicLayout && returnVal ) {
    313                         // xxx - there used to be a dereference on returnVal, but this seems to have been wrong?
    314                         Expression *retselect = new MemberExpr( field, new VariableExpr( returnVal ) );
    315                         genImplicitCall( srcParam, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
    316                 } // if
    317305        }
    318306
     
    468456                                        // our inheritance model. I think the correct way to handle this is to
    469457                                        // cast the structure to the type of the member and let the resolver
    470                                         // figure out whether it's valid and have a pass afterwards that fixes
    471                                         // the assignment to use pointer arithmetic with the offset of the
    472                                         // member, much like how generic type members are handled.
     458                                        // figure out whether it's valid/choose the correct unnamed member
    473459                                        continue;
    474460                                }
     
    486472        void makeUnionFieldsAssignment( ObjectDecl * srcParam, ObjectDecl * dstParam, OutputIterator out ) {
    487473                UntypedExpr *copy = new UntypedExpr( new NameExpr( "__builtin_memcpy" ) );
    488                 copy->get_args().push_back( new VariableExpr( dstParam ) );
     474                copy->get_args().push_back( new AddressExpr( new VariableExpr( dstParam ) ) );
    489475                copy->get_args().push_back( new AddressExpr( new VariableExpr( srcParam ) ) );
    490476                copy->get_args().push_back( new SizeofExpr( srcParam->get_type()->clone() ) );
     
    498484                ObjectDecl * dstParam = safe_dynamic_cast< ObjectDecl * >( ftype->get_parameters().front() );
    499485                ObjectDecl * srcParam = safe_dynamic_cast< ObjectDecl * >( ftype->get_parameters().back() );
    500                 ObjectDecl * returnVal = nullptr;
    501                 if ( ! ftype->get_returnVals().empty() ) {
    502                         returnVal = safe_dynamic_cast< ObjectDecl * >( ftype->get_returnVals().front() );
    503                 }
    504486
    505487                makeUnionFieldsAssignment( srcParam, dstParam, back_inserter( funcDecl->get_statements()->get_kids() ) );
    506                 if ( returnVal ) {
     488                if ( InitTweak::isAssignment( funcDecl->get_name() ) ) {
     489                        // also generate return statement in assignment
    507490                        funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
    508491                }
     
    513496                // Make function polymorphic in same parameters as generic union, if applicable
    514497                const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions
    515                
     498
    516499                // default ctor/dtor need only first parameter
    517500                // void ?{}(T *); void ^?{}(T *);
Note: See TracChangeset for help on using the changeset viewer.