Ignore:
Timestamp:
Jul 6, 2018, 2:18:34 PM (6 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, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
46e480a5
Parents:
e3b2474 (diff), 1d386a7 (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:/u/cforall/software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    re3b2474 r638ac26  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jul  2 20:23:14 2018
    13 // Update Count     : 3607
     12// Last Modified On : Fri Jul  6 08:02:38 2018
     13// Update Count     : 3716
    1414//
    1515
     
    116116
    117117void distQual( DeclarationNode * declaration, DeclarationNode * qualifiers ) {
    118         // distribute qualifiers across all declarations in a distribution statemement
     118        // distribute qualifiers across all non-variable declarations in a distribution statemement
    119119        for ( DeclarationNode * iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
    120                 if ( isMangled( iter->linkage ) ) {             // ignore extern "C"
    121                         iter->addQualifiers( qualifiers->clone() );
     120                // SKULLDUGGERY: Distributions are parsed inside out, so qualifiers are added to declarations inside out. Since
     121                // addQualifiers appends to the back of the list, the forall clauses are in the wrong order (right to left). To
     122                // get the qualifiers in the correct order and still use addQualifiers (otherwise, 90% of addQualifiers has to
     123                // be copied to add to front), the appropriate forall pointers are interchanged before calling addQualifiers.
     124                DeclarationNode * clone = qualifiers->clone();
     125                if ( qualifiers->type ) {                                               // forall clause ? (handles SC)
     126                        if ( iter->type->kind == TypeData::Aggregate ) { // struct/union ?
     127                                swap( clone->type->forall, iter->type->aggregate.params );
     128                                iter->addQualifiers( clone );
     129                        } else if ( iter->type->kind == TypeData::AggregateInst && iter->type->aggInst.aggregate->aggregate.body ) { // struct/union ?
     130                                // Create temporary node to hold aggregate, call addQualifiers as above, then put nodes back together.
     131                                DeclarationNode newnode;
     132                                swap( newnode.type, iter->type->aggInst.aggregate );
     133                                swap( clone->type->forall, newnode.type->aggregate.params );
     134                                newnode.addQualifiers( clone );
     135                                swap( newnode.type, iter->type->aggInst.aggregate );
     136                        } else if ( iter->type->kind == TypeData::Function ) { // routines ?
     137                                swap( clone->type->forall, iter->type->forall );
     138                                iter->addQualifiers( clone );
     139                        } // if
     140                } else {                                                                                // just SC qualifiers
     141                        iter->addQualifiers( clone );
    122142                } // if
    123143        } // for
    124 } // distExt
     144        delete qualifiers;
     145} // distQual
    125146
    126147// There is an ambiguity for inline generic-routine return-types and generic routines.
     
    366387%type<decl> type_parameter type_parameter_list type_initializer_opt
    367388
    368 %type<en> type_list
     389%type<en> type_parameters_opt type_list
    369390
    370391%type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list
     
    406427// Order of these lines matters (low-to-high precedence).
    407428%precedence TYPEGENname
     429%precedence '}'
    408430%precedence '('
    409431
     
    17531775                { $$ = $3->addQualifiers( $1 ); }
    17541776        | sue_type_specifier type_qualifier
    1755                 { $$ = $1->addQualifiers( $2 ); }
     1777                {
     1778                        if ( $2->type != nullptr && $2->type->forall ) forall = true; // remember generic type
     1779                        $$ = $1->addQualifiers( $2 );
     1780                }
    17561781        ;
    17571782
     
    18311856
    18321857aggregate_type:                                                                                 // struct, union
    1833         aggregate_key attribute_list_opt '{' field_declaration_list_opt '}'
    1834                 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), nullptr, $4, true )->addQualifiers( $2 ); }
     1858        aggregate_key attribute_list_opt '{' field_declaration_list_opt '}' type_parameters_opt
     1859                { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $6, $4, true )->addQualifiers( $2 ); }
    18351860        | aggregate_key attribute_list_opt no_attr_identifier fred
    18361861                {
     
    18381863                        forall = false;                                                         // reset
    18391864                }
    1840           '{' field_declaration_list_opt '}'
    1841                 { $$ = DeclarationNode::newAggregate( $1, $3, nullptr, $7, true )->addQualifiers( $2 ); }
     1865          '{' field_declaration_list_opt '}' type_parameters_opt
     1866                { $$ = DeclarationNode::newAggregate( $1, $3, $9, $7, true )->addQualifiers( $2 ); }
    18421867        | aggregate_key attribute_list_opt type_name fred
    18431868                {
     
    18451870                        forall = false;                                                         // reset
    18461871                }
    1847           '{' field_declaration_list_opt '}'
    1848                 { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, nullptr, $7, true )->addQualifiers( $2 ); }
    1849         | aggregate_key attribute_list_opt '(' type_list ')' '{' field_declaration_list_opt '}' // CFA
    1850                 { $$ = DeclarationNode::newAggregate( $1, new string( DeclarationNode::anonymous.newName() ), $4, $7, false )->addQualifiers( $2 ); }
     1872          '{' field_declaration_list_opt '}' type_parameters_opt
     1873                { $$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $9, $7, true )->addQualifiers( $2 ); }
    18511874        | aggregate_type_nobody
     1875        ;
     1876
     1877type_parameters_opt:
     1878        // empty
     1879                { $$ = nullptr; }                                                               %prec '}'
     1880        | '(' type_list ')'
     1881                { $$ = $2; }
    18521882        ;
    18531883
     
    23862416                        distQual( $5, $1 );
    23872417                        xxx = false;
    2388                         delete $1;
    23892418                        $$ = $5;
    23902419                }
     
    23982427                        distQual( $5, $1 );
    23992428                        xxx = false;
    2400                         delete $1;
    24012429                        $$ = $5;
    24022430                }
     
    24082436          '{' up external_definition_list_opt down '}'          // CFA, namespace
    24092437                {
    2410                         distQual( $6, $2 );
    2411                         distQual( $6, $1 );
     2438                        distQual( $6, $1->addQualifiers( $2 ) );
    24122439                        xxx = false;
    2413                         delete $1;
    2414                         delete $2;
    24152440                        $$ = $6;
    24162441                }
Note: See TracChangeset for help on using the changeset viewer.