summary refs log tree commit diff stats
path: root/tests/effects/tstrictfuncs_misc.nim
blob: 8c573bb3a62771908004015b7f467cf7be69f44d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
discard """
  action: compile
"""

{.experimental: "strictFuncs".}

func sortedFake1[T](a: openArray[T]): seq[T] =
  for i in 0 .. a.high: result.add a[i]
func sortedFake2[T](a: openArray[T]): seq[T] =
  result = newSeq[T](a.len)
  for i in 0 .. a.high: result[i] = a[i]
type Foo1 = object
type Foo2 = ref object
block:
  let a1 = sortedFake1([Foo1()]) # ok
  let a2 = sortedFake1([Foo2()]) # ok
block:
  let a1 = sortedFake2([Foo1()]) # ok
  let a2 = sortedFake2([Foo2()]) # error: Error: 'sortedFake2' can have side effects


import std/sequtils
type Foob = ref object
  x: int
let a1 = zip(@[1,2], @[1,2]) # ok
let a2 = zip(@[Foob(x: 1)], @[Foob(x: 2)]) # error in 1.6.0 RC2, but not 1.4.x


# bug #20863
type
  Fooc = ref object

func twice(foo: Fooc) =
  var a = newSeq[Fooc](2)
  a[0] = foo # No error.
  a[1] = foo # Error: 'twice' can have side effects.

let foo = Fooc()
twice(foo)

# bug #17387
import json

func parseColumn(columnNode: JsonNode) =
  let columnName = columnNode["name"].str

parseColumn(%*{"a": "b"})

type
  MyTable = object
    data: seq[int]

  JsonNode3 = ref object
    fields: MyTable

proc `[]`(t: MyTable, key: string): int =
  result = t.data[0]

proc `[]`(x: JsonNode3, key: string): int =
  result = x.fields[key]

func parseColumn(columnNode: JsonNode3) =
  var columnName = columnNode["test"]

parseColumn(JsonNode3())