Ignore:
Timestamp:
Aug 12, 2015, 2:27:31 PM (10 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
Children:
f32c7f4
Parents:
e45215c (diff), e869d663 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into designate

Conflicts:

src/CodeGen/CodeGenerator.h

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    re45215c rd60ccbf  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Jul 14 12:27:54 2015
    13 // Update Count     : 186
     12// Last Modified On : Wed Aug 05 14:00:24 2015
     13// Update Count     : 195
    1414//
    1515
     
    6060        class HoistStruct : public Visitor {
    6161          public:
     62                /// Flattens nested struct types
    6263                static void hoistStruct( std::list< Declaration * > &translationUnit );
    6364 
     
    8485        };
    8586
     87        /// Replaces enum types by int, and function or array types in function parameter and return lists by appropriate pointers
    8688        class Pass1 : public Visitor {
    8789                typedef Visitor Parent;
     
    8991                virtual void visit( FunctionType *func );
    9092        };
    91  
     93
     94        /// Associates forward declarations of aggregates with their definitions
    9295        class Pass2 : public Indexer {
    9396                typedef Indexer Parent;
     
    110113        };
    111114
     115        /// Replaces array and function types in forall lists by appropriate pointer type
    112116        class Pass3 : public Indexer {
    113117                typedef Indexer Parent;
     
    123127        class AddStructAssignment : public Visitor {
    124128          public:
     129                /// Generates assignment operators for aggregate types as required
    125130                static void addStructAssignment( std::list< Declaration * > &translationUnit );
    126131
     
    158163          public:
    159164          EliminateTypedef() : scopeLevel( 0 ) {}
     165            /// Replaces typedefs by forward declarations
    160166                static void eliminateTypedef( std::list< Declaration * > &translationUnit );
    161167          private:
     
    163169                virtual TypeDecl *mutate( TypeDecl *typeDecl );
    164170                virtual DeclarationWithType *mutate( FunctionDecl *funcDecl );
    165                 virtual ObjectDecl *mutate( ObjectDecl *objDecl );
     171                virtual DeclarationWithType *mutate( ObjectDecl *objDecl );
    166172                virtual CompoundStmt *mutate( CompoundStmt *compoundStmt );
    167173                virtual Type *mutate( TypeInstType *aggregateUseType );
     
    399405                        } // for
    400406                } // for
     407
     408                if ( ctx->get_parameters().size() != contextInst->get_parameters().size() ) {
     409                        throw SemanticError( "incorrect number of context parameters: ", contextInst );
     410                } // if
     411
    401412                applySubstitution( ctx->get_parameters().begin(), ctx->get_parameters().end(), contextInst->get_parameters().begin(), ctx->get_members().begin(), ctx->get_members().end(), back_inserter( contextInst->get_members() ) );
    402413        }
     
    444455        }
    445456
     457        /// Fix up assertions
    446458        void forallFixer( Type *func ) {
    447                 // Fix up assertions
    448459                for ( std::list< TypeDecl * >::iterator type = func->get_forall().begin(); type != func->get_forall().end(); ++type ) {
    449460                        std::list< DeclarationWithType * > toBeDone, nextRound;
     
    532543                std::list<Statement *> initList;
    533544                initList.push_back( initStmt );
    534 
     545 
    535546                UntypedExpr *cond = new UntypedExpr( new NameExpr( "?<?" ) );
    536547                cond->get_args().push_back( new VariableExpr( index ) );
     
    610621                        delete assigns.front();
    611622                        assigns.pop_front();
    612                 }
     623                } // for
    613624
    614625                declsToAdd.insert( declsToAdd.begin(), assigns.begin(), assigns.end() );
     
    817828                        Type *ret = def->second.first->get_base()->clone();
    818829                        ret->get_qualifiers() += typeInst->get_qualifiers();
     830                        // place instance parameters on the typedef'd type
     831                        if ( ! typeInst->get_parameters().empty() ) {
     832                                ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret);
     833                                if ( ! rtt ) {
     834                                        throw SemanticError("cannot apply type parameters to base type of " + typeInst->get_name());
     835                                }
     836                                rtt->get_parameters().clear();
     837                                cloneAll(typeInst->get_parameters(), rtt->get_parameters());
     838                        } // if
    819839                        delete typeInst;
    820840                        return ret;
     
    870890        }
    871891
    872         ObjectDecl *EliminateTypedef::mutate( ObjectDecl * objDecl ) {
     892        DeclarationWithType *EliminateTypedef::mutate( ObjectDecl * objDecl ) {
    873893                TypedefMap oldNames = typedefNames;
    874                 ObjectDecl *ret = Mutator::mutate( objDecl );
     894                DeclarationWithType *ret = Mutator::mutate( objDecl );
    875895                typedefNames = oldNames;
     896                if ( FunctionType *funtype = dynamic_cast<FunctionType *>( ret->get_type() ) ) {
     897                        return new FunctionDecl( ret->get_name(), ret->get_storageClass(), ret->get_linkage(), funtype, 0, ret->get_isInline(), ret->get_isNoreturn() );
     898                } else if ( objDecl->get_isInline() || objDecl->get_isNoreturn() ) {
     899                        throw SemanticError( "invalid inline or _Noreturn specification in declaration of ", objDecl );
     900                } // if
    876901                return ret;
    877902        }
Note: See TracChangeset for help on using the changeset viewer.