Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r42107b4 rb2da0574  
    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
    5150#include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
    5251#include "Common/ScopedMap.h"          // for ScopedMap
     
    200199                void addImplicitTypedef( AggDecl * aggDecl );
    201200
    202                 typedef ScopedMap< std::string, std::pair< TypedefDecl*, int > > TypedefMap;
     201                typedef std::unique_ptr<TypedefDecl> TypedefDeclPtr;
     202                typedef ScopedMap< std::string, std::pair< TypedefDeclPtr, 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 ); } );
     314                GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist, false ); } );
    315315        }
    316316
     
    373373                        // one void is the only thing in the list; remove it.
    374374                        if ( containsVoid ) {
     375                                delete dwts.front();
    375376                                dwts.clear();
    376377                        }
     
    499500                                }
    500501                        }
     502                        deleteAll( td->assertions );
    501503                        td->assertions.clear();
    502504                } // for
     
    614616                                        // expand trait instance into all of its members
    615617                                        expandAssertions( traitInst, back_inserter( type->assertions ) );
     618                                        delete traitInst;
    616619                                } else {
    617620                                        // pass other assertions through
     
    685688                        // grab and remember declaration of size_t
    686689                        SizeType = eliminator.pass.typedefNames["size_t"].first->get_base()->clone();
    687                         GC::get().register_static_root( SizeType );
    688690                } else {
    689691                        // xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong
    690692                        // eventually should have a warning for this case.
    691                         SizeType =
    692                                 new_static_root<BasicType>( Type::Qualifiers(), BasicType::LongUnsignedInt );
    693                 }
    694                 filter( translationUnit, isTypedef );
     693                        SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
     694                }
     695                filter( translationUnit, isTypedef, true );
    695696        }
    696697
     
    706707                                ret->attributes.splice( ret->attributes.end(), typeInst->attributes );
    707708                        } else {
     709                                deleteAll( ret->attributes );
    708710                                ret->attributes.clear();
    709711                        }
     
    718720                                mutateAll( rtt->parameters, *visitor );  // recursively fix typedefs on parameters
    719721                        } // if
     722                        delete typeInst;
    720723                        return ret;
    721724                } else {
     
    759762                        }
    760763                } else {
    761                         typedefNames[ tyDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
     764                        typedefNames[ tyDecl->get_name() ] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel );
    762765                } // if
    763766
     
    803806                if ( FunctionType *funtype = dynamic_cast<FunctionType *>( objDecl->get_type() ) ) { // function type?
    804807                        // replace the current object declaration with a function declaration
    805                         return new FunctionDecl{
    806                                 objDecl->get_name(), objDecl->get_storageClasses(), objDecl->get_linkage(),
    807                                 funtype, 0, objDecl->get_attributes(), objDecl->get_funcSpec() };
     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;
    808813                } // if
    809814                return objDecl;
     
    829834                        } // if
    830835                        return false;
    831                 } );
     836                }, true);
    832837                return compoundStmt;
    833838        }
     
    837842        template<typename AggDecl>
    838843        AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
    839                 filter( aggDecl->members, isTypedef );
     844                filter( aggDecl->members, isTypedef, true );
    840845                return aggDecl;
    841846        }
     
    852857                                type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
    853858                        } // if
    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 );
     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 );
    856861                } // if
    857862        }
     
    967972                static UniqueName indexName( "_compLit" );
    968973
    969                 ObjectDecl * tempvar = new ObjectDecl{
    970                         indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() };
     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;
    971978                declsToAddBefore.push_back( tempvar );                                  // add modified temporary to current block
    972979                return new VariableExpr( tempvar );
     
    10041011                        // ensure return value is not destructed by explicitly creating an empty ListInit node wherein maybeConstruct is false.
    10051012                        ObjectDecl * newRet = new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) );
     1013                        deleteAll( retVals );
    10061014                        retVals.clear();
    10071015                        retVals.push_back( newRet );
     
    10441052                        if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( inner->arg ) ) {
    10451053                                if ( labels.count( nameExpr->name ) ) {
    1046                                         return new LabelAddressExpr{ nameExpr->name };
     1054                                        Label name = nameExpr->name;
     1055                                        delete addrExpr;
     1056                                        return new LabelAddressExpr( name );
    10471057                                }
    10481058                        }
Note: See TracChangeset for help on using the changeset viewer.