Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/ApplicationExpr.cc

    r849720f r4d6d62e  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Aug 12 14:28:00 2019
    13 // Update Count     : 5
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Apr 26 12:41:06 2016
     13// Update Count     : 4
    1414//
    1515
     
    2525#include "Declaration.h"         // for Declaration
    2626#include "Expression.h"          // for ParamEntry, ApplicationExpr, Expression
    27 #include "InitTweak/InitTweak.h" // for getFunction
    2827#include "ResolvExpr/typeops.h"  // for extractResultType
    2928#include "Type.h"                // for Type, PointerType, FunctionType
    3029
    31 ParamEntry::ParamEntry( UniqueId decl, Declaration * declptr, Type * actualType, Type * formalType, Expression* expr )
    32                 : decl( decl ), declptr( declptr ), actualType( actualType ), formalType( formalType ), expr( expr ) {
    33         }
     30ParamEntry::ParamEntry( const ParamEntry &other ) :
     31                decl( other.decl ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) ), inferParams( new InferredParams( *other.inferParams ) ) {
     32}
    3433
    35 ParamEntry::ParamEntry( const ParamEntry &other ) :
    36                 decl( other.decl ), declptr( maybeClone( other.declptr ) ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) ) {
     34ParamEntry &ParamEntry::operator=( const ParamEntry &other ) {
     35        if ( &other == this ) return *this;
     36        decl = other.decl;
     37        // xxx - this looks like a memory leak
     38        actualType = maybeClone( other.actualType );
     39        formalType = maybeClone( other.formalType );
     40        expr = maybeClone( other.expr );
     41        *inferParams = *other.inferParams;
     42        return *this;
    3743}
    3844
    3945ParamEntry::~ParamEntry() {
    40         delete declptr;
    4146        delete actualType;
    4247        delete formalType;
     
    4550
    4651ParamEntry::ParamEntry( ParamEntry && other ) :
    47                 decl( other.decl ), declptr( other.declptr ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ) {
    48         new (&other) ParamEntry();
     52                decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ), inferParams( std::move( other.inferParams ) ) {
     53        other.actualType = nullptr;
     54        other.formalType = nullptr;
     55        other.expr = nullptr;
    4956}
    5057
    5158ParamEntry & ParamEntry::operator=( ParamEntry && other ) {
    5259        if ( &other == this ) return *this;
    53         this->~ParamEntry();
    54         new (this) ParamEntry(other.decl, other.declptr, other.actualType, other.formalType, other.expr);
    55         new (&other) ParamEntry();
    56 
     60        delete actualType;
     61        delete formalType;
     62        delete expr;
     63        decl = other.decl;
     64        actualType = other.actualType;
     65        formalType = other.formalType;
     66        expr = other.expr;
     67        other.actualType = nullptr;
     68        other.formalType = nullptr;
     69        other.expr = nullptr;
     70        inferParams = std::move( other.inferParams );
    5771        return *this;
    5872}
     
    7791}
    7892
    79 bool ApplicationExpr::get_lvalue() const {
    80         // from src/GenPoly/Lvalue.cc: isIntrinsicReference
    81         static std::set<std::string> lvalueFunctions = { "*?", "?[?]" };
    82         if ( const DeclarationWithType * func = InitTweak::getFunction( this ) ) {
    83                 return func->linkage == LinkageSpec::Intrinsic && lvalueFunctions.count(func->name);
    84         }
    85         return false;
    86 }
    87 
    8893void ApplicationExpr::print( std::ostream &os, Indenter indent ) const {
    8994        os << "Application of" << std::endl << indent+1;
Note: See TracChangeset for help on using the changeset viewer.