Changeset d964c39 for src/Parser


Ignore:
Timestamp:
Feb 25, 2023, 6:45:44 PM (3 years ago)
Author:
caparson <caparson@…>
Branches:
ADT, ast-experimental, master
Children:
601bd9e
Parents:
ce44c5f (diff), 2d028003 (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:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    rce44c5f rd964c39  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 16 14:12:03 2023
    13 // Update Count     : 1388
     12// Last Modified On : Sat Feb 25 12:15:40 2023
     13// Update Count     : 1404
    1414//
    1515
     
    254254        newnode->type->enumeration.typed = typed;
    255255        newnode->type->enumeration.hiding = hiding;
    256         if ( base && base->type)  {
     256        if ( base && base->type )  {
    257257                newnode->type->base = base->type;
    258258        } // if
     
    567567
    568568        checkQualifiers( type, q->type );
    569         if ( (builtin == Zero || builtin == One) && q->type->qualifiers.val != 0 && error.length() == 0 ) {
    570                 SemanticWarning( yylloc, Warning::BadQualifiersZeroOne, Type::QualifiersNames[ilog2( q->type->qualifiers.val )], builtinTypeNames[builtin] );
     569        if ( (builtin == Zero || builtin == One) && q->type->qualifiers.any() && error.length() == 0 ) {
     570                SemanticWarning( yylloc, Warning::BadQualifiersZeroOne, builtinTypeNames[builtin] );
    571571        } // if
    572572        addQualifiersToType( q->type, type );
     
    984984
    985985                        if ( DeclarationNode * extr = cur->extractAggregate() ) {
    986                                 // handle the case where a structure declaration is contained within an object or type declaration
     986                                // Handle the case where a SUE declaration is contained within an object or type declaration.
     987
     988                                assert( cur->type );
     989                                // Replace anonymous SUE name with typedef name to prevent anonymous naming problems across translation units.
     990                                if ( cur->type->kind == TypeData::Symbolic && cur->type->symbolic.isTypedef ) {
     991                                        assert( extr->type );
     992                                        // Handle anonymous aggregates: typedef struct { int i; } foo
     993                                        extr->type->qualifiers.reset();         // clear any CVs associated with the aggregate
     994                                        if ( extr->type->kind == TypeData::Aggregate && extr->type->aggregate.anon ) {
     995                                                delete extr->type->aggregate.name;
     996                                                extr->type->aggregate.name = new string( "__anonymous_" + *cur->name );
     997                                                extr->type->aggregate.anon = false;
     998                                                assert( cur->type->base );
     999                                                if ( cur->type->base ) {
     1000                                                        delete cur->type->base->aggInst.aggregate->aggregate.name;
     1001                                                        cur->type->base->aggInst.aggregate->aggregate.name = new string( "__anonymous_" + *cur->name );
     1002                                                        cur->type->base->aggInst.aggregate->aggregate.anon = false;
     1003                                                        cur->type->base->aggInst.aggregate->qualifiers.reset();
     1004                                                } // if
     1005                                        } // if
     1006                                        // Handle anonymous enumeration: typedef enum { A, B, C } foo
     1007                                        if ( extr->type->kind == TypeData::Enum && extr->type->enumeration.anon ) {
     1008                                                delete extr->type->enumeration.name;
     1009                                                extr->type->enumeration.name = new string( "__anonymous_" + *cur->name );
     1010                                                extr->type->enumeration.anon = false;
     1011                                                assert( cur->type->base );
     1012                                                if ( cur->type->base ) {
     1013                                                        delete cur->type->base->aggInst.aggregate->enumeration.name;
     1014                                                        cur->type->base->aggInst.aggregate->enumeration.name = new string( "__anonymous_" + *cur->name );
     1015                                                        cur->type->base->aggInst.aggregate->enumeration.anon = false;
     1016                                                } // if
     1017                                        } // if
     1018                                } // if
    9871019
    9881020                                Declaration * decl = extr->build();
  • src/Parser/TypeData.h

    rce44c5f rd964c39  
    1010// Created On       : Sat May 16 15:18:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 19 09:09:39 2023
    13 // Update Count     : 204
     12// Last Modified On : Fri Feb 24 14:25:02 2023
     13// Update Count     : 205
    1414//
    1515
     
    4141        };
    4242
    43         struct AggInst_t {
     43        struct AggInst_t {                                                                      // handles SUE
    4444                TypeData * aggregate = nullptr;
    4545                ExpressionNode * params = nullptr;
  • src/Parser/parser.yy

    rce44c5f rd964c39  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Feb 20 11:31:26 2023
    13 // Update Count     : 5896
     12// Last Modified On : Sat Feb 25 13:23:16 2023
     13// Update Count     : 5989
    1414//
    1515
     
    11731173        comma_expression_opt ';'
    11741174                { $$ = new StatementNode( build_expr( $1 ) ); }
    1175         | MUTEX '(' ')' comma_expression ';'
    1176                 { $$ = new StatementNode( build_mutex( nullptr, new StatementNode( build_expr( $4 ) ) ) ); }
    11771175        ;
    11781176
     
    12821280                {
    12831281                        $$ = new StatementNode( build_while( new CondCtl( nullptr, NEW_ONE ), maybe_build_compound( $4 ) ) );
    1284                         SemanticWarning( yylloc, Warning::SuperfluousElse, "" );
     1282                        SemanticWarning( yylloc, Warning::SuperfluousElse );
    12851283                }
    12861284        | WHILE '(' conditional_declaration ')' statement       %prec THEN
     
    12931291                {
    12941292                        $$ = new StatementNode( build_do_while( NEW_ONE, maybe_build_compound( $2 ) ) );
    1295                         SemanticWarning( yylloc, Warning::SuperfluousElse, "" );
     1293                        SemanticWarning( yylloc, Warning::SuperfluousElse );
    12961294                }
    12971295        | DO statement WHILE '(' comma_expression ')' ';'
     
    13041302                {
    13051303                        $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) );
    1306                         SemanticWarning( yylloc, Warning::SuperfluousElse, "" );
     1304                        SemanticWarning( yylloc, Warning::SuperfluousElse );
    13071305                }
    13081306        | FOR '(' for_control_expression_list ')' statement     %prec THEN
     
    15841582        ;
    15851583
    1586 // If MUTEX becomes a general qualifier, there are shift/reduce conflicts, so change syntax to "with mutex".
     1584// If MUTEX becomes a general qualifier, there are shift/reduce conflicts, so possibly change syntax to "with mutex".
    15871585mutex_statement:
    1588         MUTEX '(' argument_expression_list ')' statement
    1589                 { $$ = new StatementNode( build_mutex( $3, $5 ) ); }
     1586        MUTEX '(' argument_expression_list_opt ')' statement
     1587                {
     1588                        if ( ! $3 ) { SemanticError( yylloc, "mutex argument list cannot be empty." ); $$ = nullptr; }
     1589                        $$ = new StatementNode( build_mutex( $3, $5 ) );
     1590                }
    15901591        ;
    15911592
     
    19411942                        // if type_specifier is an anon aggregate => name
    19421943                        typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" );
    1943                         $$ = $3->addType( $2 )->addTypedef();
     1944                        $$ = $3->addType( $2 )->addTypedef();           // watchout frees $2 and $3
    19441945                }
    19451946        | typedef_declaration pop ',' push declarator
     
    19851986                {
    19861987                        assert( $1->type );
    1987                         if ( $1->type->qualifiers.val != 0 ) {
    1988                                 SemanticError( yylloc, "Useless type qualifier in empty declaration." ); $$ = nullptr;
     1988                        if ( $1->type->qualifiers.any() ) {                     // CV qualifiers ?
     1989                                SemanticError( yylloc, "Useless type qualifier(s) in empty declaration." ); $$ = nullptr;
     1990                        }
     1991                        // enums are never empty declarations because there must have at least one enumeration.
     1992                        if ( $1->type->kind == TypeData::AggregateInst && $1->storageClasses.any() ) { // storage class ?
     1993                                SemanticError( yylloc, "Useless storage qualifier(s) in empty aggregate declaration." ); $$ = nullptr;
    19891994                        }
    19901995                }
     
    20062011        | sue_declaration_specifier invalid_types
    20072012                {
    2008                         SemanticError( yylloc,
    2009                                                   ::toString( "Missing ';' after end of ",
    2010                                                                           $1->type->enumeration.name ? "enum" : AggregateDecl::aggrString( $1->type->aggregate.kind ),
    2011                                                                           " declaration" ) );
     2013                        SemanticError( yylloc, ::toString( "Missing ';' after end of ",
     2014                                $1->type->enumeration.name ? "enum" : AggregateDecl::aggrString( $1->type->aggregate.kind ),
     2015                                " declaration" ) );
    20122016                        $$ = nullptr;
    20132017                }
     
    25882592        | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '{' enumerator_list comma_opt '}'
    25892593                {
    2590                         if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 )
     2594                        if ( $3->storageClasses.val != 0 || $3->type->qualifiers.any() )
    25912595                        { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
    25922596
     
    25992603        | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt
    26002604                {
    2601                         if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
     2605                        if ( $3->storageClasses.any() || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
    26022606                        typedefTable.makeTypedef( *$6 );
    26032607                }
     
    29862990        TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' '}'
    29872991                {
    2988                         SemanticWarning( yylloc, Warning::DeprecTraitSyntax, "" );
     2992                        SemanticWarning( yylloc, Warning::DeprecTraitSyntax );
    29892993                        $$ = DeclarationNode::newTrait( $2, $4, nullptr );
    29902994                }
     
    29932997        | TRAIT identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop '}'
    29942998                {
    2995                         SemanticWarning( yylloc, Warning::DeprecTraitSyntax, "" );
     2999                        SemanticWarning( yylloc, Warning::DeprecTraitSyntax );
    29963000                        $$ = DeclarationNode::newTrait( $2, $4, $8 );
    29973001                }
     
    30583062                { $$ = DeclarationNode::newDirectiveStmt( new StatementNode( build_directive( $1 ) ) ); }
    30593063        | declaration
     3064                {
     3065                        // Variable declarations of anonymous types requires creating a unique type-name across multiple translation
     3066                        // unit, which is a dubious task, especially because C uses name rather than structural typing; hence it is
     3067                        // disallowed at the moment.
     3068                        if ( $1->linkage == LinkageSpec::Cforall && ! $1->storageClasses.is_static && $1->type && $1->type->kind == TypeData::AggregateInst ) {
     3069                                if ( $1->type->aggInst.aggregate->kind == TypeData::Enum && $1->type->aggInst.aggregate->enumeration.anon ) {
     3070                                        SemanticError( yylloc, "extern anonymous enumeration is currently unimplemented." ); $$ = nullptr;
     3071                                } else if ( $1->type->aggInst.aggregate->aggregate.anon ) { // handles struct or union
     3072                                        SemanticError( yylloc, "extern anonymous struct/union is currently unimplemented." ); $$ = nullptr;
     3073                                }
     3074                        }
     3075                }
    30603076        | IDENTIFIER IDENTIFIER
    30613077                { IdentifierBeforeIdentifier( *$1.str, *$2.str, " declaration" ); $$ = nullptr; }
     
    31033119        | type_qualifier_list
    31043120                {
    3105                         if ( $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
     3121                        if ( $1->type->qualifiers.any() ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
    31063122                        if ( $1->type->forall ) forall = true;          // remember generic type
    31073123                }
     
    31143130        | declaration_qualifier_list
    31153131                {
    3116                         if ( $1->type && $1->type->qualifiers.val ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
     3132                        if ( $1->type && $1->type->qualifiers.any() ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
    31173133                        if ( $1->type && $1->type->forall ) forall = true; // remember generic type
    31183134                }
     
    31253141        | declaration_qualifier_list type_qualifier_list
    31263142                {
    3127                         if ( ($1->type && $1->type->qualifiers.val) || ($2->type && $2->type->qualifiers.val) ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
     3143                        if ( ($1->type && $1->type->qualifiers.any()) || ($2->type && $2->type->qualifiers.any()) ) { SemanticError( yylloc, "CV qualifiers cannot be distributed; only storage-class and forall qualifiers." ); }
    31283144                        if ( ($1->type && $1->type->forall) || ($2->type && $2->type->forall) ) forall = true; // remember generic type
    31293145                }
Note: See TracChangeset for help on using the changeset viewer.