Changeset 7e13b11


Ignore:
Timestamp:
Mar 6, 2024, 10:59:19 AM (2 months ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
56b47b9
Parents:
7a29392f
Message:

documentations, support CFA declaration syntax in sizeof/alignof

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r7a29392f r7e13b11  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Mar  4 08:44:25 2024
    13 // Update Count     : 6562
     12// Last Modified On : Wed Mar  6 10:51:55 2024
     13// Update Count     : 6588
    1414//
    1515
     
    938938        | ALIGNOF '(' type_no_function ')'                                      // GCC, type alignment
    939939                { $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
     940
     941                // Cannot use rule "type", which includes cfa_abstract_function, for sizeof/alignof, because of S/R problems on
     942                // look ahead, so the cfa_abstract_function is factored out.
     943        | SIZEOF '(' cfa_abstract_function ')'
     944                { $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
     945        | ALIGNOF '(' cfa_abstract_function ')'                         // GCC, type alignment
     946                { $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
     947
    940948        | OFFSETOF '(' type_no_function ',' identifier ')'
    941949                { $$ = new ExpressionNode( build_offsetOf( yylloc, $3, build_varref( yylloc, $5 ) ) ); }
    942         | TYPEID '(' type_no_function ')'
     950        | TYPEID '(' type ')'
    943951                {
    944952                        SemanticError( yylloc, "typeid name is currently unimplemented." ); $$ = nullptr;
     
    12381246                { assert( $1 ); $1->set_last( $2 ); $$ = $1; }
    12391247        | statement_list_nodecl error                                           // invalid syntax rule
    1240                 { SemanticError( yylloc, "syntax error, declarations only allowed at the start of the switch body, i.e., after the '{'." ); $$ = nullptr; }
     1248                { SemanticError( yylloc, "syntax error, declarations only allowed at the start of the switch body,"
     1249                                                 " i.e., after the '{'." ); $$ = nullptr; }
    12411250        ;
    12421251
     
    12461255        ;
    12471256
    1248 // if, switch, and choose require parenthesis around the conditional because it can be followed by a statement.
    1249 // For example, without parenthesis:
    1250 //
    1251 //    if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
    1252 //    switch ( S ) { ... } => switch ( S ) { compound literal... } ... or
     1257// "if", "switch", and "choose" require parenthesis around the conditional. See the following ambiguities without
     1258// parenthesis:
     1259//
     1260//   if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
     1261//
     1262//   switch O { }
     1263//
     1264//     O{} => object-constructor for conditional, switch body ???
     1265//     O{} => O for conditional followed by switch body
     1266//
     1267//     C++ has this problem, as it has the same constructor syntax.
     1268//
     1269//   switch sizeof ( T ) { }
     1270//
     1271//     sizeof ( T ) => sizeof of T for conditional followed by switch body
     1272//     sizeof ( T ) => sizeof of compound literal (T){ }, closing parenthesis ???
     1273//
     1274//     Note the two grammar rules for sizeof (alignof)
     1275//
     1276//       | SIZEOF unary_expression
     1277//       | SIZEOF '(' type_no_function ')'
     1278//
     1279//     where the first DOES NOT require parenthesis! And C++ inherits this problem from C.
    12531280
    12541281selection_statement:
     
    22002227        | ATOMIC
    22012228                { $$ = DeclarationNode::newTypeQualifier( ast::CV::Atomic ); }
     2229
     2230                // forall must be a CV qualifier because it can appear in places where SC qualifiers are disallowed.
     2231                //
     2232                //   void foo( forall( T ) T (*)( T ) ); // forward declaration
     2233                //   void bar( static int ); // static disallowed (gcc/CFA)
    22022234        | forall
    22032235                { $$ = DeclarationNode::newForall( $1 ); }
     
    24642496        ;
    24652497
     2498// ************************** AGGREGATE *******************************
     2499
    24662500aggregate_type:                                                                                 // struct, union
    24672501        aggregate_key attribute_list_opt
     
    25442578        | EXCEPTION                                                                                     // CFA
    25452579                { $$ = ast::AggregateDecl::Exception; }
    2546           //            { SemanticError( yylloc, "exception aggregate is currently unimplemented." ); $$ = ast::AggregateDecl::NoAggregate; }
    25472580        ;
    25482581
     
    26832716        ;
    26842717
    2685 // ***********
    2686 // Enumeration
    2687 // ***********
     2718// ************************** ENUMERATION *******************************
    26882719
    26892720enum_type:
     
    27852816        ;
    27862817
    2787 // *******************
    2788 // Function parameters
    2789 // *******************
     2818// ************************** FUNCTION PARAMETERS *******************************
    27902819
    27912820parameter_list_ellipsis_opt:
     
    28682897        | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initializer_opt
    28692898                { $$ = $2->addName( $3 )->addQualifiers( $1 ); }
    2870         | cfa_function_specifier
     2899        | cfa_function_specifier                                                        // int f( "int fp()" );
    28712900        ;
    28722901
     
    28782907        | type_qualifier_list cfa_abstract_tuple
    28792908                { $$ = $2->addQualifiers( $1 ); }
    2880         | cfa_abstract_function
     2909        | cfa_abstract_function                                                         // int f( "int ()" );
    28812910        ;
    28822911
     
    30363065                { $$ = ast::TypeDecl::Dtype; }
    30373066        | '*'
    3038                 { $$ = ast::TypeDecl::DStype; }                                         // dtype + sized
    3039         // | '(' '*' ')'
    3040         //      { $$ = ast::TypeDecl::Ftype; }
     3067                { $$ = ast::TypeDecl::DStype; }                                 // Dtype + sized
     3068        // | '(' '*' ')'                                                                        // Gregor made me do it
     3069        //      { $$ = ast::TypeDecl::Ftype; }
    30413070        | ELLIPSIS
    30423071                { $$ = ast::TypeDecl::Ttype; }
     
    32443273                        $$ = $6;
    32453274                }
    3246         // global distribution
     3275                // global distribution
    32473276        | type_qualifier_list
    32483277                {
     
    33693398        ;
    33703399
     3400// **************************** ASM *****************************
     3401
    33713402asm_name_opt:                                                                                   // GCC
    33723403        // empty
     
    33793410                }
    33803411        ;
     3412
     3413// **************************** ATTRIBUTE *****************************
    33813414
    33823415attribute_list_opt:                                                                             // GCC
     
    38263859
    38273860type_parameter_function:
    3828         typedef_name '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
     3861        typedef_name '(' parameter_list_ellipsis_opt ')'        // empty parameter list OBSOLESCENT (see 3)
    38293862                { $$ = $1->addParamList( $3 ); }
    38303863        | '(' type_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
     
    38763909
    38773910abstract_function:
    3878         '(' parameter_list_ellipsis_opt ')'                     // empty parameter list OBSOLESCENT (see 3)
     3911        '(' parameter_list_ellipsis_opt ')'                                     // empty parameter list OBSOLESCENT (see 3)
    38793912                { $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
    38803913        | '(' abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
     
    40084041
    40094042abstract_parameter_function:
    4010         '(' parameter_list_ellipsis_opt ')'                     // empty parameter list OBSOLESCENT (see 3)
     4043        '(' parameter_list_ellipsis_opt ')'                                     // empty parameter list OBSOLESCENT (see 3)
    40114044                { $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
    40124045        | '(' abstract_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
     
    42804313// mode: c++ //
    42814314// tab-width: 4 //
    4282 // compile-command: "make install" //
     4315// compile-command: "bison -Wcounterexamples parser.yy" //
    42834316// End: //
  • tests/.expect/functions.x64.txt

    r7a29392f r7e13b11  
    9494    __attribute__ ((unused)) const signed int _X11_retval_fO5Ki_1;
    9595}
     96void _X1fFv___1(void);
     97void _X1fFv___1(void);
    9698signed int _X1fFi___1(void);
    97 signed int _X1fFi_i__1(signed int __anonymous_object4);
     99void _X1fFv_i__1(signed int __anonymous_object4);
     100void _X1fFv_i__1(signed int __anonymous_object5);
     101signed int _X1fFi_i__1(signed int __anonymous_object6);
     102void _X1fFv___1(void){
     103}
     104void _X2fvFv___1(void){
     105}
    98106signed int _X1fFi___1(void){
    99107    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    100108}
    101 signed int _X1fFi_i__1(__attribute__ ((unused)) signed int __anonymous_object5){
     109void _X1fFv_i__1(__attribute__ ((unused)) signed int __anonymous_object7){
     110}
     111void _X2fvFv_i__1(__attribute__ ((unused)) signed int __anonymous_object8){
     112}
     113signed int _X1fFi_i__1(__attribute__ ((unused)) signed int __anonymous_object9){
    102114    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    103115}
    104116signed int _X1fFi___1(void);
     117void _X1fFv_i__1(signed int _X1xi_1);
     118void _X2fvFv_i__1(signed int _X1xi_1);
     119void _X2f2Fv_i__1(signed int _X1xi_1){
     120}
     121void _X3fv1Fv_i__1(signed int _X1xi_1){
     122}
    105123struct _tuple2_ {
    106124};
     
    127145};
    128146struct _conc__tuple2_0 _X1fFT2ii___1(void);
    129 struct _conc__tuple2_0 _X1fFT2ii_ii__1(signed int __anonymous_object6, signed int _X1xi_1);
     147void _X1fFv_ii__1(signed int __anonymous_object10, signed int _X1xi_1);
     148void _X2fvFv_ii__1(signed int __anonymous_object11, signed int _X1xi_1);
     149struct _conc__tuple2_0 _X1fFT2ii_ii__1(signed int __anonymous_object12, signed int _X1xi_1);
    130150struct _conc__tuple2_0 _X1fFT2ii___1(void){
    131151    __attribute__ ((unused)) struct _conc__tuple2_0 _X9_retval_fT2ii_1 = {  };
    132152}
    133 struct _conc__tuple2_0 _X1fFT2ii_ii__1(__attribute__ ((unused)) signed int __anonymous_object7, signed int _X1xi_1){
     153void _X1fFv_ii__1(__attribute__ ((unused)) signed int __anonymous_object13, signed int _X1xi_1){
     154}
     155void _X2fvFv_ii__1(__attribute__ ((unused)) signed int __anonymous_object14, signed int _X1xi_1){
     156}
     157struct _conc__tuple2_0 _X1fFT2ii_ii__1(__attribute__ ((unused)) signed int __anonymous_object15, signed int _X1xi_1){
    134158    __attribute__ ((unused)) struct _conc__tuple2_0 _X9_retval_fT2ii_1 = {  };
    135159}
     
    165189};
    166190struct _conc__tuple3_1 _X1fFT3iii___1(void);
    167 struct _conc__tuple3_1 _X1fFT3iii_iii__1(signed int __anonymous_object8, signed int _X1xi_1, signed int __anonymous_object9);
     191void _X1fFv_iii__1(signed int __anonymous_object16, signed int _X1xi_1, signed int __anonymous_object17);
     192void _X2fvFv_iii__1(signed int __anonymous_object18, signed int _X1xi_1, signed int __anonymous_object19);
     193struct _conc__tuple3_1 _X1fFT3iii_iii__1(signed int __anonymous_object20, signed int _X1xi_1, signed int __anonymous_object21);
    168194struct _conc__tuple3_1 _X1fFT3iii___1(void){
    169195    __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
    170196}
    171 struct _conc__tuple3_1 _X1fFT3iii_iii__1(__attribute__ ((unused)) signed int __anonymous_object10, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object11){
     197void _X1fFv_iii__1(__attribute__ ((unused)) signed int __anonymous_object22, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object23){
     198}
     199void _X2fvFv_iii__1(__attribute__ ((unused)) signed int __anonymous_object24, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object25){
     200}
     201struct _conc__tuple3_1 _X1fFT3iii_iii__1(__attribute__ ((unused)) signed int __anonymous_object26, signed int _X1xi_1, __attribute__ ((unused)) signed int __anonymous_object27){
    172202    __attribute__ ((unused)) struct _conc__tuple3_1 _X9_retval_fT3iii_1 = {  };
    173203}
     
    179209};
    180210struct _conc__tuple3_2 _X1fFT3iiPi___1(void);
    181 struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(signed int __anonymous_object12, signed int _X1xi_1, signed int *_X1yPi_1);
     211void _X1fFv_iiPi__1(signed int __anonymous_object28, signed int _X1xi_1, signed int *_X1yPi_1);
     212void _X2fvFv_iiPi__1(signed int __anonymous_object29, signed int _X1xi_1, signed int *_X1yPi_1);
     213struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(signed int __anonymous_object30, signed int _X1xi_1, signed int *_X1yPi_1);
    182214struct _conc__tuple3_2 _X1fFT3iiPi___1(void){
    183215    __attribute__ ((unused)) struct _conc__tuple3_2 _X9_retval_fT3iiPi_1 = {  };
    184216}
    185 struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object13, signed int _X1xi_1, signed int *_X1yPi_1){
     217void _X1fFv_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object31, signed int _X1xi_1, signed int *_X1yPi_1){
     218}
     219void _X2fvFv_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object32, signed int _X1xi_1, signed int *_X1yPi_1){
     220}
     221struct _conc__tuple3_2 _X1fFT3iiPi_iiPi__1(__attribute__ ((unused)) signed int __anonymous_object33, signed int _X1xi_1, signed int *_X1yPi_1){
    186222    __attribute__ ((unused)) struct _conc__tuple3_2 _X9_retval_fT3iiPi_1 = {  };
    187223}
    188 signed int _X3f11Fi_i__1(signed int __anonymous_object14);
     224signed int _X3f11Fi_i__1(signed int __anonymous_object34);
    189225signed int _X3f12Fi___1(void);
    190226const double _X4bar1Fd___1();
    191 const double _X4bar2Fd_i__1(signed int __anonymous_object15);
    192 const double _X4bar3Fd_d__1(double __anonymous_object16);
     227const double _X4bar2Fd_i__1(signed int __anonymous_object35);
     228const double _X4bar3Fd_d__1(double __anonymous_object36);
    193229const double _X3fooFd___1(void);
    194 const double _X3fooFd_i__1(signed int __anonymous_object17);
    195 const double _X3fooFd_d__1(__attribute__ ((unused)) double __anonymous_object18){
     230const double _X3fooFd_i__1(signed int __anonymous_object37);
     231const double _X3fooFd_d__1(__attribute__ ((unused)) double __anonymous_object38){
    196232    __attribute__ ((unused)) const double _X11_retval_fooKd_1;
    197233    {
     
    245281
    246282}
    247 struct S _X3rtnFS1S_i__1(__attribute__ ((unused)) signed int __anonymous_object19){
     283struct S _X3rtnFS1S_i__1(__attribute__ ((unused)) signed int __anonymous_object39){
    248284    __attribute__ ((unused)) struct S _X11_retval_rtnS1S_1;
    249285}
    250 signed int _X1fFi_Fi_ii_Fi_i___1(__attribute__ ((unused)) signed int (*__anonymous_object20)(signed int __param_0, signed int __param_1), __attribute__ ((unused)) signed int (*__anonymous_object21)(signed int __param_0)){
     286signed int _X1fFi_Fi_ii_Fi_i___1(__attribute__ ((unused)) signed int (*__anonymous_object40)(signed int __param_0, signed int __param_1), __attribute__ ((unused)) signed int (*__anonymous_object41)(signed int __param_0)){
    251287    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    252288    signed int (*(*_X2pcPA0A0PA0A0i_2)[][((unsigned long int )10)])[][((unsigned long int )3)];
     
    274310    __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
    275311}
    276 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object22)(), signed int *(*__anonymous_object23)(), signed int **(*__anonymous_object24)(), signed int *const *(*__anonymous_object25)(), signed int *const *const (*__anonymous_object26)(), signed int *__anonymous_object27, signed int __anonymous_object28[10], signed int **__anonymous_object29, signed int *__anonymous_object30[10], signed int ***__anonymous_object31, signed int **__anonymous_object32[10], signed int *const **__anonymous_object33, signed int *const *__anonymous_object34[10], signed int *const *const *__anonymous_object35, signed int *const *const __anonymous_object36[10]);
    277 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object37)(), __attribute__ ((unused)) signed int *(*__anonymous_object38)(), __attribute__ ((unused)) signed int **(*__anonymous_object39)(), __attribute__ ((unused)) signed int *const *(*__anonymous_object40)(), __attribute__ ((unused)) signed int *const *const (*__anonymous_object41)(), __attribute__ ((unused)) signed int *__anonymous_object42, __attribute__ ((unused)) signed int __anonymous_object43[10], __attribute__ ((unused)) signed int **__anonymous_object44, __attribute__ ((unused)) signed int *__anonymous_object45[10], __attribute__ ((unused)) signed int ***__anonymous_object46, __attribute__ ((unused)) signed int **__anonymous_object47[10], __attribute__ ((unused)) signed int *const **__anonymous_object48, __attribute__ ((unused)) signed int *const *__anonymous_object49[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object50, __attribute__ ((unused)) signed int *const *const __anonymous_object51[10]){
     312signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(), signed int *(*__anonymous_object43)(), signed int **(*__anonymous_object44)(), signed int *const *(*__anonymous_object45)(), signed int *const *const (*__anonymous_object46)(), signed int *__anonymous_object47, signed int __anonymous_object48[10], signed int **__anonymous_object49, signed int *__anonymous_object50[10], signed int ***__anonymous_object51, signed int **__anonymous_object52[10], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[10], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[10]);
     313signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(), __attribute__ ((unused)) signed int *(*__anonymous_object58)(), __attribute__ ((unused)) signed int **(*__anonymous_object59)(), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[10], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[10], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[10], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[10], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[10]){
    278314    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    279315}
Note: See TracChangeset for help on using the changeset viewer.