* fixes #7167
* spec: distinct types can be ordinal types
* bootstrapping issue
This commit is contained in:
Andreas Rumpf 2019-05-22 11:50:05 +02:00 • committed by GitHub
commit 1e97b420bb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 4 deletions

View file

@ -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

View file

@ -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
~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

View file

@ -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[]

View file

@ -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'