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
|
discard """
output: '''
Deallocating OwnedString
HelloWorld
'''
matrix: "--cursorinference:on; --cursorinference:off"
target: "c"
"""
# bug #23837
{.
emit: [
"""
#include <stdlib.h>
#include <string.h>
char *allocCString() {
char *result = (char *) malloc(10 + 1);
strcpy(result, "HelloWorld");
return result;
}
"""
]
.}
proc rawWrapper(): cstring {.importc: "allocCString", cdecl.}
proc free(p: pointer) {.importc: "free", cdecl.}
# -------------------------
type OwnedString = distinct cstring
proc `=destroy`(s: OwnedString) =
free(cstring s)
echo "Deallocating OwnedString"
func `$`(s: OwnedString): string {.borrow.}
proc leakyWrapper(): string =
let ostring = rawWrapper().OwnedString
$ostring
# -------------------------
proc main() =
# destructor not called - definitely lost: 11 bytes in 1 blocks
# doesn't leak with --cursorInference:off
let s = leakyWrapper()
echo s
main()
|