Changeset 6b224a52 for src/Parser


Ignore:
Timestamp:
Aug 25, 2017, 12:11:53 PM (7 years ago)
Author:
Thierry Delisle <tdelisle@…>
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:
bf7b9da7
Parents:
135b431 (diff), f676b84 (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

Location:
src/Parser
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    r135b431 r6b224a52  
    340340} // DeclarationNode::newTypeDecl
    341341
    342 DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers ) {
    343         DeclarationNode * newnode = new DeclarationNode;
    344         newnode->type = new TypeData( TypeData::Pointer );
     342DeclarationNode * DeclarationNode::newPointer( DeclarationNode * qualifiers, OperKinds kind ) {
     343        DeclarationNode * newnode = new DeclarationNode;
     344        newnode->type = new TypeData( kind == OperKinds::PointTo ? TypeData::Pointer : TypeData::Reference );
    345345        if ( qualifiers ) {
    346346                return newnode->addQualifiers( qualifiers );
     
    759759DeclarationNode * DeclarationNode::addPointer( DeclarationNode * p ) {
    760760        if ( p ) {
    761                 assert( p->type->kind == TypeData::Pointer );
     761                assert( p->type->kind == TypeData::Pointer || TypeData::Reference );
    762762                setBase( p->type );
    763763                p->type = nullptr;
     
    781781DeclarationNode * DeclarationNode::addNewPointer( DeclarationNode * p ) {
    782782        if ( p ) {
    783                 assert( p->type->kind == TypeData::Pointer );
     783                assert( p->type->kind == TypeData::Pointer || p->type->kind == TypeData::Reference );
    784784                if ( type ) {
    785785                        switch ( type->kind ) {
  • src/Parser/ExpressionNode.cc

    r135b431 r6b224a52  
    314314Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) {
    315315        std::list< Expression * > args;
    316         args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) );
     316        args.push_back(  maybeMoveBuild< Expression >(expr_node) ); // xxx
    317317        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    318318} // build_unary_ptr
     
    327327Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
    328328        std::list< Expression * > args;
    329         args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1) ) );
     329        args.push_back( maybeMoveBuild< Expression >(expr_node1) );
    330330        args.push_back( maybeMoveBuild< Expression >(expr_node2) );
    331331        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
  • src/Parser/ParseNode.h

    r135b431 r6b224a52  
    243243        static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
    244244        static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams );
    245         static DeclarationNode * newPointer( DeclarationNode * qualifiers );
     245        static DeclarationNode * newPointer( DeclarationNode * qualifiers, OperKinds kind );
    246246        static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic );
    247247        static DeclarationNode * newVarArray( DeclarationNode * qualifiers );
  • src/Parser/TypeData.cc

    r135b431 r6b224a52  
    3535          case Unknown:
    3636          case Pointer:
     37          case Reference:
    3738          case EnumConstant:
    3839                // nothing else to initialize
     
    104105          case Unknown:
    105106          case Pointer:
     107          case Reference:
    106108          case EnumConstant:
    107109                // nothing to destroy
     
    170172          case EnumConstant:
    171173          case Pointer:
     174          case Reference:
    172175                // nothing else to copy
    173176                break;
     
    405408                        // add dtor:  void ^?{}(T *)
    406409                        FunctionType * dtorType = new FunctionType( Type::Qualifiers(), false );
    407                         dtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
     410                        dtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
    408411                        td->get_assertions().push_front( new FunctionDecl( "^?{}", Type::StorageClasses(), LinkageSpec::Cforall, dtorType, nullptr ) );
    409412
    410413                        // add copy ctor:  void ?{}(T *, T)
    411414                        FunctionType * copyCtorType = new FunctionType( Type::Qualifiers(), false );
    412                         copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
     415                        copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
    413416                        copyCtorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) );
    414417                        td->get_assertions().push_front( new FunctionDecl( "?{}", Type::StorageClasses(), LinkageSpec::Cforall, copyCtorType, nullptr ) );
     
    416419                        // add default ctor:  void ?{}(T *)
    417420                        FunctionType * ctorType = new FunctionType( Type::Qualifiers(), false );
    418                         ctorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
     421                        ctorType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
    419422                        td->get_assertions().push_front( new FunctionDecl( "?{}", Type::StorageClasses(), LinkageSpec::Cforall, ctorType, nullptr ) );
    420423
    421424                        // add assignment operator:  T * ?=?(T *, T)
    422425                        FunctionType * assignType = new FunctionType( Type::Qualifiers(), false );
    423                         assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
     426                        assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) );
    424427                        assignType->get_parameters().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) );
    425428                        assignType->get_returnVals().push_back( new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) );
     
    441444          case TypeData::Array:
    442445                return buildArray( td );
     446          case TypeData::Reference:
     447                return buildReference( td );
    443448          case TypeData::Function:
    444449                return buildFunction( td );
     
    619624        buildForall( td->forall, at->get_forall() );
    620625        return at;
    621 } // buildPointer
     626} // buildArray
     627
     628ReferenceType * buildReference( const TypeData * td ) {
     629        ReferenceType * rt;
     630        if ( td->base ) {
     631                rt = new ReferenceType( buildQualifiers( td ), typebuild( td->base ) );
     632        } else {
     633                rt = new ReferenceType( buildQualifiers( td ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
     634        } // if
     635        buildForall( td->forall, rt->get_forall() );
     636        return rt;
     637} // buildReference
    622638
    623639AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
  • src/Parser/TypeData.h

    r135b431 r6b224a52  
    2626
    2727struct TypeData {
    28         enum Kind { Basic, Pointer, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
     28        enum Kind { Basic, Pointer, Array, Reference, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
    2929                                SymbolicInst, Tuple, Typeof, Builtin, Unknown };
    3030
     
    109109PointerType * buildPointer( const TypeData * );
    110110ArrayType * buildArray( const TypeData * );
     111ReferenceType * buildReference( const TypeData * );
    111112AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > );
    112113ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage );
  • src/Parser/lex.ll

    r135b431 r6b224a52  
    237237__label__               { KEYWORD_RETURN(LABEL); }                              // GCC
    238238long                    { KEYWORD_RETURN(LONG); }
    239 lvalue                  { KEYWORD_RETURN(LVALUE); }                             // CFA
    240239monitor                 { KEYWORD_RETURN(MONITOR); }                    // CFA
    241240mutex                   { KEYWORD_RETURN(MUTEX); }                              // CFA
  • src/Parser/parser.yy

    r135b431 r6b224a52  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Aug 23 14:53:20 2017
    13 // Update Count     : 2702
     12// Last Modified On : Wed Aug 23 21:08:08 2017
     13// Update Count     : 2704
    1414//
    1515
     
    120120%token RESTRICT                                                                                 // C99
    121121%token ATOMIC                                                                                   // C11
    122 %token FORALL LVALUE MUTEX VIRTUAL                                              // CFA
     122%token FORALL MUTEX VIRTUAL                                             // CFA
    123123%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
    124124%token BOOL COMPLEX IMAGINARY                                                   // C99
     
    307307// Similar issues exit with the waitfor statement.
    308308
    309 // Order of these lines matters. THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left associative over
    310 // TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.
     309// Order of these lines matters (low-to-high precedence). THEN is left associative over WOR/TIMEOUT/ELSE, WOR is left
     310// associative over TIMEOUT/ELSE, and TIMEOUT is left associative over ELSE.
    311311%precedence THEN        // rule precedence for IF/WAITFOR statement
    312312%precedence WOR         // token precedence for start of WOR in WAITFOR statement
     
    569569        | '&'                                                                           { $$ = OperKinds::AddressOf; }
    570570                // GCC, address of label must be handled by semantic check for ref,ref,label
    571 //      | ANDAND                                                                        { $$ = OperKinds::And; }
     571        | ANDAND                                                                        { $$ = OperKinds::And; }
    572572        ;
    573573
     
    691691        conditional_expression
    692692        | unary_expression assignment_operator assignment_expression
    693                 { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
     693                { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
    694694        ;
    695695
     
    14941494        | VOLATILE
    14951495                { $$ = DeclarationNode::newTypeQualifier( Type::Volatile ); }
    1496         | LVALUE                                                                                        // CFA
    1497                 { $$ = DeclarationNode::newTypeQualifier( Type::Lvalue ); }
    14981496        | MUTEX
    14991497                { $$ = DeclarationNode::newTypeQualifier( Type::Mutex ); }
     
    24772475variable_ptr:
    24782476        ptrref_operator variable_declarator
    2479                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2477                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    24802478        | ptrref_operator type_qualifier_list variable_declarator
    2481                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2479                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    24822480        | '(' variable_ptr ')' attribute_list_opt
    24832481                { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     
    25252523function_ptr:
    25262524        ptrref_operator function_declarator
    2527                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2525                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25282526        | ptrref_operator type_qualifier_list function_declarator
    2529                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2527                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25302528        | '(' function_ptr ')'
    25312529                { $$ = $2; }
     
    25652563KR_function_ptr:
    25662564        ptrref_operator KR_function_declarator
    2567                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2565                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    25682566        | ptrref_operator type_qualifier_list KR_function_declarator
    2569                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2567                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    25702568        | '(' KR_function_ptr ')'
    25712569                { $$ = $2; }
     
    26092607type_ptr:
    26102608        ptrref_operator variable_type_redeclarator
    2611                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2609                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26122610        | ptrref_operator type_qualifier_list variable_type_redeclarator
    2613                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2611                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26142612        | '(' type_ptr ')' attribute_list_opt
    26152613                { $$ = $2->addQualifiers( $4 ); }
     
    26532651identifier_parameter_ptr:
    26542652        ptrref_operator identifier_parameter_declarator
    2655                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2653                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    26562654        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    2657                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2655                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    26582656        | '(' identifier_parameter_ptr ')' attribute_list_opt
    26592657                { $$ = $2->addQualifiers( $4 ); }
     
    27132711type_parameter_ptr:
    27142712        ptrref_operator type_parameter_redeclarator
    2715                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2713                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    27162714        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    2717                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2715                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    27182716        | '(' type_parameter_ptr ')' attribute_list_opt
    27192717                { $$ = $2->addQualifiers( $4 ); }
     
    27562754abstract_ptr:
    27572755        ptrref_operator
    2758                 { $$ = DeclarationNode::newPointer( 0 ); }
     2756                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    27592757        | ptrref_operator type_qualifier_list
    2760                 { $$ = DeclarationNode::newPointer( $2 ); }
     2758                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    27612759        | ptrref_operator abstract_declarator
    2762                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2760                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    27632761        | ptrref_operator type_qualifier_list abstract_declarator
    2764                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2762                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    27652763        | '(' abstract_ptr ')' attribute_list_opt
    27662764                { $$ = $2->addQualifiers( $4 ); }
     
    28452843abstract_parameter_ptr:
    28462844        ptrref_operator
    2847                 { $$ = DeclarationNode::newPointer( nullptr ); }
     2845                { $$ = DeclarationNode::newPointer( nullptr, $1 ); }
    28482846        | ptrref_operator type_qualifier_list
    2849                 { $$ = DeclarationNode::newPointer( $2 ); }
     2847                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    28502848        | ptrref_operator abstract_parameter_declarator
    2851                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr ) ); }
     2849                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
    28522850        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    2853                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2851                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    28542852        | '(' abstract_parameter_ptr ')' attribute_list_opt
    28552853                { $$ = $2->addQualifiers( $4 ); }
     
    29242922variable_abstract_ptr:
    29252923        ptrref_operator
    2926                 { $$ = DeclarationNode::newPointer( 0 ); }
     2924                { $$ = DeclarationNode::newPointer( 0, $1 ); }
    29272925        | ptrref_operator type_qualifier_list
    2928                 { $$ = DeclarationNode::newPointer( $2 ); }
     2926                { $$ = DeclarationNode::newPointer( $2, $1 ); }
    29292927        | ptrref_operator variable_abstract_declarator
    2930                 { $$ = $2->addPointer( DeclarationNode::newPointer( 0 ) ); }
     2928                { $$ = $2->addPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29312929        | ptrref_operator type_qualifier_list variable_abstract_declarator
    2932                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2 ) ); }
     2930                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    29332931        | '(' variable_abstract_ptr ')' attribute_list_opt
    29342932                { $$ = $2->addQualifiers( $4 ); }
     
    29702968                // No SUE declaration in parameter list.
    29712969        ptrref_operator type_specifier_nobody
    2972                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2970                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29732971        | type_qualifier_list ptrref_operator type_specifier_nobody
    2974                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2972                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29752973        | ptrref_operator cfa_abstract_function
    2976                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2974                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29772975        | type_qualifier_list ptrref_operator cfa_abstract_function
    2978                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2976                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29792977        | ptrref_operator cfa_identifier_parameter_declarator_tuple
    2980                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     2978                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    29812979        | type_qualifier_list ptrref_operator cfa_identifier_parameter_declarator_tuple
    2982                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     2980                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    29832981        ;
    29842982
     
    30583056cfa_abstract_ptr:                                                                               // CFA
    30593057        ptrref_operator type_specifier
    3060                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3058                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30613059        | type_qualifier_list ptrref_operator type_specifier
    3062                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3060                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30633061        | ptrref_operator cfa_abstract_function
    3064                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3062                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30653063        | type_qualifier_list ptrref_operator cfa_abstract_function
    3066                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3064                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30673065        | ptrref_operator cfa_abstract_declarator_tuple
    3068                 { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     3066                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0, $1 ) ); }
    30693067        | type_qualifier_list ptrref_operator cfa_abstract_declarator_tuple
    3070                 { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
     3068                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1, $2 ) ); }
    30713069        ;
    30723070
Note: See TracChangeset for help on using the changeset viewer.