Changeset 81e768d for tests


Ignore:
Timestamp:
Nov 28, 2024, 4:34:08 PM (3 weeks ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
master
Children:
46c4dea
Parents:
f5e37a4
Message:

Fix #276; add support for c-array parameters using dependent lengths.

Without this fix, declarations like

void f( int m, int n, float[m][n] );

would either

  • generate bad C code, with unmangled variable names appearing in the function definition, or
  • refuse to resolve a valid-c call of such a function.

tests/array-collections/c-dependent: add direct tests of such cases
tests/tuplearray: activate and expand cases which were blocked on #276
tests/array: activate case fm5y, which was blocked on #276; [noise] adjust source line numbers in .expect
tests/typedefRedef: expand coverage of "error, an array detail is different" cases; [noise] adjust source line numbers in .expect
tests/functions: [noise] adjust .expect to have resolved array sizes (extra casts) in the diffed code dump

The fix is:

  • (ResolvExpr/ResolveTypeof?, ResolvExpr/Resolver?) Resolve the dimension expressions, where they were missed.
  • (ResolvExpr/Resolver?) Prevent dimension expressions that are bound to other parameters from escaping in the function's type, to where they are out of scope. In the f example above, redact the type shown to callers from void (*)(int, int, float[m][n]) to void (*)(int, int, float[][*]).
  • (ResolvExpr/Unify?) Relax the matching rules for such a type, when used at a call site, letting the patameters wildcard type match with the concrete type in scope at the caller's side.
  • (Validate/ReplaceTypedef?) Apply the former, stricter matching rules to the one place where they are still needed: detecting inconsistent typedefs.
Location:
tests
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • tests/.expect/array-ERR1.txt

    rf5e37a4 r81e768d  
    1 array.cfa:119:25: warning: Preprocessor started
     1array.cfa:125:25: warning: Preprocessor started
    22array.cfa:40:22: error: '[*]' not allowed in other than function prototype scope
    33array.cfa:46:24: error: '[*]' not allowed in other than function prototype scope
     
    55array.cfa:52:16: error: array size missing in '_X2a1A0i_2'
    66array.cfa:53:26: error: '[*]' not allowed in other than function prototype scope
     7array.cfa: At top level:
     8array.cfa:64:1: error: '[*]' not allowed in other than function prototype scope
  • tests/.expect/array-ERR2.txt

    rf5e37a4 r81e768d  
    1 array.cfa:119:25: warning: Preprocessor started
    2 array.cfa:109:32: error: syntax error, unexpected STATIC before token "static"
     1array.cfa:125:25: warning: Preprocessor started
     2array.cfa:117:32: error: syntax error, unexpected STATIC before token "static"
  • tests/.expect/array-ERR3.txt

    rf5e37a4 r81e768d  
    1 array.cfa:119:25: warning: Preprocessor started
    2 array.cfa:110:32: error: syntax error, unexpected ']' before token "]"
     1array.cfa:125:25: warning: Preprocessor started
     2array.cfa:118:32: error: syntax error, unexpected ']' before token "]"
  • tests/.expect/array.txt

    rf5e37a4 r81e768d  
    1 array.cfa:119:25: warning: Preprocessor started
     1array.cfa:125:25: warning: Preprocessor started
  • tests/.expect/functions.arm64.txt

    rf5e37a4 r81e768d  
    310310    __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
    311311}
    312 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), 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]);
    313 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __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]){
     312signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
     313signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
    314314    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    315315}
  • tests/.expect/functions.x64.txt

    rf5e37a4 r81e768d  
    310310    __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
    311311}
    312 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), 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]);
    313 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __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]){
     312signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
     313signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
    314314    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    315315}
  • tests/.expect/functions.x86.txt

    rf5e37a4 r81e768d  
    310310    __attribute__ ((unused)) const struct _conc__tuple2_3 _X10_retval_f5KT2PiKi_1;
    311311}
    312 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), 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]);
    313 signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __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]){
     312signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(signed int (*__anonymous_object42)(void), signed int *(*__anonymous_object43)(void), signed int **(*__anonymous_object44)(void), signed int *const *(*__anonymous_object45)(void), signed int *const *const (*__anonymous_object46)(void), signed int *__anonymous_object47, signed int __anonymous_object48[((unsigned long int )10)], signed int **__anonymous_object49, signed int *__anonymous_object50[((unsigned long int )10)], signed int ***__anonymous_object51, signed int **__anonymous_object52[((unsigned long int )10)], signed int *const **__anonymous_object53, signed int *const *__anonymous_object54[((unsigned long int )10)], signed int *const *const *__anonymous_object55, signed int *const *const __anonymous_object56[((unsigned long int )10)]);
     313signed int _X1fFi_Fi__FPi__FPPi__FPKPi__FPKPi__PiPiPPiPPiPPPiPPPiPPKPiPPKPiPKPKPiPKPKPi__1(__attribute__ ((unused)) signed int (*__anonymous_object57)(void), __attribute__ ((unused)) signed int *(*__anonymous_object58)(void), __attribute__ ((unused)) signed int **(*__anonymous_object59)(void), __attribute__ ((unused)) signed int *const *(*__anonymous_object60)(void), __attribute__ ((unused)) signed int *const *const (*__anonymous_object61)(void), __attribute__ ((unused)) signed int *__anonymous_object62, __attribute__ ((unused)) signed int __anonymous_object63[((unsigned long int )10)], __attribute__ ((unused)) signed int **__anonymous_object64, __attribute__ ((unused)) signed int *__anonymous_object65[((unsigned long int )10)], __attribute__ ((unused)) signed int ***__anonymous_object66, __attribute__ ((unused)) signed int **__anonymous_object67[((unsigned long int )10)], __attribute__ ((unused)) signed int *const **__anonymous_object68, __attribute__ ((unused)) signed int *const *__anonymous_object69[((unsigned long int )10)], __attribute__ ((unused)) signed int *const *const *__anonymous_object70, __attribute__ ((unused)) signed int *const *const __anonymous_object71[((unsigned long int )10)]){
    314314    __attribute__ ((unused)) signed int _X9_retval_fi_1;
    315315}
  • tests/.expect/tuplearray.txt

    rf5e37a4 r81e768d  
    991, 2
    10101, 2
     112, 4
     122, 4
     132, 4
     142, 4
     152, 4
     162, 4
     172, 4
     182, 4
     192, 4
     202, 4
  • tests/.expect/typedefRedef-ERR1.txt

    rf5e37a4 r81e768d  
    1 typedefRedef.cfa:75:25: warning: Compiled
     1typedefRedef.cfa:87:25: warning: Compiled
    22typedefRedef.cfa:4:1 error: Cannot redefine typedef Foo
    33typedefRedef.cfa:31:1 error: Cannot redefine typedef ARR
    4 typedefRedef.cfa:65:1 error: Cannot redefine typedef ARR
     4typedefRedef.cfa:37:1 error: Cannot redefine typedef ARRSa
     5typedefRedef.cfa:43:1 error: Cannot redefine typedef ARRSb
     6typedefRedef.cfa:77:1 error: Cannot redefine typedef ARR
  • tests/.expect/typedefRedef.txt

    rf5e37a4 r81e768d  
    1 typedefRedef.cfa:75:25: warning: Compiled
     1typedefRedef.cfa:87:25: warning: Compiled
  • tests/array.cfa

    rf5e37a4 r81e768d  
    5757    }
    5858
     59    int fred2(int n,
     60        int a1[],
     61E1(     int a2[*],   )
     62        int a4[3],
     63        int T[3],
     64        int a5[n]
     65    ) {}
     66
    5967    int mary( int T[3],                                 // same as: int *T
    6068              int p1[const 3],                          // same as: int const *p1
     
    110118E3( int fm4( int r, int c, int m[][] );            )    // m's immediate element type is incomplete
    111119    int fm5x( int, int, int[*][*] );                    // same as fm1 decl
    112                                                         #ifndef __cforall
    113     int fm5y( int r, int c, int m[r][c] ) {}            // BUG 276: CFA chokes but should accept
    114                                                         // C: same as fm1 defn
    115                                                         #endif
     120    int fm5y( int r, int c, int m[r][c] ) {}            // same as fm1 defn
     121
    116122
    117123
  • tests/tuplearray.cfa

    rf5e37a4 r81e768d  
    2020[void] bar12( * [3][10] [int,int] f );
    2121
    22 //[void] foo( size_t size, [size] [int,int] f ) {
    23 [void] foo( size_t size, [10] [int,int] f ) {
    24         for ( i; size ) f[i] = [1, 2];
     22[void] foo1( [10] [int,int] f ) {
     23        for ( i; 10 ) f[i] = [1, 2];
     24}
     25[void] foo2( size_t size, [size] [int,int] f ) {
     26        for ( i; size ) f[i] = [2, 4];
    2527}
    2628
     
    2931//      [int,int] arr[10];      // unimplemented
    3032
    31         foo( 10, arr );
     33        foo1( arr );
     34        for ( i; 10 ) sout | arr[i];
     35
     36        foo2( 10, arr );
    3237        for ( i; 10 ) sout | arr[i];
    3338}
  • tests/typedefRedef.cfa

    rf5e37a4 r81e768d  
    3030// if a typedef has an array dimension, it can only be redefined to the same dimension
    3131typedef int ARR[2];
     32#endif
     33
     34typedef [ float[], char[], int[] ] ARRSa;
     35typedef [ float[], char[], int[] ] ARRSa;
     36#ifdef ERR1
     37typedef [ float[], char[2], int[] ] ARRSa;
     38#endif
     39
     40typedef int ARRSb[][1][2][3];
     41typedef int ARRSb[][1][2][3];
     42#ifdef ERR1
     43typedef int ARRSb[][1][2][99];
    3244#endif
    3345
Note: See TracChangeset for help on using the changeset viewer.