Changeset 5170d95 for src/ResolvExpr


Ignore:
Timestamp:
Feb 19, 2019, 11:24:40 PM (6 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
2ede686
Parents:
45af7e1
Message:

fix implict void cast problem

Location:
src/ResolvExpr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    r45af7e1 r5170d95  
    1010// Created On       : Sun May 17 12:17:01 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 13 18:13:43 2019
    13 // Update Count     : 216
     12// Last Modified On : Tue Feb 19 18:09:56 2019
     13// Update Count     : 240
    1414//
    1515
     
    5353                }
    5454
    55                 void previsit( FunctionDecl *functionDecl );
    56                 void postvisit( FunctionDecl *functionDecl );
    57                 void previsit( ObjectDecl *objectDecll );
     55                void previsit( FunctionDecl * functionDecl );
     56                void postvisit( FunctionDecl * functionDecl );
     57                void previsit( ObjectDecl * objectDecll );
    5858                void previsit( EnumDecl * enumDecl );
    5959                void previsit( StaticAssertDecl * assertDecl );
     
    6262                void previsit( PointerType * at );
    6363
    64                 void previsit( ExprStmt *exprStmt );
    65                 void previsit( AsmExpr *asmExpr );
    66                 void previsit( AsmStmt *asmStmt );
    67                 void previsit( IfStmt *ifStmt );
    68                 void previsit( WhileStmt *whileStmt );
    69                 void previsit( ForStmt *forStmt );
    70                 void previsit( SwitchStmt *switchStmt );
    71                 void previsit( CaseStmt *caseStmt );
    72                 void previsit( BranchStmt *branchStmt );
    73                 void previsit( ReturnStmt *returnStmt );
    74                 void previsit( ThrowStmt *throwStmt );
    75                 void previsit( CatchStmt *catchStmt );
     64                void previsit( ExprStmt * exprStmt );
     65                void previsit( AsmExpr * asmExpr );
     66                void previsit( AsmStmt * asmStmt );
     67                void previsit( IfStmt * ifStmt );
     68                void previsit( WhileStmt * whileStmt );
     69                void previsit( ForStmt * forStmt );
     70                void previsit( SwitchStmt * switchStmt );
     71                void previsit( CaseStmt * caseStmt );
     72                void previsit( BranchStmt * branchStmt );
     73                void previsit( ReturnStmt * returnStmt );
     74                void previsit( ThrowStmt * throwStmt );
     75                void previsit( CatchStmt * catchStmt );
    7676                void previsit( WaitForStmt * stmt );
    7777
    78                 void previsit( SingleInit *singleInit );
    79                 void previsit( ListInit *listInit );
    80                 void previsit( ConstructorInit *ctorInit );
     78                void previsit( SingleInit * singleInit );
     79                void previsit( ListInit * listInit );
     80                void previsit( ConstructorInit * ctorInit );
    8181          private:
    8282                typedef std::list< Initializer * >::iterator InitIterator;
     
    104104        }
    105105
    106         void resolveDecl( Declaration * decl, const SymTab::Indexer &indexer ) {
     106        void resolveDecl( Declaration * decl, const SymTab::Indexer & indexer ) {
    107107                PassVisitor<Resolver> resolver( indexer );
    108108                maybeAccept( decl, resolver );
     
    148148                };
    149149
    150                 void finishExpr( Expression *&expr, const TypeEnvironment &env, TypeSubstitution * oldenv = nullptr ) {
     150                void finishExpr( Expression *& expr, const TypeEnvironment & env, TypeSubstitution * oldenv = nullptr ) {
    151151                        expr->env = oldenv ? oldenv->clone() : new TypeSubstitution;
    152152                        env.makeSubstitution( *expr->env );
     
    279279
    280280        // used in resolveTypeof
    281         Expression * resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer ) {
     281        Expression * resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer ) {
    282282                TypeEnvironment env;
    283283                return resolveInVoidContext( expr, indexer, env );
    284284        }
    285285
    286         Expression * resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ) {
     286        Expression * resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer, TypeEnvironment & env ) {
    287287                // it's a property of the language that a cast expression has either 1 or 0 interpretations; if it has 0
    288288                // interpretations, an exception has already been thrown.
    289289                assertf( expr, "expected a non-null expression." );
    290290
    291                 static CastExpr untyped( nullptr ); // cast to void
    292                 untyped.location = expr->location;
     291                CastExpr * untyped = new CastExpr( expr ); // cast to void
     292                untyped->location = expr->location;
    293293
    294294                // set up and resolve expression cast to void
    295                 untyped.arg = expr;
    296295                Alternative choice;
    297                 findUnfinishedKindExpression( &untyped, choice, indexer, "", standardAlternativeFilter, ResolvMode::withAdjustment() );
     296                findUnfinishedKindExpression( untyped, choice, indexer, "", standardAlternativeFilter, ResolvMode::withAdjustment() );
    298297                CastExpr * castExpr = strict_dynamic_cast< CastExpr * >( choice.expr );
     298                assert( castExpr );
    299299                env = std::move( choice.env );
    300300
     
    304304
    305305                // unlink the arg so that it isn't deleted twice at the end of the program
    306                 untyped.arg = nullptr;
     306                untyped->arg = nullptr;
    307307                return ret;
    308308        }
    309309
    310         void findVoidExpression( Expression *& untyped, const SymTab::Indexer &indexer ) {
     310        void findVoidExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
    311311                resetTyVarRenaming();
    312312                TypeEnvironment env;
     
    317317        }
    318318
    319         void findSingleExpression( Expression *&untyped, const SymTab::Indexer &indexer ) {
     319        void findSingleExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
    320320                findKindExpression( untyped, indexer, "", standardAlternativeFilter );
    321321        }
     
    336336                        if ( dynamic_cast< EnumInstType * >( type ) ) {
    337337                                return true;
    338                         } else if ( BasicType *bt = dynamic_cast< BasicType * >( type ) ) {
     338                        } else if ( BasicType * bt = dynamic_cast< BasicType * >( type ) ) {
    339339                                return bt->isInteger();
    340340                        } else if ( dynamic_cast< ZeroType* >( type ) != nullptr || dynamic_cast< OneType* >( type ) != nullptr ) {
     
    345345                }
    346346
    347                 void findIntegralExpression( Expression *& untyped, const SymTab::Indexer &indexer ) {
     347                void findIntegralExpression( Expression *& untyped, const SymTab::Indexer & indexer ) {
    348348                        findKindExpression( untyped, indexer, "condition", isIntegralType );
    349349                }
     
    401401        }
    402402
    403         void Resolver::previsit( ObjectDecl *objectDecl ) {
     403        void Resolver::previsit( ObjectDecl * objectDecl ) {
    404404                // To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that
    405405                // class-variable initContext is changed multiple time because the LHS is analysed twice.
     
    431431        }
    432432
    433         void Resolver::previsit( FunctionDecl *functionDecl ) {
     433        void Resolver::previsit( FunctionDecl * functionDecl ) {
    434434#if 0
    435435                std::cerr << "resolver visiting functiondecl ";
     
    441441        }
    442442
    443         void Resolver::postvisit( FunctionDecl *functionDecl ) {
     443        void Resolver::postvisit( FunctionDecl * functionDecl ) {
    444444                // default value expressions have an environment which shouldn't be there and trips up
    445445                // later passes.
     
    466466        }
    467467
    468         void Resolver::previsit( ExprStmt *exprStmt ) {
     468        void Resolver::previsit( ExprStmt * exprStmt ) {
    469469                visit_children = false;
    470470                assertf( exprStmt->expr, "ExprStmt has null Expression in resolver" );
     
    472472        }
    473473
    474         void Resolver::previsit( AsmExpr *asmExpr ) {
     474        void Resolver::previsit( AsmExpr * asmExpr ) {
    475475                visit_children = false;
    476476                findVoidExpression( asmExpr->operand, indexer );
     
    480480        }
    481481
    482         void Resolver::previsit( AsmStmt *asmStmt ) {
     482        void Resolver::previsit( AsmStmt * asmStmt ) {
    483483                visit_children = false;
    484484                acceptAll( asmStmt->get_input(), *visitor );
     
    486486        }
    487487
    488         void Resolver::previsit( IfStmt *ifStmt ) {
     488        void Resolver::previsit( IfStmt * ifStmt ) {
    489489                findIntegralExpression( ifStmt->condition, indexer );
    490490        }
    491491
    492         void Resolver::previsit( WhileStmt *whileStmt ) {
     492        void Resolver::previsit( WhileStmt * whileStmt ) {
    493493                findIntegralExpression( whileStmt->condition, indexer );
    494494        }
    495495
    496         void Resolver::previsit( ForStmt *forStmt ) {
     496        void Resolver::previsit( ForStmt * forStmt ) {
    497497                if ( forStmt->condition ) {
    498498                        findIntegralExpression( forStmt->condition, indexer );
     
    504504        }
    505505
    506         void Resolver::previsit( SwitchStmt *switchStmt ) {
     506        void Resolver::previsit( SwitchStmt * switchStmt ) {
    507507                GuardValue( currentObject );
    508508                findIntegralExpression( switchStmt->condition, indexer );
     
    511511        }
    512512
    513         void Resolver::previsit( CaseStmt *caseStmt ) {
     513        void Resolver::previsit( CaseStmt * caseStmt ) {
    514514                if ( caseStmt->condition ) {
    515515                        std::list< InitAlternative > initAlts = currentObject.getOptions();
     
    530530        }
    531531
    532         void Resolver::previsit( BranchStmt *branchStmt ) {
     532        void Resolver::previsit( BranchStmt * branchStmt ) {
    533533                visit_children = false;
    534534                // must resolve the argument for a computed goto
     
    541541        }
    542542
    543         void Resolver::previsit( ReturnStmt *returnStmt ) {
     543        void Resolver::previsit( ReturnStmt * returnStmt ) {
    544544                visit_children = false;
    545545                if ( returnStmt->expr ) {
     
    548548        }
    549549
    550         void Resolver::previsit( ThrowStmt *throwStmt ) {
     550        void Resolver::previsit( ThrowStmt * throwStmt ) {
    551551                visit_children = false;
    552552                // TODO: Replace *exception type with &exception type.
     
    560560        }
    561561
    562         void Resolver::previsit( CatchStmt *catchStmt ) {
     562        void Resolver::previsit( CatchStmt * catchStmt ) {
    563563                if ( catchStmt->cond ) {
    564564                        findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer );
     
    724724
    725725                                                }
    726                                                 catch( SemanticErrorException &e ) {
     726                                                catch( SemanticErrorException & e ) {
    727727                                                        errors.append( e );
    728728                                                }
    729729                                        }
    730730                                }
    731                                 catch( SemanticErrorException &e ) {
     731                                catch( SemanticErrorException & e ) {
    732732                                        errors.append( e );
    733733                                }
     
    781781        }
    782782
    783         void Resolver::previsit( SingleInit *singleInit ) {
     783        void Resolver::previsit( SingleInit * singleInit ) {
    784784                visit_children = false;
    785785                // resolve initialization using the possibilities as determined by the currentObject cursor
     
    813813                                if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) {
    814814                                        if ( isCharType( pt->get_base() ) ) {
    815                                                 if ( CastExpr *ce = dynamic_cast< CastExpr * >( newExpr ) ) {
     815                                                if ( CastExpr * ce = dynamic_cast< CastExpr * >( newExpr ) ) {
    816816                                                        // strip cast if we're initializing a char[] with a char *,
    817817                                                        // e.g.  char x[] = "hello";
     
    893893        }
    894894
    895         void Resolver::previsit( ConstructorInit *ctorInit ) {
     895        void Resolver::previsit( ConstructorInit * ctorInit ) {
    896896                visit_children = false;
    897897                // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit
  • src/ResolvExpr/Resolver.h

    r45af7e1 r5170d95  
    1010// Created On       : Sun May 17 12:18:34 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 22 09:36:57 2017
    13 // Update Count     : 3
     12// Last Modified On : Mon Feb 18 20:40:38 2019
     13// Update Count     : 4
    1414//
    1515
     
    2929        /// Checks types and binds syntactic constructs to typed representations
    3030        void resolve( std::list< Declaration * > translationUnit );
    31         void resolveDecl( Declaration *, const SymTab::Indexer &indexer );
    32         Expression *resolveInVoidContext( Expression * expr, const SymTab::Indexer &indexer );
    33         void findVoidExpression( Expression *& untyped, const SymTab::Indexer &indexer );
    34         void findSingleExpression( Expression *& untyped, const SymTab::Indexer &indexer );
    35         void findSingleExpression( Expression *& untyped, Type * type, const SymTab::Indexer &indexer );
     31        void resolveDecl( Declaration *, const SymTab::Indexer & indexer );
     32        Expression *resolveInVoidContext( Expression * expr, const SymTab::Indexer & indexer );
     33        void findVoidExpression( Expression *& untyped, const SymTab::Indexer & indexer );
     34        void findSingleExpression( Expression *& untyped, const SymTab::Indexer & indexer );
     35        void findSingleExpression( Expression *& untyped, Type * type, const SymTab::Indexer & indexer );
    3636        void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer );
    3737        void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer );
Note: See TracChangeset for help on using the changeset viewer.