From d91d338d0391ed028ddb30748b873767501928a2 Mon Sep 17 00:00:00 2001 From: Araq Date: Sat, 25 Feb 2017 23:58:47 +0100 Subject: [PATCH] fixes #5432 --- compiler/cgmeth.nim | 3 ++- tests/method/tgeneric_methods2.nim | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/method/tgeneric_methods2.nim diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim index 1d7f5a6e10..d05e395b97 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 0000000000..6e761dc480 --- /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]