Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    rb2da0574 r42107b4  
    4848#include "CodeGen/CodeGenerator.h"     // for genName
    4949#include "CodeGen/OperatorTable.h"     // for isCtorDtor, isCtorDtorAssign
     50#include "Common/GC.h"                 // for new_static_root, register_static_root
    5051#include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
    5152#include "Common/ScopedMap.h"          // for ScopedMap
     
    199200                void addImplicitTypedef( AggDecl * aggDecl );
    200201
    201                 typedef std::unique_ptr<TypedefDecl> TypedefDeclPtr;
    202                 typedef ScopedMap< std::string, std::pair< TypedefDeclPtr, int > > TypedefMap;
     202                typedef ScopedMap< std::string, std::pair< TypedefDecl*, int > > TypedefMap;
    203203                typedef std::map< std::string, TypeDecl * > TypeDeclMap;
    204204                TypedefMap typedefNames;
     
    312312                } // if
    313313                // Always remove the hoisted aggregate from the inner structure.
    314                 GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist, false ); } );
     314                GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist ); } );
    315315        }
    316316
     
    373373                        // one void is the only thing in the list; remove it.
    374374                        if ( containsVoid ) {
    375                                 delete dwts.front();
    376375                                dwts.clear();
    377376                        }
     
    500499                                }
    501500                        }
    502                         deleteAll( td->assertions );
    503501                        td->assertions.clear();
    504502                } // for
     
    616614                                        // expand trait instance into all of its members
    617615                                        expandAssertions( traitInst, back_inserter( type->assertions ) );
    618                                         delete traitInst;
    619616                                } else {
    620617                                        // pass other assertions through
     
    688685                        // grab and remember declaration of size_t
    689686                        SizeType = eliminator.pass.typedefNames["size_t"].first->get_base()->clone();
     687                        GC::get().register_static_root( SizeType );
    690688                } else {
    691689                        // xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong
    692690                        // eventually should have a warning for this case.
    693                         SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
    694                 }
    695                 filter( translationUnit, isTypedef, true );
     691                        SizeType =
     692                                new_static_root<BasicType>( Type::Qualifiers(), BasicType::LongUnsignedInt );
     693                }
     694                filter( translationUnit, isTypedef );
    696695        }
    697696
     
    707706                                ret->attributes.splice( ret->attributes.end(), typeInst->attributes );
    708707                        } else {
    709                                 deleteAll( ret->attributes );
    710708                                ret->attributes.clear();
    711709                        }
     
    720718                                mutateAll( rtt->parameters, *visitor );  // recursively fix typedefs on parameters
    721719                        } // if
    722                         delete typeInst;
    723720                        return ret;
    724721                } else {
     
    762759                        }
    763760                } else {
    764                         typedefNames[ tyDecl->get_name() ] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel );
     761                        typedefNames[ tyDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
    765762                } // if
    766763
     
    806803                if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl->get_type() ) ) { // function type?
    807804                        // replace the current object declaration with a function declaration
    808                         FunctionDecl * newDecl = new FunctionDecl( objDecl->get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(), funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() );
    809                         objDecl->get_attributes().clear();
    810                         objDecl->set_type( nullptr );
    811                         delete objDecl;
    812                         return newDecl;
     805                        return new FunctionDecl{
     806                                objDecl->get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(),
     807                                funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() };
    813808                } // if
    814809                return objDecl;
     
    834829                        } // if
    835830                        return false;
    836                 }, true);
     831                } );
    837832                return compoundStmt;
    838833        }
     
    842837        template<typename AggDecl>
    843838        AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
    844                 filter( aggDecl->members, isTypedef, true );
     839                filter( aggDecl->members, isTypedef );
    845840                return aggDecl;
    846841        }
     
    857852                                type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
    858853                        } // if
    859                         TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() ) );
    860                         typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
     854                        TypedefDecl* tyDecl = new TypedefDecl{ aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() };
     855                        typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
    861856                } // if
    862857        }
     
    972967                static UniqueName indexName( "_compLit" );
    973968
    974                 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() );
    975                 compLitExpr->set_result( nullptr );
    976                 compLitExpr->set_initializer( nullptr );
    977                 delete compLitExpr;
     969                ObjectDecl * tempvar = new ObjectDecl{
     970                        indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() };
    978971                declsToAddBefore.push_back( tempvar );                                  // add modified temporary to current block
    979972                return new VariableExpr( tempvar );
     
    10111004                        // ensure return value is not destructed by explicitly creating an empty ListInit node wherein maybeConstruct is false.
    10121005                        ObjectDecl * newRet = new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) );
    1013                         deleteAll( retVals );
    10141006                        retVals.clear();
    10151007                        retVals.push_back( newRet );
     
    10521044                        if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) {
    10531045                                if ( labels.count( nameExpr->name ) ) {
    1054                                         Label name = nameExpr->name;
    1055                                         delete addrExpr;
    1056                                         return new LabelAddressExpr( name );
     1046                                        return new LabelAddressExpr{ nameExpr->name };
    10571047                                }
    10581048                        }
Note: See TracChangeset for help on using the changeset viewer.