Ignore:
Timestamp:
Jul 31, 2019, 3:23:04 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
ae265b55, f49b3fc
Parents:
504eb72
Message:

Startup.cfa now compiles with new ast

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.cc

    r504eb72 r2890212  
    2525#include "AST/Init.hpp"                // for Designation
    2626#include "AST/Node.hpp"                // for readonly
     27#include "AST/Print.hpp"                // for readonly
    2728#include "AST/Type.hpp"
    2829#include "Common/Indenter.h"           // for Indenter, operator<<
     
    596597                SimpleIterator( const CodeLocation & loc, const Type * t ) : location( loc ), type( t ) {}
    597598
    598                 void setPosition( 
    599                         std::deque< ptr< Expr > >::const_iterator begin, 
     599                void setPosition(
     600                        std::deque< ptr< Expr > >::const_iterator begin,
    600601                        std::deque< ptr< Expr > >::const_iterator end
    601602                ) override {
     
    637638                        auto res = eval(expr);
    638639                        if ( ! res.second ) {
    639                                 SemanticError( location, 
     640                                SemanticError( location,
    640641                                        toString("Array designator must be a constant expression: ", expr ) );
    641642                        }
     
    644645
    645646        public:
    646                 ArrayIterator( const CodeLocation & loc, const ArrayType * at ) 
     647                ArrayIterator( const CodeLocation & loc, const ArrayType * at )
    647648                : location( loc ), array( at ), base( at->base ) {
    648649                        PRINT( std::cerr << "Creating array iterator: " << at << std::endl; )
     
    655656
    656657                void setPosition( const Expr * expr ) {
    657                         // need to permit integer-constant-expressions, including: integer constants, 
    658                         // enumeration constants, character constants, sizeof expressions, alignof expressions, 
     658                        // need to permit integer-constant-expressions, including: integer constants,
     659                        // enumeration constants, character constants, sizeof expressions, alignof expressions,
    659660                        // cast expressions
    660661                        if ( auto constExpr = dynamic_cast< const ConstantExpr * >( expr ) ) {
     
    662663                                        index = constExpr->intValue();
    663664                                } catch ( SemanticErrorException & ) {
    664                                         SemanticError( expr, 
     665                                        SemanticError( expr,
    665666                                                "Constant expression of non-integral type in array designator: " );
    666667                                }
    667668                        } else if ( auto castExpr = dynamic_cast< const CastExpr * >( expr ) ) {
    668669                                setPosition( castExpr->arg );
    669                         } else if ( 
    670                                 dynamic_cast< const SizeofExpr * >( expr ) 
    671                                 || dynamic_cast< const AlignofExpr * >( expr ) 
     670                        } else if (
     671                                dynamic_cast< const SizeofExpr * >( expr )
     672                                || dynamic_cast< const AlignofExpr * >( expr )
    672673                        ) {
    673674                                index = 0;
    674675                        } else {
    675                                 assertf( false, 
     676                                assertf( false,
    676677                                        "bad designator given to ArrayIterator: %s", toString( expr ).c_str() );
    677678                        }
    678679                }
    679680
    680                 void setPosition( 
    681                         std::deque< ptr< Expr > >::const_iterator begin, 
     681                void setPosition(
     682                        std::deque< ptr< Expr > >::const_iterator begin,
    682683                        std::deque< ptr< Expr > >::const_iterator end
    683684                ) override {
     
    758759                }
    759760
    760                 AggregateIterator( 
    761                         const CodeLocation & loc, const std::string k, const std::string & n, const Type * i, 
     761                AggregateIterator(
     762                        const CodeLocation & loc, const std::string k, const std::string & n, const Type * i,
    762763                        const MemberList & ms )
    763                 : location( loc ), kind( k ), name( n ), inst( i ), members( ms ), curMember( ms.begin() ), 
     764                : location( loc ), kind( k ), name( n ), inst( i ), members( ms ), curMember( ms.begin() ),
    764765                  sub( genericSubstitution( i ) ) {
    765766                        PRINT( std::cerr << "Creating " << kind << "(" << name << ")"; )
     
    768769
    769770        public:
    770                 void setPosition( 
    771                         std::deque< ptr< Expr > >::const_iterator begin, 
     771                void setPosition(
     772                        std::deque< ptr< Expr > >::const_iterator begin,
    772773                        std::deque< ptr< Expr > >::const_iterator end
    773774                ) final {
     
    786787                                        return;
    787788                                }
    788                                 assertf( false, 
     789                                assertf( false,
    789790                                        "could not find member in %s: %s", kind.c_str(), toString( varExpr ).c_str() );
    790791                        } else {
    791                                 assertf( false, 
     792                                assertf( false,
    792793                                        "bad designator given to %s: %s", kind.c_str(), toString( *begin ).c_str() );
    793794                        }
     
    842843                                for ( InitAlternative & alt : ret ) {
    843844                                        PRINT( std::cerr << "iterating and adding designators" << std::endl; )
    844                                         alt.designation.get_and_mutate()->designators.emplace_front( 
     845                                        alt.designation.get_and_mutate()->designators.emplace_front(
    845846                                                new VariableExpr{ location, curMember->strict_as< ObjectDecl >() } );
    846847                                }
     
    897898        class TupleIterator final : public AggregateIterator {
    898899        public:
    899                 TupleIterator( const CodeLocation & loc, const TupleType * inst ) 
    900                 : AggregateIterator( 
    901                         loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members 
     900                TupleIterator( const CodeLocation & loc, const TupleType * inst )
     901                : AggregateIterator(
     902                        loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members
    902903                ) {}
    903904
     
    926927                                return new UnionIterator{ loc, uit };
    927928                        } else {
    928                                 assertf( 
    929                                         dynamic_cast< const EnumInstType * >( aggr )
    930                                                 || dynamic_cast< const TypeInstType * >( aggr ),
     929                                assertf(
     930                                        dynamic_cast< const EnumInstType * >( type )
     931                                                || dynamic_cast< const TypeInstType * >( type ),
    931932                                        "Encountered unhandled ReferenceToType in createMemberIterator: %s",
    932933                                                toString( type ).c_str() );
     
    949950                using DesignatorChain = std::deque< ptr< Expr > >;
    950951                PRINT( std::cerr << "___findNext" << std::endl; )
    951                
     952
    952953                // find all the d's
    953954                std::vector< DesignatorChain > desigAlts{ {} }, newDesigAlts;
     
    10131014                // set new designators
    10141015                assertf( ! objStack.empty(), "empty object stack when setting designation" );
    1015                 Designation * actualDesignation = 
     1016                Designation * actualDesignation =
    10161017                        new Designation{ designation->location, DesignatorChain{d} };
    10171018                objStack.back()->setPosition( d ); // destroys d
Note: See TracChangeset for help on using the changeset viewer.