Changes in / [b56c17c:8b11840]


Ignore:
Location:
src/InitTweak
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/FixInit.cc

    rb56c17c r8b11840  
    5858#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution, operator<<
    5959#include "SynTree/Visitor.h"           // for acceptAll, maybeAccept
     60#include "Tuples/Tuples.h"             // for isTtype
    6061
    6162bool ctordtorp = false; // print all debug
     
    367368                }
    368369
    369                 bool ResolveCopyCtors::skipCopyConstruct( Type * type ) { return ! isConstructable( type ); }
     370                bool ResolveCopyCtors::skipCopyConstruct( Type * type ) {
     371                        return dynamic_cast< VarArgsType * >( type ) || dynamic_cast< ReferenceType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );
     372                }
    370373
    371374                Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {
  • src/InitTweak/GenInit.cc

    rb56c17c r8b11840  
    7575                // that need to be constructed or destructed
    7676                void previsit( StructDecl *aggregateDecl );
    77                 void previsit( AggregateDecl * ) { visit_children = false; }
    78                 void previsit( NamedTypeDecl * ) { visit_children = false; }
     77                void premutate( AggregateDecl * ) { visit_children = false; }
     78                void premutate( NamedTypeDecl * ) { visit_children = false; }
    7979                void previsit( FunctionType * ) { visit_children = false; }
    8080
     
    130130                // hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address
    131131                // is being returned
    132                 if ( returnStmt->get_expr() && returnVals.size() == 1 && isConstructable( returnVals.front()->get_type() ) ) {
     132                if ( returnStmt->get_expr() && returnVals.size() == 1 && tryConstruct( returnVals.front() ) ) {
    133133                        // explicitly construct the return value using the return expression and the retVal object
    134134                        assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() );
  • src/InitTweak/InitTweak.cc

    rb56c17c r8b11840  
    2222#include "SynTree/Type.h"          // for FunctionType, ArrayType, PointerType
    2323#include "SynTree/Visitor.h"       // for Visitor, maybeAccept
    24 #include "Tuples/Tuples.h"         // for Tuples::isTtype
    2524
    2625class UntypedValofExpr;
     
    277276                                ( objDecl->get_init() != nullptr && objDecl->get_init()->get_maybeConstructed() ))
    278277                        && ! objDecl->get_storageClasses().is_extern
    279                         && isConstructable( objDecl->type );
    280         }
    281 
    282         bool isConstructable( Type * type ) {
    283                 return ! dynamic_cast< VarArgsType * >( type ) && ! dynamic_cast< ReferenceType * >( type ) && ! dynamic_cast< FunctionType * >( type ) && ! Tuples::isTtype( type );
     278                        && ! dynamic_cast< ReferenceType * >( objDecl->type );
    284279        }
    285280
  • src/InitTweak/InitTweak.h

    rb56c17c r8b11840  
    3535        /// True if the resolver should try to construct dwt
    3636        bool tryConstruct( DeclarationWithType * dwt );
    37 
    38         /// True if the type can have a user-defined constructor
    39         bool isConstructable( Type * t );
    4037
    4138        /// True if the Initializer contains designations
Note: See TracChangeset for help on using the changeset viewer.