Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using the `in` keyword causes "E1012 Constant expression violates subrange bounds" in Delphi

I've come across some rather unusual behaviour in a bit of Delphi code. When using the in keyword to check if an item is in a constant array, I get the following compilation error:

E1012 Constant expression violates subrange bounds

The constants are defined as follows:

type TSomeEnum = (seFoo = 1000,
                  seBar = 2000,
                  seBoo = 3000,
                  seFar = 4000,
                  seFooBar = 5000,
                  seBooFar = 6000,
                  seLow = 1000,
                  seHigh = 6000,
                  seCount = 6);

The line that is failing is the following:

if someObj.someProperty in [seFoo, seFar, seFooBar] then
...

Whilst I understand the reasoning behind the error showing in another question posted here, where bounds checking on integer arrays wasn't done at compile time when using a variable, it seems odd that I'm getting the same problem with a constant array which is most certainly within bounds.

For now, I've replaced the line with a (much larger) statement comprising of or clauses. However, this is clearly not ideal. Can anyone shed any light on why I'm getting this problem?

like image 977
Polynomial Avatar asked Aug 29 '12 15:08

Polynomial


1 Answers

Documentation about Sets says :

The base type can have no more than 256 possible values, and their ordinalities must fall between 0 and 255.

So even if you can have enums of any value, the if xx in [a,b,c] statement will fail here, since a set cannot hold a value larger than 255.

Use a case statement instead:

case xx of
  a,b,c : // Make something 

end;
like image 149
LU RD Avatar answered Sep 20 '22 18:09

LU RD