Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

when picks wrong branch with static int #22474

Closed
arnetheduck opened this issue Aug 14, 2023 · 4 comments
Closed

when picks wrong branch with static int #22474

arnetheduck opened this issue Aug 14, 2023 · 4 comments

Comments

@arnetheduck
Copy link
Contributor

Description

type X[bits: static int] = object
  when bits >= 256:
   data32* {.align: 32.}: byte
  else:
   data16* {.align: 16.}: byte


proc f*(v: X[256]) {.exportc.} =
  echo v.data32

Nim Version

Nim Compiler Version 1.6.14 [Linux: amd64]
Compiled at 2023-06-30
Copyright (c) 2006-2023 by Andreas Rumpf

git hash: 71ba2e7f3c5815d956b1ae0341b0743242b8fec6
active boot switches: -d:release

Current Output

testit.nim(9, 9) Error: undeclared field: 'data32' for type testit.X [type declared in testit.nim(1, 6)]

Expected Output

No response

Possible Solution

No response

Additional Information

No response

@ringabout
Copy link
Member

!nim c

type X[bits: static int] = object
  when bits >= 256:
   data32* {.align: 32.}: byte
  else:
   data16* {.align: 16.}: byte


proc f*(v: X[256]) {.exportc.} =
  echo v.data32

@github-actions
Copy link
Contributor

@ringabout (member)

devel 👎 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(7, 9) Error: undeclared field: 'data32' for type temp.X [type declared in /home/runner/work/Nim/Nim/temp.nim(1, 6)]

Stats

  • Started 2023-08-14T11:11:56
  • Finished 2023-08-14T11:11:56
  • Duration

IR

Compiled filesize 0 bytes (0 bytes)

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("X"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("bits"),
          nnkCommand.newTree(
            newIdentNode("static"),
            newIdentNode("int")
          ),
          newEmptyNode()
        )
      ),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecWhen.newTree(
            nnkElifBranch.newTree(
              nnkInfix.newTree(
                newIdentNode(">="),
                newIdentNode("bits"),
                newLit(256)
              ),
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data32")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(32)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            ),
            nnkElse.newTree(
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data16")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(16)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkProcDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("f")
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("v"),
        nnkBracketExpr.newTree(
          newIdentNode("X"),
          newLit(256)
        ),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("exportc")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCommand.newTree(
        newIdentNode("echo"),
        nnkDotExpr.newTree(
          newIdentNode("v"),
          newIdentNode("data32")
        )
      )
    )
  )
)
stable 👎 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(7, 9) Error: undeclared field: 'data32' for type temp.X [type declared in /home/runner/work/Nim/Nim/temp.nim(1, 6)]

Stats

  • Started 2023-08-14T11:11:57
  • Finished 2023-08-14T11:11:57
  • Duration

IR

Compiled filesize 0 bytes (0 bytes)

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("X"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("bits"),
          nnkCommand.newTree(
            newIdentNode("static"),
            newIdentNode("int")
          ),
          newEmptyNode()
        )
      ),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecWhen.newTree(
            nnkElifBranch.newTree(
              nnkInfix.newTree(
                newIdentNode(">="),
                newIdentNode("bits"),
                newLit(256)
              ),
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data32")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(32)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            ),
            nnkElse.newTree(
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data16")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(16)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkProcDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("f")
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("v"),
        nnkBracketExpr.newTree(
          newIdentNode("X"),
          newLit(256)
        ),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("exportc")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCommand.newTree(
        newIdentNode("echo"),
        nnkDotExpr.newTree(
          newIdentNode("v"),
          newIdentNode("data32")
        )
      )
    )
  )
)
2.0.0 👎 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(7, 9) Error: undeclared field: 'data32' for type temp.X [type declared in /home/runner/work/Nim/Nim/temp.nim(1, 6)]

Stats

  • Started 2023-08-14T11:11:58
  • Finished 2023-08-14T11:11:58
  • Duration

IR

Compiled filesize 0 bytes (0 bytes)

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("X"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("bits"),
          nnkCommand.newTree(
            newIdentNode("static"),
            newIdentNode("int")
          ),
          newEmptyNode()
        )
      ),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecWhen.newTree(
            nnkElifBranch.newTree(
              nnkInfix.newTree(
                newIdentNode(">="),
                newIdentNode("bits"),
                newLit(256)
              ),
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data32")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(32)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            ),
            nnkElse.newTree(
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data16")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(16)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkProcDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("f")
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("v"),
        nnkBracketExpr.newTree(
          newIdentNode("X"),
          newLit(256)
        ),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("exportc")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCommand.newTree(
        newIdentNode("echo"),
        nnkDotExpr.newTree(
          newIdentNode("v"),
          newIdentNode("data32")
        )
      )
    )
  )
)
1.6.0 👍 $\color{green}\textbf{\large OK}$

