Hi Marcos.

On Thu, 13 Mar 2025, Marcos Cruz wrote:

I'm using Pike v8.0 release 1738 on Debian 12.9.

I got this:

```
int x;
x = has_value(({ 1, 2, 3, 4 }), -100); // result: 0
x = has_value(({ 1, 2, 3, 4 }), 0); // result: 0
x = has_value(({ 1, 2, 3, 4 }), 4); // result: 1
x = has_value(({ 1, 2, 3, 4 }), 5);
Compiler Error: 1: Bad argument 2 to has_value.
Compiler Error: 1: Expected: int(0..4).
Compiler Error: 1: Got     : int(5..5).
```

I expected a result of 0 also with numbers greater than 4, after the
documentation
(http://pike.lysator.liu.se/generated/manual/modref/ex/predef_3A_3A/has_value.html#has_value).

Is it a bug or am I missing something?

This is an intended behavior. In Pike 9.0 and later the issue with
the first two not triggering a compilation error has been fixed.

| $ pike
| Pike v9.0 release 9 running Hilfe v3.5 (Incremental Pike Frontend)
| > has_value(({ 1, 2, 3, 4 }), -100);
| Compiler Error: 1: Bad argument 2 to has_value.
| Compiler Error: 1: Expected: int(1..4).
| Compiler Error: 1: Got     : int(-100).
| > has_value(({ 1, 2, 3, 4 }), 0);
| Compiler Error: 1: Bad argument 2 to has_value.
| Compiler Error: 1: Expected: int(1..4).
| Compiler Error: 1: Got     : zero.
| > has_value(({ 1, 2, 3, 4 }), 4);
| (1) Result: 1
| > has_value(({ 1, 2, 3, 4 }), 5);
| Compiler Error: 1: Bad argument 2 to has_value.
| Compiler Error: 1: Expected: int(1..4).
| Compiler Error: 1: Got     : int(5).

Note that the error is triggered because the compiler has sufficient
type information to determine that the respective calls will always
fail. This is typically not a problem except in interactive use
(ie hilfe), or eg when it is part of a macro. It is possible to
force the compiler to know less by eg casting to/via mixed:

| > has_value(({ 1, 2, 3, 4 }), (mixed)5);
| (2) Result: 0

Did this help?

        /grubba

--
Henrik Grubbström                                       [email protected]
Roxen Internet Software AB                              [email protected]

Reply via email to