1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
discard """
cmd: "nim c --verbosity:0 --colors:off $file"
nimout: '''
Hint: texplain [Processing]
texplain.nim(158, 10) Hint: Non-matching candidates for e(y)
proc e(i: int): int
first type mismatch at position: 1
required type for i: int
but expression 'y' is of type: MatchingType
texplain.nim(161, 7) Hint: Non-matching candidates for e(10)
proc e(o: ExplainedConcept): int
first type mismatch at position: 1
required type for o: ExplainedConcept
but expression '10' is of type: int literal(10)
texplain.nim(124, 6) ExplainedConcept: undeclared field: 'foo'
texplain.nim(124, 6) ExplainedConcept: undeclared field: '.'
texplain.nim(124, 6) ExplainedConcept: expression '.' cannot be called
texplain.nim(124, 5) ExplainedConcept: concept predicate failed
texplain.nim(125, 6) ExplainedConcept: undeclared field: 'bar'
texplain.nim(125, 6) ExplainedConcept: undeclared field: '.'
texplain.nim(125, 6) ExplainedConcept: expression '.' cannot be called
texplain.nim(124, 5) ExplainedConcept: concept predicate failed
texplain.nim(164, 10) Hint: Non-matching candidates for e(10)
proc e(o: ExplainedConcept): int
first type mismatch at position: 1
required type for o: ExplainedConcept
but expression '10' is of type: int literal(10)
texplain.nim(124, 6) ExplainedConcept: undeclared field: 'foo'
texplain.nim(124, 6) ExplainedConcept: undeclared field: '.'
texplain.nim(124, 6) ExplainedConcept: expression '.' cannot be called
texplain.nim(124, 5) ExplainedConcept: concept predicate failed
texplain.nim(125, 6) ExplainedConcept: undeclared field: 'bar'
texplain.nim(125, 6) ExplainedConcept: undeclared field: '.'
texplain.nim(125, 6) ExplainedConcept: expression '.' cannot be called
texplain.nim(124, 5) ExplainedConcept: concept predicate failed
texplain.nim(168, 20) Error: type mismatch: got <NonMatchingType>
but expected one of:
proc e(o: ExplainedConcept): int
first type mismatch at position: 1
required type for o: ExplainedConcept
but expression 'n' is of type: NonMatchingType
texplain.nim(168, 9) template/generic instantiation of `assert` from here
texplain.nim(124, 5) ExplainedConcept: concept predicate failed
proc e(i: int): int
first type mismatch at position: 1
required type for i: int
but expression 'n' is of type: NonMatchingType
expression: e(n)
texplain.nim(169, 20) Error: type mismatch: got <NonMatchingType>
but expected one of:
proc r(o: RegularConcept): int
first type mismatch at position: 1
required type for o: RegularConcept
but expression 'n' is of type: NonMatchingType
texplain.nim(169, 9) template/generic instantiation of `assert` from here
texplain.nim(128, 5) RegularConcept: concept predicate failed
proc r[T](a: SomeNumber; b: T; c: auto)
first type mismatch at position: 1
required type for a: SomeNumber
but expression 'n' is of type: NonMatchingType
proc r(i: string): int
first type mismatch at position: 1
required type for i: string
but expression 'n' is of type: NonMatchingType
expression: r(n)
texplain.nim(170, 20) Hint: Non-matching candidates for r(y)
proc r[T](a: SomeNumber; b: T; c: auto)
first type mismatch at position: 1
required type for a: SomeNumber
but expression 'y' is of type: MatchingType
proc r(i: string): int
first type mismatch at position: 1
required type for i: string
but expression 'y' is of type: MatchingType
texplain.nim(178, 2) Error: type mismatch: got <MatchingType>
but expected one of:
proc f(o: NestedConcept)
first type mismatch at position: 1
required type for o: NestedConcept
but expression 'y' is of type: MatchingType
texplain.nim(128, 6) RegularConcept: undeclared field: 'foo'
texplain.nim(128, 6) RegularConcept: undeclared field: '.'
texplain.nim(128, 6) RegularConcept: expression '.' cannot be called
texplain.nim(128, 5) RegularConcept: concept predicate failed
texplain.nim(129, 6) RegularConcept: undeclared field: 'bar'
texplain.nim(129, 6) RegularConcept: undeclared field: '.'
texplain.nim(129, 6) RegularConcept: expression '.' cannot be called
texplain.nim(128, 5) RegularConcept: concept predicate failed
texplain.nim(132, 5) NestedConcept: concept predicate failed
expression: f(y)'''
errormsg: "type mismatch: got <MatchingType>"
line: 178
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 120 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)
|