Changeset a5aa5bf


Ignore:
Timestamp:
May 25, 2023, 5:55:18 PM (23 months ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
ast-experimental, master
Children:
8a919cf
Parents:
a5294af
Message:

Flesh out "C" array syntax testing.

Enable testing of expected-rejection cases.
One such "test" (now trac #275) had regressed while it was commented out.

Add expected-acceptance cases for size-star declarations.
Add cases for "dependent parameter" syntax.

Add comments summarizing semantics of these (obscure C) syntax cases.

Location:
tests
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified tests/.expect/array.txt

    ra5294af ra5aa5bf  
    1 array.cfa:52:25: warning: Compiled
     1array.cfa:105:25: warning: Preprocessor started
  • TabularUnified tests/Makefile.am

    ra5294af ra5aa5bf  
    211211# expected failures
    212212# use custom target since they require a custom define *and* have a name that doesn't match the file
     213
     214array-ERR1 : array.cfa ${CFACCBIN}
     215        ${CFACOMPILE_SYNTAX} -DERR1
     216        -cp ${test} ${abspath ${@}}
     217
     218array-ERR2 : array.cfa ${CFACCBIN}
     219        ${CFACOMPILE_SYNTAX} -DERR2
     220        -cp ${test} ${abspath ${@}}
     221
     222array-ERR3 : array.cfa ${CFACCBIN}
     223        ${CFACOMPILE_SYNTAX} -DERR3
     224        -cp ${test} ${abspath ${@}}
     225
    213226alloc-ERROR : alloc.cfa ${CFACCBIN}
    214227        ${CFACOMPILE_SYNTAX} -DERR1
  • TabularUnified tests/array.cfa

    ra5294af ra5aa5bf  
    1515//
    1616
    17 int a1[0];
    18 //int a2[*];
    19 //double a4[3.0];
     17// Tests syntax.  Comments explain semantics.  Test does not show semantics.
     18// Mostly illustrates facts about C (with which CFA is being tested to agree).
     19// Is a test oracle under `gcc -x c`.
    2020
    21 int m1[0][3];
    22 //int m2[*][*];
    23 int m4[3][3];
     21#ifdef ERR1
     22#define E1(...) __VA_ARGS__
     23#else
     24#define E1(...)
     25#endif
    2426
    25 typedef int T;
     27#ifdef ERR2
     28#define E2(...) __VA_ARGS__
     29#else
     30#define E2(...)
     31#endif
    2632
    27 int fred() {
    28 //      int a1[];
    29 //      int a2[*];
    30         int a4[3];
    31         int T[3];
    32 }
     33#ifdef ERR3
     34#define E3(...) __VA_ARGS__
     35#else
     36#define E3(...)
     37#endif
    3338
    34 int mary( int T[3],
    35                   int p1[const 3],
    36                   int p2[static 3],
    37                   int p3[static const 3]
    38         ) {
    39 }
     39        int a1[0];
     40E1( int a2[*];       )
     41                                                        #ifndef __cforall
     42E1( double a4[3.0];  )                                  // BUG 275: CFA accepts but should reject
     43                                                        #endif
    4044
    41 int (*tom())[3] {
    42 }
     45        int m1[0][3];
     46E1(     int m2[*][*];    )
     47        int m4[3][3];
    4348
    44 int (*(jane)())( int T[3],
    45                                  int p1[const 3],
    46                                  int p2[static 3],
    47                                  int p3[static const 3]
    48         ) {
    49 }
     49        typedef int T;
     50
     51        int fred(int n) {
     52E1(             int a1[];    )
     53E1(             int a2[*];   )
     54                int a4[3];
     55                int T[3];
     56                int a5[n];
     57        }
     58
     59        int mary( int T[3],                                 // same as: int *T
     60                          int p1[const 3],                          // same as: int const *p1
     61                          int p2[static 3],                         // same as T, but length >=3 checked
     62                          int p3[static const 3]                    // both above: 3 is static, p3 is const
     63                ) {
     64        }
     65
     66        // function taking (), returning pointer to array of ints
     67        int (*tom())[3] {
     68        }
     69
     70        // function taking (), returning pointer to function of same type as mary
     71        int (*(jane)())( int T[3],
     72                                        int p1[const 3],
     73                                        int p2[static 3],
     74                                        int p3[static const 3]
     75                ) {
     76        }
     77
     78        // functions returning same exotic pointers, in CFA's non-onion syntax
     79        #ifdef __cforall
     80        [ * [3] int ] toms_twin(...) {
     81        }
     82        [ * [int]( [3] int T,
     83                        [const 3] int p1,
     84                        [static 3] int p2,
     85                        [static const 3] int p3
     86                        )
     87        ] janes_twin(...) {
     88        }
     89        #endif
     90
     91
     92        int fm1( int, int, int[][*] );
     93        int fm1( int r, int c, int m[][c] ) {}
     94        int fm2( int r, int c, int (*m)[c] ) {}             // same as fm1
     95E2(     int fm3( int r, int c, int m[][static c] ) {}  )    // that's not static
     96E3(     int fm4( int r, int c, int m[][] );            )    // m's immediate element type is incomplete
     97        int fm5( int, int, int[*][*] );                     // same as fm1 decl
     98                                                        #ifndef __cforall
     99        int fm5( int r, int c, int m[r][c] ) {}             // BUG 276: CFA chokes but should accept
     100                                                            // C: same as fm1 defn
     101                                                        #endif
     102
    50103
    51104int main() {
    52     #pragma GCC warning "Compiled"                      // force non-empty .expect file, NO TABS!!!
     105    #pragma GCC warning "Preprocessor started"          // force non-empty .expect file, NO TABS!!!
    53106}
    54107
Note: See TracChangeset for help on using the changeset viewer.