summary refs log tree commit diff stats
path: root/compiler/sempass2.nim
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/sempass2.nim')
-rw-r--r--compiler/sempass2.nim7
1 files changed, 5 insertions, 2 deletions
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim
index e9a1160e5..bd156dc72 100644
--- a/compiler/sempass2.nim
+++ b/compiler/sempass2.nim
@@ -582,7 +582,10 @@ proc trackOperand(tracked: PEffects, n: PNode, paramType: PType) =
     if n.kind == nkSym and isLocalVar(tracked, n.sym):
       makeVolatile(tracked, n.sym)
   if paramType != nil and paramType.kind == tyProc and tfGcSafe in paramType.flags:
-    if tfGcSafe notin a.typ.flags and not tracked.inEnforcedGcSafe:
+    let argtype = skipTypes(a.typ, abstractInst)
+    # XXX figure out why this can be a non tyProc here. See httpclient.nim for an
+    # example that triggers it.
+    if argtype.kind == tyProc and notGcSafe(argtype) and not tracked.inEnforcedGcSafe:
       localError(n.info, $n & " is not GC safe")
   notNilCheck(tracked, n, paramType)
 
@@ -736,7 +739,7 @@ proc track(tracked: PEffects, n: PNode) =
           if not (a.kind == nkSym and a.sym == tracked.owner):
             markSideEffect(tracked, a)
     if a.kind != nkSym or a.sym.magic != mNBindSym:
-      for i in 1 .. <len(n): trackOperand(tracked, n.sons[i], paramType(op, i))
+      for i in 1 ..< len(n): trackOperand(tracked, n.sons[i], paramType(op, i))
     if a.kind == nkSym and a.sym.magic in {mNew, mNewFinalize, mNewSeq}:
       # may not look like an assignment, but it is:
       let arg = n.sons[1]