diff options
author | Araq <rumpf_a@web.de> | 2017-02-25 23:58:47 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2017-02-26 00:32:07 +0100 |
commit | d91d338d0391ed028ddb30748b873767501928a2 (patch) | |
tree | 036aed109e3cbb7126ec925e88932bc8e3249864 | |
parent | 5774145f5d6b15b831d90e0daa10806d988da799 (diff) | |
download | Nim-d91d338d0391ed028ddb30748b873767501928a2.tar.gz |
fixes #5432
-rw-r--r-- | compiler/cgmeth.nim | 3 | ||||
-rw-r--r-- | tests/method/tgeneric_methods2.nim | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim index 1d7f5a6e1..d05e395b9 100644 --- a/compiler/cgmeth.nim +++ b/compiler/cgmeth.nim @@ -169,7 +169,8 @@ proc methodDef*(g: ModuleGraph; s: PSym, fromCache: bool) = fixupDispatcher(s, disp) #echo "fixup ", disp.name.s, " ", disp.id when useEffectSystem: checkMethodEffects(disp, s) - if sfBase in s.flags and g.methods[i].methods[0] != s: + if {sfBase, sfFromGeneric} * s.flags == {sfBase} and + g.methods[i].methods[0] != s: # already exists due to forwarding definition? localError(s.info, "method is not a base") return diff --git a/tests/method/tgeneric_methods2.nim b/tests/method/tgeneric_methods2.nim new file mode 100644 index 000000000..6e761dc48 --- /dev/null +++ b/tests/method/tgeneric_methods2.nim @@ -0,0 +1,15 @@ +#5432 +type + Iterator[T] = ref object of RootObj + +# base methods with `T` in the return type are okay +method methodThatWorks*[T](i: Iterator[T]): T {.base.} = + discard + +# base methods without `T` (void or basic types) fail +method methodThatFails*[T](i: Iterator[T]) {.base.} = + discard + +type + SpecificIterator1 = ref object of Iterator[string] + SpecificIterator2 = ref object of Iterator[int] |