ast2 proc pragmas, fix typedef struct X importc, convention selection, ast2 bitfield support

This commit is contained in:
Ganesh Viswanathan 2020-04-01 21:47:15 -05:00
commit ad8557d70e
8 changed files with 183 additions and 77 deletions

View file

@ -1,3 +1,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#define A 1
#define B 1.0
#define C 0x10
@ -26,7 +30,7 @@ struct A4 {
typedef char *A9p[3]; //, A9[4];
typedef char *A10[3][6];
typedef char *(*A11)[3];
typedef struct A1 *A111[12];
typedef struct A0 *A111[12];
typedef int **(*A12)(int, int b, int *c, int *, int *count[4], int (*func)(int, int));
typedef int A13(int, int, void (*func)(void));
@ -212,4 +216,8 @@ typedef enum VSPresetFormat {
//struct A2 test_proc1(struct A0 a);
#endif
#ifdef __cplusplus
}
#endif

View file

@ -11,7 +11,7 @@ const
when defined(HEADER):
cDefine("HEADER")
const
flags = " -H -d"
flags = " -H"
pHeader = @["header:" & path.replace("\\", "/")]
pHeaderImp = @["importc"] & pHeader
else:
@ -183,21 +183,15 @@ a11 = addr a9p
assert A111 is array[12, ptr A1]
checkPragmas(A111, pHeaderImp)
var a111: A111
a111[11] = addr a1
a111[11] = addr a0
assert A12 is proc(a1: cint, b: cint, c: ptr cint, a4: ptr cint, count: array[4, ptr cint], `func`: proc(a1: cint, a2: cint): cint): ptr ptr cint
checkPragmas(A12, pHeaderImp)
when not defined(HEADER):
# Unclear why this fails
# request for member ‘ClE_0’ in something not a structure or union
var a12: A12
assert A12 is proc(a1: cint, b: cint, c: ptr cint, a4: ptr cint, count: array[4, ptr cint], `func`: proc(a1: cint, a2: cint): cint {.cdecl.}): ptr ptr cint {.cdecl.}
checkPragmas(A12, pHeaderImp & "cdecl")
var a12: A12
assert A13 is proc(a1: cint, a2: cint, `func`: proc()): cint
checkPragmas(A13, pHeaderImp)
when not defined(HEADER):
# Unclear why this fails
# request for member ‘ClE_0’ in something not a structure or union
var a13: A13
assert A13 is proc(a1: cint, a2: cint, `func`: proc() {.cdecl.}): cint {.cdecl.}
checkPragmas(A13, pHeaderImp & "cdecl")
var a13: A13
assert A14 is object
testFields(A14, "a1:cchar")
@ -216,20 +210,16 @@ a15.a2[0] = addr a15i
assert A16 is object
testFields(A16, "f1:cchar")
checkPragmas(A16, pHeaderImpBy)
when not defined(HEADER):
# Similar to A2
var a16: A16
a16.f1 = 's'
checkPragmas(A16, pHeaderBy, istype = false)
var a16: A16
a16.f1 = 's'
assert A17 is object
testFields(A17, "a1|a2:cstring|array[1, ptr cint]")
checkPragmas(A17, pHeaderImpBy)
when not defined(HEADER):
# Similar to A2
var a17: A17
a17.a1 = "hello".cstring
a17.a2[0] = addr a15i
checkPragmas(A17, pHeaderBy, istype = false)
var a17: A17
a17.a1 = "hello".cstring
a17.a2[0] = addr a15i
assert A18 is A17
checkPragmas(A18, pHeaderImp)
@ -254,7 +244,7 @@ a19p = addr a19
assert A20 is object
testFields(A20, "a1:cchar")
checkPragmas(A20, pHeaderImpBy)
checkPragmas(A20, pHeaderBy, istype = false)
var a20: A20
a20.a1 = 'a'
@ -270,7 +260,7 @@ a21p = addr a20
assert A22 is object
testFields(A22, "f1|f2:ptr ptr cint|array[123 + 132, ptr cint]")
checkPragmas(A22, pHeaderImpBy)
checkPragmas(A22, pHeaderBy, istype = false)
var a22: A22
a22.f1 = addr a15.a2[0]
@ -282,7 +272,7 @@ u1.f1 = 5
assert U2 is object
assert sizeof(U2) == 256 * sizeof(cint)
checkPragmas(U2, pHeaderImpBy & @["union"])
checkPragmas(U2, pHeaderBy & @["union"], istype = false)
var u2: U2
u2.f1 = addr a15.a2[0]

View file

@ -41,7 +41,17 @@ cOverride:
proc weirdfunc(apple: ptr ptr ptr cchar): int {.importc.}
proc weirdfunc2(mango: ptr ptr cchar): int {.importc.}
cImport(cSearchPath("test.h"))
# includeHeader
const header =
when defined(HEADER): " -H"
else: ""
# Test AST2
const mode =
when defined(AST2): " -f:ast2"
else: ""
cImport(cSearchPath("test.h"), flags = header & mode)
check TEST_INT == 512
check TEST_FLOAT == 5.12
@ -65,7 +75,7 @@ var
ct: CUSTTYPE
cct: CCUSTTYPE
s0: STRUCT0
s0: ptr STRUCT0
s1: STRUCT1
s2: STRUCT2
s3: STRUCT3