mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-18 17:08:32 +00:00
fix #1013
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
|
||||
import
|
||||
intsets, ast, astalgo, semdata, types, msgs, renderer, lookups, semtypinst,
|
||||
magicsys, condsyms, idents, lexer, options, parampatterns, strutils
|
||||
magicsys, condsyms, idents, lexer, options, parampatterns, strutils, trees
|
||||
|
||||
when not defined(noDocgen):
|
||||
import docgen
|
||||
@@ -973,11 +973,17 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
|
||||
# fix the expression, so it contains the already instantiated types
|
||||
let instantiated = replaceTypesInBody(c.c, c.bindings, f.n)
|
||||
let reevaluted = c.c.semExpr(c.c, instantiated)
|
||||
if reevaluted.typ.kind != tyTypeDesc:
|
||||
case reevaluted.typ.kind
|
||||
of tyTypeDesc:
|
||||
result = typeRel(c, a, reevaluted.typ.base)
|
||||
of tyStatic:
|
||||
result = typeRel(c, a, reevaluted.typ.base)
|
||||
if result != isNone and reevaluted.typ.n != nil:
|
||||
if not exprStructuralEquivalent(aOrig.n, reevaluted.typ.n):
|
||||
result = isNone
|
||||
else:
|
||||
localError(f.n.info, errTypeExpected)
|
||||
result = isNone
|
||||
else:
|
||||
result = typeRel(c, a, reevaluted.typ.base)
|
||||
|
||||
else:
|
||||
internalAssert false
|
||||
|
||||
23
tests/matrix/issue1013.nim
Normal file
23
tests/matrix/issue1013.nim
Normal file
@@ -0,0 +1,23 @@
|
||||
import typetraits
|
||||
|
||||
template reject(e: expr) =
|
||||
static: assert(not compiles(e))
|
||||
|
||||
type
|
||||
TMatrix[T; M, N: static[int]] = array[M*N, T]
|
||||
|
||||
proc `*`[T; R, N, C](a: TMatrix[T, R, N], b: TMatrix[T, N, C]): TMatrix[T, R, C] =
|
||||
discard
|
||||
|
||||
var m1: TMatrix[int, 6, 4]
|
||||
var m2: TMatrix[int, 4, 3]
|
||||
var m3: TMatrix[int, 3, 3]
|
||||
|
||||
var m4 = m1*m2
|
||||
static: assert m4.M == 6 and m4.N == 3
|
||||
|
||||
reject m1 * m3 # not compatible
|
||||
|
||||
var m5 = m2 * m3
|
||||
static: assert high(m5) == 11 # 4*3 - 1
|
||||
|
||||
Reference in New Issue
Block a user