Changeset a4dd728 for src/InitTweak


Ignore:
Timestamp:
Mar 30, 2017, 8:17:30 AM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
936a287, ee68e11
Parents:
93afb96
Message:

fix initialization of unmanaged static objects

Location:
src/InitTweak
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/FixInit.cc

    r93afb96 ra4dd728  
    738738                                                stmtsToAddAfter.push_back( ifStmt );
    739739
    740                                                 if ( ctorInit->get_dtor() ) {
     740                                                Statement * dtor = ctorInit->get_dtor();
     741                                                objDecl->set_init( NULL );
     742                                                ctorInit->set_ctor( NULL );
     743                                                ctorInit->set_dtor( nullptr );
     744                                                if ( dtor ) {
    741745                                                        // if the object has a non-trivial destructor, have to
    742746                                                        // hoist it and the object into the global space and
    743747                                                        // call the destructor function with atexit.
    744748
    745                                                         Statement * dtorStmt = ctorInit->get_dtor()->clone();
     749                                                        Statement * dtorStmt = dtor->clone();
    746750
    747751                                                        // void __objName_dtor_atexitN(...) {...}
     
    772776                                                        objDecl->set_mangleName( SymTab::Mangler::mangle( objDecl ) );
    773777
    774                                                         objDecl->set_init( NULL );
    775                                                         ctorInit->set_ctor( NULL );
    776                                                         delete ctorInit;
    777 
    778778                                                        // xxx - temporary hack: need to return a declaration, but want to hoist the current object out of this scope
    779779                                                        // create a new object which is never used
    780780                                                        static UniqueName dummyNamer( "_dummy" );
    781781                                                        ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
     782                                                        delete ctorInit;
    782783                                                        return dummy;
    783784                                                }
  • src/InitTweak/GenInit.cc

    r93afb96 ra4dd728  
    294294                handleDWT( objDecl );
    295295                // hands off if @=, extern, builtin, etc.
    296                 // if global but initializer is not constexpr, always try to construct, since this is not legal C
    297                 if ( ( tryConstruct( objDecl ) && isManaged( objDecl ) ) || (! inFunction && ! isConstExpr( objDecl->get_init() ) ) ) {
     296                // even if unmanaged, try to construct global or static if initializer is not constexpr, since this is not legal C
     297                if ( tryConstruct( objDecl ) && ( isManaged( objDecl ) || ((! inFunction || objDecl->get_storageClasses().is_static ) && ! isConstExpr( objDecl->get_init() ) ) ) ) {
    298298                        // constructed objects cannot be designated
    299                         if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.", objDecl );
     299                        if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n", objDecl );
    300300                        // constructed objects should not have initializers nested too deeply
    301301                        if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl );
Note: See TracChangeset for help on using the changeset viewer.