Allow let to not have value when using importc (#14258)

* Allow let to not have value when using importc

This allows a let statement with the `{.importc.}` pragma to not be
initialised with a value. This allows us to declare C constants as Nim
lets without putting the value in the Nim code (which can lead to
errors, and requires us to go looking for the value). Fixes #14253

* Proper fix and documentation + changelog entry

* Improve testcase with one from timotheecour

* Add test to verify it working with macros
This commit is contained in:
PMunch 2020-05-12 20:28:18 +02:00 • committed by GitHub
commit 9acbf99efb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 52 additions and 5 deletions

View file

@ -2679,6 +2679,11 @@ nor can their address be taken. They cannot be assigned new values.
For let variables the same pragmas are available as for ordinary variables.
As ``let`` statements are immutable after creation they need to define a value
when they are declared. The only exception to this is if the ``{.importc.}``
pragma (or any of the other ``importX`` pragmas) is applied, in this case the
value is expected to come from native code, typically a C/C++ ``const``.
Tuple unpacking
---------------
@ -7090,6 +7095,16 @@ spelled*:
.. code-block::
proc printf(formatstr: cstring) {.header: "<stdio.h>", importc: "printf", varargs.}
When ``importc`` is applied to a ``let`` statement it can omit its value which
will then be expected to come from C. This can be used to import a C ``const``:
.. code-block::
{.emit: "const int cconst = 42;".}
let cconst {.importc, nodecl.}: cint
assert cconst == 42
Note that this pragma has been abused in the past to also work in the
js backend for js objects and functions. : Other backends do provide
the same feature under the same name. Also, when the target language