Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r1869adf r843054c2  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:50:04 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jun 24 16:20:50 2015
    13 // Update Count     : 30
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue May 19 16:50:09 2015
     13// Update Count     : 3
    1414//
    1515
     
    4545#include "SynTree/Type.h"
    4646#include "SynTree/Statement.h"
     47#include "Indexer.h"
    4748#include "SynTree/TypeSubstitution.h"
    48 #include "Indexer.h"
    4949#include "FixFunction.h"
    5050#include "ImplementationType.h"
     
    176176                acceptAll( translationUnit, pass1 );
    177177                acceptAll( translationUnit, pass2 );
    178                 // need to collect all of the assignment operators prior to
    179                 // this point and only generate assignment operators if one doesn't exist
    180178                AddStructAssignment::addStructAssignment( translationUnit );
    181179                acceptAll( translationUnit, pass3 );
     
    508506                if ( ! array->get_dimension() ) return;
    509507 
    510                 ObjectDecl *index = new ObjectDecl( indexName.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), 0 );
     508                ObjectDecl *index = new ObjectDecl( indexName.newName(), Declaration::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), 0 );
    511509                *out++ = new DeclStmt( noLabels, index );
    512510 
     
    546544                FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
    547545 
    548                 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
     546                ObjectDecl *returnVal = new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
    549547                assignType->get_returnVals().push_back( returnVal );
    550548 
    551                 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
     549                ObjectDecl *dstParam = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
    552550                assignType->get_parameters().push_back( dstParam );
    553551 
    554                 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
     552                ObjectDecl *srcParam = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
    555553                assignType->get_parameters().push_back( srcParam );
    556554
    557555                // Routines at global scope marked "static" to prevent multiple definitions is separate translation units
    558556                // because each unit generates copies of the default routines for each aggregate.
    559                 FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );
     557                FunctionDecl *assignDecl = new FunctionDecl( "?=?", functionNesting > 0 ? Declaration::NoStorageClass : Declaration::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true );
    560558                assignDecl->fixUniqueId();
    561559 
    562560                for ( std::list< Declaration * >::const_iterator member = aggregateDecl->get_members().begin(); member != aggregateDecl->get_members().end(); ++member ) {
    563561                        if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member ) ) {
    564                                 // query the type qualifiers of this field and skip assigning it if it is marked const.
    565                                 // If it is an array type, we need to strip off the array layers to find its qualifiers.
    566                                 Type * type = dwt->get_type();
    567                                 while ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
    568                                         type = at->get_base();
    569                                 }
    570 
    571                                 if ( type->get_qualifiers().isConst ) {
    572                                         // don't assign const members
    573                                         continue;
    574                                 }
    575 
    576562                                if ( ArrayType *array = dynamic_cast< ArrayType * >( dwt->get_type() ) ) {
    577563                                        makeArrayAssignment( srcParam, dstParam, dwt, array, back_inserter( assignDecl->get_statements()->get_kids() ) );
     
    589575                FunctionType *assignType = new FunctionType( Type::Qualifiers(), false );
    590576 
    591                 ObjectDecl *returnVal = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
     577                ObjectDecl *returnVal = new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType->clone(), 0 );
    592578                assignType->get_returnVals().push_back( returnVal );
    593579 
    594                 ObjectDecl *dstParam = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
     580                ObjectDecl *dstParam = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), refType->clone() ), 0 );
    595581                assignType->get_parameters().push_back( dstParam );
    596582 
    597                 ObjectDecl *srcParam = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
     583                ObjectDecl *srcParam = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, refType, 0 );
    598584                assignType->get_parameters().push_back( srcParam );
    599585 
    600586                // Routines at global scope marked "static" to prevent multiple definitions is separate translation units
    601587                // because each unit generates copies of the default routines for each aggregate.
    602                 FunctionDecl *assignDecl = new FunctionDecl( "?=?",  functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true, false );
     588                FunctionDecl *assignDecl = new FunctionDecl( "?=?",  functionNesting > 0 ? Declaration::NoStorageClass : Declaration::Static, LinkageSpec::AutoGen, assignType, new CompoundStmt( noLabels ), true );
    603589                assignDecl->fixUniqueId();
    604590 
     
    635621                TypeInstType *typeInst = new TypeInstType( Type::Qualifiers(), typeDecl->get_name(), false );
    636622                typeInst->set_baseType( typeDecl );
    637                 ObjectDecl *src = new ObjectDecl( "_src", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst->clone(), 0 );
    638                 ObjectDecl *dst = new ObjectDecl( "_dst", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), typeInst->clone() ), 0 );
     623                ObjectDecl *src = new ObjectDecl( "_src", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, typeInst->clone(), 0 );
     624                ObjectDecl *dst = new ObjectDecl( "_dst", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), typeInst->clone() ), 0 );
    639625                if ( typeDecl->get_base() ) {
    640626                        stmts = new CompoundStmt( std::list< Label >() );
     
    645631                } // if
    646632                FunctionType *type = new FunctionType( Type::Qualifiers(), false );
    647                 type->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, typeInst, 0 ) );
     633                type->get_returnVals().push_back( new ObjectDecl( "", Declaration::NoStorageClass, LinkageSpec::Cforall, 0, typeInst, 0 ) );
    648634                type->get_parameters().push_back( dst );
    649635                type->get_parameters().push_back( src );
    650                 FunctionDecl *func = new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::AutoGen, type, stmts, false, false );
     636                FunctionDecl *func = new FunctionDecl( "?=?", Declaration::NoStorageClass, LinkageSpec::AutoGen, type, stmts, false );
    651637                declsToAdd.push_back( func );
    652638        }
    653639
    654640        void addDecls( std::list< Declaration * > &declsToAdd, std::list< Statement * > &statements, std::list< Statement * >::iterator i ) {
    655                 for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) {
    656                         statements.insert( i, new DeclStmt( noLabels, *decl ) );
    657                 } // for
    658                 declsToAdd.clear();
     641                if ( ! declsToAdd.empty() ) {
     642                        for ( std::list< Declaration * >::iterator decl = declsToAdd.begin(); decl != declsToAdd.end(); ++decl ) {
     643                                statements.insert( i, new DeclStmt( noLabels, *decl ) );
     644                        } // for
     645                        declsToAdd.clear();
     646                } // if
    659647        }
    660648
Note: See TracChangeset for help on using the changeset viewer.