[fpc-devel] "case" with range stupidities

Daniël Mantione daniel.mantione at freepascal.org
Thu Feb 15 14:06:05 CET 2007



Op Thu, 15 Feb 2007, schreef Vinzent Hoefler:

> program
>    Case_Test;
> 
> type
>    My_Range = 2000 .. 3000;
> 
> var
>    X : Integer;
> 
> begin
>    X := 2500;
> 
>    case X of
>       Low (My_Range) .. High (My_Range) : WriteLn ('In range. (1)');
>       My_Range                          : WriteLn ('In range. (2)');
>    else
>       WriteLn ('Out of range.');
>    end {case};
> end {Case_Test}.
> 
> -- 8< --
> 
> Is there any reasoning why the first switch in the case statement ("Low 
> (My_Range) ...") is allowed, whilst the second one (just "My_Range") is 
> not (says: "constant expression expected")?

Well, a case label is basically a set of values. A type definition is something 
different, i.e. you cannot use "byte" or "longint" as case labels either. 
Afaik set names aren't allowed either but allowing these would seem more 
logical to me than allowing type names (seeing byte and longint as case 
labels would seem weird to me.


> Another minor issue is that a type declaration like:
> 
>    type
>       My_Range = (2500 - 500) .. (2500 + 500);
> 
> is not accepted (message similar to ";" expected, ".." found) and 
> (basically the same declaration)
> 
>    type
>       My_Range = 2500 - 500 .. 2500 + 500;
> 
> is. Sometimes I'd really like to add those parantheses just to make the 
> intention more clear.

I think this is a parser limitation. I don't think it is a problem to 
allow it.

Daniël


More information about the fpc-devel mailing list