summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/cgmeth.nim3
-rw-r--r--tests/method/tgeneric_methods2.nim15
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]