Ignore:
Timestamp:
Jun 23, 2017, 4:20:33 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
74e58ea3, 7bbba76
Parents:
e1c1829 (diff), 88177cf (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' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    re1c1829 r4c03e63  
    6666#include "ResolvExpr/typeops.h"
    6767
     68#include "SynTree/Attribute.h"
    6869#include "SynTree/Expression.h"
    6970#include "SynTree/Mutator.h"
     
    114115
    115116        /// Replaces enum types by int, and function or array types in function parameter and return lists by appropriate pointers.
    116         class EnumAndPointerDecayPass final : public Visitor {
    117                 typedef Visitor Parent;
    118                 virtual void visit( EnumDecl *aggregateDecl );
    119                 virtual void visit( FunctionType *func );
     117        class EnumAndPointerDecay {
     118        public:
     119                void previsit( EnumDecl *aggregateDecl );
     120                void previsit( FunctionType *func );
    120121        };
    121122
     
    125126          public:
    126127                LinkReferenceToTypes( bool doDebug, const Indexer *indexer );
    127           private:
    128128                using Parent::visit;
    129129                void visit( EnumInstType *enumInst ) final;
     
    135135                void visit( UnionDecl *unionDecl ) final;
    136136                void visit( TypeInstType *typeInst ) final;
    137 
     137          private:
    138138                const Indexer *indexer;
    139139
     
    146146        };
    147147
    148         /// Replaces array and function types in forall lists by appropriate pointer type
    149         class Pass3 final : public Indexer {
     148        /// Replaces array and function types in forall lists by appropriate pointer type and assigns each Object and Function declaration a unique ID.
     149        class ForallPointerDecay final : public Indexer {
    150150                typedef Indexer Parent;
    151151          public:
    152152                using Parent::visit;
    153                 Pass3( const Indexer *indexer );
    154           private:
     153                ForallPointerDecay( const Indexer *indexer );
     154
    155155                virtual void visit( ObjectDecl *object ) override;
    156156                virtual void visit( FunctionDecl *func ) override;
     
    159159        };
    160160
    161         class ReturnChecker {
     161        class ReturnChecker : public WithScopes {
    162162          public:
    163163                /// Checks that return statements return nothing if their return type is void
     
    166166          private:
    167167                void previsit( FunctionDecl * functionDecl );
    168                 void postvisit( FunctionDecl * functionDecl );
    169168                void previsit( ReturnStmt * returnStmt );
    170169
    171170                typedef std::list< DeclarationWithType * > ReturnVals;
    172171                ReturnVals returnVals;
    173                 std::stack< ReturnVals > returnValsStack;
    174172        };
    175173
     
    247245
    248246        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    249                 EnumAndPointerDecayPass epc;
     247                PassVisitor<EnumAndPointerDecay> epc;
    250248                LinkReferenceToTypes lrt( doDebug, 0 );
    251                 Pass3 pass3( 0 );
     249                ForallPointerDecay fpd( 0 );
    252250                CompoundLiteral compoundliteral;
    253251                PassVisitor<ValidateGenericParameters> genericParams;
     
    261259                VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
    262260                Concurrency::applyKeywords( translationUnit );
    263                 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
     261                autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay
    264262                Concurrency::implementMutexFuncs( translationUnit );
    265263                Concurrency::implementThreadStarter( translationUnit );
    266264                ReturnChecker::checkFunctionReturns( translationUnit );
    267265                compoundliteral.mutateDeclarationList( translationUnit );
    268                 acceptAll( translationUnit, pass3 );
     266                acceptAll( translationUnit, fpd );
    269267                ArrayLength::computeLength( translationUnit );
    270268        }
    271269
    272270        void validateType( Type *type, const Indexer *indexer ) {
    273                 EnumAndPointerDecayPass epc;
     271                PassVisitor<EnumAndPointerDecay> epc;
    274272                LinkReferenceToTypes lrt( false, indexer );
    275                 Pass3 pass3( indexer );
     273                ForallPointerDecay fpd( indexer );
    276274                type->accept( epc );
    277275                type->accept( lrt );
    278                 type->accept( pass3 );
     276                type->accept( fpd );
    279277        }
    280278
     
    355353        }
    356354
    357         void EnumAndPointerDecayPass::visit( EnumDecl *enumDecl ) {
     355        void EnumAndPointerDecay::previsit( EnumDecl *enumDecl ) {
    358356                // Set the type of each member of the enumeration to be EnumConstant
    359357                for ( std::list< Declaration * >::iterator i = enumDecl->get_members().begin(); i != enumDecl->get_members().end(); ++i ) {
     
    362360                        obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl->get_name() ) );
    363361                } // for
    364                 Parent::visit( enumDecl );
    365362        }
    366363
     
    369366                void fixFunctionList( DWTList & dwts, FunctionType * func ) {
    370367                        // the only case in which "void" is valid is where it is the only one in the list; then it should be removed
    371                         // entirely other fix ups are handled by the FixFunction class
     368                        // entirely. other fix ups are handled by the FixFunction class
    372369                        typedef typename DWTList::iterator DWTIterator;
    373370                        DWTIterator begin( dwts.begin() ), end( dwts.end() );
     
    388385                                for ( ; i != end; ++i ) {
    389386                                        FixFunction fixer;
    390                                         *i = (*i )->acceptMutator( fixer );
     387                                        *i = (*i)->acceptMutator( fixer );
    391388                                        if ( fixer.get_isVoid() ) {
    392389                                                throw SemanticError( "invalid type void in function type ", func );
     
    397394        }
    398395
    399         void EnumAndPointerDecayPass::visit( FunctionType *func ) {
     396        void EnumAndPointerDecay::previsit( FunctionType *func ) {
    400397                // Fix up parameters and return types
    401398                fixFunctionList( func->get_parameters(), func );
    402399                fixFunctionList( func->get_returnVals(), func );
    403                 Visitor::visit( func );
    404400        }
    405401
     
    548544        }
    549545
    550         Pass3::Pass3( const Indexer *other_indexer ) :  Indexer( false ) {
     546        ForallPointerDecay::ForallPointerDecay( const Indexer *other_indexer ) :  Indexer( false ) {
    551547                if ( other_indexer ) {
    552548                        indexer = other_indexer;
     
    586582        }
    587583
    588         void Pass3::visit( ObjectDecl *object ) {
     584        void ForallPointerDecay::visit( ObjectDecl *object ) {
    589585                forallFixer( object->get_type() );
    590586                if ( PointerType *pointer = dynamic_cast< PointerType * >( object->get_type() ) ) {
     
    595591        }
    596592
    597         void Pass3::visit( FunctionDecl *func ) {
     593        void ForallPointerDecay::visit( FunctionDecl *func ) {
    598594                forallFixer( func->get_type() );
    599595                Parent::visit( func );
     
    607603
    608604        void ReturnChecker::previsit( FunctionDecl * functionDecl ) {
    609                 returnValsStack.push( returnVals );
     605                GuardValue( returnVals );
    610606                returnVals = functionDecl->get_functionType()->get_returnVals();
    611         }
    612         void ReturnChecker::postvisit( __attribute__((unused)) FunctionDecl * functionDecl ) {
    613                 returnVals = returnValsStack.top();
    614                 returnValsStack.pop();
    615607        }
    616608
     
    927919                                ret->set_name( toString( "_retval_", CodeGen::genName( functionDecl ) ) );
    928920                        }
     921                        ret->get_attributes().push_back( new Attribute( "unused" ) );
    929922                }
    930923        }
Note: See TracChangeset for help on using the changeset viewer.