diff options
-rw-r--r-- | compiler/semexprs.nim | 6 | ||||
-rw-r--r-- | lib/system.nim | 8 | ||||
-rw-r--r-- | tests/concepts/t3330.nim | 8 |
3 files changed, 15 insertions, 7 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 63039b36d..65557658a 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1085,9 +1085,11 @@ proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = if ty.n != nil and ty.n.kind == nkRecList: let field = lookupInRecord(ty.n, i) if field != nil: - n.typ = newTypeWithSons(c, tyFieldAccessor, @[ty, field.typ]) - n.typ.n = copyTree(n) + n.typ = makeTypeDesc(c, field.typ) return n + #n.typ = newTypeWithSons(c, tyFieldAccessor, @[ty, field.typ]) + #n.typ.n = copyTree(n) + #return n else: tryReadingGenericParam(ty) return diff --git a/lib/system.nim b/lib/system.nim index f8896ed13..9efa850ed 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -261,12 +261,18 @@ proc high*[T: Ordinal](x: T): T {.magic: "High", noSideEffect.} proc high*[T: Ordinal](x: typeDesc[T]): T {.magic: "High", noSideEffect.} proc high*[T](x: openArray[T]): int {.magic: "High", noSideEffect.} proc high*[I, T](x: array[I, T]): I {.magic: "High", noSideEffect.} +proc high*[I, T](x: typeDesc[array[I, T]]): I {.magic: "High", noSideEffect.} +proc high*(x: cstring): int {.magic: "High", noSideEffect.} +proc high*(x: string): int {.magic: "High", noSideEffect.} proc low*[T: Ordinal](x: typeDesc[T]): T {.magic: "Low", noSideEffect.} proc low*[T](x: openArray[T]): int {.magic: "Low", noSideEffect.} proc low*[I, T](x: array[I, T]): I {.magic: "Low", noSideEffect.} proc low*[T](x: T): T {.magic: "Low", noSideEffect.} - ## returns the lowest possible index of an array, a sequence, a string or +proc low*[I, T](x: typeDesc[array[I, T]]): I {.magic: "Low", noSideEffect.} +proc low*(x: cstring): int {.magic: "Low", noSideEffect.} +proc low*(x: string): int {.magic: "Low", noSideEffect.} +## returns the lowest possible index of an array, a sequence, a string or ## the lowest possible value of an ordinal value `x`. As a special ## semantic rule, `x` may also be a type identifier. ## diff --git a/tests/concepts/t3330.nim b/tests/concepts/t3330.nim index 04add2b6f..fcd5054ef 100644 --- a/tests/concepts/t3330.nim +++ b/tests/concepts/t3330.nim @@ -2,16 +2,16 @@ discard """ errormsg: "type mismatch: got (Bar[system.int])" nimout: ''' t3330.nim(40, 4) Error: type mismatch: got (Bar[system.int]) -but expected one of: +but expected one of: proc test(foo: Foo[int]) t3330.nim(25, 8) Hint: Non-matching candidates for add(k, string, T) -proc add[T](x: var seq[T]; y: T) -proc add(result: var string; x: float) proc add(x: var string; y: string) -proc add(x: var string; y: cstring) proc add(x: var string; y: char) proc add(result: var string; x: int64) +proc add(x: var string; y: cstring) +proc add(result: var string; x: float) proc add[T](x: var seq[T]; y: openArray[T]) +proc add[T](x: var seq[T]; y: T) t3330.nim(25, 8) template/generic instantiation from here t3330.nim(32, 6) Foo: 'bar.value' cannot be assigned to |