summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/cgen.nim1
-rw-r--r--compiler/semexprs.nim6
-rw-r--r--compiler/semstmts.nim13
-rw-r--r--lib/pure/httpclient.nim2
4 files changed, 19 insertions, 3 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index cb796e456..f09252b48 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -600,6 +600,7 @@ proc loadDynamicLib(m: BModule, lib: PLib) =
             [loadlib, getStrLit(m, lib.path.strVal)]) 
     else:
       var p = newProc(nil, m)
+      p.options = p.options - {optStackTrace, optEndb}
       var dest: TLoc
       initLocExpr(p, lib.path, dest)
       app(m.s[cfsVars], p.s(cpsLocals))
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index cba4ed081..71e44aa43 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1146,6 +1146,12 @@ proc semProcBody(c: PContext, n: PNode): PNode =
       # discard it. This is bad for chaining but nicer for C wrappers. 
       # ambiguous :-(
       result.typ = nil
+    elif result.kind == nkStmtListExpr and result.typ.kind == tyNil:
+      # to keep backwards compatibility bodies like:
+      #   nil
+      #   # comment
+      # are not expressions:
+      fixNilType(result)
     else:
       var a = newNodeI(nkAsgn, n.info, 2)
       a.sons[0] = newSymNode(c.p.resultSym)
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 2811c107a..4146b69a1 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -103,7 +103,16 @@ proc semExprBranchScope(c: PContext, n: PNode): PNode =
   result = semExprBranch(c, n)
   closeScope(c.tab)
 
+proc meaningfulStmt(n: PNode): PNode =
+  assert n.kind == nkStmtListExpr
+  var last = n.len-1
+  while last > 0 and n.sons[last].kind in {nkPragma, nkCommentStmt, nkEmpty}:
+    dec last
+  result = n.sons[last]
+
 proc ImplicitlyDiscardable(n: PNode): bool =
+  var n = n
+  while n.kind == nkStmtListExpr: n = meaningfulStmt(n)
   result = isCallExpr(n) and n.sons[0].kind == nkSym and 
            sfDiscardable in n.sons[0].sym.flags
 
@@ -115,6 +124,8 @@ proc fixNilType(n: PNode) =
     for it in n: fixNilType(it)
   n.typ = nil
 
+var EnforceVoidContext = PType(kind: tyStmt)
+
 proc discardCheck(result: PNode) =
   if result.typ != nil and result.typ.kind notin {tyStmt, tyEmpty}:
     if result.kind == nkNilLit:
@@ -1060,8 +1071,6 @@ proc semStaticStmt(c: PContext, n: PNode): PNode =
     result = newNodeI(nkDiscardStmt, n.info, 1)
     result.sons[0] = emptyNode
 
-var EnforceVoidContext = PType(kind: tyStmt)
-
 proc semStmtList(c: PContext, n: PNode): PNode =
   # these must be last statements in a block:
   const
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim
index ab6cb04a9..15cc6abb8 100644
--- a/lib/pure/httpclient.nim
+++ b/lib/pure/httpclient.nim
@@ -264,10 +264,10 @@ proc request*(url: string, httpMethod = httpGET, extraHeaders = "",
   if r.scheme == "https":
     when defined(ssl):
       sslContext.wrapSocket(s)
+      port = TPort(443)
     else:
       raise newException(EHttpRequestErr,
                 "SSL support is not available. Cannot connect over SSL.")
-    port = TPort(443)
   if r.port != "":
     port = TPort(r.port.parseInt)