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.43k stars 1.47k forks source link

Map function with a variable under walkDirRec caused a compile error #12375

Open hokamoto opened 4 years ago

hokamoto commented 4 years ago

Using a map function with a variable under walkDirRec iterator caused a compile error.

Example

The below snippet itself does not make sense because I made up it for reproducing the problem with minimum code. I came across the problem during coding a real application.

import os, sequtils, sequtils, sugar

for file in walkDirRec("./"):
  let multiplier = 5
  echo(toSeq(1..4).map(x => x * multiplier))

Current Output

Error: execution of an external compiler program 'clang -c  -w  -I/Users/hokamoto/.choosenim/toolchains/nim-1.0.0/lib -I/Users/hokamoto/NimProjects/video_thumbnail -o /Users/hokamoto/.cache/nim/a_d/a.nim.c.o /Users/hokamoto/.cache/nim/a_d/a.nim.c' failed with exit code: 1

/Users/hokamoto/.cache/nim/a_d/a.nim.c:727:45: error: use of undeclared identifier 'multiplier__oOhn9b9auJ3LN3lvBg5aNedw_2'; did you mean 'multiplier__oOhn9b9auJ3LN3lvBg5aNedw_3'?
        TM__R8RUzYq41iOx0I9bZH5Nyrw_17 = mulInt(x, multiplier__oOhn9b9auJ3LN3lvBg5aNedw_2);
                                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                   multiplier__oOhn9b9auJ3LN3lvBg5aNedw_3
/Users/hokamoto/.cache/nim/a_d/a.nim.c:326:4: note: 'multiplier__oOhn9b9auJ3LN3lvBg5aNedw_3' declared here
NI multiplier__oOhn9b9auJ3LN3lvBg5aNedw_3;
   ^
1 error generated.

Expected Output

@[5, 10, 15, 20]

Possible Solution

I found the error did not occur when not using variable or not under walkDirRec.

Work (Not using a variable)

import os, sequtils, sequtils, sugar

for file in walkDirRec("./"):
  echo(toSeq(1..4).map(x => x * 5))

Work (Not under walkDirRec)

import os, sequtils, sequtils, sugar

let multiplier = 5
echo(toSeq(1..4).map(x => x * multiplier))

Additional Information

$ nim -v
Nim Compiler Version 1.0.0 [MacOSX: amd64]
Compiled at 2019-09-23
Copyright (c) 2006-2019 by Andreas Rumpf

git hash: f7a8fc46c0012033917582eb740dc0343c093e35
active boot switches: -d:release
narimiran commented 4 years ago

A similar example, but using mapIt, works:

import os, sequtils, sequtils, sugar

for file in walkDirRec("./"):
  let multiplier = 5
  echo(toSeq(1..4).mapIt(it * multiplier))
hokamoto commented 4 years ago

Thanks. mapIt works for me! But do you know why map caused the compile error?

hokamoto commented 2 years ago

This issue has not been fixed on v1.6.6.

% nim -v
Nim Compiler Version 1.6.6 [MacOSX: amd64]
Compiled at 2022-07-01
Copyright (c) 2006-2021 by Andreas Rumpf

active boot switches: -d:release

% nim c issue12375.nim
Hint: used config file '/Users/hokamoto/.choosenim/toolchains/nim-1.6.6/config/nim.cfg' [Conf]
Hint: used config file '/Users/hokamoto/.choosenim/toolchains/nim-1.6.6/config/config.nims' [Conf]
.......................................................................................
/Users/hokamoto/issue12375.nim(1, 22) Hint: duplicate import of 'sequtils'; previous import here: /Users/hokamoto/issue12375.nim(1, 12) [DuplicateModuleImport]
..
CC: stdlib_digitsutils.nim
CC: stdlib_assertions.nim
CC: stdlib_dollars.nim
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: stdlib_pathnorm.nim
CC: stdlib_posix.nim
CC: stdlib_times.nim
CC: stdlib_os.nim
CC: issue12375.nim
/Users/hokamoto/.cache/nim/issue12375_d/@missue12375.nim.c:633:19: error: use of undeclared identifier 'multiplier__issue4950515553_6'; did you mean 'multiplier__issue4950515553_369'?
        if (nimMulInt(x, multiplier__issue4950515553_6, &TM__kIv9ayHDPjlWRZ8dPrg9c9cdQ_15)) { raiseOverflow(); };
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                         multiplier__issue4950515553_369
/Users/hokamoto/.choosenim/toolchains/nim-1.6.6/lib/nimbase.h:595:63: note: expanded from macro 'nimMulInt'
    #define nimMulInt(a, b, res) __builtin_smulll_overflow(a, b, (long long int*)res)
                                                              ^
/Users/hokamoto/.cache/nim/issue12375_d/@missue12375.nim.c:315:18: note: 'multiplier__issue4950515553_369' declared here
N_LIB_PRIVATE NI multiplier__issue4950515553_369;
                 ^
1 error generated.
Error: execution of an external compiler program 'clang -c  -w -ferror-limit=3   -I/Users/hokamoto/.choosenim/toolchains/nim-1.6.6/lib -I/Users/hokamoto -o /Users/hokamoto/.cache/nim/issue12375_d/@missue12375.nim.c.o /Users/hokamoto/.cache/nim/issue12375_d/@missue12375.nim.c' failed with exit code: 1