This commit is contained in:
Zahary Karadjov 2014-03-19 22:35:31 +02:00
commit d508384d39
2 changed files with 33 additions and 4 deletions

View file

@ -12,7 +12,7 @@
import import
intsets, ast, astalgo, semdata, types, msgs, renderer, lookups, semtypinst, 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): when not defined(noDocgen):
import docgen 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 # fix the expression, so it contains the already instantiated types
let instantiated = replaceTypesInBody(c.c, c.bindings, f.n) let instantiated = replaceTypesInBody(c.c, c.bindings, f.n)
let reevaluted = c.c.semExpr(c.c, instantiated) let reevaluted = c.c.semExpr(c.c, instantiated)
if reevaluted.typ.kind != tyTypeDesc: case reevaluted.typ.kind
localError(f.n.info, errTypeExpected) 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 result = isNone
else: else:
result = typeRel(c, a, reevaluted.typ.base) localError(f.n.info, errTypeExpected)
result = isNone
else: else:
internalAssert false internalAssert false

View 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