discard """ cmd: "nim c --verbosity:0 --colors:off $file" nimout: ''' Hint: texplain [Processing] texplain.nim(118, 10) Hint: Non-matching candidates for e(y) proc e(i: int): int texplain.nim(121, 7) Hint: Non-matching candidates for e(10) proc e(o: ExplainedConcept): int texplain.nim(84, 6) ExplainedConcept: undeclared field: 'foo' texplain.nim(84, 6) ExplainedConcept: undeclared field: '.' texplain.nim(84, 6) ExplainedConcept: expression '.' cannot be called texplain.nim(84, 5) ExplainedConcept: concept predicate failed texplain.nim(85, 6) ExplainedConcept: undeclared field: 'bar' texplain.nim(85, 6) ExplainedConcept: undeclared field: '.' texplain.nim(85, 6) ExplainedConcept: expression '.' cannot be called texplain.nim(84, 5) ExplainedConcept: concept predicate failed texplain.nim(124, 10) Hint: Non-matching candidates for e(10) proc e(o: ExplainedConcept): int texplain.nim(84, 6) ExplainedConcept: undeclared field: 'foo' texplain.nim(84, 6) ExplainedConcept: undeclared field: '.' texplain.nim(84, 6) ExplainedConcept: expression '.' cannot be called texplain.nim(84, 5) ExplainedConcept: concept predicate failed texplain.nim(85, 6) ExplainedConcept: undeclared field: 'bar' texplain.nim(85, 6) ExplainedConcept: undeclared field: '.' texplain.nim(85, 6) ExplainedConcept: expression '.' cannot be called texplain.nim(84, 5) ExplainedConcept: concept predicate failed texplain.nim(128, 20) Error: type mismatch: got but expected one of: proc e(o: ExplainedConcept): int texplain.nim(128, 9) template/generic instantiation of `assert` from here texplain.nim(84, 5) ExplainedConcept: concept predicate failed proc e(i: int): int expression: e(n) texplain.nim(129, 20) Error: type mismatch: got but expected one of: proc r(o: RegularConcept): int texplain.nim(129, 9) template/generic instantiation of `assert` from here texplain.nim(88, 5) RegularConcept: concept predicate failed proc r[T](a: SomeNumber; b: T; c: auto) proc r(i: string): int expression: r(n) texplain.nim(130, 20) Hint: Non-matching candidates for r(y) proc r[T](a: SomeNumber; b: T; c: auto) proc r(i: string): int texplain.nim(138, 2) Error: type mismatch: got but expected one of: proc f(o: NestedConcept) texplain.nim(88, 6) RegularConcept: undeclared field: 'foo' texplain.nim(88, 6) RegularConcept: undeclared field: '.' texplain.nim(88, 6) RegularConcept: expression '.' cannot be called texplain.nim(88, 5) RegularConcept: concept predicate failed texplain.nim(89, 6) RegularConcept: undeclared field: 'bar' texplain.nim(89, 6) RegularConcept: undeclared field: '.' texplain.nim(89, 6) RegularConcept: expression '.' cannot be called texplain.nim(88, 5) RegularConcept: concept predicate failed texplain.nim(92, 5) NestedConcept: concept predicate failed expression: f(y) ''' errormsg: "type mismatch: got " line: 138 disabled: 32bit """ # disabled on 32 bit, because the order of suggested alternatives ``r`` differs # proc r[T](a: SomeNumber; b: T; c: auto) # proc r(i: string): int # proc r(o: RegularConcept): int # line 80 HERE type ExplainedConcept {.explain.} = concept o o.foo is int o.bar is string RegularConcept = concept o o.foo is int o.bar is string NestedConcept = concept o o.foo is RegularConcept NonMatchingType = object foo: int bar: int MatchingType = object foo: int bar: string proc e(o: ExplainedConcept): int = 1 proc e(i: int): int = i proc r[T](a: SomeNumber, b: T, c: auto) = discard proc r(o: RegularConcept): int = 1 proc r(i: string): int = 1 proc f(o: NestedConcept) = discard var n = NonMatchingType(foo: 10, bar: 20) var y = MatchingType(foo: 10, bar: "bar") # no diagnostic here: discard e(y) # explain that e(int) doesn't match discard e(y) {.explain.} # explain that e(ExplainedConcept) doesn't match echo(e(10) {.explain.}, 20) # explain that e(ExplainedConcept) doesn't again discard e(10) static: # provide diagnostics why the compile block failed assert(compiles(e(n)) {.explain.} == false) assert(compiles(r(n)) {.explain.} == false) assert(compiles(r(y)) {.explain.} == true) # these should not produce any output assert(compiles(r(10)) == false) assert(compiles(e(10)) == true) # finally, provide multiple nested explanations for failed matching # of regular concepts, even when the explain pragma is not used f(y)