Changes in / [aacd1e1:831b2ec]


Ignore:
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/collections/string.hfa

    raacd1e1 r831b2ec  
    2323};
    2424
    25 // Getters
    26 static inline size_t len( const string & s ) { return len( *s.inner ); }
    27 static inline size_t len( const char * cs ) { return strlen( cs ); };
    28 static inline size_t strlen( const string & s ) { return len( s ); }
    29 
    3025// RAII, assignment
     26void ^?{}( string & s );
     27
    3128void ?{}( string & s );                                                                 // empty string
    3229void ?{}( string & s, const string & s2 );
     
    5855string & assign( string & s, const string & c, size_t n );
    5956string & assign( string & s, const char * c, size_t n );
    60 
    61 static inline string & strcpy( string & s, const char * c ) { s = c; return s; }
    62 static inline string & strncpy( string & s, const char * c, size_t n ) { assign( s, c, n ); return s; }
    63 static inline string & strcpy( string & s, const string & c ) { s = c; return s; }
    64 static inline string & strncpy( string & s, const string & c, size_t n ) { assign( s, c, n ); return s; }
    65 
    6657string & ?=?( string & s, ssize_t rhs );
    6758string & ?=?( string & s, size_t rhs );
     
    7162string & ?=?( string & s, long double _Complex rhs );
    7263
    73 void ^?{}( string & s );
     64static inline string & strcpy( string & s, const char * c ) { s = c; return s; }
     65static inline string & strncpy( string & s, const char * c, size_t n ) { assign( s, c, n ); return s; }
     66static inline string & strcpy( string & s, const string & c ) { s = c; return s; }
     67static inline string & strncpy( string & s, const string & c, size_t n ) { assign( s, c, n ); return s; }
    7468
    7569// Alternate construction: request shared edits
     
    7973string_Share ?`share( string & s );
    8074void ?{}( string & s, string_Share src );
     75
     76// Getters
     77static inline size_t len( const string & s ) { return len( *s.inner ); }
     78static inline size_t len( const char * cs ) { return strlen( cs ); };
     79static inline size_t strlen( const string & s ) { return len( s ); }
    8180
    8281// IO Operator
  • src/AST/Util.cpp

    raacd1e1 r831b2ec  
    260260                        }
    261261                }
     262                if ( ! type->assertions.empty() ) visit_children = false;
    262263        }
    263264
  • src/Parser/TypeData.cpp

    raacd1e1 r831b2ec  
    15851585        buildParamList( td->function.params, params );
    15861586        buildForall( td->forall, forall );
    1587         // Functions do not store their assertions there anymore.
     1587        // Functions do not store their assertions there anymore.  <-- FIXME: clarify or remove this comment
     1588        // Assertions were parsed as belonging to the type that preceded them.
     1589        // forall ( T | is_foo(T), U | are_bar(T, U) )
     1590        //   => parse
     1591        // forall( [ typarm( T, [is_foo(T)] ), typarm( U, [are_bar(T, U)] ) ] )
     1592        //   => now, flatten as
     1593        // forall( [ T, U ] ), assns( [ is_foo(T), are_bar(T, U)] )
    15881594        for ( ast::ptr<ast::TypeDecl> & type_param : forall ) {
    15891595                auto mut = type_param.get_and_mutate();
    15901596                splice( assertions, mut->assertions );
     1597        }
     1598        // When assertions without a type preceding them were parsed, placeholder
     1599        // types were invented to hold them.
     1600        // forall ( | is_foo(), U | is_bar(U) )
     1601        //   => parse
     1602        // forall( [ typarm( PLCHLD, [is_foo()] ), typarm( U, [is_bar(U)] ) ] )
     1603        //   => prev step
     1604        // forall( [ PLCHLD, U ] ), assns( [ is_foo(), is_bar(U)] )
     1605        //   => now, remove the placeholders
     1606        // forall( [ U ] ), assns( [ is_foo(), is_bar(U)] )
     1607        for (std::vector<ast::ptr<ast::TypeDecl>>::iterator it = forall.begin();
     1608                        it != forall.end(); ) {
     1609                // placeholder types have empty names
     1610                if ( (*it)->name == "" ) it = forall.erase(it);
     1611                else ++it;
    15911612        }
    15921613        if ( td->base ) {
  • src/Parser/parser.yy

    raacd1e1 r831b2ec  
    31323132        // | type_specifier identifier_parameter_declarator
    31333133        | assertion_list
    3134                 { $$ = DeclarationNode::newTypeParam( ast::TypeDecl::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
     3134                // Invent a placeholder type to wrap these bare assertions.  Rely on buildFunctionDecl to remove the placeholder.
     3135                { $$ = DeclarationNode::newTypeParam( ast::TypeDecl::Dtype, new string( "" ) )->addAssertions( $1 ); }
    31353136        | ENUM '(' identifier_or_type_name ')' identifier_or_type_name new_type_class type_initializer_opt assertion_list_opt
    31363137                {       
  • src/SymTab/Mangler.cpp

    raacd1e1 r831b2ec  
    290290        if ( typeMode ) return;
    291291        auto funcType = dynamic_cast<const ast::FunctionType *>( type );
    292         if ( funcType && !funcType->forall.empty() ) {
     292        if ( funcType && (!funcType->forall.empty() || !funcType->assertions.empty()) ) {
    293293                std::list< std::string > assertionNames;
    294294                int dcount = 0, fcount = 0, vcount = 0, acount = 0;
Note: See TracChangeset for help on using the changeset viewer.