Output


Stats

  • Started 2023-08-14T11:12:02
  • Finished 2023-08-14T11:12:03
  • Duration
1.4.0 👍 $\color{green}\textbf{\large OK}$

Output


Stats

  • Started 2023-08-14T11:12:06
  • Finished 2023-08-14T11:12:07
  • Duration
1.2.0 👍 $\color{green}\textbf{\large OK}$

Output


Stats

  • Started 2023-08-14T11:12:23
  • Finished 2023-08-14T11:12:23
  • Duration
1.0.0 👎 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(3, 19) Error: invalid pragma: align: 32

Stats

  • Started 2023-08-14T11:12:37
  • Finished 2023-08-14T11:12:37
  • Duration

IR

Compiled filesize 91.86 Kb (94,064 bytes)
#define NIM_INTBITS 64
#include "nimbase.h"
#include <string.h>
#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_X__0ZfcXWkEeyU0KreWvvCasQ tyObject_X__0ZfcXWkEeyU0KreWvvCasQ;
typedef struct NimStringDesc NimStringDesc;
typedef struct TGenericSeq TGenericSeq;
struct TGenericSeq {
NI len;
NI reserved;
};
struct NimStringDesc {
  TGenericSeq Sup;
NIM_CHAR data[SEQ_DECL_SIZE];
};
typedef NimStringDesc* tyArray__nHXaesL0DJZHyVS07ARPRA[1];
struct tyObject_X__0ZfcXWkEeyU0KreWvvCasQ {
NIM_ALIGN(32) NU8 data32;
};
N_LIB_PRIVATE N_NIMCALL(void, f)(tyObject_X__0ZfcXWkEeyU0KreWvvCasQ* v);
static N_INLINE(void, nimZeroMem)(void* p, NI size);
static N_INLINE(void, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size);
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, dollar___RkX9btpg5sQIaP8yYXB6tbA)(NU64 x);
N_LIB_PRIVATE N_NIMCALL(void, echoBinSafe)(NimStringDesc** args, NI argsLen_0);
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);
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, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size) {
	void* T1_;
	T1_ = (void*)0;
	T1_ = memset(a, v, ((size_t) (size)));
}
static N_INLINE(void, nimZeroMem)(void* p, NI size) {
	nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory(p, ((int) 0), size);
}
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)(tyObject_X__0ZfcXWkEeyU0KreWvvCasQ* v) {
	tyArray__nHXaesL0DJZHyVS07ARPRA T1_;
	nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim");
	nimZeroMem((void*)T1_, sizeof(tyArray__nHXaesL0DJZHyVS07ARPRA));
	T1_[0] = dollar___RkX9btpg5sQIaP8yYXB6tbA(((NU64) ((*v).data32)));
	echoBinSafe(T1_, 1);
	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) {
{
}
}

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("X"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("bits"),
          nnkCommand.newTree(
            newIdentNode("static"),
            newIdentNode("int")
          ),
          newEmptyNode()
        )
      ),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecWhen.newTree(
            nnkElifBranch.newTree(
              nnkInfix.newTree(
                newIdentNode(">="),
                newIdentNode("bits"),
                newLit(256)
              ),
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data32")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(32)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            ),
            nnkElse.newTree(
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data16")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(16)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkProcDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("f")
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("v"),
        nnkBracketExpr.newTree(
          newIdentNode("X"),
          newLit(256)
        ),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("exportc")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCommand.newTree(
        newIdentNode("echo"),
        nnkDotExpr.newTree(
          newIdentNode("v"),
          newIdentNode("data32")
        )
      )
    )
  )
)
0.20.2 👎 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(3, 19) Error: invalid pragma: align: 32

Stats

  • Started 2023-08-14T11:12:50
  • Finished 2023-08-14T11:12:50
  • Duration

IR

