nim-lang / Nim

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
https://nim-lang.org
Other
16.49k stars 1.46k forks source link

`offsetof(T, anFieldOfUncheckedArray)` returned the wrong value #22553

Closed haoyu234 closed 1 month ago

haoyu234 commented 1 year ago

Description

Here is my code example:

type
  ChunkObj = object
    data: UncheckedArray[byte]

proc main() =
  let n = offsetOf(ChunkObj, data)
  echo n
  assert n != 0                          # By looking at the generated C code, it should be 1 or something else

This is the C code generated by the NIM compiler:

struct tyObject_ChunkObj__mOTFrUaGXmv4xFi10w76AA {
    char dummy;                                      // offset 0
    NU8 data[SEQ_DECL_SIZE];                // offset 1
};

From the above c code, you can see that the offset of the 'data' field should not be 0.

Nim Version

Nim Compiler Version 2.1.1 [Linux: amd64] Compiled at 2023-08-23 Copyright (c) 2006-2023 by Andreas Rumpf

git hash: 6b04d0395ab1d6d8efa7d287c73da2c7230800c9 active boot switches: -d:release

Current Output

output '0' and assertion exception.

0
/root/repos/spaces/src/spaces.nim(33) spaces
/root/repos/spaces/src/spaces.nim(13) main
/root/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim(41) failedAssertImpl
/root/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim(36) raiseAssert
/root/.choosenim/toolchains/nim-#devel/lib/system/fatal.nim(53) sysFatal
Error: unhandled exception: /root/repos/spaces/src/spaces.nim(13, 3) `n != 0`  [AssertionDefect]

Expected Output

1

Possible Solution

No response

Additional Information

I also ran into another issue, which I'll explain in a new issue.

juancarlospaco commented 1 year ago

!nim c

type O = object
  data: UncheckedArray[byte]
proc f() =
  let n = offsetOf(O, data)
  doAssert n != 0, $n
f()
github-actions[bot] commented 1 year ago

@juancarlospaco (collaborator)

devel :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim temp
/home/runner/work/Nim/Nim/temp.nim f
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim failedAssertImpl
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim raiseAssert
/home/runner/.choosenim/toolchains/nim-#devel/lib/system/fatal.nim sysFatal
Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` 0 [AssertionDefect]
Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp'

Stats

  • Started 2023-08-25T12:21:27
  • Finished 2023-08-25T12:21:28
  • Duration 1 minutes

IR

Compiled filesize 93.84 Kb (96,096 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix #define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); #define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename;NI len;VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); #define nimln_(n) \ FR_.line = n; #define nimlf_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__gTP9bZO3wWkO7fb3G7iYykA tyObject_O__gTP9bZO3wWkO7fb3G7iYykA; typedef struct NimStrPayload NimStrPayload; typedef struct NimStringV2 NimStringV2; struct NimStrPayload { NI cap; NIM_CHAR data[SEQ_DECL_SIZE]; }; struct NimStringV2 { NI len; NimStrPayload* p; }; N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__stdZassertions_u310)(NimStringV2 msg_p0); static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1); static N_INLINE(void, copyMem__system_u1741)(void* dest_p0, void* source_p1, NI size_p2); static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2); N_LIB_PRIVATE N_NOINLINE(void, raiseOverflow)(void); N_LIB_PRIVATE N_NOINLINE(void, raiseRangeErrorI)(NI64 i_p0, NI64 a_p1, NI64 b_p2); N_LIB_PRIVATE N_NIMCALL(NimStringV2, dollar___systemZdollars_u8)(NI x_p0); N_LIB_PRIVATE N_NIMCALL(NimStringV2, rawNewString)(NI space_p0); N_LIB_PRIVATE N_NOCONV(void, deallocShared)(void* p_p0); static N_INLINE(NIM_BOOL*, nimErrorFlag)(void); static N_INLINE(void, nimFrame)(TFrame* s_p0); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__system_u4559)(void); static N_INLINE(void, popFrame)(void); N_LIB_PRIVATE N_NIMCALL(void, nimTestErrorFlag)(void); N_LIB_PRIVATE N_NIMCALL(void, atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminusathdevelatslibatssystemdotnim_Init000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); static const struct { NI cap; NIM_CHAR data[50+1]; } TM__SRd76hP9cMfCzdUO857UhQQ_2 = { 50 | NIM_STRLIT_FLAG, "/home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` " }; static const NimStringV2 TM__SRd76hP9cMfCzdUO857UhQQ_3 = {50, (NimStrPayload*)&TM__SRd76hP9cMfCzdUO857UhQQ_2}; extern NIM_THREADVAR NIM_BOOL nimInErrorMode__system_u4343; extern NIM_THREADVAR TFrame* framePtr__system_u3967; static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest_p0, source_p1, ((size_t) (size_p2))); } static N_INLINE(void, copyMem__system_u1741)(void* dest_p0, void* source_p1, NI size_p2) { nimCopyMem(dest_p0, source_p1, size_p2); } static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1) { { { NI TM__SRd76hP9cMfCzdUO857UhQQ_4; NI TM__SRd76hP9cMfCzdUO857UhQQ_5; if (!(((NI)0) < src_p1.len)) goto LA3_; if (nimAddInt(src_p1.len, ((NI)1), &TM__SRd76hP9cMfCzdUO857UhQQ_4)) { raiseOverflow(); goto BeforeRet_; }; if (((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) < ((NI)0) || ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) > ((NI)IL64(9223372036854775807))){ raiseRangeErrorI((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4), ((NI)0), ((NI)IL64(9223372036854775807))); goto BeforeRet_; } copyMem__system_u1741(((void*) ((&(*(*dest_p0).p).data[(*dest_p0).len]))), ((void*) ((&(*src_p1.p).data[((NI)0)]))), ((NI) ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)))); if (nimAddInt((*dest_p0).len, src_p1.len, &TM__SRd76hP9cMfCzdUO857UhQQ_5)) { raiseOverflow(); goto BeforeRet_; }; (*dest_p0).len = (NI)(TM__SRd76hP9cMfCzdUO857UhQQ_5); } LA3_: ; }BeforeRet_: ; } static N_INLINE(NIM_BOOL*, nimErrorFlag)(void) { NIM_BOOL* result; result = (NIM_BOOL*)0; result = (&nimInErrorMode__system_u4343); return result; } static N_INLINE(void, nimFrame)(TFrame* s_p0) { { if (!(framePtr__system_u3967 == ((TFrame*) NIM_NIL))) goto LA3_; (*s_p0).calldepth = ((NI16)0); } goto LA1_; LA3_: ; { (*s_p0).calldepth = (NI16)((*framePtr__system_u3967).calldepth + ((NI16)1)); } LA1_: ; (*s_p0).prev = framePtr__system_u3967; framePtr__system_u3967 = s_p0; { if (!((*s_p0).calldepth == ((NI16)2000))) goto LA8_; callDepthLimitReached__system_u4559(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr__system_u3967 = (*framePtr__system_u3967).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void) { NI n; tyObject_O__gTP9bZO3wWkO7fb3G7iYykA* tmpX60gensym0_; NIM_BOOL* nimErr_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); {nimErr_ = nimErrorFlag(); n = ((NI)0); { NimStringV2 colontmpD_; NimStringV2 colontmpD__2; NimStringV2 T5_; if (!!(!((n == ((NI)0))))) goto LA3_; colontmpD_.len = 0; colontmpD_.p = NIM_NIL; colontmpD__2.len = 0; colontmpD__2.p = NIM_NIL; T5_.len = 0; T5_.p = NIM_NIL; colontmpD_ = dollar___systemZdollars_u8(n); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; T5_ = rawNewString(colontmpD_.len + 50); appendString((&T5_), TM__SRd76hP9cMfCzdUO857UhQQ_3); appendString((&T5_), colontmpD_); colontmpD__2 = T5_; failedAssertImpl__stdZassertions_u310(colontmpD__2); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; if (colontmpD__2.p && !(colontmpD__2.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD__2.p); } if (colontmpD_.p && !(colontmpD_.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD_.p); } } LA3_: ; }BeforeRet_: ; popFrame(); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { #if 0 void (*volatile inner)(void); inner = PreMainInner; atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminusathdevelatslibatssystemdotnim_Init000(); (*inner)(); #else atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminusathdevelatslibatssystemdotnim_Init000(); PreMainInner(); #endif } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { #if 0 void (*volatile inner)(void); PreMain(); inner = NimMainInner; (*inner)(); #else PreMain(); NimMainInner(); #endif } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { NIM_BOOL* nimErr_; nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); nimErr_ = nimErrorFlag(); f__temp_u3(); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; BeforeRet_: ; nimTestErrorFlag(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
stable :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-2.0.0/lib/std/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-2.0.0/lib/std/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-2.0.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` 0 [AssertionDefect] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp' ```

