Hi,
that reminds me of https://bugs.freepascal.org/view.php?id=34232
Bye,
Benito
Am 08.01.19 um 23:28 schrieb Sven Barth via fpc-pascal:
Am Di., 8. Jan. 2019, 21:01 hat Ryan Joseph
<r...@thealchemistguild.com <mailto:r...@thealchemistguild.com>>
geschrieben:
I’ve made constants respect their proper definition now so we can
do range checking but this broke some other things. For example
there’s a range check error with static arrays now because “U” has
a value of 0 so 0-1 = -1:
type
generic TList<const U:byte> = record
list: array[0..U-1] of integer; // ERROR: high
value < low value (0..-1)
end;
There’s a couple ways to resolve this:
1) Add some extra flags to nodes/syms so “U-1” can be known to
contain a generic parameter and errors can be ignored. That’s the
most complicated solution and I wasn’t able to figure that out
easily because flags need to be transferred in multiple locations.
This is the preferred solution as otherwise you'd also defeat the
purpose of type safety and probably open another can of worms when
constant parameters are used in more complex expressions.
The symbols should already have sp_generic_param set (if not that
should definitely be changed so that it matches the type symbols). Now
you only need a way to differentiate whether the symbol is an
undefined generic parameter or not.
For type parameters it abuses the fact that the undefined defs of the
parameters are children of the generic while the final types are never
children of the generic. Maybe we can use something similar for the
constants?
If not we can always add some flag to tconstsym...
Regards,
Sven
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal