Changeset 861799c


Ignore:
Timestamp:
Mar 10, 2017, 11:00:13 AM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
c857ad3
Parents:
0e7ea335
Message:

fix 0,1 member access, fix autogenerated routines missing size for sized generic types

Location:
src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r0e7ea335 r861799c  
    410410                { $$ = new ExpressionNode( build_fieldSel( $1, build_field_name_REALFRACTIONconstant( *$2 ) ) ); }
    411411        | postfix_expression ARROW no_attr_identifier
    412                 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
     412                {
     413                        $$ = new ExpressionNode( build_pfieldSel( $1, *$3 == "0" || *$3 == "1" ? build_constantInteger( *$3 ) : build_varref( $3 ) ) );
     414                }
    413415        | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
    414416                        { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }
     417        | postfix_expression ARROW INTEGERconstant                      // CFA, tuple index
     418                { $$ = new ExpressionNode( build_pfieldSel( $1, build_constantInteger( *$3 ) ) ); }
    415419        | postfix_expression ICR
    416420                { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
  • src/SymTab/Autogen.cc

    r0e7ea335 r861799c  
    151151        bool hasDynamicLayout( AggrDecl * aggregateDecl ) {
    152152                for ( TypeDecl * param : aggregateDecl->get_parameters() ) {
    153                         if ( param->get_kind() == TypeDecl::Any ) return true;
     153                        if ( param->isComplete() ) return true;
    154154                }
    155155                return false;
  • src/SymTab/Validate.cc

    r0e7ea335 r861799c  
    224224                HoistStruct::hoistStruct( translationUnit );
    225225                ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
     226                acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
    226227                autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecayPass
    227228                acceptAll( translationUnit, epc );
    228                 acceptAll( translationUnit, lrt );
    229229                ReturnChecker::checkFunctionReturns( translationUnit );
    230230                compoundliteral.mutateDeclarationList( translationUnit );
     
    838838                assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %d", functionDecl->get_name().c_str(), retVals.size() );
    839839                if ( retVals.size() == 1 ) {
    840                         // ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging)
    841                         // ensure other return values have a name
     840                        // ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging).
     841                        // ensure other return values have a name.
    842842                        DeclarationWithType * ret = retVals.front();
    843843                        if ( ret->get_name() == "" ) {
  • src/SynTree/TypeDecl.cc

    r0e7ea335 r861799c  
    2525
    2626std::string TypeDecl::typeString() const {
    27         static const char *kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
    28         return kindNames[ kind ];
     27        static const std::string kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
     28        return (kind != Any && isComplete() ? "sized " : "") + kindNames[ kind ];
    2929}
    3030
Note: See TracChangeset for help on using the changeset viewer.