Stats

  • Started 2023-08-25T12:21:29
  • Finished 2023-08-25T12:21:30
  • Duration

IR

Compiled filesize 91.68 Kb (93,880 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix #define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); #define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename;NI len;VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); #define nimln_(n) \ FR_.line = n; #define nimlf_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__gTP9bZO3wWkO7fb3G7iYykA tyObject_O__gTP9bZO3wWkO7fb3G7iYykA; typedef struct NimStrPayload NimStrPayload; typedef struct NimStringV2 NimStringV2; struct NimStrPayload { NI cap; NIM_CHAR data[SEQ_DECL_SIZE]; }; struct NimStringV2 { NI len; NimStrPayload* p; }; N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__stdZassertions_u310)(NimStringV2 msg_p0); static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1); static N_INLINE(void, copyMem__system_u1745)(void* dest_p0, void* source_p1, NI size_p2); static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2); N_LIB_PRIVATE N_NOINLINE(void, raiseOverflow)(void); N_LIB_PRIVATE N_NOINLINE(void, raiseRangeErrorI)(NI64 i_p0, NI64 a_p1, NI64 b_p2); N_LIB_PRIVATE N_NIMCALL(NimStringV2, dollar___systemZdollars_u8)(NI x_p0); N_LIB_PRIVATE N_NIMCALL(NimStringV2, rawNewString)(NI space_p0); N_LIB_PRIVATE N_NOCONV(void, deallocShared)(void* p_p0); static N_INLINE(NIM_BOOL*, nimErrorFlag)(void); static N_INLINE(void, nimFrame)(TFrame* s_p0); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__system_u4607)(void); static N_INLINE(void, popFrame)(void); N_LIB_PRIVATE N_NIMCALL(void, nimTestErrorFlag)(void); N_LIB_PRIVATE N_NIMCALL(void, atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); static const struct { NI cap; NIM_CHAR data[50+1]; } TM__SRd76hP9cMfCzdUO857UhQQ_2 = { 50 | NIM_STRLIT_FLAG, "/home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` " }; static const NimStringV2 TM__SRd76hP9cMfCzdUO857UhQQ_3 = {50, (NimStrPayload*)&TM__SRd76hP9cMfCzdUO857UhQQ_2}; extern NIM_THREADVAR NIM_BOOL nimInErrorMode__system_u4389; extern NIM_THREADVAR TFrame* framePtr__system_u4006; static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest_p0, source_p1, ((size_t) (size_p2))); } static N_INLINE(void, copyMem__system_u1745)(void* dest_p0, void* source_p1, NI size_p2) { nimCopyMem(dest_p0, source_p1, size_p2); } static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1) { { { NI TM__SRd76hP9cMfCzdUO857UhQQ_4; NI TM__SRd76hP9cMfCzdUO857UhQQ_5; if (!(((NI)0) < src_p1.len)) goto LA3_; if (nimAddInt(src_p1.len, ((NI)1), &TM__SRd76hP9cMfCzdUO857UhQQ_4)) { raiseOverflow(); goto BeforeRet_; }; if (((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) < ((NI)0) || ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) > ((NI)IL64(9223372036854775807))){ raiseRangeErrorI((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4), ((NI)0), ((NI)IL64(9223372036854775807))); goto BeforeRet_; } copyMem__system_u1745(((void*) ((&(*(*dest_p0).p).data[(*dest_p0).len]))), ((void*) ((&(*src_p1.p).data[((NI)0)]))), ((NI) ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)))); if (nimAddInt((*dest_p0).len, src_p1.len, &TM__SRd76hP9cMfCzdUO857UhQQ_5)) { raiseOverflow(); goto BeforeRet_; }; (*dest_p0).len = (NI)(TM__SRd76hP9cMfCzdUO857UhQQ_5); } LA3_: ; }BeforeRet_: ; } static N_INLINE(NIM_BOOL*, nimErrorFlag)(void) { NIM_BOOL* result; result = (NIM_BOOL*)0; result = (&nimInErrorMode__system_u4389); return result; } static N_INLINE(void, nimFrame)(TFrame* s_p0) { { if (!(framePtr__system_u4006 == ((TFrame*) NIM_NIL))) goto LA3_; (*s_p0).calldepth = ((NI16)0); } goto LA1_; LA3_: ; { (*s_p0).calldepth = (NI16)((*framePtr__system_u4006).calldepth + ((NI16)1)); } LA1_: ; (*s_p0).prev = framePtr__system_u4006; framePtr__system_u4006 = s_p0; { if (!((*s_p0).calldepth == ((NI16)2000))) goto LA8_; callDepthLimitReached__system_u4607(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr__system_u4006 = (*framePtr__system_u4006).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void) { NI n; tyObject_O__gTP9bZO3wWkO7fb3G7iYykA* tmpX60gensym0_; NIM_BOOL* nimErr_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); {nimErr_ = nimErrorFlag(); n = ((NI)0); { NimStringV2 colontmpD_; NimStringV2 colontmpD__2; NimStringV2 T5_; if (!!(!((n == ((NI)0))))) goto LA3_; colontmpD_.len = 0; colontmpD_.p = NIM_NIL; colontmpD__2.len = 0; colontmpD__2.p = NIM_NIL; T5_.len = 0; T5_.p = NIM_NIL; colontmpD_ = dollar___systemZdollars_u8(n); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; T5_ = rawNewString(colontmpD_.len + 50); appendString((&T5_), TM__SRd76hP9cMfCzdUO857UhQQ_3); appendString((&T5_), colontmpD_); colontmpD__2 = T5_; failedAssertImpl__stdZassertions_u310(colontmpD__2); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; if (colontmpD__2.p && !(colontmpD__2.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD__2.p); } if (colontmpD_.p && !(colontmpD_.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD_.p); } } LA3_: ; }BeforeRet_: ; popFrame(); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { #if 0 void (*volatile inner)(void); inner = PreMainInner; atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000(); (*inner)(); #else atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000(); PreMainInner(); #endif } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { #if 0 void (*volatile inner)(void); PreMain(); inner = NimMainInner; (*inner)(); #else PreMain(); NimMainInner(); #endif } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { NIM_BOOL* nimErr_; nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); nimErr_ = nimErrorFlag(); f__temp_u3(); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; BeforeRet_: ; nimTestErrorFlag(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
2.0.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-2.0.0/lib/std/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-2.0.0/lib/std/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-2.0.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` 0 [AssertionDefect] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp' ```

Stats

  • Started 2023-08-25T12:21:30
  • Finished 2023-08-25T12:21:31
  • Duration

IR

Compiled filesize 91.68 Kb (93,880 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix #define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); #define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename;NI len;VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); #define nimln_(n) \ FR_.line = n; #define nimlf_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__gTP9bZO3wWkO7fb3G7iYykA tyObject_O__gTP9bZO3wWkO7fb3G7iYykA; typedef struct NimStrPayload NimStrPayload; typedef struct NimStringV2 NimStringV2; struct NimStrPayload { NI cap; NIM_CHAR data[SEQ_DECL_SIZE]; }; struct NimStringV2 { NI len; NimStrPayload* p; }; N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__stdZassertions_u310)(NimStringV2 msg_p0); static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1); static N_INLINE(void, copyMem__system_u1745)(void* dest_p0, void* source_p1, NI size_p2); static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2); N_LIB_PRIVATE N_NOINLINE(void, raiseOverflow)(void); N_LIB_PRIVATE N_NOINLINE(void, raiseRangeErrorI)(NI64 i_p0, NI64 a_p1, NI64 b_p2); N_LIB_PRIVATE N_NIMCALL(NimStringV2, dollar___systemZdollars_u8)(NI x_p0); N_LIB_PRIVATE N_NIMCALL(NimStringV2, rawNewString)(NI space_p0); N_LIB_PRIVATE N_NOCONV(void, deallocShared)(void* p_p0); static N_INLINE(NIM_BOOL*, nimErrorFlag)(void); static N_INLINE(void, nimFrame)(TFrame* s_p0); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__system_u4607)(void); static N_INLINE(void, popFrame)(void); N_LIB_PRIVATE N_NIMCALL(void, nimTestErrorFlag)(void); N_LIB_PRIVATE N_NIMCALL(void, atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); static const struct { NI cap; NIM_CHAR data[50+1]; } TM__SRd76hP9cMfCzdUO857UhQQ_2 = { 50 | NIM_STRLIT_FLAG, "/home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` " }; static const NimStringV2 TM__SRd76hP9cMfCzdUO857UhQQ_3 = {50, (NimStrPayload*)&TM__SRd76hP9cMfCzdUO857UhQQ_2}; extern NIM_THREADVAR NIM_BOOL nimInErrorMode__system_u4389; extern NIM_THREADVAR TFrame* framePtr__system_u4006; static N_INLINE(void, nimCopyMem)(void* dest_p0, void* source_p1, NI size_p2) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest_p0, source_p1, ((size_t) (size_p2))); } static N_INLINE(void, copyMem__system_u1745)(void* dest_p0, void* source_p1, NI size_p2) { nimCopyMem(dest_p0, source_p1, size_p2); } static N_INLINE(void, appendString)(NimStringV2* dest_p0, NimStringV2 src_p1) { { { NI TM__SRd76hP9cMfCzdUO857UhQQ_4; NI TM__SRd76hP9cMfCzdUO857UhQQ_5; if (!(((NI)0) < src_p1.len)) goto LA3_; if (nimAddInt(src_p1.len, ((NI)1), &TM__SRd76hP9cMfCzdUO857UhQQ_4)) { raiseOverflow(); goto BeforeRet_; }; if (((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) < ((NI)0) || ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)) > ((NI)IL64(9223372036854775807))){ raiseRangeErrorI((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4), ((NI)0), ((NI)IL64(9223372036854775807))); goto BeforeRet_; } copyMem__system_u1745(((void*) ((&(*(*dest_p0).p).data[(*dest_p0).len]))), ((void*) ((&(*src_p1.p).data[((NI)0)]))), ((NI) ((NI)(TM__SRd76hP9cMfCzdUO857UhQQ_4)))); if (nimAddInt((*dest_p0).len, src_p1.len, &TM__SRd76hP9cMfCzdUO857UhQQ_5)) { raiseOverflow(); goto BeforeRet_; }; (*dest_p0).len = (NI)(TM__SRd76hP9cMfCzdUO857UhQQ_5); } LA3_: ; }BeforeRet_: ; } static N_INLINE(NIM_BOOL*, nimErrorFlag)(void) { NIM_BOOL* result; result = (NIM_BOOL*)0; result = (&nimInErrorMode__system_u4389); return result; } static N_INLINE(void, nimFrame)(TFrame* s_p0) { { if (!(framePtr__system_u4006 == ((TFrame*) NIM_NIL))) goto LA3_; (*s_p0).calldepth = ((NI16)0); } goto LA1_; LA3_: ; { (*s_p0).calldepth = (NI16)((*framePtr__system_u4006).calldepth + ((NI16)1)); } LA1_: ; (*s_p0).prev = framePtr__system_u4006; framePtr__system_u4006 = s_p0; { if (!((*s_p0).calldepth == ((NI16)2000))) goto LA8_; callDepthLimitReached__system_u4607(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr__system_u4006 = (*framePtr__system_u4006).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__temp_u3)(void) { NI n; tyObject_O__gTP9bZO3wWkO7fb3G7iYykA* tmpX60gensym0_; NIM_BOOL* nimErr_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); {nimErr_ = nimErrorFlag(); n = ((NI)0); { NimStringV2 colontmpD_; NimStringV2 colontmpD__2; NimStringV2 T5_; if (!!(!((n == ((NI)0))))) goto LA3_; colontmpD_.len = 0; colontmpD_.p = NIM_NIL; colontmpD__2.len = 0; colontmpD__2.p = NIM_NIL; T5_.len = 0; T5_.p = NIM_NIL; colontmpD_ = dollar___systemZdollars_u8(n); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; T5_ = rawNewString(colontmpD_.len + 50); appendString((&T5_), TM__SRd76hP9cMfCzdUO857UhQQ_3); appendString((&T5_), colontmpD_); colontmpD__2 = T5_; failedAssertImpl__stdZassertions_u310(colontmpD__2); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; if (colontmpD__2.p && !(colontmpD__2.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD__2.p); } if (colontmpD_.p && !(colontmpD_.p->cap & NIM_STRLIT_FLAG)) { deallocShared(colontmpD_.p); } } LA3_: ; }BeforeRet_: ; popFrame(); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { #if 0 void (*volatile inner)(void); inner = PreMainInner; atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000(); (*inner)(); #else atmdotdotatsdotdotatsdotdotatsdotchoosenimatstoolchainsatsnimminus2dot0dot0atslibatssystemdotnim_Init000(); PreMainInner(); #endif } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { #if 0 void (*volatile inner)(void); PreMain(); inner = NimMainInner; (*inner)(); #else PreMain(); NimMainInner(); #endif } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { NIM_BOOL* nimErr_; nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); nimErr_ = nimErrorFlag(); f__temp_u3(); if (NIM_UNLIKELY(*nimErr_)) goto BeforeRet_; BeforeRet_: ; nimTestErrorFlag(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
1.6.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-1.6.0/lib/system/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-1.6.0/lib/system/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-1.6.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` 0 [AssertionDefect] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp ' ```

Stats

  • Started 2023-08-25T12:21:34
  • Finished 2023-08-25T12:21:35
  • Duration

IR

Compiled filesize 95.38 Kb (97,672 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix # define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); # define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); # define nimln_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g; typedef struct NimStringDesc NimStringDesc; typedef struct TGenericSeq TGenericSeq; struct TGenericSeq { NI len; NI reserved; }; struct NimStringDesc { TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; }; N_LIB_PRIVATE N_NIMCALL(void, f_temp_3)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl_systemZassertions_56)(NimStringDesc* msg); static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src); static N_INLINE(void, copyMem_system_1727)(void* dest, void* source, NI size); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, dollar__systemZdollars_3)(NI x); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, rawNewString)(NI space); static N_INLINE(void, nimFrame)(TFrame* s); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached_system_2997)(void); static N_INLINE(void, popFrame)(void); static N_INLINE(void, initStackBottomWith)(void* locals); N_LIB_PRIVATE N_NOINLINE(void, nimGC_setStackBottom)(void* theStackBottom); N_LIB_PRIVATE N_NIMCALL(void, systemDatInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, systemInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); STRING_LITERAL(TM__SRd76hP9cMfCzdUO857UhQQ_2, "/home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` ", 51); extern TFrame* framePtr_system_2564; extern TFrame* framePtr_system_2564; extern TFrame* framePtr_system_2564; extern TFrame* framePtr_system_2564; extern TFrame* framePtr_system_2564; extern TFrame* framePtr_system_2564; static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest, source, ((size_t) (size))); } static N_INLINE(void, copyMem_system_1727)(void* dest, void* source, NI size) { nimCopyMem(dest, source, size); } static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src) { { if (!!((src == ((NimStringDesc*) NIM_NIL)))) goto LA3_; copyMem_system_1727(((void*) ((&(*dest).data[(*dest).Sup.len]))), ((void*) ((*src).data)), ((NI) ((NI)((*src).Sup.len + ((NI) 1))))); (*dest).Sup.len += (*src).Sup.len; } LA3_: ; } static N_INLINE(void, nimFrame)(TFrame* s) { { if (!(framePtr_system_2564 == ((TFrame*) NIM_NIL))) goto LA3_; (*s).calldepth = ((NI16) 0); } goto LA1_; LA3_: ; { (*s).calldepth = (NI16)((*framePtr_system_2564).calldepth + ((NI16) 1)); } LA1_: ; (*s).prev = framePtr_system_2564; framePtr_system_2564 = s; { if (!((*s).calldepth == ((NI16) 2000))) goto LA8_; callDepthLimitReached_system_2997(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr_system_2564 = (*framePtr_system_2564).prev; } N_LIB_PRIVATE N_NIMCALL(void, f_temp_3)(void) { NI n; tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g* tmpX60gensym0_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); n = ((NI) 0); { NimStringDesc* T5_; NimStringDesc* T6_; if (!!(!((n == ((NI) 0))))) goto LA3_; T5_ = (NimStringDesc*)0; T6_ = (NimStringDesc*)0; T6_ = dollar__systemZdollars_3(n); T5_ = rawNewString((T6_ ? T6_->Sup.len : 0) + 51); appendString(T5_, ((NimStringDesc*) &TM__SRd76hP9cMfCzdUO857UhQQ_2)); appendString(T5_, T6_); failedAssertImpl_systemZassertions_56(T5_); } LA3_: ; popFrame(); } static N_INLINE(void, initStackBottomWith)(void* locals) { nimGC_setStackBottom(locals); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { void (*volatile inner)(void); inner = PreMainInner; systemDatInit000(); initStackBottomWith((void *)&inner); systemInit000(); (*inner)(); } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { void (*volatile inner)(void); PreMain(); inner = NimMainInner; initStackBottomWith((void *)&inner); (*inner)(); } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); f_temp_3(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
1.4.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-1.4.0/lib/system/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-1.4.0/lib/system/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-1.4.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` 0 [AssertionDefect] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp ' ```

Stats

  • Started 2023-08-25T12:21:38
  • Finished 2023-08-25T12:21:39
  • Duration

IR

Compiled filesize 91.77 Kb (93,968 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix # define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); # define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); # define nimln_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g; typedef struct NimStringDesc NimStringDesc; typedef struct TGenericSeq TGenericSeq; struct TGenericSeq { NI len; NI reserved; }; struct NimStringDesc { TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; }; N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A)(NimStringDesc* msg); static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src); static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, nimIntToStr)(NI x); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, rawNewString)(NI space); static N_INLINE(void, nimFrame)(TFrame* s); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw)(void); static N_INLINE(void, popFrame)(void); static N_INLINE(void, initStackBottomWith)(void* locals); N_LIB_PRIVATE N_NOINLINE(void, nimGC_setStackBottom)(void* theStackBottom); N_LIB_PRIVATE N_NIMCALL(void, systemDatInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, systemInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); STRING_LITERAL(TM__SRd76hP9cMfCzdUO857UhQQ_2, "/home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` ", 51); extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest, source, ((size_t) (size))); } static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size) { nimCopyMem(dest, source, size); } static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src) { { void* T5_; void* T6_; if (!!((src == NIM_NIL))) goto LA3_; T5_ = (void*)0; T5_ = ((void*) ((&(*dest).data[(*dest).Sup.len]))); T6_ = (void*)0; T6_ = ((void*) ((*src).data)); copyMem__i80o3k0SgEI5gTRCzYdyWAsystem(T5_, T6_, ((NI) ((NI)((*src).Sup.len + ((NI) 1))))); (*dest).Sup.len += (*src).Sup.len; } LA3_: ; } static N_INLINE(void, nimFrame)(TFrame* s) { { if (!(framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw == NIM_NIL)) goto LA3_; (*s).calldepth = ((NI16) 0); } goto LA1_; LA3_: ; { (*s).calldepth = (NI16)((*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).calldepth + ((NI16) 1)); } LA1_: ; (*s).prev = framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = s; { if (!((*s).calldepth == ((NI16) 2000))) goto LA8_; callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = (*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void) { NI n; tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g* tmpX60gensym0_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); n = ((NI) 0); { NimStringDesc* T5_; NimStringDesc* T6_; if (!!(!((n == ((NI) 0))))) goto LA3_; T5_ = (NimStringDesc*)0; T6_ = (NimStringDesc*)0; T6_ = nimIntToStr(n); T5_ = rawNewString((T6_ ? T6_->Sup.len : 0) + 51); appendString(T5_, ((NimStringDesc*) &TM__SRd76hP9cMfCzdUO857UhQQ_2)); appendString(T5_, T6_); failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(T5_); } LA3_: ; popFrame(); } static N_INLINE(void, initStackBottomWith)(void* locals) { nimGC_setStackBottom(locals); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { void (*volatile inner)(void); inner = PreMainInner; systemDatInit000(); initStackBottomWith((void *)&inner); systemInit000(); (*inner)(); } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { void (*volatile inner)(void); PreMain(); inner = NimMainInner; initStackBottomWith((void *)&inner); (*inner)(); } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); f__EzBZaa239as9bFx8yeHDoTOw(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
1.2.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-1.2.0/lib/system/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-1.2.0/lib/system/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-1.2.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` 0 [AssertionError] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp ' ```

Stats

  • Started 2023-08-25T12:21:56
  • Finished 2023-08-25T12:21:56
  • Duration

IR

Compiled filesize 91.53 Kb (93,728 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix # define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); # define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); # define nimln_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g; typedef struct NimStringDesc NimStringDesc; typedef struct TGenericSeq TGenericSeq; struct TGenericSeq { NI len; NI reserved; }; struct NimStringDesc { TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; }; N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A)(NimStringDesc* msg); static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src); static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, nimIntToStr)(NI x); N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, rawNewString)(NI space); static N_INLINE(void, nimFrame)(TFrame* s); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw)(void); static N_INLINE(void, popFrame)(void); static N_INLINE(void, initStackBottomWith)(void* locals); N_LIB_PRIVATE N_NOINLINE(void, nimGC_setStackBottom)(void* theStackBottom); N_LIB_PRIVATE N_NIMCALL(void, systemDatInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, systemInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); STRING_LITERAL(TM__SRd76hP9cMfCzdUO857UhQQ_2, "/home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` ", 51); extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest, source, ((size_t) (size))); } static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size) { nimCopyMem(dest, source, size); } static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src) { { if (!!((src == NIM_NIL))) goto LA3_; copyMem__i80o3k0SgEI5gTRCzYdyWAsystem(((void*) ((&(*dest).data[(*dest).Sup.len]))), ((void*) ((*src).data)), ((NI) ((NI)((*src).Sup.len + ((NI) 1))))); (*dest).Sup.len += (*src).Sup.len; } LA3_: ; } static N_INLINE(void, nimFrame)(TFrame* s) { { if (!(framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw == NIM_NIL)) goto LA3_; (*s).calldepth = ((NI16) 0); } goto LA1_; LA3_: ; { (*s).calldepth = (NI16)((*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).calldepth + ((NI16) 1)); } LA1_: ; (*s).prev = framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = s; { if (!((*s).calldepth == ((NI16) (((NI) 2000))))) goto LA8_; callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw(); } LA8_: ; } static N_INLINE(void, popFrame)(void) { framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = (*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void) { NI n; tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g* tmpX60gensym3387012_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); n = ((NI) 0); { NimStringDesc* T5_; NimStringDesc* T6_; if (!!(!((n == ((NI) 0))))) goto LA3_; T5_ = (NimStringDesc*)0; T6_ = (NimStringDesc*)0; T6_ = nimIntToStr(n); T5_ = rawNewString((T6_ ? T6_->Sup.len : 0) + 51); appendString(T5_, ((NimStringDesc*) &TM__SRd76hP9cMfCzdUO857UhQQ_2)); appendString(T5_, T6_); failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(T5_); } LA3_: ; popFrame(); } static N_INLINE(void, initStackBottomWith)(void* locals) { nimGC_setStackBottom(locals); } N_LIB_PRIVATE void PreMainInner(void) { } N_LIB_PRIVATE int cmdCount; N_LIB_PRIVATE char** cmdLine; N_LIB_PRIVATE char** gEnv; N_LIB_PRIVATE void PreMain(void) { void (*volatile inner)(void); inner = PreMainInner; systemDatInit000(); initStackBottomWith((void *)&inner); systemInit000(); (*inner)(); } N_LIB_PRIVATE N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { void (*volatile inner)(void); PreMain(); inner = NimMainInner; initStackBottomWith((void *)&inner); (*inner)(); } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); f__EzBZaa239as9bFx8yeHDoTOw(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
1.0.0 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-1.0.0/lib/system/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-1.0.0/lib/system/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-1.0.0/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` 0 [AssertionError] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp ' ```

Stats

  • Started 2023-08-25T12:22:09
  • Finished 2023-08-25T12:22:10
  • Duration

IR

Compiled filesize 86.54 Kb (88,616 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix # define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); # define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); # define nimln_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g; typedef struct NimStringDesc NimStringDesc; typedef struct TGenericSeq TGenericSeq; struct TGenericSeq { NI len; NI reserved; }; struct NimStringDesc { TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; }; N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A)(NimStringDesc* msg); static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src); static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size); N_NIMCALL(NimStringDesc*, nimIntToStr)(NI x); N_NIMCALL(NimStringDesc*, rawNewString)(NI space); static N_INLINE(void, nimFrame)(TFrame* s); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw)(void); static N_INLINE(void, popFrame)(void); static N_INLINE(void, initStackBottomWith)(void* locals); N_NOINLINE(void, nimGC_setStackBottom)(void* theStackBottom); N_LIB_PRIVATE N_NIMCALL(void, systemDatInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, systemInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; STRING_LITERAL(TM__SRd76hP9cMfCzdUO857UhQQ_2, "/home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` ", 51); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest, source, ((size_t) (size))); } static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size) { nimCopyMem(dest, source, size); } static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src) { { if (!!((src == NIM_NIL))) goto LA3_; copyMem__i80o3k0SgEI5gTRCzYdyWAsystem(((void*) ((&(*dest).data[(*dest).Sup.len]))), ((void*) ((*src).data)), ((NI) ((NI)((*src).Sup.len + ((NI) 1))))); (*dest).Sup.len += (*src).Sup.len; } LA3_: ; } static N_INLINE(void, nimFrame)(TFrame* s) { NI T1_; T1_ = (NI)0; { if (!(framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw == NIM_NIL)) goto LA4_; T1_ = ((NI) 0); } goto LA2_; LA4_: ; { T1_ = ((NI) ((NI16)((*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).calldepth + ((NI16) 1)))); } LA2_: ; (*s).calldepth = ((NI16) (T1_)); (*s).prev = framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = s; { if (!((*s).calldepth == ((NI16) (((NI) 2000))))) goto LA9_; callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw(); } LA9_: ; } static N_INLINE(void, popFrame)(void) { framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = (*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void) { NI n; tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g* tmpX60gensym133012_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); n = ((NI) 0); { NimStringDesc* T5_; NimStringDesc* T6_; if (!!(!((n == ((NI) 0))))) goto LA3_; T5_ = (NimStringDesc*)0; T6_ = (NimStringDesc*)0; T6_ = nimIntToStr(n); T5_ = rawNewString((T6_ ? T6_->Sup.len : 0) + 51); appendString(T5_, ((NimStringDesc*) &TM__SRd76hP9cMfCzdUO857UhQQ_2)); appendString(T5_, T6_); failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(T5_); } LA3_: ; popFrame(); } static N_INLINE(void, initStackBottomWith)(void* locals) { nimGC_setStackBottom(locals); } void PreMainInner(void) { } int cmdCount; char** cmdLine; char** gEnv; void PreMain(void) { void (*volatile inner)(void); inner = PreMainInner; systemDatInit000(); initStackBottomWith((void *)&inner); systemInit000(); (*inner)(); } N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { void (*volatile inner)(void); PreMain(); inner = NimMainInner; initStackBottomWith((void *)&inner); (*inner)(); } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); f__EzBZaa239as9bFx8yeHDoTOw(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
0.20.2 :-1: FAIL

Output

``` Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim /home/runner/work/Nim/Nim/temp.nim temp /home/runner/work/Nim/Nim/temp.nim f /home/runner/.choosenim/toolchains/nim-0.20.2/lib/system/assertions.nim failedAssertImpl /home/runner/.choosenim/toolchains/nim-0.20.2/lib/system/assertions.nim raiseAssert /home/runner/.choosenim/toolchains/nim-0.20.2/lib/system/fatal.nim sysFatal Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` 0 [AssertionError] Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp ' ```

Stats

  • Started 2023-08-25T12:22:19
  • Finished 2023-08-25T12:22:20
  • Duration

IR

Compiled filesize 86.22 Kb (88,288 bytes) ```cpp #define NIM_INTBITS 64 #include "nimbase.h" #include #undef LANGUAGE_C #undef MIPSEB #undef MIPSEL #undef PPC #undef R3000 #undef R4000 #undef i386 #undef linux #undef mips #undef near #undef far #undef powerpc #undef unix # define nimfr_(proc, file) \ TFrame FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = 0; nimFrame(&FR_); # define nimfrs_(proc, file, slots, length) \ struct {TFrame* prev;NCSTRING procname;NI line;NCSTRING filename; NI len; VarSlot s[slots];} FR_; \ FR_.procname = proc; FR_.filename = file; FR_.line = 0; FR_.len = length; nimFrame((TFrame*)&FR_); # define nimln_(n, file) \ FR_.line = n; FR_.filename = file; typedef struct tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g; typedef struct NimStringDesc NimStringDesc; typedef struct TGenericSeq TGenericSeq; struct TGenericSeq { NI len; NI reserved; }; struct NimStringDesc { TGenericSeq Sup; NIM_CHAR data[SEQ_DECL_SIZE]; }; N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void); N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A)(NimStringDesc* msg); static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src); static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size); N_NIMCALL(NimStringDesc*, nimIntToStr)(NI x); N_NIMCALL(NimStringDesc*, rawNewString)(NI space); static N_INLINE(void, nimFrame)(TFrame* s); N_LIB_PRIVATE N_NOINLINE(void, callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw)(void); static N_INLINE(void, popFrame)(void); static N_INLINE(void, initStackBottomWith)(void* locals); N_NOINLINE(void, nimGC_setStackBottom)(void* theStackBottom); N_LIB_PRIVATE N_NIMCALL(void, systemDatInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, systemInit000)(void); N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void); extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; extern TFrame* framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; STRING_LITERAL(TM__SRd76hP9cMfCzdUO857UhQQ_2, "/home/runner/work/Nim/Nim/temp.nim(5, 12) `n != 0` ", 51); static N_INLINE(void, nimCopyMem)(void* dest, void* source, NI size) { void* T1_; T1_ = (void*)0; T1_ = memcpy(dest, source, ((size_t) (size))); } static N_INLINE(void, copyMem__i80o3k0SgEI5gTRCzYdyWAsystem)(void* dest, void* source, NI size) { nimCopyMem(dest, source, size); } static N_INLINE(void, appendString)(NimStringDesc* dest, NimStringDesc* src) { { if (!!((src == NIM_NIL))) goto LA3_; copyMem__i80o3k0SgEI5gTRCzYdyWAsystem(((void*) ((&(*dest).data[(*dest).Sup.len]))), ((void*) ((*src).data)), ((NI) ((NI)((*src).Sup.len + ((NI) 1))))); (*dest).Sup.len += (*src).Sup.len; } LA3_: ; } static N_INLINE(void, nimFrame)(TFrame* s) { NI T1_; T1_ = (NI)0; { if (!(framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw == NIM_NIL)) goto LA4_; T1_ = ((NI) 0); } goto LA2_; LA4_: ; { T1_ = ((NI) ((NI16)((*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).calldepth + ((NI16) 1)))); } LA2_: ; (*s).calldepth = ((NI16) (T1_)); (*s).prev = framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw; framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = s; { if (!((*s).calldepth == ((NI16) (((NI) 2000))))) goto LA9_; callDepthLimitReached__mMRdr4sgmnykA9aWeM9aDZlw(); } LA9_: ; } static N_INLINE(void, popFrame)(void) { framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw = (*framePtr__HRfVMH3jYeBJz6Q6X9b6Ptw).prev; } N_LIB_PRIVATE N_NIMCALL(void, f__EzBZaa239as9bFx8yeHDoTOw)(void) { NI n; tyObject_O__xdOaNEs1w0sWK9bAPs3lm0g* tmpX60gensym133012_; nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim"); n = ((NI) 0); { NimStringDesc* T5_; NimStringDesc* T6_; if (!!(!((n == ((NI) 0))))) goto LA3_; T5_ = (NimStringDesc*)0; T6_ = (NimStringDesc*)0; T6_ = nimIntToStr(n); T5_ = rawNewString((T6_ ? T6_->Sup.len : 0) + 51); appendString(T5_, ((NimStringDesc*) &TM__SRd76hP9cMfCzdUO857UhQQ_2)); appendString(T5_, T6_); failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(T5_); } LA3_: ; popFrame(); } static N_INLINE(void, initStackBottomWith)(void* locals) { nimGC_setStackBottom(locals); } void PreMainInner(void) { } int cmdCount; char** cmdLine; char** gEnv; void PreMain(void) { void (*volatile inner)(void); inner = PreMainInner; systemDatInit000(); initStackBottomWith((void *)&inner); systemInit000(); (*inner)(); } N_CDECL(void, NimMainInner)(void) { NimMainModule(); } N_CDECL(void, NimMain)(void) { void (*volatile inner)(void); PreMain(); inner = NimMainInner; initStackBottomWith((void *)&inner); (*inner)(); } int main(int argc, char** args, char** env) { cmdLine = args; cmdCount = argc; gEnv = env; NimMain(); return nim_program_result; } N_LIB_PRIVATE N_NIMCALL(void, NimMainModule)(void) { { nimfr_("temp", "/home/runner/work/Nim/Nim/temp.nim"); f__EzBZaa239as9bFx8yeHDoTOw(); popFrame(); } } ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("O"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("data"), nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), newIdentNode("byte") ), newEmptyNode() ) ) ) ) ), nnkProcDef.newTree( newIdentNode("f"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("n"), newEmptyNode(), nnkCall.newTree( newIdentNode("offsetOf"), newIdentNode("O"), newIdentNode("data") ) ) ), nnkCommand.newTree( newIdentNode("doAssert"), nnkInfix.newTree( newIdentNode("!="), newIdentNode("n"), newLit(0) ), nnkPrefix.newTree( newIdentNode("$"), newIdentNode("n") ) ) ) ), nnkCall.newTree( newIdentNode("f") ) ) ```
Stats
  • GCC 11.4.0
  • LibC 2.35
  • Valgrind 3.18.1
  • NodeJS 17.1
  • Linux 5.15.0
  • Created 2023-08-25T12:20:40Z
  • Comments 1
  • Commands nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
:robot: Bug found in 56 minutes bisecting 8 commits at 0 commits per second.
litlighilit commented 1 year ago

@haoyu234 Beware nim is not C-backend only.

Firstly, dummy is to deal with the limit of C implementation. For example, it won't appear if using js backend [^1]

What's more, offsetof in fact works in compilation-time, which means it shall not consider how Chunk is implemented in backend language.

All in all, nim shall not be aware if a dummy exists; And, if seeing nim-code, everyone will tell data is in the first i.e. 0-index.
Therefore, making offset 1 may not be a good idea

[^1]: just a non-practical example

ringabout commented 1 year ago

there is no bug here. And the result of offsetOf in this case is alway 0 in every version.

Araq commented 1 year ago

No, the bug is very real.

shirleyquirk commented 10 months ago

on gcc, clang, icc, zigcc: struct{} dummy; //zero bytes, but enough to shut up the 'named field' error on msvc: //cant use empty struct, but works without a dummy char. godbolt

either way, offsetOf and sizeOf are correct at 0,0

ringabout commented 1 month ago

on gcc, clang, icc, zigcc: struct{} dummy; //zero bytes, but enough to shut up the 'named field' error on msvc: //cant use empty struct, but works without a dummy char.

It's undefined behavior

(C11, 6.7.2.1 Structure and union specifiers p8) "If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined."

but a GNU C extension:

ref https://stackoverflow.com/questions/24685399/c-empty-struct-what-does-this-mean-do

C/C++ returns different results for offsetOf and sizeOf

C: 0, 0 C++: 1, 1