Changes in / [803deb1:771b3c3]


Ignore:
Location:
src
Files:
2 added
31 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r803deb1 r771b3c3  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jan 20 12:54:50 2016
    13 // Update Count     : 241
     12// Last Modified On : Wed Jan 20 12:59:17 2016
     13// Update Count     : 254
    1414//
    1515
     
    258258
    259259                                  case OT_CALL:
    260                                         // there are no intrinsic definitions of the function call operator
     260                                        // there are no intrinsic definitions of the function call operator or constructors or destructors
    261261                                        assert( false );
    262262                                        break;
     263
     264                                  case OT_CTOR:
     265                                  // intrinsic constructors should never be called directly - they should be transformed back into Initializer nodes
     266                                  assert(false);
     267                                  break;
     268
     269                                  case OT_DTOR:
     270                                  // intrinsic destructors do nothing - don't generate any code
     271                                  output << " // " << dynamic_cast<VariableExpr*>(applicationExpr->get_function())->get_var()->get_name() << endl;
     272                                  break;
    263273
    264274                                  case OT_PREFIX:
     
    277287                                        output << opInfo.symbol;
    278288                                        break;
     289
    279290
    280291                                  case OT_INFIX:
     
    323334                                  case OT_CALL:
    324335                                        assert( false );
     336
     337                                        case OT_CTOR:
     338                                        case OT_DTOR:
     339                                        // intrinsic constructors should never be called
     340                                        // intrinsic destructors do nothing
    325341                                        break;
    326342
  • src/CodeGen/OperatorTable.cc

    r803deb1 r771b3c3  
    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 : Tue Jun 23 17:41:14 2015
    13 // Update Count     : 5
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Oct 06 15:26:34 2015
     13// Update Count     : 9
    1414//
    1515
     
    2121                const OperatorInfo tableValues[] = {
    2222                        {       "?[?]",         "",             "_operator_index",                              OT_INDEX                        },
     23                        {       "?{}",          "",             "_constructor",                                 OT_CTOR                         },
     24                        {       "^?{}",         "",             "_destructor",                                  OT_DTOR                         }, // ~?{}, -?{}, !?{}, $?{}, ??{}, ^?{}, ?destroy, ?delete
    2325                        {       "?()",          "",             "_operator_call",                               OT_CALL                         },
    2426                        {       "?++",          "++",   "_operator_postincr",                   OT_POSTFIXASSIGN        },
  • src/CodeGen/OperatorTable.h

    r803deb1 r771b3c3  
    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 : Tue Jun 23 16:09:27 2015
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jun 24 16:17:57 2015
     13// Update Count     : 5
    1414//
    1515
     
    2222        enum OperatorType {
    2323                OT_INDEX,
     24                OT_CTOR,
     25                OT_DTOR,
    2426                OT_CALL,
    2527                OT_PREFIX,
  • src/GenPoly/Box.cc

    r803deb1 r771b3c3  
    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
     
    11391139
    11401140                                        std::list<Expression*> designators;
    1141                                         objectDecl->set_init( new SingleInit( alloc, designators ) );
     1141                                        objectDecl->set_init( new SingleInit( alloc, designators, false ) ); // not constructed
    11421142                                }
    11431143                        }
  • src/GenPoly/Specialize.cc

    r803deb1 r771b3c3  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jan 20 12:40:33 2016
    13 // Update Count     : 18
     12// Last Modified On : Wed Jan 20 13:00:00 2016
     13// Update Count     : 24
    1414//
    1515
     
    142142
    143143        Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) {
    144                 assert( ! actual->get_results().empty() );
     144                assert( ! actual->get_results().empty() ); // using front, should have this assert
    145145                if ( needsSpecialization( formalType, actual->get_results().front(), env ) ) {
    146146                        FunctionType *funType;
  • src/InitTweak/InitModel.cc

    r803deb1 r771b3c3  
    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

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // RemoveInit.cc -- 
     7// RemoveInit.cc --
    88//
    99// Author           : Rob Schluntz
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Dec 15 15:37:26 2015
    13 // Update Count     : 15
    14 //
    15 
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jan 19 11:12:49 2016
     13// Update Count     : 165
     14//
     15
     16#include <stack>
     17#include <list>
    1618#include "RemoveInit.h"
    1719#include "SynTree/Declaration.h"
     
    2123#include "SynTree/Initializer.h"
    2224#include "SynTree/Mutator.h"
     25#include "GenPoly/PolyMutator.h"
    2326
    2427namespace InitTweak {
     
    2629                const std::list<Label> noLabels;
    2730        }
    28        
    29         class RemoveInit : public Mutator {
     31
     32        class RemoveInit : public GenPoly::PolyMutator {
    3033          public:
     34                /// removes and replaces initialization for polymorphic value objects
     35                /// with assignment (TODO: constructor) statements.
     36                /// also consistently allocates a temporary variable for the return value
     37                /// of a function so that anything which the resolver decides can be assigned
     38                /// into the return type of a function can be returned.
     39                static void removeInitializers( std::list< Declaration * > &translationUnit );
     40
    3141                RemoveInit();
    32                 virtual ObjectDecl * mutate(ObjectDecl *objDecl);
     42                virtual ObjectDecl * mutate( ObjectDecl *objDecl );
    3343                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
    3444
    3545                virtual Statement * mutate( ReturnStmt * returnStmt );
    36                
    37                 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt);
    38                
     46
    3947          protected:
    40                 std::list< Statement* > stmtsToAddBefore;
    41                 std::list< Statement* > stmtsToAddAfter;
    42                 void mutateStatementList( std::list< Statement* > &statements );
    43 
    4448                std::list<DeclarationWithType*> returnVals;
    4549                UniqueName tempNamer;
     
    4751        };
    4852
    49         void tweak( std::list< Declaration * > translationUnit ) {
     53        class CtorDtor : public GenPoly::PolyMutator {
     54          public:
     55                /// create constructor and destructor statements for object declarations.
     56                /// Destructors are inserted directly into the code, whereas constructors
     57                /// will be added in after the resolver has run so that the initializer expression
     58                /// is only removed if a constructor is found
     59                static void generateCtorDtor( std::list< Declaration * > &translationUnit );
     60
     61                CtorDtor() : inFunction( false ) {}
     62
     63                virtual ObjectDecl * mutate( ObjectDecl * );
     64                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
     65                virtual Declaration* mutate( StructDecl *aggregateDecl );
     66                virtual Declaration* mutate( UnionDecl *aggregateDecl );
     67                virtual Declaration* mutate( EnumDecl *aggregateDecl );
     68                virtual Declaration* mutate( ContextDecl *aggregateDecl );
     69                virtual TypeDecl* mutate( TypeDecl *typeDecl );
     70                virtual Declaration* mutate( TypedefDecl *typeDecl );
     71
     72                virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
     73
     74          protected:
     75                bool inFunction;
     76
     77                // to be added before block ends - use push_front so order is correct
     78                std::list< Statement * > destructorStmts;
     79        };
     80
     81        void tweak( std::list< Declaration * > & translationUnit ) {
     82                RemoveInit::removeInitializers( translationUnit );
     83                CtorDtor::generateCtorDtor( translationUnit );
     84        }
     85
     86        void RemoveInit::removeInitializers( std::list< Declaration * > & translationUnit ) {
    5087                RemoveInit remover;
    5188                mutateAll( translationUnit, remover );
     
    5390
    5491        RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}
    55        
    56         void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) {
    57                 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
    58                         if ( ! stmtsToAddAfter.empty() ) {
    59                                 statements.splice( i, stmtsToAddAfter );
    60                         } // if
    61                         *i = (*i)->acceptMutator( *this );
    62                         if ( ! stmtsToAddBefore.empty() ) {
    63                                 statements.splice( i, stmtsToAddBefore );
    64                         } // if
    65                 } // for
    66                 if ( ! stmtsToAddAfter.empty() ) {
    67                         statements.splice( statements.end(), stmtsToAddAfter );
    68                 } // if
    69         }
    70 
    71         CompoundStmt *RemoveInit::mutate(CompoundStmt *compoundStmt) {
    72                 mutateStatementList( compoundStmt->get_kids() );
    73                 return compoundStmt;
    74         }
    7592
    7693        // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the
     
    7996                if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) {
    8097                        if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) {
    81                                 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
     98                                // xxx this can be more complicated - consider ListInit
     99                                UntypedExpr *assign = new UntypedExpr( new NameExpr( "?{}" ) );
    82100                                assign->get_args().push_back( new AddressExpr (new NameExpr( objDecl->get_name() ) ) );
    83101                                assign->get_args().push_back( single->get_value()->clone() );
     
    93111                // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address
    94112                // is being returned
     113                // xxx - this should construct rather than assign
    95114                if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue()  ) {
    96115                        ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 );
    97                         stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) );
    98                        
     116                        stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) );
     117
    99118                        UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
    100119                        assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) );
    101120                        assign->get_args().push_back( returnStmt->get_expr() );
    102                         stmtsToAddBefore.push_back(new ExprStmt(noLabels, assign));
     121                        stmtsToAdd.push_back(new ExprStmt(noLabels, assign));
    103122
    104123                        returnStmt->set_expr( new VariableExpr( newObj ) );
     
    110129                std::list<DeclarationWithType*> oldReturnVals = returnVals;
    111130                std::string oldFuncName = funcName;
    112                
     131
    113132                FunctionType * type = functionDecl->get_functionType();
    114133                returnVals = type->get_returnVals();
     
    119138                return decl;
    120139        }
     140
     141
     142        void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {
     143                CtorDtor ctordtor;
     144                mutateAll( translationUnit, ctordtor );
     145        }
     146
     147        namespace {
     148                bool tryConstruct( ObjectDecl * objDecl ) {
     149                        // xxx - handle designations
     150                        return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) &&
     151                                (objDecl->get_init() == NULL ||
     152                                ( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() ));
     153                }
     154
     155                Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
     156                        UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );
     157                        expr->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
     158                        expr->get_args().splice( expr->get_args().end(), args );
     159                        return expr;
     160                }
     161
     162                class InitExpander : public Visitor {
     163                  public:
     164                  InitExpander() {}
     165                  // ~InitExpander() {}
     166                        virtual void visit( SingleInit * singleInit );
     167                        virtual void visit( ListInit * listInit );
     168                        std::list< Expression * > argList;
     169                };
     170
     171                void InitExpander::visit( SingleInit * singleInit ) {
     172                        argList.push_back( singleInit->get_value()->clone() );
     173                }
     174
     175                void InitExpander::visit( ListInit * listInit ) {
     176                        // xxx - for now, assume no nested list inits
     177                        std::list<Initializer*>::iterator it = listInit->begin_initializers();
     178                        for ( ; it != listInit->end_initializers(); ++it ) {
     179                                (*it)->accept( *this );
     180                        }
     181                }
     182
     183                std::list< Expression * > makeInitList( Initializer * init ) {
     184                        InitExpander expander;
     185                        maybeAccept( init, expander );
     186                        return expander.argList;
     187                }
     188        }
     189
     190        ObjectDecl * CtorDtor::mutate( ObjectDecl * objDecl ) {
     191                // hands off if designated or if @=
     192                if ( tryConstruct( objDecl ) ) {
     193                        if ( inFunction ) {
     194                                Expression * ctor = makeCtorDtorExpr( "?{}", objDecl, makeInitList( objDecl->get_init() ) );
     195                                Expression * dtor = makeCtorDtorExpr( "^?{}", objDecl, std::list< Expression * >() );
     196
     197                                // need to remember init expression, in case no ctors exist
     198                                // if ctor does exist, want to use ctor expression instead of init
     199                                // push this decision to the resolver
     200                                objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) );
     201                                destructorStmts.push_front( new ExprStmt( noLabels, dtor ) );
     202                        } else {
     203                                // xxx - find a way to construct/destruct globals
     204                                // hack: implicit "static" initialization routine for each struct type? or something similar?
     205                                // --ties into module system
     206                        }
     207                }
     208                return objDecl;
     209        }
     210
     211        DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {
     212                // parameters should not be constructed and destructed, so don't mutate FunctionType
     213                bool oldInFunc = inFunction;
     214                mutateAll( functionDecl->get_oldDecls(), *this );
     215                inFunction = true;
     216                functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
     217                inFunction = oldInFunc;
     218                return functionDecl;
     219        }
     220
     221        CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
     222                CompoundStmt * ret = PolyMutator::mutate( compoundStmt );
     223                std::list< Statement * > &statements = ret->get_kids();
     224                if ( ! destructorStmts.empty() ) {
     225                        statements.splice( statements.end(), destructorStmts );
     226                } // if
     227                return ret;
     228        }
     229
     230        // should not traverse into any of these declarations to find objects
     231        // that need to be constructed or destructed
     232        Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }
     233        Declaration* CtorDtor::mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
     234        Declaration* CtorDtor::mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
     235        Declaration* CtorDtor::mutate( ContextDecl *aggregateDecl ) { return aggregateDecl; }
     236        TypeDecl* CtorDtor::mutate( TypeDecl *typeDecl ) { return typeDecl; }
     237        Declaration* CtorDtor::mutate( TypedefDecl *typeDecl ) { return typeDecl; }
     238
    121239} // namespace InitTweak
    122240
  • src/InitTweak/RemoveInit.h

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // RemoveInit.h -- 
     7// RemoveInit.h --
    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 : Fri Nov 27 17:00:47 2015
    13 // Update Count     : 2
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Mon Jan 11 16:02:44 2016
     13// Update Count     : 3
    1414//
    1515
     
    2626namespace InitTweak {
    2727        /// Adds assignment statements for polymorphic type initializers
    28         void tweak( std::list< Declaration * > translationUnit );
    29 } // namespace 
     28        void tweak( std::list< Declaration * > & translationUnit );
     29} // namespace
    3030
    3131#endif // GENPOLY_POLYMUTATOR_H
  • src/InitTweak/module.mk

    r803deb1 r771b3c3  
    1111## Created On       : Mon Jun  1 17:49:17 2015
    1212## Last Modified By : Rob Schluntz
    13 ## Last Modified On : Mon Jan 11 14:40:16 2016
    14 ## Update Count     : 2
     13## Last Modified On : Wed Jan 13 16:29:03 2016
     14## Update Count     : 3
    1515###############################################################################
    1616
    17 SRC += InitTweak/RemoveInit.cc
    18 
     17SRC += InitTweak/RemoveInit.cc \
     18        InitTweak/FixInit.cc
  • src/MakeLibCfa.cc

    r803deb1 r771b3c3  
    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
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun 26 16:52:59 2015
    13 // Update Count     : 14
    14 // 
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jan 19 13:20:26 2016
     13// Update Count     : 40
     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;
     
    5454                assert( param != funcDecl->get_functionType()->get_parameters().end() );
    5555
    56                 if ( (*param)->get_name() == "" ) {
    57                         (*param)->set_name( paramNamer.newName() );
    58                         (*param)->set_linkage( LinkageSpec::C );
    59                 } // if
     56                for ( ; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
     57                        if ( (*param)->get_name() == "" ) {
     58                                (*param)->set_name( paramNamer.newName() );
     59                                (*param)->set_linkage( LinkageSpec::C );
     60                        }
     61                        newExpr->get_args().push_back( new VariableExpr( *param ) );
     62                } // for
     63
     64                funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
     65                newDecls.push_back( funcDecl );
    6066
    6167                switch ( opInfo.type ) {
     
    6571                  case CodeGen::OT_POSTFIX:
    6672                  case CodeGen::OT_INFIX:
    67                         newExpr->get_args().push_back( new VariableExpr( *param ) );
    68                         break;
    6973                  case CodeGen::OT_PREFIXASSIGN:
    7074                  case CodeGen::OT_POSTFIXASSIGN:
    7175                  case CodeGen::OT_INFIXASSIGN:
    72                         {
    73                                 newExpr->get_args().push_back( new VariableExpr( *param ) );
    74                                 // UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
    75                                 // deref->get_args().push_back( new VariableExpr( *param ) );
    76                                 // newExpr->get_args().push_back( deref );
     76                                funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
    7777                                break;
    78                         }
     78                  case CodeGen::OT_CTOR:
     79                        // ctors don't return a value
     80                        if ( funcDecl->get_functionType()->get_parameters().size() == 1 ) {
     81                                // intrinsic default constructors should do nothing
     82                                // delete newExpr;
     83                                break;
     84                        } else {
     85                                assert( funcDecl->get_functionType()->get_parameters().size() == 2 );
     86                                // anything else is a single parameter constructor that is effectively a C-style assignment
     87                                // delete newExpr->get_function();
     88                                assert(newExpr->get_args().size()==2);
     89                                newExpr->set_function( new NameExpr( "?=?" ) );
     90                                funcDecl->get_statements()->get_kids().push_back( new ExprStmt( std::list< Label >(), newExpr ) );
     91                        }
     92                        break;
     93                  case CodeGen::OT_DTOR:
     94                        // intrinsic destructors should do nothing
     95                        // delete newExpr;
     96                        break;
    7997                  case CodeGen::OT_CONSTANT:
    8098                  case CodeGen::OT_LABELADDRESS:
     
    82100                        assert( false );
    83101                } // switch
    84 
    85                 for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
    86                         if ( (*param)->get_name() == "" ) {
    87                                 (*param)->set_name( paramNamer.newName() );
    88                                 (*param)->set_linkage( LinkageSpec::C );
    89                         }
    90                         newExpr->get_args().push_back( new VariableExpr( *param ) );
    91                 } // for
    92                 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
    93                 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
    94                 newDecls.push_back( funcDecl );
    95102        }
    96103
    97104        void MakeLibCfa::visit( ObjectDecl* origObjDecl ) {
    98105                if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
    99  
     106
    100107                ObjectDecl *objDecl = origObjDecl->clone();
    101108                assert( ! objDecl->get_init() );
    102109                std::list< Expression* > noDesignators;
    103                 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );
     110                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed
    104111                newDecls.push_back( objDecl );
    105112        }
    106113} // namespace LibCfa
    107 
    108 // Local Variables: //
    109 // tab-width: 4 //
    110 // mode: c++ //
    111 // compile-command: "make install" //
    112 // End: //
  • src/Makefile.in

    r803deb1 r771b3c3  
    124124        GenPoly/cfa_cpp-DeclMutator.$(OBJEXT) \
    125125        InitTweak/cfa_cpp-RemoveInit.$(OBJEXT) \
     126        InitTweak/cfa_cpp-FixInit.$(OBJEXT) \
    126127        Parser/cfa_cpp-parser.$(OBJEXT) Parser/cfa_cpp-lex.$(OBJEXT) \
    127128        Parser/cfa_cpp-TypedefTable.$(OBJEXT) \
     
    346347        GenPoly/CopyParams.cc GenPoly/FindFunction.cc \
    347348        GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \
    348         InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll \
    349         Parser/TypedefTable.cc Parser/ParseNode.cc \
     349        InitTweak/RemoveInit.cc InitTweak/FixInit.cc Parser/parser.yy \
     350        Parser/lex.ll Parser/TypedefTable.cc Parser/ParseNode.cc \
    350351        Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
    351352        Parser/StatementNode.cc Parser/InitializerNode.cc \
     
    562563        @: > InitTweak/$(DEPDIR)/$(am__dirstamp)
    563564InitTweak/cfa_cpp-RemoveInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
     565        InitTweak/$(DEPDIR)/$(am__dirstamp)
     566InitTweak/cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
    564567        InitTweak/$(DEPDIR)/$(am__dirstamp)
    565568Parser/parser.h: Parser/parser.cc
     
    783786        -rm -f GenPoly/cfa_cpp-ScrubTyVars.$(OBJEXT)
    784787        -rm -f GenPoly/cfa_cpp-Specialize.$(OBJEXT)
     788        -rm -f InitTweak/cfa_cpp-FixInit.$(OBJEXT)
    785789        -rm -f InitTweak/cfa_cpp-RemoveInit.$(OBJEXT)
    786790        -rm -f Parser/cfa_cpp-DeclarationNode.$(OBJEXT)
     
    890894@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/cfa_cpp-ScrubTyVars.Po@am__quote@
    891895@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/cfa_cpp-Specialize.Po@am__quote@
     896@AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po@am__quote@
    892897@AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/cfa_cpp-RemoveInit.Po@am__quote@
    893898@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/cfa_cpp-DeclarationNode.Po@am__quote@
     
    13881393@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-RemoveInit.obj `if test -f 'InitTweak/RemoveInit.cc'; then $(CYGPATH_W) 'InitTweak/RemoveInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/RemoveInit.cc'; fi`
    13891394
     1395InitTweak/cfa_cpp-FixInit.o: InitTweak/FixInit.cc
     1396@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/cfa_cpp-FixInit.o -MD -MP -MF InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo -c -o InitTweak/cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc
     1397@am__fastdepCXX_TRUE@   $(am__mv) InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po
     1398@AMDEP_TRUE@@am__fastdepCXX_FALSE@      source='InitTweak/FixInit.cc' object='InitTweak/cfa_cpp-FixInit.o' libtool=no @AMDEPBACKSLASH@
     1399@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1400@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc
     1401
     1402InitTweak/cfa_cpp-FixInit.obj: InitTweak/FixInit.cc
     1403@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/cfa_cpp-FixInit.obj -MD -MP -MF InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo -c -o InitTweak/cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi`
     1404@am__fastdepCXX_TRUE@   $(am__mv) InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po
     1405@AMDEP_TRUE@@am__fastdepCXX_FALSE@      source='InitTweak/FixInit.cc' object='InitTweak/cfa_cpp-FixInit.obj' libtool=no @AMDEPBACKSLASH@
     1406@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1407@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi`
     1408
    13901409Parser/cfa_cpp-parser.o: Parser/parser.cc
    13911410@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/cfa_cpp-parser.o -MD -MP -MF Parser/$(DEPDIR)/cfa_cpp-parser.Tpo -c -o Parser/cfa_cpp-parser.o `test -f 'Parser/parser.cc' || echo '$(srcdir)/'`Parser/parser.cc
  • src/Parser/DeclarationNode.cc

    r803deb1 r771b3c3  
    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

    r803deb1 r771b3c3  
    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

    r803deb1 r771b3c3  
    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 12 13:27:11 2015
    13 // Update Count     : 172
     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,
    182                                 UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress
     182                                UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
     183                                Ctor, Dtor,
    183184        };
    184185
     
    306307        ValofExprNode( const ValofExprNode &other );
    307308        ~ValofExprNode();
    308  
     309
    309310        virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); }
    310311
     
    329330        enum TypeClass { Type, Dtype, Ftype };
    330331
    331         static const char *storageName[]; 
     332        static const char *storageName[];
    332333        static const char *qualifierName[];
    333334        static const char *basicTypeName[];
     
    419420class StatementNode : public ParseNode {
    420421  public:
    421         enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru, 
     422        enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru,
    422423                                While, Do,        For,
    423424                                Goto,  Continue,  Break,   Return,  Throw,
     
    517518        ExpressionNode *get_designators() const { return designator; }
    518519
     520        InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
     521        bool get_maybeConstructed() const { return maybeConstructed; }
     522
    519523        InitializerNode *next_init() const { return kids; }
    520524
     
    528532        ExpressionNode *designator; // may be list
    529533        InitializerNode *kids;
     534        bool maybeConstructed;
    530535};
    531536
  • src/Parser/TypeData.cc

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TypeData.cc -- 
     7// TypeData.cc --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:12:51 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 14 14:57:23 2015
    13 // Update Count     : 32
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 14 10:43:42 2016
     13// Update Count     : 36
    1414//
    1515
     
    436436        for ( std::list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) {
    437437                if ( (*i)->get_kind() == TypeDecl::Any ) {
     438                        // add assertion parameters to `type' tyvars
     439                        // add:  T * ?=?(T *, T)
    438440                        FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
    439441                        assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) );
     
    441443                        assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), 0 ) );
    442444                        (*i)->get_assertions().push_front( new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignType, 0, false, false ) );
     445
     446                        // add:  void ?{}(T *)
     447                        FunctionType *ctorType = new FunctionType( Type::Qualifiers(), false );
     448                        ctorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) );
     449                        (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, 0, false, false ) );
     450
     451                        // add:  void ^?{}(T *)
     452                        FunctionType *dtorType = new FunctionType( Type::Qualifiers(), false );
     453                        dtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), 0 ) );
     454                        (*i)->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, 0, false, false ) );
    443455                } // if
    444456        } // for
  • src/Parser/parser.cc

    r803deb1 r771b3c3  
    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

    r803deb1 r771b3c3  
    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/ResolvExpr/Resolver.cc

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Resolver.cc -- 
     7// Resolver.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:17:01 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 24 17:33:54 2015
    13 // Update Count     : 178
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Thu Jan 14 16:45:32 2016
     13// Update Count     : 203
    1414//
    1515
     
    3333          public:
    3434                Resolver() : SymTab::Indexer( false ), switchType( 0 ) {}
    35  
     35
    3636                virtual void visit( FunctionDecl *functionDecl );
    3737                virtual void visit( ObjectDecl *functionDecl );
     
    5454                virtual void visit( SingleInit *singleInit );
    5555                virtual void visit( ListInit *listInit );
     56                virtual void visit( ConstructorInit *ctorInit );
    5657          private:
    5758        typedef std::list< Initializer * >::iterator InitIterator;
     
    5960          void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );
    6061          void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );
     62          void fallbackInit( ConstructorInit * ctorInit );
    6163
    6264                std::list< Type * > functionReturn;
     
    9597                        return newExpr;
    9698                }
    97  
     99
    98100                Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    99101                        TypeEnvironment env;
     
    126128                        } // if
    127129                }
    128  
     130
    129131                Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    130132                        TypeEnvironment env;
     
    159161                        return newExpr;
    160162                }
    161  
    162         }
    163  
     163
     164        }
     165
    164166        void Resolver::visit( ObjectDecl *objectDecl ) {
    165167                Type *new_type = resolveTypeof( objectDecl->get_type(), *this );
     
    251253                        forStmt->set_condition( newExpr );
    252254                } // if
    253                
     255
    254256                if ( forStmt->get_increment() ) {
    255257                        Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this );
     
    265267                delete switchStmt->get_condition();
    266268                switchStmt->set_condition( newExpr );
    267  
     269
    268270                visitor.Visitor::visit( switchStmt );
    269271        }
     
    307309        bool isCharType( T t ) {
    308310                if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) {
    309                         return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 
     311                        return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar ||
    310312                                bt->get_kind() == BasicType::UnsignedChar;
    311313                }
     
    319321                                string n = ne->get_name();
    320322                                if (n == "0") {
    321                                         initContext = new BasicType(Type::Qualifiers(), 
     323                                        initContext = new BasicType(Type::Qualifiers(),
    322324                                                                                                BasicType::SignedInt);
    323325                                } else {
     
    325327                                        initContext = decl->get_type();
    326328                                }
    327                         } else if (ConstantExpr * e = 
     329                        } else if (ConstantExpr * e =
    328330                                           dynamic_cast<ConstantExpr*>(singleInit->get_value())) {
    329331                                Constant *c = e->get_constant();
     
    349351                                                        singleInit->set_value( ce->get_arg() );
    350352                                                        ce->set_arg( NULL );
    351                                                         delete ce;                                                                     
     353                                                        delete ce;
    352354                                                }
    353355                                        }
     
    465467#endif
    466468        }
     469
     470        // ConstructorInit - fall back on C-style initializer
     471        void Resolver::fallbackInit( ConstructorInit * ctorInit ) {
     472                // could not find valid constructor, or found an intrinsic constructor
     473                // fall back on C-style initializer
     474                delete ctorInit->get_ctor();
     475                ctorInit->set_ctor( NULL );
     476                maybeAccept( ctorInit->get_init(), *this );
     477        }
     478
     479        void Resolver::visit( ConstructorInit *ctorInit ) {
     480                TypeEnvironment env;
     481                AlternativeFinder finder( *this, env );
     482                finder.find( ctorInit->get_ctor() );
     483
     484                if ( finder.get_alternatives().size() == 0 ) {
     485                        fallbackInit( ctorInit );
     486                } else if ( finder.get_alternatives().size() == 1 ) {
     487                        Alternative &choice = finder.get_alternatives().front();
     488                        if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( choice.expr ) ) {
     489                                if ( VariableExpr * function = dynamic_cast< VariableExpr * > ( appExpr->get_function() ) ) {
     490                                        if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
     491                                                // if the constructor that was found is intrinsic, reset to C-style
     492                                                // initializer so that code generation is easy to handle
     493                                                fallbackInit( ctorInit );
     494                                                return;
     495                                        }
     496                                }
     497                        }
     498                        // found a constructor - can get rid of C-style initializer
     499                        Expression *newExpr = choice.expr->clone();
     500                        finishExpr( newExpr, choice.env );
     501                        ctorInit->set_ctor( newExpr );
     502                        delete ctorInit->get_init();
     503                        ctorInit->set_init( NULL );
     504                } else {
     505                        // too many constructors found
     506                        assert(false);
     507                }
     508        }
    467509} // namespace ResolvExpr
    468510
  • src/SymTab/Validate.cc

    r803deb1 r771b3c3  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Dec 18 15:34:05 2015
    13 // Update Count     : 218
     12// Last Modified On : Thu Jan 07 11:27:49 2016
     13// Update Count     : 269
    1414//
    1515
     
    202202        };
    203203
     204        class VerifyCtorDtor : public Visitor {
     205        public:
     206                /// ensure that constructors and destructors have at least one
     207                /// parameter, the first of which must be a pointer, and no
     208                /// return values.
     209                static void verify( std::list< Declaration * > &translationUnit );
     210
     211                // VerifyCtorDtor() {}
     212
     213                virtual void visit( FunctionDecl *funcDecl );
     214        private:
     215        };
     216
    204217        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    205218                Pass1 pass1;
     
    213226                AutogenerateRoutines::autogenerateRoutines( translationUnit );
    214227                acceptAll( translationUnit, pass3 );
     228                VerifyCtorDtor::verify( translationUnit );
    215229        }
    216230
     
    10291043        }
    10301044
     1045        void VerifyCtorDtor::verify( std::list< Declaration * > & translationUnit ) {
     1046                VerifyCtorDtor verifier;
     1047                acceptAll( translationUnit, verifier );
     1048        }
     1049
     1050        void VerifyCtorDtor::visit( FunctionDecl * funcDecl ) {
     1051                FunctionType * funcType = funcDecl->get_functionType();
     1052                std::list< DeclarationWithType * > &returnVals = funcType->get_returnVals();
     1053                std::list< DeclarationWithType * > &params = funcType->get_parameters();
     1054
     1055                if ( funcDecl->get_name() == "?{}" || funcDecl->get_name() == "^?{}" ) {
     1056                        if ( params.size() == 0 ) {
     1057                                throw SemanticError( "Constructors and destructors require at least one parameter ", funcDecl );
     1058                        }
     1059                        if ( ! dynamic_cast< PointerType * >( params.front()->get_type() ) ) {
     1060                                throw SemanticError( "First parameter of a constructor or destructor must be a pointer ", funcDecl );
     1061                        }
     1062                        if ( returnVals.size() != 0 ) {
     1063                                throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl );
     1064                        }
     1065                }
     1066
     1067                Visitor::visit( funcDecl );
     1068                // original idea: modify signature of ctor/dtors and insert appropriate return statements
     1069                // to cause desired behaviour
     1070                // new idea: add comma exprs to every ctor call to produce first parameter.
     1071                // this requires some memoization of the first parameter, because it can be a
     1072                // complicated expression with side effects (see: malloc). idea: add temporary variable
     1073                // that is assigned address of constructed object in ctor argument position and
     1074                // return the temporary. It should also be done after all implicit ctors are
     1075                // added, so not in this pass!
     1076        }
    10311077} // namespace SymTab
    10321078
  • src/SynTree/Declaration.h

    r803deb1 r771b3c3  
    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 : Wed Jan 13 16:11:49 2016
     13// Update Count     : 36
    1414//
    1515
  • src/SynTree/Initializer.cc

    r803deb1 r771b3c3  
    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 : Wed Jan 13 15:31:45 2016
     13// Update Count     : 28
    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}
     81
     82
     83ConstructorInit::ConstructorInit( Expression * ctor, Initializer * init ) : Initializer( true ), ctor( ctor ), init( init ) {}
     84ConstructorInit::~ConstructorInit() {
     85        delete ctor;
     86        delete init;
     87}
     88
     89ConstructorInit *ConstructorInit::clone() const {
     90        return new ConstructorInit( *this );
     91}
     92
     93void ConstructorInit::print( std::ostream &os, int indent ) {
     94        os << std::endl << std::string(indent, ' ') << "Constructor initializer: ";
     95        if ( ctor ) {
     96                os << " initially constructed with ";
     97                ctor->print( os, indent+2 );
     98        } // if
     99
     100        if ( init ) {
     101                os << " with fallback C-style initializer: ";
     102                init->print( os, indent+2 );
     103        }
     104}
     105
     106
    81107// Local Variables: //
    82108// tab-width: 4 //
  • src/SynTree/Initializer.h

    r803deb1 r771b3c3  
    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 : Wed Jan 13 15:29:53 2016
     13// Update Count     : 17
    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
     
    100103};
    101104
     105// ConstructorInit represents an initializer that is either a constructor expression or
     106// a C-style initializer.
     107class ConstructorInit : public Initializer {
     108  public:
     109        ConstructorInit( Expression * ctor, Initializer * init );
     110        virtual ~ConstructorInit();
     111
     112        void set_ctor( Expression * newValue ) { ctor = newValue; }
     113        Expression * get_ctor() const { return ctor; }
     114        void set_init( Initializer * newValue ) { init = newValue; }
     115        Initializer * get_init() const { return init; }
     116
     117        virtual ConstructorInit *clone() const;
     118        virtual void accept( Visitor &v ) { v.visit( this ); }
     119        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     120        virtual void print( std::ostream &os, int indent = 0 );
     121
     122  private:
     123        Expression * ctor;
     124        // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
     125        // if an appropriate constructor definition is not found by the resolver
     126        Initializer * init;
     127};
     128
    102129#endif // INITIALIZER_H
    103130
  • src/SynTree/Mutator.cc

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Mutator.cc -- 
     7// Mutator.cc --
    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 : Sat Jul 25 19:21:33 2015
    13 // Update Count     : 11
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:32:29 2016
     13// Update Count     : 15
    1414//
    1515
     
    419419}
    420420
     421Initializer *Mutator::mutate( ConstructorInit *ctorInit ) {
     422        ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) );
     423        ctorInit->set_init( maybeMutate( ctorInit->get_init(), *this ) );
     424        return ctorInit;
     425}
     426
    421427Subrange *Mutator::mutate( Subrange *subrange ) {
    422428        return subrange;
  • src/SynTree/Mutator.h

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Mutator.h -- 
     7// Mutator.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 : Thu Nov 19 22:26:16 2015
    13 // Update Count     : 8
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:24:26 2016
     13// Update Count     : 9
    1414//
    1515#include <cassert>
     
    6262        virtual Expression* mutate( MemberExpr *memberExpr );
    6363        virtual Expression* mutate( VariableExpr *variableExpr );
    64         virtual Expression* mutate( ConstantExpr *constantExpr ); 
     64        virtual Expression* mutate( ConstantExpr *constantExpr );
    6565        virtual Expression* mutate( SizeofExpr *sizeofExpr );
    6666        virtual Expression* mutate( AlignofExpr *alignofExpr );
     
    9191        virtual Initializer* mutate( SingleInit *singleInit );
    9292        virtual Initializer* mutate( ListInit *listInit );
     93        virtual Initializer* mutate( ConstructorInit *ctorInit );
    9394
    9495        virtual Subrange *mutate( Subrange *subrange );
  • src/SynTree/ObjectDecl.cc

    r803deb1 r771b3c3  
    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 : Wed Jan 13 16:11:19 2016
     13// Update Count     : 29
    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 )
     
    5859                os << " with initializer ";
    5960                init->print( os, indent );
     61                os << std::string(indent, ' ') << "maybeConstructed? " << init->get_maybeConstructed();
    6062        } // if
    6163
     
    6971#if 0
    7072        if ( get_mangleName() != "") {
    71                 os << get_mangleName() << ": "; 
    72         } else 
     73                os << get_mangleName() << ": ";
     74        } else
    7375#endif
    7476        if ( get_name() != "" ) {
  • src/SynTree/SynTree.h

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // SynTree.h -- 
     7// SynTree.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 : Thu Jul 23 23:25:04 2015
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:28:41 2016
     13// Update Count     : 4
    1414//
    1515
     
    9999class SingleInit;
    100100class ListInit;
     101class ConstructorInit;
    101102
    102103class Subrange;
  • src/SynTree/Visitor.cc

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Visitor.cc -- 
     7// Visitor.cc --
    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 : Fri Jul 24 16:11:05 2015
    13 // Update Count     : 15
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:27:23 2016
     13// Update Count     : 18
    1414//
    1515
     
    353353}
    354354
     355void Visitor::visit( ConstructorInit *ctorInit ) {
     356        maybeAccept( ctorInit->get_ctor(), *this );
     357        maybeAccept( ctorInit->get_init(), *this );
     358}
     359
    355360void Visitor::visit( Subrange *subrange ) {}
    356361
  • src/SynTree/Visitor.h

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Visitor.h -- 
     7// Visitor.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 : Thu Jul 23 23:22:23 2015
    13 // Update Count     : 4
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:24:05 2016
     13// Update Count     : 5
    1414//
    1515
     
    6262        virtual void visit( MemberExpr *memberExpr );
    6363        virtual void visit( VariableExpr *variableExpr );
    64         virtual void visit( ConstantExpr *constantExpr ); 
     64        virtual void visit( ConstantExpr *constantExpr );
    6565        virtual void visit( SizeofExpr *sizeofExpr );
    6666        virtual void visit( AlignofExpr *alignofExpr );
     
    9191        virtual void visit( SingleInit *singleInit );
    9292        virtual void visit( ListInit *listInit );
     93        virtual void visit( ConstructorInit *ctorInit );
    9394
    9495        virtual void visit( Subrange *subrange );
  • src/initialization.txt

    r803deb1 r771b3c3  
    3434sure that resolved initializers for all declarations are being
    3535generated.
     36
     37
     38------
     39
     40More recent email: (I am quoted; Richard is the responder)
     41> As far as I'm aware, the only way that I could currently get the correct
     42> results from the unification engine is by feeding it an expression that
     43> looks like "?=?( ((struct Y)x.y).a, 10 )", then picking out the pieces that
     44> I need (namely the correct choice for a). Does this seem like a reasonable
     45> approach to solve this problem?
     46
     47No, unfortunately. Initialization isn't being rewritten as assignment,
     48so you shouldn't allow the particular selection of assignment
     49operators that happen to be in scope (and which may include
     50user-defined operators) to guide the type resolution.
     51
     52I don't think there is any way to rewrite an initializer as a single
     53expression and have the resolver just do the right thing. I see the
     54algorithm as:
     55
     56For each alternative interpretation of the designator:
     57  Construct an expression that casts the initializer to the type of
     58    the designator
     59  Construct an AlternativeFinder and use it to find the lowest cost
     60    interpretation of the expression
     61  Add this interpretation to a list of possibilities
     62Go through the list of possibilities and pick the lowest cost
     63
     64As with many things in the resolver, it's conceptually simple but the
     65implementation may be a bit of a pain. It fits in with functions like
     66findSingleExpression, findIntegralExpression in Resolver.cc, although
     67it will be significantly more complicated than any of the existing
     68ones.
     69
     70
     71
  • src/libcfa/prelude.cf

    r803deb1 r771b3c3  
    1 //                               -*- Mode: C -*- 
    2 // 
     1//                               -*- Mode: C -*-
     2//
    33// Copyright (C) Glen Ditchfield 1994, 1999
    4 // 
     4//
    55// prelude.cf -- Standard Cforall Preample for C99
    6 // 
     6//
    77// Author           : Glen Ditchfield
    88// Created On       : Sat Nov 29 07:23:41 2014
     
    116116forall( ftype FT ) lvalue FT             *?( FT * );
    117117
    118 _Bool                   +?( _Bool ),                    -?( _Bool ),                    ~?( _Bool );         
    119 signed int              +?( signed int ),               -?( signed int ),               ~?( signed int );           
    120 unsigned int            +?( unsigned int ),             -?( unsigned int ),             ~?( unsigned int );         
    121 signed long int         +?( signed long int ),          -?( signed long int ),          ~?( signed long int );       
    122 unsigned long int       +?( unsigned long int ),        -?( unsigned long int ),        ~?( unsigned long int );             
    123 signed long long int    +?( signed long long int ),     -?( signed long long int ),     ~?( signed long long int );   
    124 unsigned long long int  +?( unsigned long long int ),   -?( unsigned long long int ),   ~?( unsigned long long int ); 
     118_Bool                   +?( _Bool ),                    -?( _Bool ),                    ~?( _Bool );
     119signed int              +?( signed int ),               -?( signed int ),               ~?( signed int );
     120unsigned int            +?( unsigned int ),             -?( unsigned int ),             ~?( unsigned int );
     121signed long int         +?( signed long int ),          -?( signed long int ),          ~?( signed long int );
     122unsigned long int       +?( unsigned long int ),        -?( unsigned long int ),        ~?( unsigned long int );
     123signed long long int    +?( signed long long int ),     -?( signed long long int ),     ~?( signed long long int );
     124unsigned long long int  +?( unsigned long long int ),   -?( unsigned long long int ),   ~?( unsigned long long int );
    125125float                   +?( float ),                    -?( float );
    126126double                  +?( double ),                   -?( double );
     
    626626                        ?+=?( long double _Complex *, long double _Complex ), ?+=?( volatile long double _Complex *, long double _Complex ),
    627627                        ?-=?( long double _Complex *, long double _Complex ), ?-=?( volatile long double _Complex *, long double _Complex );
     628
     629
     630
     631
     632
     633// ------------------------------------------------------------
     634//
     635// Section ??? Constructors and Destructors
     636//
     637// ------------------------------------------------------------
     638
     639// default ctor
     640void    ?{}( _Bool * ),                         ?{}( volatile _Bool * );
     641void    ?{}( unsigned char * ),                 ?{}( volatile unsigned char * );
     642void    ?{}( signed int * ),                    ?{}( volatile signed int * );
     643void    ?{}( unsigned int * ),                  ?{}( volatile unsigned int * );
     644void    ?{}( signed long int * ),               ?{}( volatile signed long int * );
     645void    ?{}( unsigned long int * ),             ?{}( volatile unsigned long int * );
     646void    ?{}( signed long long int * ),          ?{}( volatile signed long long int * );
     647void    ?{}( unsigned long long int * ),        ?{}( volatile unsigned long long int * );
     648void    ?{}( float * ),                         ?{}( volatile float * );
     649void    ?{}( double * ),                        ?{}( volatile double * );
     650void    ?{}( long double * ),                   ?{}( volatile long double * );
     651void    ?{}( float _Complex * ),                ?{}( volatile float _Complex * );
     652void    ?{}( double _Complex * ),               ?{}( volatile double _Complex * );
     653void    ?{}( long double _Complex * ),          ?{}( volatile long double _Complex * );
     654
     655// copy ctor
     656void    ?{}( _Bool *, _Bool ),                                  ?{}( volatile _Bool *, _Bool );
     657void    ?{}( unsigned char *, unsigned char ),                  ?{}( volatile unsigned char *, unsigned char );
     658void    ?{}( signed int *, signed int),                         ?{}( volatile signed int *, signed int );
     659void    ?{}( unsigned int *, unsigned int),                     ?{}( volatile unsigned int *, unsigned int );
     660void    ?{}( signed long int *, signed long int),               ?{}( volatile signed long int *, signed long int );
     661void    ?{}( unsigned long int *, unsigned long int),           ?{}( volatile unsigned long int *, unsigned long int );
     662void    ?{}( signed long long int *, signed long long int),     ?{}( volatile signed long long int *, signed long long int );
     663void    ?{}( unsigned long long int *, unsigned long long int), ?{}( volatile unsigned long long int *, unsigned long long int );
     664void    ?{}( float *, float),                                   ?{}( volatile float *, float );
     665void    ?{}( double *, double),                                 ?{}( volatile double *, double );
     666void    ?{}( long double *, long double),                       ?{}( volatile long double *, long double );
     667void    ?{}( float _Complex *, float _Complex),                 ?{}( volatile float _Complex *, float _Complex );
     668void    ?{}( double _Complex *, double _Complex),               ?{}( volatile double _Complex *, double _Complex );
     669void    ?{}( long double _Complex *, long double _Complex),     ?{}( volatile long double _Complex *, long double _Complex );
     670
     671// dtor
     672void    ^?{}( _Bool * ),                        ^?{}( volatile _Bool * );
     673void    ^?{}( signed int * ),                   ^?{}( volatile signed int * );
     674void    ^?{}( unsigned int * ),                 ^?{}( volatile unsigned int * );
     675void    ^?{}( signed long int * ),              ^?{}( volatile signed long int * );
     676void    ^?{}( unsigned long int * ),            ^?{}( volatile unsigned long int * );
     677void    ^?{}( signed long long int * ),         ^?{}( volatile signed long long int * );
     678void    ^?{}( unsigned long long int * ),       ^?{}( volatile unsigned long long int * );
     679void    ^?{}( float * ),                        ^?{}( volatile float * );
     680void    ^?{}( double * ),                       ^?{}( volatile double * );
     681void    ^?{}( long double * ),                  ^?{}( volatile long double * );
     682void    ^?{}( float _Complex * ),               ^?{}( volatile float _Complex * );
     683void    ^?{}( double _Complex * ),              ^?{}( volatile double _Complex * );
     684void    ^?{}( long double _Complex * ),         ^?{}( volatile long double _Complex * );
     685
     686// // default ctor
     687// forall( dtype DT ) void       ?{}(                DT ** );
     688// forall( dtype DT ) void       ?{}( const          DT ** );
     689// forall( dtype DT ) void       ?{}(       volatile DT ** );
     690// forall( dtype DT ) void       ?{}( const volatile DT ** );
     691
     692// // copy ctor
     693// forall( dtype DT ) void       ?{}(                DT **, DT* );
     694// forall( dtype DT ) void       ?{}( const          DT **, DT* );
     695// forall( dtype DT ) void       ?{}(       volatile DT **, DT* );
     696// forall( dtype DT ) void       ?{}( const volatile DT **, DT* );
     697
     698// // dtor
     699// forall( dtype DT ) void      ^?{}(                DT ** );
     700// forall( dtype DT ) void      ^?{}( const          DT ** );
     701// forall( dtype DT ) void      ^?{}(       volatile DT ** );
     702// forall( dtype DT ) void      ^?{}( const volatile DT ** );
     703
     704// copied from assignment section
     705// copy constructors
     706forall( ftype FT ) void ?{}( FT **, FT * );
     707forall( ftype FT ) void ?{}( FT * volatile *, FT * );
     708
     709forall( dtype DT ) void ?{}(                 DT *          *,                   DT * );
     710forall( dtype DT ) void ?{}(                 DT * volatile *,                   DT * );
     711forall( dtype DT ) void ?{}( const           DT *          *,                   DT * );
     712forall( dtype DT ) void ?{}( const           DT * volatile *,                   DT * );
     713forall( dtype DT ) void ?{}( const           DT *          *, const             DT * );
     714forall( dtype DT ) void ?{}( const           DT * volatile *, const             DT * );
     715forall( dtype DT ) void ?{}(       volatile  DT *          *,                   DT * );
     716forall( dtype DT ) void ?{}(       volatile  DT * volatile *,                   DT * );
     717forall( dtype DT ) void ?{}(       volatile  DT *          *,       volatile    DT * );
     718forall( dtype DT ) void ?{}(       volatile  DT * volatile *,       volatile    DT * );
     719
     720forall( dtype DT ) void ?{}( const volatile  DT *          *,                   DT * );
     721forall( dtype DT ) void ?{}( const volatile  DT * volatile *,                   DT * );
     722forall( dtype DT ) void ?{}( const volatile  DT *          *, const             DT * );
     723forall( dtype DT ) void ?{}( const volatile  DT * volatile *, const             DT * );
     724forall( dtype DT ) void ?{}( const volatile  DT *          *,       volatile    DT * );
     725forall( dtype DT ) void ?{}( const volatile  DT * volatile *,       volatile    DT * );
     726forall( dtype DT ) void ?{}( const volatile  DT *          *, const volatile    DT * );
     727forall( dtype DT ) void ?{}( const volatile  DT * volatile *, const volatile    DT * );
     728
     729forall( dtype DT ) void ?{}(                 DT *          *,                   void * );
     730forall( dtype DT ) void ?{}(                 DT * volatile *,                   void * );
     731forall( dtype DT ) void ?{}( const           DT *          *,                   void * );
     732forall( dtype DT ) void ?{}( const           DT * volatile *,                   void * );
     733forall( dtype DT ) void ?{}( const           DT *          *, const             void * );
     734forall( dtype DT ) void ?{}( const           DT * volatile *, const             void * );
     735forall( dtype DT ) void ?{}(       volatile  DT *          *,                   void * );
     736forall( dtype DT ) void ?{}(       volatile  DT * volatile *,                   void * );
     737forall( dtype DT ) void ?{}(       volatile  DT *          *,       volatile    void * );
     738forall( dtype DT ) void ?{}(       volatile  DT * volatile *,       volatile    void * );
     739
     740forall( dtype DT ) void ?{}( const volatile  DT *          *,                   void * );
     741forall( dtype DT ) void ?{}( const volatile  DT * volatile *,                   void * );
     742forall( dtype DT ) void ?{}( const volatile  DT *          *, const             void * );
     743forall( dtype DT ) void ?{}( const volatile  DT * volatile *, const             void * );
     744forall( dtype DT ) void ?{}( const volatile  DT *          *,       volatile    void * );
     745forall( dtype DT ) void ?{}( const volatile  DT * volatile *,       volatile    void * );
     746forall( dtype DT ) void ?{}( const volatile  DT *          *, const volatile    void * );
     747forall( dtype DT ) void ?{}( const volatile  DT * volatile *, const volatile    void * );
     748
     749forall( dtype DT ) void ?{}(                 void *          *,                 DT * );
     750forall( dtype DT ) void ?{}(                 void * volatile *,                 DT * );
     751forall( dtype DT ) void ?{}( const           void *          *,                 DT * );
     752forall( dtype DT ) void ?{}( const           void * volatile *,                 DT * );
     753forall( dtype DT ) void ?{}( const           void *          *, const           DT * );
     754forall( dtype DT ) void ?{}( const           void * volatile *, const           DT * );
     755forall( dtype DT ) void ?{}(        volatile void *          *,                 DT * );
     756forall( dtype DT ) void ?{}(        volatile void * volatile *,                 DT * );
     757forall( dtype DT ) void ?{}(        volatile void *          *,       volatile  DT * );
     758forall( dtype DT ) void ?{}(        volatile void * volatile *,       volatile  DT * );
     759forall( dtype DT ) void ?{}( const volatile void *           *,                 DT * );
     760forall( dtype DT ) void ?{}( const volatile void * volatile *,                  DT * );
     761forall( dtype DT ) void ?{}( const volatile void *           *, const           DT * );
     762forall( dtype DT ) void ?{}( const volatile void * volatile *, const            DT * );
     763forall( dtype DT ) void ?{}( const volatile void *           *,       volatile  DT * );
     764forall( dtype DT ) void ?{}( const volatile void * volatile *,        volatile  DT * );
     765forall( dtype DT ) void ?{}( const volatile void *           *, const volatile  DT * );
     766forall( dtype DT ) void ?{}( const volatile void * volatile *, const volatile   DT * );
     767
     768void    ?{}(                void *          *,                void * );
     769void    ?{}(                void * volatile *,                void * );
     770void    ?{}( const          void *          *,                void * );
     771void    ?{}( const          void * volatile *,                void * );
     772void    ?{}( const          void *          *, const          void * );
     773void    ?{}( const          void * volatile *, const          void * );
     774void    ?{}(       volatile void *          *,                void * );
     775void    ?{}(       volatile void * volatile *,                void * );
     776void    ?{}(       volatile void *          *,       volatile void * );
     777void    ?{}(       volatile void * volatile *,       volatile void * );
     778void    ?{}( const volatile void *          *,                void * );
     779void    ?{}( const volatile void * volatile *,                void * );
     780void    ?{}( const volatile void *          *, const          void * );
     781void    ?{}( const volatile void * volatile *, const          void * );
     782void    ?{}( const volatile void *          *,       volatile void * );
     783void    ?{}( const volatile void * volatile *,       volatile void * );
     784void    ?{}( const volatile void *          *, const volatile void * );
     785void    ?{}( const volatile void * volatile *, const volatile void * );
     786
     787//forall( dtype DT ) void ?{}(              DT *          *, forall( dtype DT2 ) const DT2 * );
     788//forall( dtype DT ) void ?{}(              DT * volatile *, forall( dtype DT2 ) const DT2 * );
     789forall( dtype DT ) void ?{}( const          DT *          *, forall( dtype DT2 ) const DT2 * );
     790forall( dtype DT ) void ?{}( const          DT * volatile *, forall( dtype DT2 ) const DT2 * );
     791//forall( dtype DT ) void ?{}( volatile     DT *          *, forall( dtype DT2 ) const DT2 * );
     792//forall( dtype DT ) void ?{}( volatile     DT * volatile *, forall( dtype DT2 ) const DT2 * );
     793forall( dtype DT ) void ?{}( const volatile DT *          *, forall( dtype DT2 ) const DT2 * );
     794forall( dtype DT ) void ?{}( const volatile DT * volatile *, forall( dtype DT2 ) const DT2 * );
     795
     796forall( ftype FT ) void ?{}( FT *          *, forall( ftype FT2 ) FT2 * );
     797forall( ftype FT ) void ?{}( FT * volatile *, forall( ftype FT2 ) FT2 * );
     798
     799// default ctors
     800forall( ftype FT ) void ?{}( FT *          * );
     801forall( ftype FT ) void ?{}( FT * volatile * );
     802
     803forall( dtype DT ) void ?{}(                 DT *          *);
     804forall( dtype DT ) void ?{}(                 DT * volatile *);
     805forall( dtype DT ) void ?{}( const           DT *          *);
     806forall( dtype DT ) void ?{}( const           DT * volatile *);
     807forall( dtype DT ) void ?{}(       volatile  DT *          *);
     808forall( dtype DT ) void ?{}(       volatile  DT * volatile *);
     809forall( dtype DT ) void ?{}( const volatile  DT *          *);
     810forall( dtype DT ) void ?{}( const volatile  DT * volatile *);
     811
     812void    ?{}(                void *          *);
     813void    ?{}(                void * volatile *);
     814void    ?{}( const          void *          *);
     815void    ?{}( const          void * volatile *);
     816void    ?{}(       volatile void *          *);
     817void    ?{}(       volatile void * volatile *);
     818void    ?{}( const volatile void *          *);
     819void    ?{}( const volatile void * volatile *);
     820
     821// dtors
     822forall( ftype FT ) void ^?{}( FT *         * );
     823forall( ftype FT ) void ^?{}( FT * volatile * );
     824
     825forall( dtype DT ) void ^?{}(                DT *          *);
     826forall( dtype DT ) void ^?{}(                DT * volatile *);
     827forall( dtype DT ) void ^?{}( const          DT *          *);
     828forall( dtype DT ) void ^?{}( const          DT * volatile *);
     829forall( dtype DT ) void ^?{}(      volatile  DT *          *);
     830forall( dtype DT ) void ^?{}(      volatile  DT * volatile *);
     831forall( dtype DT ) void ^?{}( const volatile  DT *         *);
     832forall( dtype DT ) void ^?{}( const volatile  DT * volatile *);
     833
     834void    ^?{}(               void *          *);
     835void    ^?{}(               void * volatile *);
     836void    ^?{}( const         void *          *);
     837void    ^?{}( const         void * volatile *);
     838void    ^?{}(      volatile void *          *);
     839void    ^?{}(      volatile void * volatile *);
     840void    ^?{}( const volatile void *         *);
     841void    ^?{}( const volatile void * volatile *);
  • src/main.cc

    r803deb1 r771b3c3  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // main.cc -- 
     7// main.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Fri May 15 23:12:02 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec 17 12:59:06 2015
    13 // Update Count     : 179
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Tue Jan 19 16:28:13 2016
     13// Update Count     : 194
    1414//
    1515
     
    4242#include "InitTweak/Mutate.h"
    4343#include "InitTweak/RemoveInit.h"
     44#include "InitTweak/FixInit.h"
    4445//#include "Explain/GenProlog.h"
    4546//#include "Try/Visit.h"
     
    6162        astp = false,
    6263        bresolvep = false,
     64        ctorinitp = false,
    6365        exprp = false,
    6466        expraltp = false,
     
    7476        codegenp = false;
    7577
    76 enum { Ast, Bresolver, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Validate, };
     78enum { Ast, Bresolver, CtorInitFix, Expr, ExprAlt, Grammar, LibCFA, Nopreamble, Parse, Prototypes, Resolver, Symbol, Validate, };
    7779
    7880static struct option long_opts[] = {
    7981        { "ast", no_argument, 0, Ast },
    8082        { "before-resolver", no_argument, 0, Bresolver },
     83        { "ctorinitfix", no_argument, 0, CtorInitFix },
    8184        { "expr", no_argument, 0, Expr },
    8285        { "expralt", no_argument, 0, ExprAlt },
     
    99102
    100103        opterr = 0;                                                                                     // prevent getopt from printing error messages
    101        
     104
    102105        int c;
    103         while ( (c = getopt_long( argc, argv, "abefglnpqrsvyzD:", long_opts, &long_index )) != -1 ) {
     106        while ( (c = getopt_long( argc, argv, "abcefFglnpqrsvyzD:", long_opts, &long_index )) != -1 ) {
    104107                switch ( c ) {
    105108                  case Ast:
     
    110113                  case 'b':                                                                             // print before resolver steps
    111114                        bresolvep = true;
     115                        break;
     116                        case CtorInitFix:
     117                        case 'c':
     118                        ctorinitp = true;
    112119                        break;
    113120                  case Expr:
     
    182189                        output = new ofstream( argv[ optind ] );
    183190                } // if
    184        
     191
    185192                Parser::get_parser().set_debug( grammarp );
    186193
     
    203210                                        exit( 1 );
    204211                                } // if
    205                    
     212
    206213                                parse( prelude, LinkageSpec::Intrinsic );
    207214                        } // if
    208215                } // if
    209216
    210                 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp );     
    211  
     217                parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp );
     218
    212219                if ( parsep ) {
    213220                        Parser::get_parser().get_parseTree()->printList( std::cout );
     
    244251                OPTPRINT( "mutate" )
    245252                ControlStruct::mutate( translationUnit );
    246                 OPTPRINT( "fixNames" ) 
     253                OPTPRINT( "fixNames" )
    247254                CodeGen::fixNames( translationUnit );
    248                 OPTPRINT( "tweak" )
     255                OPTPRINT( "tweakInit" )
    249256                InitTweak::tweak( translationUnit );
    250257
     
    263270                if ( exprp ) {
    264271                        dump( translationUnit );
     272                        return 0;
     273                }
     274
     275                OPTPRINT( "fixInit" )
     276                // fix ObjectDecl - replaces ConstructorInit nodes
     277                InitTweak::fix( translationUnit );
     278                if ( ctorinitp ) {
     279                        dump ( translationUnit );
     280                        return 0;
    265281                }
    266282
     
    331347        std::list< Declaration * > decls;
    332348        if ( noprotop ) {
    333                 filter( translationUnit.begin(), translationUnit.end(), 
     349                filter( translationUnit.begin(), translationUnit.end(),
    334350                                std::back_inserter( decls ), notPrelude );
    335351        } else {
Note: See TracChangeset for help on using the changeset viewer.