From 5fd9bf9cd52a19b0ddd59452d9ebde0715d7d890 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sun, 10 Feb 2019 22:07:51 +0100 Subject: [PATCH] Propagate tfGcSafe flag to generic instantiations (#10620) Fixes a nasty endless loop in the generic instantiation phase. --- compiler/semtypinst.nim | 5 ++--- tests/generics/tgenerics_various.nim | 11 +++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim index ebe822cdfca33..ceabd8e60dee7 100644 --- a/compiler/semtypinst.nim +++ b/compiler/semtypinst.nim @@ -300,7 +300,6 @@ proc instCopyType*(cl: var TReplTypeVars, t: PType): PType = proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType = # tyGenericInvocation[A, tyGenericInvocation[A, B]] # is difficult to handle: - const eqFlags = eqTypeFlags + {tfGcSafe} var body = t.sons[0] if body.kind != tyGenericBody: internalError(cl.c.config, cl.info, "no generic body") @@ -311,7 +310,7 @@ proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType = else: result = searchInstTypes(t) - if result != nil and eqFlags*result.flags == eqFlags*t.flags: + if result != nil and sameFlags(result, t): when defined(reportCacheHits): echo "Generic instantiation cached ", typeToString(result), " for ", typeToString(t) return @@ -329,7 +328,7 @@ proc handleGenericInvocation(cl: var TReplTypeVars, t: PType): PType = if header != t: # search again after first pass: result = searchInstTypes(header) - if result != nil and eqFlags*result.flags == eqFlags*t.flags: + if result != nil and sameFlags(result, t): when defined(reportCacheHits): echo "Generic instantiation cached ", typeToString(result), " for ", typeToString(t), " header ", typeToString(header) diff --git a/tests/generics/tgenerics_various.nim b/tests/generics/tgenerics_various.nim index 9e61865340f8f..656bfa566e8ac 100644 --- a/tests/generics/tgenerics_various.nim +++ b/tests/generics/tgenerics_various.nim @@ -242,3 +242,14 @@ block tvarargs_vs_generics: withDirectType "string" withOpenArray "string" withVarargs "string" + +block: + type + Que[T] {.gcsafe.} = object + x: T + + proc `=`[T](q: var Que[T]; x: Que[T]) = + discard + + var x: Que[int] + doAssert(x.x == 0)