diff options
-rw-r--r-- | compiler/ccgtypes.nim | 5 | ||||
-rw-r--r-- | lib/nimbase.h | 8 |
2 files changed, 12 insertions, 1 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index bd2e2cdda..0327d9b82 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -701,7 +701,10 @@ proc getTypeDescAux(m: BModule, typ: PType, check: var IntSet): Rope = idTablePut(m.typeCache, t, result) # always call for sideeffects: let recdesc = if t.kind != tyTuple: getRecordDesc(m, t, result, check) else: getTupleDesc(m, t, result, check) - if not isImportedType(t): add(m.s[cfsTypes], recdesc) + if not isImportedType(t): + add(m.s[cfsTypes], recdesc) + elif tfIncompleteStruct notin t.flags: + addf(m.s[cfsTypeInfo], "NIM_CHECK_SIZE($1, $2);$n", [result, rope(getSize(t))]) of tySet: result = getTypeName(t.lastSon) & "Set" idTablePut(m.typeCache, t, result) diff --git a/lib/nimbase.h b/lib/nimbase.h index 52de60969..a75016ed7 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -459,3 +459,11 @@ typedef int Nim_and_C_compiler_disagree_on_target_architecture[sizeof(NI) == siz #elif defined(__FreeBSD__) # include <sys/types.h> #endif + +/* Compile with -t:-DNIM_CHECK_ABI to enable */ +#ifdef NIM_CHECK_ABI +# define NIM_CHECK_SIZE(typ, sz) \ + _Static_assert(sizeof(typ) == sz, "Nim & C disagree on type size") +#else +# define NIM_CHECK_SIZE(typ, sz) +#endif |