mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
107 lines
2.5 KiB
Nim
107 lines
2.5 KiB
Nim
discard """
|
|
output: '''true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true
|
|
true'''
|
|
"""
|
|
|
|
# Test not mangled:
|
|
block:
|
|
type T = object
|
|
a: int
|
|
b: cstring
|
|
proc test(): bool =
|
|
let obj = T(a: 11, b: "foo")
|
|
{. emit: [result, " = (", obj, ".a == 11);"] .}
|
|
{. emit: [result, " = ", result, " && (", obj, ".b == \"foo\");"] .}
|
|
echo test()
|
|
|
|
# Test indirect (fields in genAddr):
|
|
block:
|
|
type T = object
|
|
a: int
|
|
b: cstring
|
|
var global = T(a: 11, b: "foo")
|
|
proc test(): bool =
|
|
var obj = T(a: 11, b: "foo")
|
|
{. emit: [result, " = (", obj.addr[], ".a == 11);"] .}
|
|
{. emit: [result, " = ", result, " && (", obj.addr[], ".b == \"foo\");"] .}
|
|
{. emit: [result, " = ", result, " && (", global, ".a == 11);"] .}
|
|
{. emit: [result, " = ", result, " && (", global, ".b == \"foo\");"] .}
|
|
echo test()
|
|
|
|
# Test addr of field:
|
|
block:
|
|
type T = object
|
|
a: int
|
|
b: cstring
|
|
proc test(): bool =
|
|
var obj = T(a: 11, b: "foo")
|
|
result = obj.a.addr[] == 11
|
|
result = result and obj.b.addr[] == "foo".cstring
|
|
echo test()
|
|
|
|
# Test reserved words:
|
|
block:
|
|
type T = ref object
|
|
`if`: int
|
|
`for`: int
|
|
`==`: cstring
|
|
`&&`: cstring
|
|
proc test(): bool =
|
|
var
|
|
obj1 = T(`if`: 11, `for`: 22, `==`: "foo", `&&`: "bar")
|
|
obj2: T
|
|
new obj2 # Test behaviour for createRecordVarAux.
|
|
result = obj1.`if` == 11
|
|
result = result and obj1.addr[].`for` == 22
|
|
result = result and obj1.`==` == "foo".cstring
|
|
result = result and obj1.`&&`.addr[] == "bar".cstring
|
|
result = result and obj2.`if` == 0
|
|
result = result and obj2.`for` == 0
|
|
result = result and obj2.`==`.isNil
|
|
result = result and obj2.`&&`.isNil
|
|
echo test()
|
|
|
|
# Test codegen for fields with uppercase letters:
|
|
block:
|
|
type MyObj = object
|
|
mField: int
|
|
proc test(): bool =
|
|
var a: MyObj
|
|
var b = a
|
|
result = b.mField == 0
|
|
echo test()
|
|
|
|
# Test tuples
|
|
block:
|
|
type T = tuple
|
|
a: int
|
|
b: int
|
|
proc test(): bool =
|
|
var a: T = (a: 1, b: 1)
|
|
result = a.a == 1
|
|
result = result and a.b == 1
|
|
echo test()
|
|
|
|
# Test importc / exportc fields:
|
|
block:
|
|
type T = object
|
|
a: int
|
|
b {. importc: "notB" .}: cstring
|
|
type U = object
|
|
a: int
|
|
b {. exportc: "notB" .}: cstring
|
|
proc test(): bool =
|
|
var
|
|
obj1 = T(a: 11, b: "foo")
|
|
obj2 = U(a: 11, b: "foo")
|
|
{. emit: [result, " = (", obj1, ".a == 11);"] .}
|
|
{. emit: [result, " = ", result, " && (", obj1, ".notB == \"foo\");"] .}
|
|
{. emit: [result, " = (", obj2, ".a == 11);"] .}
|
|
{. emit: [result, " = ", result, " && (", obj2, ".notB == \"foo\");"] .}
|
|
echo test()
|