Compiled filesize 91.86 Kb (94,064 bytes)
#define NIM_INTBITS 64
#include "nimbase.h"
#include <string.h>
#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_X__0ZfcXWkEeyU0KreWvvCasQ tyObject_X__0ZfcXWkEeyU0KreWvvCasQ;
typedef struct NimStringDesc NimStringDesc;
typedef struct TGenericSeq TGenericSeq;
struct TGenericSeq {
NI len;
NI reserved;
};
struct NimStringDesc {
  TGenericSeq Sup;
NIM_CHAR data[SEQ_DECL_SIZE];
};
typedef NimStringDesc* tyArray__nHXaesL0DJZHyVS07ARPRA[1];
struct tyObject_X__0ZfcXWkEeyU0KreWvvCasQ {
NIM_ALIGN(32) NU8 data32;
};
N_LIB_PRIVATE N_NIMCALL(void, f)(tyObject_X__0ZfcXWkEeyU0KreWvvCasQ* v);
static N_INLINE(void, nimZeroMem)(void* p, NI size);
static N_INLINE(void, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size);
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, dollar___RkX9btpg5sQIaP8yYXB6tbA)(NU64 x);
N_LIB_PRIVATE N_NIMCALL(void, echoBinSafe)(NimStringDesc** args, NI argsLen_0);
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);
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, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size) {
	void* T1_;
	T1_ = (void*)0;
	T1_ = memset(a, v, ((size_t) (size)));
}
static N_INLINE(void, nimZeroMem)(void* p, NI size) {
	nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory(p, ((int) 0), size);
}
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)(tyObject_X__0ZfcXWkEeyU0KreWvvCasQ* v) {
	tyArray__nHXaesL0DJZHyVS07ARPRA T1_;
	nimfr_("f", "/home/runner/work/Nim/Nim/temp.nim");
	nimZeroMem((void*)T1_, sizeof(tyArray__nHXaesL0DJZHyVS07ARPRA));
	T1_[0] = dollar___RkX9btpg5sQIaP8yYXB6tbA(((NU64) ((*v).data32)));
	echoBinSafe(T1_, 1);
	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) {
{
}
}

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      newIdentNode("X"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("bits"),
          nnkCommand.newTree(
            newIdentNode("static"),
            newIdentNode("int")
          ),
          newEmptyNode()
        )
      ),
      nnkObjectTy.newTree(
        newEmptyNode(),
        newEmptyNode(),
        nnkRecList.newTree(
          nnkRecWhen.newTree(
            nnkElifBranch.newTree(
              nnkInfix.newTree(
                newIdentNode(">="),
                newIdentNode("bits"),
                newLit(256)
              ),
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data32")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(32)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            ),
            nnkElse.newTree(
              nnkRecList.newTree(
                nnkIdentDefs.newTree(
                  nnkPragmaExpr.newTree(
                    nnkPostfix.newTree(
                      newIdentNode("*"),
                      newIdentNode("data16")
                    ),
                    nnkPragma.newTree(
                      nnkExprColonExpr.newTree(
                        newIdentNode("align"),
                        newLit(16)
                      )
                    )
                  ),
                  newIdentNode("byte"),
                  newEmptyNode()
                )
              )
            )
          )
        )
      )
    )
  ),
  nnkProcDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("f")
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("v"),
        nnkBracketExpr.newTree(
          newIdentNode("X"),
          newLit(256)
        ),
        newEmptyNode()
      )
    ),
    nnkPragma.newTree(
      newIdentNode("exportc")
    ),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkCommand.newTree(
        newIdentNode("echo"),
        nnkDotExpr.newTree(
          newIdentNode("v"),
          newIdentNode("data32")
        )
      )
    )
  )
)
#a9d0124b5 ➡️ 🐛

Diagnostics

jason beetham introduced a bug at 2023-03-17 03:17:08 -0600 on commit #a9d0124b5 with message:

Made generic type classes work with types using static parameters (#21528)

The bug is in the files:

compiler/semtypinst.nim
tests/metatype/tstatic_generic_typeclass.nim

The bug can be in the commits:

(Diagnostics sometimes off-by-one).

Stats
  • GCC 11.4.0
  • LibC 2.35
  • Valgrind 3.18.1
  • NodeJS 17.0
  • Linux 5.15.0
  • Created 2023-08-14T11:11:08Z
  • 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

🤖 Bug found in 59 minutes bisecting 1700 commits at 29 commits per second.

@ringabout
Copy link
Member

@beef331 Hi, do you happen to have some clues since it might be related to #21528 as the online bisecting has shown.

@arnetheduck
Copy link
Contributor Author

the actual problem here is the template evaluation of >= - without that, when works

@Araq Araq closed this as completed in 6c4e783 Aug 15, 2023
narimiran pushed a commit that referenced this issue Aug 22, 2023
Ping @narimiran please backport to the 2.0 line.

(cherry picked from commit 6c4e783)
narimiran pushed a commit that referenced this issue Sep 11, 2023
Ping @narimiran please backport to the 2.0 line.

(cherry picked from commit 6c4e783)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants