On 11/10/21 2:04 AM, rempas wrote:
On Tuesday, 9 November 2021 at 13:44:04 UTC, Steven Schveighoffer wrote:

It seems like it should work. Figuring out the "lines" for things is really difficult in this expanded format, even though I know why it does that. I think importC should possibly allow printing of the actual source line along with the explicit source file/line, because knowing the vagrancies of the preprocessor is not going to be something that's easy to deal with, and you want to see what raw format is being passed to the compiler.

[here](https://gist.github.com/rempas/a1633ba4d3fd4f166277d7ff35cedc63#file-tomld-c-L1439) is where "line 39" of toml.c is. [here](https://gist.github.com/rempas/a1633ba4d3fd4f166277d7ff35cedc63#file-tomld-c-L763) is where the definition of `malloc` is.

To me, this looks reasonable. I narrowed it down to the following file, and it builds with gcc and ldc2 on my system. I don't have support for DMD, as this is an Arm system, but on another system, I can confirm that DMD 2.098.0 does not compile this:

```c
typedef long unsigned int size_t;
extern void *malloc (size_t __size)
     ;
static void* (*ppmalloc)(size_t) = malloc;
```

I used `dmd -c testc.c`, `gcc -c testc.c` and `ldc2 -c testc.c`.

Please file a bug report.

https://issues.dlang.org

It works with LDC2 for you? I'm having the latest version (ldc 1.28.0) downloaded from the [release](https://github.com/ldc-developers/ldc/releases/tag/v1.28.0) page for Linux (X86_64) and it doesn't seem to work for me. These 2 errors are not present with LDC2 however, I'm now getting some other errors with LDC2. How was your LDC2 built?

I'm using the downloaded LDC2 for aarch64.

But I'm not building tomld.c that you created, I'm building the reduced example (that I posted).

Also it is worth noting that the compiler that is used to preprocess the file will result in different error messages when trying to use ImportC. For example when using cproc to preprocess and then LDC2 to compile, the error message is the following:

```
toml.c(638): Error: assignment cannot be used as a condition, perhaps `==` was meant? toml.c(671): Error: assignment cannot be used as a condition, perhaps `==` was meant? toml.c(1027): Error: assignment cannot be used as a condition, perhaps `==` was meant? toml.c(1140): Error: assignment cannot be used as a condition, perhaps `==` was meant? toml.c(1844): Error: cannot implicitly convert expression `*((*tab).arr + cast(long)i * 8L)` of type `const(toml_array_t*)` to `toml_array_t*` toml.c(1855): Error: cannot implicitly convert expression `*((*tab).tab + cast(long)i * 8L)` of type `const(toml_table_t*)` to `toml_table_t*` toml.c(1914): Error: cannot implicitly convert expression `0 <= idx && (idx < (*arr).nitem) ? (*((*arr).item + cast(long)idx * 32L)).arr : cast(const(toml_array_t*))0LU` of type `const(toml_array_t*)` to `toml_array_t*` toml.c(1919): Error: cannot implicitly convert expression `0 <= idx && (idx < (*arr).nitem) ? (*((*arr).item + cast(long)idx * 32L)).tab : cast(const(toml_table_t*))0LU` of type `const(toml_table_t*)` to `toml_table_t*` toml.c(2247): Error: assignment cannot be used as a condition, perhaps `==` was meant? toml.c(2305): Error: assignment cannot be used as a condition, perhaps `==` was meant?
```

That is an interesting situation -- you have D errors being applied to C code. I think those should be disabled, otherwise, you will have to change all your C code, and it's more like portC than importC.

I'd suggest filing all these as issues. If importC is to be successful it has to build existing C projects.

-Steve

Reply via email to