gcc error compiling array contains test for const array or boxed value

The C code for an in test for an array fails to compile when the variable being tested is boxed or if the array is const:

For example, with a boxed array boxed-value-contains.vala:

enum Test { ONE, TWO, THREE; }

public void main() {
    bool accepted = false;

    // Compiles fine
    Test[] ACCEPTABLE_1 = { ONE, TWO };
    Test test_1 = ONE;
    accepted = test_1 in ACCEPTABLE_1;
    print("%s\n", accepted.to_string());

    // Boxed test value fails to compile
    Test[] ACCEPTABLE_2 = { ONE, TWO };
    Test? test_2 = null;
    accepted = test_2 in ACCEPTABLE_2;
    print("%s\n", accepted.to_string());
}

When compiling this I get:

mjog@blanchefort:~/Projects/GNOME/geary$ valac boxed-array-contains.vala
/home/mjog/Projects/GNOME/geary/boxed-array-contains.vala.c: In function ‘_vala_main’:
/home/mjog/Projects/GNOME/geary/boxed-array-contains.vala.c:114:76: error: incompatible type for argument 3 of ‘_vala_test_array_contains’
  114 |  accepted = _vala_test_array_contains (ACCEPTABLE_2, ACCEPTABLE_2_length1, test_2);
      |                                                                            ^~~~~~
      |                                                                            |
      |                                                                            Test * {aka enum <anonymous> *}
/home/mjog/Projects/GNOME/geary/boxed-array-contains.vala.c:48:39: note: expected ‘Test’ {aka ‘const enum <anonymous>’} but argument is of type ‘Test *’ {aka ‘enum <anonymous> *’}
   48 |                            const Test needle)
      |                            ~~~~~~~~~~~^~~~~~
error: cc exited with status 256
Compilation failed: 1 error(s), 0 warning(s)

And with a const array, const-array-contains.vala:

enum Test { ONE, TWO, THREE; }

public void main() {
    bool accepted = false;

    // Compiles fine
    Test[] ACCEPTABLE_1 = { ONE, TWO };
    Test test_1 = ONE;
    accepted = test_1 in ACCEPTABLE_1;
    print("%s\n", accepted.to_string());

    // Const array fails to compile
    const Test[] ACCEPTABLE_2 = { ONE, TWO };
    Test test_2 = ONE;
    accepted = test_2 in ACCEPTABLE_2;
    print("%s\n", accepted.to_string());
}

Compiling gives:

mjog@blanchefort:~/Projects/GNOME/geary$ valac const-array-contains.vala
/home/mjog/Projects/GNOME/geary/const-array-contains.vala.c: In function ‘_vala_main’:
/home/mjog/Projects/GNOME/geary/const-array-contains.vala.c:105:40: warning: passing argument 1 of ‘_vala_test_array_contains’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  105 |  accepted = _vala_test_array_contains (ACCEPTABLE_2, G_N_ELEMENTS (ACCEPTABLE_2), test_2);
      |                                        ^~~~~~~~~~~~
/home/mjog/Projects/GNOME/geary/const-array-contains.vala.c:46:35: note: expected ‘Test *’ {aka ‘enum <anonymous> *’} but argument is of type ‘const Test *’ {aka ‘const enum <anonymous> *’}
   46 | _vala_test_array_contains (Test * stack,
      |                            ~~~~~~~^~~~~

Test cases: boxed-array-contains.vala const-array-contains.vala

Edited Mar 29, 2020 by Rico Tzschichholz
Assignee Loading
Time tracking Loading