mirror of
https://github.com/irmen/prog8.git
synced 2024-09-07 03:54:27 +00:00
range expressions are on integers only
This commit is contained in:
parent
fd1f30f92b
commit
af99173cd7
@ -12,6 +12,7 @@ import prog8.compiler.IErrorReporter
|
||||
import prog8.compiler.target.ICompilationTarget
|
||||
|
||||
// Fix up the literal value's type to match that of the vardecl
|
||||
// (also check range literal operands types before they get expanded to arrays for instance)
|
||||
internal class VarConstantValueTypeAdjuster(private val program: Program, private val errors: IErrorReporter) : AstWalker() {
|
||||
|
||||
override fun after(decl: VarDecl, parent: Node): Iterable<IAstModification> {
|
||||
@ -52,6 +53,35 @@ internal class VarConstantValueTypeAdjuster(private val program: Program, privat
|
||||
}
|
||||
return noModifications
|
||||
}
|
||||
|
||||
override fun after(range: RangeExpr, parent: Node): Iterable<IAstModification> {
|
||||
val from = range.from.constValue(program)?.number?.toDouble()
|
||||
val to = range.to.constValue(program)?.number?.toDouble()
|
||||
val step = range.step.constValue(program)?.number?.toDouble()
|
||||
|
||||
if(from==null) {
|
||||
if(!range.from.inferType(program).isInteger())
|
||||
errors.err("range expression from value must be integer", range.from.position)
|
||||
} else if(from-from.toInt()>0) {
|
||||
errors.err("range expression from value must be integer", range.from.position)
|
||||
}
|
||||
|
||||
if(to==null) {
|
||||
if(!range.to.inferType(program).isInteger())
|
||||
errors.err("range expression to value must be integer", range.to.position)
|
||||
} else if(to-to.toInt()>0) {
|
||||
errors.err("range expression to value must be integer", range.to.position)
|
||||
}
|
||||
|
||||
if(step==null) {
|
||||
if(!range.step.inferType(program).isInteger())
|
||||
errors.err("range expression step value must be integer", range.step.position)
|
||||
} else if(step-step.toInt()>0) {
|
||||
errors.err("range expression step value must be integer", range.step.position)
|
||||
}
|
||||
|
||||
return noModifications
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -396,7 +396,7 @@ The following names are reserved, they have a special meaning::
|
||||
Range expression
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
A special value is the *range expression* which represents a range of numbers or characters,
|
||||
A special value is the *range expression* which represents a range of integer numbers or characters,
|
||||
from the starting value to (and including) the ending value::
|
||||
|
||||
<start> to <end> [ step <step> ]
|
||||
@ -406,7 +406,7 @@ You an provide a step value if you need something else than the default incremen
|
||||
in case of downto, a decrement of one). Because a step of minus one is so common you can just use
|
||||
the downto variant to avoid having to specify the step as well.
|
||||
|
||||
If used in the place of a literal value, it expands into the actual array of values::
|
||||
If used in the place of a literal value, it expands into the actual array of integer values::
|
||||
|
||||
byte[] array = 100 to 199 ; initialize array with [100, 101, ..., 198, 199]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user