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

os.putEnv does not compile on cpp backend on Windows #19292

Closed
rockcavera opened this issue Dec 27, 2021 · 1 comment · Fixed by #19293 or #21143
Closed

os.putEnv does not compile on cpp backend on Windows #19292

rockcavera opened this issue Dec 27, 2021 · 1 comment · Fixed by #19293 or #21143
Assignees

Comments

@rockcavera
Copy link
Contributor

rockcavera commented Dec 27, 2021

os.putEnv does not compile on the cpp backend on Windows. The problem occurs with GCC, CLANG and VCC.

Example

import std/os

putEnv("NimPutEnvTest", "test")

Current Output

GCC

nim cpp test
Hint: used config file 'D:\Nim\config\nim.cfg' [Conf]
Hint: used config file 'D:\Nim\config\config.nims' [Conf]
.......................................................................................
CC: stdlib_digitsutils.nim
CC: stdlib_assertions.nim
CC: stdlib_dollars.nim
CC: stdlib_widestrs.nim
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: stdlib_dynlib.nim
CC: stdlib_winlean.nim
CC: stdlib_times.nim
CC: stdlib_win_setenv.nim
CC: stdlib_os.nim
CC: test.nim
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp: In function 'int setEnvImpl__stdZprivateZwin95setenv_20(NCSTRING, NCSTRING, int)':
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:199:46: error: no matching function for call to 'mbstowcs_s(size_t*, NI16*&, size_t, char*&, size_t)'
  199 |                         int T30_ = mbstowcs_s((&len), buf2, ((size_t) 32768), name, ((size_t) 32767));
      |                                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from d:\mingw64\x86_64-w64-mingw32\include\crtdefs.h:10,
                 from d:\mingw64\x86_64-w64-mingw32\include\limits.h:6,
                 from d:\mingw64\lib\gcc\x86_64-w64-mingw32\11.2.0\include-fixed\limits.h:203,
                 from d:\mingw64\lib\gcc\x86_64-w64-mingw32\11.2.0\include-fixed\syslimits.h:7,
                 from d:\mingw64\lib\gcc\x86_64-w64-mingw32\11.2.0\include-fixed\limits.h:34,
                 from D:\Nim\lib/nimbase.h:269,
                 from C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:7:
d:\mingw64\x86_64-w64-mingw32\include\sec_api\stdlib_s.h:26:3: note: candidate: 'template<long long unsigned int __size> errno_t mbstowcs_s(size_t*, wchar_t (&)[__size], const char*, size_t)'
   26 |   __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(errno_t, mbstowcs_s, size_t *, _PtNumOfCharConverted, wchar_t, _Dest, const char *, _Source, size_t, _MaxCount)
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
d:\mingw64\x86_64-w64-mingw32\include\sec_api\stdlib_s.h:26:3: note:   template argument deduction/substitution failed:
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:199:46: note:   mismatched types 'wchar_t [__size]' and 'NI16*' {aka 'short int*'}
  199 |                         int T30_ = mbstowcs_s((&len), buf2, ((size_t) 32768), name, ((size_t) 32767));
      |                                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from d:\mingw64\x86_64-w64-mingw32\include\stdlib.h:765,
                 from d:\mingw64\include\c++\11.2.0\cstdlib:75,
                 from d:\mingw64\include\c++\11.2.0\stdlib.h:36,
                 from C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:9:
d:\mingw64\x86_64-w64-mingw32\include\sec_api\stdlib_s.h:25:27: note: candidate: 'errno_t mbstowcs_s(size_t*, wchar_t*, size_t, const char*, size_t)' (near match)
   25 |   _CRTIMP errno_t __cdecl mbstowcs_s(size_t *_PtNumOfCharConverted,wchar_t *_DstBuf,size_t _SizeInWords,const char *_SrcBuf,size_t _MaxCount);
      |                           ^~~~~~~~~~
d:\mingw64\x86_64-w64-mingw32\include\sec_api\stdlib_s.h:25:27: note:   conversion of argument 2 would be ill-formed:
Error: execution of an external compiler program 'D:\mingw64\bin\g++.exe -c -std=gnu++14 -funsigned-char  -w -fmax-errors=3 -fpermissive -mno-ms-bitfields -DWIN32_LEAN_AND_MEAN   -ID:\Nim\lib -Ic:\Users\Jose\Desktop -o C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp.o C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp' failed with exit code: 1

CLANG

nim cpp --cc:clang test
Hint: used config file 'D:\Nim\config\nim.cfg' [Conf]
Hint: used config file 'D:\Nim\config\config.nims' [Conf]
.......................................................................................
CC: stdlib_digitsutils.nim
CC: stdlib_assertions.nim
CC: stdlib_dollars.nim
CC: stdlib_widestrs.nim
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: stdlib_dynlib.nim
CC: stdlib_winlean.nim
CC: stdlib_times.nim
CC: stdlib_win_setenv.nim
CC: stdlib_os.nim
CC: test.nim
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:199:15: error: no matching function for call to 'mbstowcs_s'
                        int T30_ = mbstowcs_s((&len), buf2, ((size_t) 32768), name, ((size_t) 32767));
                                   ^~~~~~~~~~
D:\mingw64\x86_64-w64-mingw32\include\sec_api/stdlib_s.h:25:27: note: candidate function not viable: no known conversion from 'NI16 *' (aka 'short *') to 'wchar_t *' for 2nd argument
  _CRTIMP errno_t __cdecl mbstowcs_s(size_t *_PtNumOfCharConverted,wchar_t *_DstBuf,size_t _SizeInWords,const char *_SrcBuf,size_t _MaxCount);
                          ^
D:\mingw64\x86_64-w64-mingw32\include\sec_api/stdlib_s.h:26:50: note: candidate function template not viable: requires 4 arguments, but 5 were provided
  __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(errno_t, mbstowcs_s, size_t *, _PtNumOfCharConverted, wchar_t, _Dest, const char *, _Source, size_t, _MaxCount)
                                                 ^
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:209:16: error: no matching function for call to '_wgetenv'
                NI16* T33_ = _wgetenv(buf2);
                             ^~~~~~~~
D:\mingw64\x86_64-w64-mingw32\include\stdlib.h:582:28: note: candidate function not viable: no known conversion from 'NI16 *' (aka 'short *') to 'const wchar_t *' for 1st argument
  _CRTIMP wchar_t *__cdecl _wgetenv(const wchar_t *_VarName) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
                           ^
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:209:9: error: cannot initialize a variable of type 'NI16 *' (aka 'short *') with an rvalue of type 'wchar_t *'
                NI16* T33_ = _wgetenv(buf2);
                      ^      ~~~~~~~~~~~~~~
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:212:16: error: no matching function for call to '_wgetenv'
                NI16* T34_ = _wgetenv(buf2);
                             ^~~~~~~~
D:\mingw64\x86_64-w64-mingw32\include\stdlib.h:582:28: note: candidate function not viable: no known conversion from 'NI16 *' (aka 'short *') to 'const wchar_t *' for 1st argument
  _CRTIMP wchar_t *__cdecl _wgetenv(const wchar_t *_VarName) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
                           ^
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp:212:9: error: cannot initialize a variable of type 'NI16 *' (aka 'short *') with an rvalue of type 'wchar_t *'
                NI16* T34_ = _wgetenv(buf2);
                      ^      ~~~~~~~~~~~~~~
5 errors generated.
Error: execution of an external compiler program 'clang++.exe -c -std=gnu++14 -funsigned-char  -DWIN32_LEAN_AND_MEAN   -ID:\Nim\lib -Ic:\Users\Jose\Desktop -o C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp.o C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp' failed with exit code: 1

VCC

nim cpp --cc:vcc test
Hint: used config file 'D:\Nim\config\nim.cfg' [Conf]
Hint: used config file 'D:\Nim\config\config.nims' [Conf]
.......................................................................................
CC: stdlib_digitsutils.nim
CC: stdlib_assertions.nim
CC: stdlib_dollars.nim
CC: stdlib_widestrs.nim
CC: stdlib_io.nim
CC: stdlib_system.nim
CC: stdlib_dynlib.nim
CC: stdlib_winlean.nim
stdlib_system.nim.cpp
stdlib_digitsutils.nim.cpp
stdlib_dollars.nim.cpp
stdlib_widestrs.nim.cpp
CC: stdlib_times.nim
CC: stdlib_win_setenv.nim
CC: stdlib_os.nim
stdlib_dynlib.nim.cpp
CC: test.nim
stdlib_assertions.nim.cpp
stdlib_io.nim.cpp
stdlib_times.nim.cpp
stdlib_win_setenv.nim.cpp
stdlib_os.nim.cpp
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(200): error C2664: 'errno_t mbstowcs_s(size_t *,wchar_t *,size_t,const char *,size_t)': não é possível converter um argumento 2 de 'NI16 *' em 'wchar_t *'
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(200): note: Tipos apontados não são relacionados; conversão requer reinterpret_cast, conversão C-style ou conversão function-style
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\stdlib.h(911): note: consulte a declaração de 'mbstowcs_s'
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(210): error C2664: 'wchar_t *_wgetenv(const wchar_t *)': não é possível converter um argumento 1 de 'NI16 *' em 'const wchar_t *'
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(210): note: Tipos apontados não são relacionados; conversão requer reinterpret_cast, conversão C-style ou conversão function-style
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\corecrt_wstdlib.h(418): note: consulte a declaração de '_wgetenv'
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(213): error C2664: 'wchar_t *_wgetenv(const wchar_t *)': não é possível converter um argumento 1 de 'NI16 *' em 'const wchar_t *'
C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp(213): note: Tipos apontados não são relacionados; conversão requer reinterpret_cast, conversão C-style ou conversão function-style
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt\corecrt_wstdlib.h(418): note: consulte a declaração de '_wgetenv'
Error: exestdlib_winlean.nim.cpp
cution of an external compiler program 'vccexe.exe /c --platform:amd64  /nologo /EHsc -DWIN32_LEAN_AND_MEAN   /ID:\Nim\lib /Ic:\Users\Jose\Desktop /nologo /FoC:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp.obj C:\Users\Jose\nimcache\test_d\stdlib_win_setenv.nim.cpp' failed with exit code: 2

Expected Output

Compile without errors.

Possible Solution

The problem is that the backend compilers do not support the conversion from Nim type WideCString to cpp type wchar_t*.

The solution is to rewrite the code to import the c_wgetenv and mbstowcs_s procs with parameters like ptr wchar_t instead of WideCString. Also, pass the parameters with cast[ptr wchar_t]().

Additional Information

nim -v
Nim Compiler Version 1.7.1 [Windows: amd64]
Compiled at 2021-12-27
Copyright (c) 2006-2021 by Andreas Rumpf

git hash: a61bbf7d8d9905a8dd70cc41f4b9e010c3bfee28
active boot switches: -d:release
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=d:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/11.2.0/lto-wrapper.exe
OFFLOAD_TARGET_NAMES=nvptx-none
Target: x86_64-w64-mingw32
Configured with: ../configure --prefix=/R/winlibs64_stage/inst_gcc-11.2.0/share/gcc --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --enable-offload-targets=nvptx-none --with-pkgversion='MinGW-W64 x86_64-posix-seh, built by Brecht Sanders' --with-tune=generic --enable-checking=release --enable-threads=posix --disable-sjlj-exceptions --disable-libunwind-exceptions --disable-serial-configure --disable-bootstrap --enable-host-shared --enable-plugin --disable-default-ssp --disable-rpath --enable-libstdcxx-pch --enable-libstdcxx-time=yes --disable-libstdcxx-debug --disable-version-specific-runtime-libs --with-stabs --disable-symvers --enable-languages=c,c++,fortran,lto,objc,obj-c++,d,jit --disable-gold --disable-nls --disable-stage1-checking --disable-win32-registry --disable-multilib --enable-ld --enable-libquadmath --enable-libada --enable-libssp --enable-libstdcxx --enable-lto --enable-fully-dynamic-string --enable-libgomp --enable-graphite --enable-mingw-wildcard --with-mpc=/d/Prog/winlibs64_stage/custombuilt --with-mpfr=/d/Prog/winlibs64_stage/custombuilt --with-gmp=/d/Prog/winlibs64_stage/custombuilt --with-isl=/d/Prog/winlibs64_stage/custombuilt --enable-install-libiberty --enable-__cxa_atexit --without-included-gettext --with-diagnostics-color=auto --enable-clocale=generic --with-libiconv --with-system-zlib --with-build-sysroot=/R/winlibs64_stage/gcc-11.2.0/build_mingw/mingw-w64 CFLAGS=-I/d/Prog/winlibs64_stage/custombuilt/include/libdl-win32
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.2.0 (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders)
clang -v
(built by Brecht Sanders) clang version 13.0.0
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: D:\mingw64\bin
Microsoft (R) C/C++ Optimizing Compiler Versão 19.29.30137 para x64
Copyright (C) Microsoft Corporation. Todos os direitos reservados.
@ringabout
Copy link
Member

There is a regression since #20084

Araq pushed a commit that referenced this issue Dec 20, 2022
* fixes #19292; fixes 21122; fixes putEnv and setEnv with vcc

* add a test
survivorm pushed a commit to survivorm/Nim that referenced this issue Feb 28, 2023
…ith vcc (nim-lang#21143)

* fixes nim-lang#19292; fixes 21122; fixes putEnv and setEnv with vcc

* add a test
capocasa pushed a commit to capocasa/Nim that referenced this issue Mar 31, 2023
…ith vcc (nim-lang#21143)

* fixes nim-lang#19292; fixes 21122; fixes putEnv and setEnv with vcc

* add a test
bung87 pushed a commit to bung87/Nim that referenced this issue Jul 29, 2023
…ith vcc (nim-lang#21143)

* fixes nim-lang#19292; fixes 21122; fixes putEnv and setEnv with vcc

* add a test
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants