source: tests/array-collections/c-dependent.cfa @ 81e768d

Last change on this file since 81e768d was 81e768d, checked in by Michael Brooks <mlbrooks@…>, 3 weeks ago

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.
  • Property mode set to 100644
File size: 861 bytes
Line 
1void iota1( int n, float * a, float base ) {
2    for (i; n) {
3        a[i] = base + 0.1f * (float)(i + 1);
4    }
5}
6
7void f__bound_ptr_allow( int n, float a[n] ) {
8    printf( "bound_ptr_allow %d: %.1f %.1f %.1f\n", n, a[0], a[1], a[2] );
9}
10void bound_ptr_allow() {
11    float a[42];
12    iota1( 42, a, 1.0 );
13    f__bound_ptr_allow( 999, a );
14}
15
16void f__bound_ar_allow( int n, float a[][n + 1] ) {
17    printf( "bound_ar_allow %d:\n", n );
18    printf( "%.1f %.1f %.1f\n", a[0][0], a[0][1], a[0][2] );
19    printf( "%.1f %.1f %.1f\n", a[1][0], a[1][1], a[1][2] );
20    printf( "%.1f %.1f %.1f\n", a[2][0], a[2][1], a[2][2] );
21}
22void bound_ar_allow() {
23    float a[3][42];
24    iota1( 42, a[0], 1.0 );
25    iota1( 42, a[1], 2.0 );
26    iota1( 42, a[2], 3.0 );
27    f__bound_ar_allow( 41, a );
28}
29
30
31int main() {
32    bound_ptr_allow();
33    bound_ar_allow();
34
35    return 0;
36}
Note: See TracBrowser for help on using the repository browser.