Changeset 974906e2


Ignore:
Timestamp:
Jan 11, 2016, 2:48:05 PM (9 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
a56767c
Parents:
1e9d87b
Message:

propagate maybeConstructed flag through system, begin create constructor/destructor statements for further processing by Resolver

Location:
src
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r1e9d87b r974906e2  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Dec 18 14:53:08 2015
    13 // Update Count     : 217
     12// Last Modified On : Thu Jan 07 13:40:05 2016
     13// Update Count     : 219
    1414//
    1515
     
    11421142
    11431143                                        std::list<Expression*> designators;
    1144                                         objectDecl->set_init( new SingleInit( alloc, designators ) );
     1144                                        objectDecl->set_init( new SingleInit( alloc, designators, false ) ); // not constructed
    11451145                                }
    11461146                        }
  • src/InitTweak/InitModel.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // InitModel.cc -- 
     7// InitModel.cc --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 16:37:08 2015
    13 // Update Count     : 1
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 07 13:38:46 2016
     13// Update Count     : 5
    1414//
    1515
     
    198198                assert(init == 0 && single != 0);
    199199                std::list< Expression * > empty;
    200                 init = new SingleInit( single->get_expr(), empty );
     200                init = new SingleInit( single->get_expr(), empty, false ); // cannot be constructed
    201201                return;
    202202        }
     
    214214                        } // if
    215215
    216                 init = new ListInit( contents );
     216                std::list< Expression * > desig;
     217                init = new ListInit( contents, desig, false ); // cannot be constructed
    217218                return;
    218219        }
  • src/InitTweak/RemoveInit.cc

    r1e9d87b r974906e2  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jan 07 11:34:33 2016
    13 // Update Count     : 23
    14 //
    15 
     12// Last Modified On : Mon Jan 11 14:41:26 2016
     13// Update Count     : 118
     14//
     15
     16#include <stack>
     17#include <list>
    1618#include "RemoveInit.h"
    1719#include "SynTree/Declaration.h"
     
    3133          public:
    3234                RemoveInit();
    33                 virtual ObjectDecl * mutate(ObjectDecl *objDecl);
     35                virtual ObjectDecl * mutate( ObjectDecl *objDecl );
    3436                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
    3537
    3638                virtual Statement * mutate( ReturnStmt * returnStmt );
    37 
    38                 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt);
    3939
    4040          protected:
     
    4444        };
    4545
     46        class CtorDtor : public GenPoly::PolyMutator {
     47          public:
     48                // CtorDtor();
     49
     50                virtual ObjectDecl * mutate( ObjectDecl * );
     51
     52                virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
     53
     54          protected:
     55                typedef std::map< std::string, DeclarationWithType * > MMMMAP;
     56                std::stack< MMMMAP > constructedObjects;
     57
     58                // to be added before block ends - use push_front so order is correct
     59                std::list< Statement * > destructorStmts;
     60        };
     61
    4662        void tweak( std::list< Declaration * > translationUnit ) {
    4763                RemoveInit remover;
     64                CtorDtor ctordtor;
    4865                mutateAll( translationUnit, remover );
     66                mutateAll( translationUnit, ctordtor );
    4967        }
    5068
    5169        RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}
    52 
    53         CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) {
    54                 mutateStatementList( compoundStmt->get_kids() );
    55                 return compoundStmt;
    56         }
    5770
    5871        // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the
     
    101114                return decl;
    102115        }
     116
     117        bool tryConstruct( ObjectDecl * objDecl ) {
     118                // xxx - handle designations
     119                return objDecl->get_init() == NULL ||
     120                        ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() );
     121        }
     122
     123        ExprStmt * makeCtorDtorStmt( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
     124                UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );
     125                expr->get_args().push_back( new VariableExpr( objDecl ) );
     126                expr->get_args().splice( expr->get_args().end(), args );
     127                return new ExprStmt( noLabels, expr );
     128        }
     129
     130        // InitExpander ctor/dtor being marked as weak symbols
     131        // this is causing a bug - Rodolfo's InitExpander is being constructed and destructed
     132        // with different fields, which causes a segfault
     133
     134        class InitExpander : public Visitor {
     135          public:
     136          InitExpander() {}
     137          // ~InitExpander() {}
     138                virtual void visit( SingleInit * singleInit );
     139                virtual void visit( ListInit * listInit );
     140                std::list< Expression * > argList;
     141        };
     142
     143        void InitExpander::visit( SingleInit * singleInit ) {
     144                argList.push_back( singleInit->get_value()->clone() );
     145        }
     146
     147        void InitExpander::visit( ListInit * listInit ) {
     148                // xxx - for now, assume no nested list inits
     149                std::list<Initializer*>::iterator it = listInit->begin_initializers();
     150                for ( ; it != listInit->end_initializers(); ++it ) {
     151                        (*it)->accept( *this );
     152                }
     153        }
     154
     155        std::list< Expression * > makeInitList( Initializer * init ) {
     156                if ( init ) {
     157                        InitExpander expander;
     158                        // init->accept( expander );
     159                        // std::list< Expression * > l = expander.argList;
     160                        std::list< Expression * > l;
     161                        return l;
     162                } else {
     163                        std::list< Expression * > l;
     164                        return l;
     165                }
     166        }
     167
     168        ObjectDecl * CtorDtor::mutate( ObjectDecl * objDecl ) {
     169                // hands off if designated or if @=
     170                if ( tryConstruct( objDecl ) ) {
     171                        ExprStmt * ctor = makeCtorDtorStmt( "?{}", objDecl, makeInitList( objDecl->get_init() ) );
     172                        ExprStmt * dtor = makeCtorDtorStmt( "^?{}", objDecl, std::list< Expression * >() );
     173
     174                        // set_ctor...
     175                        // need to remember init expression, in case no ctors exist
     176                        // if ctor does exist, want to use ctor stmt instead of init
     177                        objDecl->set_ctor( ctor );
     178                        destructorStmts.push_front( dtor );
     179                }
     180                return objDecl;
     181        }
     182
     183        CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
     184                CompoundStmt * ret = PolyMutator::mutate( compoundStmt );
     185                std::list< Statement * > &statements = ret->get_kids();
     186                if ( ! destructorStmts.empty() ) {
     187                        statements.splice( statements.end(), destructorStmts );
     188                } // if
     189                return ret;
     190        }
     191
     192
     193
    103194} // namespace InitTweak
    104195
  • src/MakeLibCfa.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // MakeLibCfa.cc -- 
     7// MakeLibCfa.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 10:33:33 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Jul 03 18:11:37 2015
    13 // Update Count     : 18
    14 // 
     12// Last Modified On : Thu Jan 07 13:34:39 2016
     13// Update Count     : 20
     14//
    1515
    1616#include "MakeLibCfa.h"
     
    2929                void visit( FunctionDecl* funcDecl );
    3030                void visit( ObjectDecl* objDecl );
    31  
     31
    3232                std::list< Declaration* > &get_newDecls() { return newDecls; }
    3333          private:
     
    4343        void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) {
    4444                if ( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
    45  
     45
    4646                FunctionDecl *funcDecl = origFuncDecl->clone();
    4747                CodeGen::OperatorInfo opInfo;
     
    9999        void MakeLibCfa::visit( ObjectDecl* origObjDecl ) {
    100100                if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
    101  
     101
    102102                ObjectDecl *objDecl = origObjDecl->clone();
    103103                assert( ! objDecl->get_init() );
    104104                std::list< Expression* > noDesignators;
    105                 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );
     105                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed
    106106                newDecls.push_back( objDecl );
    107107        }
  • src/Parser/DeclarationNode.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // DeclarationNode.cc -- 
     7// DeclarationNode.cc --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 12:34:05 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 14 14:46:32 2015
    13 // Update Count     : 126
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 07 13:18:02 2016
     13// Update Count     : 130
    1414//
    1515
     
    9696                os << endl << string( indent + 2, ' ' ) << "with initializer ";
    9797                initializer->printOneLine( os );
     98                os << " maybe constructed? " << initializer->get_maybeConstructed();
     99
    98100        } // if
    99101
     
    357359        } // if
    358360}
    359          
     361
    360362DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) {
    361363        if ( q ) {
     
    508510                assert( false );
    509511        } // switch
    510        
     512
    511513        return this;
    512514}
     
    619621                assert( a->type->kind == TypeData::Array );
    620622                TypeData *lastArray = findLast( a->type );
    621                 if ( type ) { 
     623                if ( type ) {
    622624                        switch ( type->kind ) {
    623625                          case TypeData::Aggregate:
     
    663665        } // if
    664666}
    665        
     667
    666668DeclarationNode *DeclarationNode::addIdList( DeclarationNode *ids ) {
    667669        type = addIdListToType( type, ids );
     
    868870Type *DeclarationNode::buildType() const {
    869871        assert( type );
    870  
     872
    871873        switch ( type->kind ) {
    872874          case TypeData::Enum:
  • src/Parser/InitializerNode.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // InitializerNode.cc -- 
    8 // 
     7// InitializerNode.cc --
     8//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:20:24 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Oct  8 17:18:55 2015
    13 // Update Count     : 4
    14 // 
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 07 13:32:57 2016
     13// Update Count     : 13
     14//
    1515
    1616#include <cassert>
     
    2323
    2424InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des )
    25         : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) {
     25        : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
    2626        if ( aggrp )
    2727                kids = dynamic_cast< InitializerNode *>( get_link() );
     
    3232
    3333InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des )
    34         : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ) {
     34        : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
    3535        if ( init != 0 )
    3636                set_link(init);
     
    9191                } // if
    9292
    93                 return new ListInit( initlist, designlist );
     93                return new ListInit( initlist, designlist, maybeConstructed );
    9494        } else {
    9595                std::list< Expression *> designators;
     
    9999
    100100                if ( get_expression() != 0)
    101                         return new SingleInit( get_expression()->build(), designators );
     101                        return new SingleInit( get_expression()->build(), designators, maybeConstructed );
    102102        } // if
    103103
  • src/Parser/ParseNode.h

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ParseNode.h -- 
     7// ParseNode.h --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Aug 19 15:59:27 2015
    13 // Update Count     : 174
     12// Last Modified On : Thu Jan 07 13:17:46 2016
     13// Update Count     : 177
    1414//
    1515
     
    175175  public:
    176176        enum Type { TupleC, Comma, TupleFieldSel,
    177                                 Cond, NCond, 
    178                                 SizeOf, AlignOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And, 
    179                                 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 
    180                                 Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, 
     177                                Cond, NCond,
     178                                SizeOf, AlignOf, Attr, CompLit, Plus, Minus, Mul, Div, Mod, Or, And,
     179                                BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
     180                                Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn,
    181181                                ERAssn, OrAssn, Index, FieldSel, PFieldSel, Range,
    182182                                UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
     
    307307        ValofExprNode( const ValofExprNode &other );
    308308        ~ValofExprNode();
    309  
     309
    310310        virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); }
    311311
     
    330330        enum TypeClass { Type, Dtype, Ftype };
    331331
    332         static const char *storageName[]; 
     332        static const char *storageName[];
    333333        static const char *qualifierName[];
    334334        static const char *basicTypeName[];
     
    420420class StatementNode : public ParseNode {
    421421  public:
    422         enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru, 
     422        enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru,
    423423                                While, Do,        For,
    424424                                Goto,  Continue,  Break,   Return,  Throw,
     
    518518        ExpressionNode *get_designators() const { return designator; }
    519519
     520        InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
     521        bool get_maybeConstructed() const { return maybeConstructed; }
     522
    520523        InitializerNode *next_init() const { return kids; }
    521524
     
    529532        ExpressionNode *designator; // may be list
    530533        InitializerNode *kids;
     534        bool maybeConstructed;
    531535};
    532536
  • src/Parser/parser.cc

    r1e9d87b r974906e2  
    72917291/* Line 1806 of yacc.c  */
    72927292#line 1684 "parser.yy"
    7293     { (yyval.in) = (yyvsp[(2) - (2)].in); }
     7293    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
    72947294    break;
    72957295
  • src/Parser/parser.yy

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // cfa.y -- 
    8 // 
     7// cfa.y --
     8//
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
     
    1212// Last Modified On : Thu Oct  8 17:17:54 2015
    1313// Update Count     : 1473
    14 // 
     14//
    1515
    1616// This grammar is based on the ANSI99/11 C grammar, specifically parts of EXPRESSION and STATEMENTS, and on the C
     
    16821682                { $$ = $2; }
    16831683        | ATassign initializer
    1684                 { $$ = $2; }
     1684                { $$ = $2->set_maybeConstructed( false ); }
    16851685        ;
    16861686
  • src/SynTree/Declaration.h

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Declaration.h -- 
     7// Declaration.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Dec 09 14:08:22 2015
    13 // Update Count     : 32
     12// Last Modified On : Thu Jan 07 14:48:44 2016
     13// Update Count     : 34
    1414//
    1515
     
    9191        Expression *get_bitfieldWidth() const { return bitfieldWidth; }
    9292        void set_bitfieldWidth( Expression *newValue ) { bitfieldWidth = newValue; }
     93        ExprStmt * get_ctor() const { return ctor; }
     94        void set_ctor( ExprStmt * newValue ) { ctor = newValue; }
    9395
    9496        virtual ObjectDecl *clone() const { return new ObjectDecl( *this ); }
     
    101103        Initializer *init;
    102104        Expression *bitfieldWidth;
     105        ExprStmt * ctor;
    103106};
    104107
  • src/SynTree/Initializer.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Initializer.cc -- 
     7// Initializer.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Aug 12 14:05:25 2015
    13 // Update Count     : 14
     12// Last Modified On : Thu Jan 07 15:00:18 2016
     13// Update Count     : 23
    1414//
    1515
     
    1818#include "utility.h"
    1919
    20 Initializer::Initializer() {}
     20Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {}
    2121
    2222Initializer::~Initializer() {}
     
    3131void Initializer::print( std::ostream &os, int indent ) {}
    3232
    33 SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators ) : value ( v ), designators( _designators ) {
     33SingleInit::SingleInit( Expression *v, std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) {
    3434}
    3535
    36 SingleInit::SingleInit( const SingleInit &other ) : value ( other.value ) {
     36SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( other.value ) {
    3737        cloneAll(other.designators, designators );
    3838}
     
    5454}
    5555
    56 ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators )
    57         : initializers( _initializers ), designators( _designators ) {
     56ListInit::ListInit( std::list<Initializer*> &_initializers, std::list<Expression *> &_designators, bool maybeConstructed )
     57        : Initializer( maybeConstructed), initializers( _initializers ), designators( _designators ) {
    5858}
    5959
     
    6565
    6666void ListInit::print( std::ostream &os, int indent ) {
    67         os << std::endl << std::string(indent, ' ') << "Compound initializer:  "; 
     67        os << std::endl << std::string(indent, ' ') << "Compound initializer:  ";
    6868        if ( ! designators.empty() ) {
    6969                os << std::string(indent + 2, ' ' ) << "designated by: [";
    7070                for ( std::list < Expression * >::iterator i = designators.begin();
    7171                          i != designators.end(); i++ ) {
    72                         ( *i )->print(os, indent + 4 ); 
     72                        ( *i )->print(os, indent + 4 );
    7373                } // for
    74        
     74
    7575                os << std::string(indent + 2, ' ' ) << "]";
    7676        } // if
    7777
    78         for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 
     78        for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ )
    7979                (*i)->print( os, indent + 2 );
    8080}
  • src/SynTree/Initializer.h

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Initializer.h -- 
     7// Initializer.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 09:03:48 2015
    13 // Update Count     : 1
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 07 13:33:20 2016
     13// Update Count     : 5
    1414//
    1515
     
    2727  public:
    2828        //      Initializer( std::string _name = std::string(""), int _pos = 0 );
    29         Initializer( );
     29        Initializer( bool maybeConstructed );
    3030        virtual ~Initializer();
    3131
     
    4343        }
    4444
     45        bool get_maybeConstructed() { return maybeConstructed; }
     46
    4547        virtual Initializer *clone() const = 0;
    4648        virtual void accept( Visitor &v ) = 0;
     
    5052        //      std::string name;
    5153        //      int pos;
     54        bool maybeConstructed;
    5255};
    5356
     
    5558class SingleInit : public Initializer {
    5659  public:
    57         SingleInit( Expression *value, std::list< Expression *> &designators );
     60        SingleInit( Expression *value, std::list< Expression *> &designators, bool maybeConstructed );
    5861        SingleInit( const SingleInit &other );
    5962        virtual ~SingleInit();
    60        
     63
    6164        Expression *get_value() { return value; }
    6265        void set_value( Expression *newValue ) { value = newValue; }
     
    7982class ListInit : public Initializer {
    8083  public:
    81         ListInit( std::list<Initializer*> &, 
    82                           std::list<Expression *> &designators = *(new std::list<Expression *>()) );
     84        ListInit( std::list<Initializer*> &,
     85                          std::list<Expression *> &designators, bool maybeConstructed );
    8386        virtual ~ListInit();
    8487
  • src/SynTree/ObjectDecl.cc

    r1e9d87b r974906e2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ObjectDecl.cc -- 
     7// ObjectDecl.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Sep 29 14:13:01 2015
    13 // Update Count     : 18
     12// Last Modified On : Fri Jan 08 15:29:10 2016
     13// Update Count     : 27
    1414//
    1515
     
    1919#include "Expression.h"
    2020#include "utility.h"
     21#include "Statement.h"
    2122
    2223ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn )
     
    2425        set_isInline( isInline );
    2526        set_isNoreturn( isNoreturn );
     27        set_ctor( NULL );
    2628}
    2729
    2830ObjectDecl::ObjectDecl( const ObjectDecl &other )
    29         : Parent( other ), type( maybeClone( other.type ) ), init( maybeClone( other.init ) ), bitfieldWidth( maybeClone( other.bitfieldWidth ) ) {
     31        : Parent( other ), type( maybeClone( other.type ) ), init( maybeClone( other.init ) ), bitfieldWidth( maybeClone( other.bitfieldWidth ) ), ctor( maybeClone( other.ctor ) ) {
    3032}
    3133
     
    3436        delete init;
    3537        delete bitfieldWidth;
     38        delete ctor;
    3639}
    3740
     
    5861                os << " with initializer ";
    5962                init->print( os, indent );
     63                os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed();
    6064        } // if
    6165
     
    6468                bitfieldWidth->print( os );
    6569        } // if
     70
     71        if ( ctor ) {
     72                os << " initially constructed with ";
     73                ctor->print( os, indent );
     74        } // if
    6675}
    6776
     
    6978#if 0
    7079        if ( get_mangleName() != "") {
    71                 os << get_mangleName() << ": "; 
    72         } else 
     80                os << get_mangleName() << ": ";
     81        } else
    7382#endif
    7483        if ( get_name() != "" ) {
Note: See TracChangeset for help on using the changeset viewer.