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 by Rico Tzschichholz