* fixes #7167 * spec: distinct types can be ordinal types * bootstrapping issue
This commit is contained in:
parent
57bc8d73b4
commit
1e97b420bb
4 changed files with 23 additions and 4 deletions
|
|
@ -338,8 +338,7 @@ proc semLowHigh(c: PContext, n: PNode, m: TMagic): PNode =
|
||||||
of tyArray:
|
of tyArray:
|
||||||
n.typ = typ.sons[0] # indextype
|
n.typ = typ.sons[0] # indextype
|
||||||
of tyInt..tyInt64, tyChar, tyBool, tyEnum, tyUInt8, tyUInt16, tyUInt32, tyFloat..tyFloat64:
|
of tyInt..tyInt64, tyChar, tyBool, tyEnum, tyUInt8, tyUInt16, tyUInt32, tyFloat..tyFloat64:
|
||||||
# do not skip the range!
|
n.typ = n.sons[1].typ.skipTypes({tyTypeDesc})
|
||||||
n.typ = n.sons[1].typ.skipTypes(abstractVar)
|
|
||||||
of tyGenericParam:
|
of tyGenericParam:
|
||||||
# prepare this for resolving in semtypinst:
|
# prepare this for resolving in semtypinst:
|
||||||
# we must use copyTree here in order to avoid creating a cycle
|
# we must use copyTree here in order to avoid creating a cycle
|
||||||
|
|
|
||||||
|
|
@ -827,7 +827,10 @@ Ordinal types have the following characteristics:
|
||||||
|
|
||||||
Integers, bool, characters and enumeration types (and subranges of these
|
Integers, bool, characters and enumeration types (and subranges of these
|
||||||
types) belong to ordinal types. For reasons of simplicity of implementation
|
types) belong to ordinal types. For reasons of simplicity of implementation
|
||||||
the types ``uint`` and ``uint64`` are not ordinal types.
|
the types ``uint`` and ``uint64`` are not ordinal types. (This will be changed
|
||||||
|
in later versions of the language.)
|
||||||
|
|
||||||
|
A distinct type is an ordinal type if its base type is an ordinal type.
|
||||||
|
|
||||||
|
|
||||||
Pre-defined integer types
|
Pre-defined integer types
|
||||||
|
|
@ -1801,6 +1804,8 @@ and its base type. Explicit type conversions from a distinct type to its
|
||||||
base type and vice versa are allowed. See also ``distinctBase`` to get the
|
base type and vice versa are allowed. See also ``distinctBase`` to get the
|
||||||
reverse operation.
|
reverse operation.
|
||||||
|
|
||||||
|
A distinct type is an ordinal type if its base type is an ordinal type.
|
||||||
|
|
||||||
|
|
||||||
Modelling currencies
|
Modelling currencies
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
||||||
|
|
@ -1102,7 +1102,7 @@ else:
|
||||||
|
|
||||||
# In case of a 32-bit time_t, we fallback to the closest available
|
# In case of a 32-bit time_t, we fallback to the closest available
|
||||||
# timezone information.
|
# timezone information.
|
||||||
var a = clamp(unix, low(CTime), high(CTime)).CTime
|
var a = clamp(unix, low(CTime).int64, high(CTime).int64).CTime
|
||||||
let tmPtr = localtime(a)
|
let tmPtr = localtime(a)
|
||||||
if not tmPtr.isNil:
|
if not tmPtr.isNil:
|
||||||
let tm = tmPtr[]
|
let tm = tmPtr[]
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,10 @@ discard """
|
||||||
output: '''
|
output: '''
|
||||||
tdistinct
|
tdistinct
|
||||||
25
|
25
|
||||||
|
false
|
||||||
|
false
|
||||||
|
false
|
||||||
|
false
|
||||||
'''
|
'''
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -83,3 +87,14 @@ type
|
||||||
const d: DistTup = DistTup((
|
const d: DistTup = DistTup((
|
||||||
foo:"FOO", bar:"BAR"
|
foo:"FOO", bar:"BAR"
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
|
# bug #7167
|
||||||
|
|
||||||
|
type Id = distinct range[0..3]
|
||||||
|
|
||||||
|
proc `<=`(a, b: Id): bool {.borrow.}
|
||||||
|
|
||||||
|
var xs: array[Id, bool]
|
||||||
|
|
||||||
|
for x in xs: echo x # type mismatch: got (T) but expected 'bool'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue