[Bug?] ImportC: undefined RTInfoImpl for imported C struct's TypeInfo on 2.112

Danny Arends Danny.Arends at gmail.com
Thu Jul 2 19:06:43 UTC 2026


Hey Guys,

Working on my [3D engine](https://github.com/DannyArends/DImGui), 
I ran into an issue when updating the compiler 2.110 -> 2.112 
with the way that the code is structured. I am not a compiler 
person, or someone who deals with intricacies of linkage, but 
together with Claude I was able to reduce the issue to a minimal 
example. The issue itself doesn't cause too much issues (I can 
code around it) but it forces me to maintain C-code shims for 
compiler intrinsics when using 2.112, versus not needing to do 
this in 2.110...

Since the project compiles on Window, Linux this adds a minimal 
amount of C shim code, but this might grow in the future due to 
having more external libararies imported.

#### Issue and changes

Since 2.112, referencing the `TypeInfo` of a `struct` defined in 
an **imported** (not command-line) ImportC module fails at link 
with an undefined `RTInfoImpl` instance. Worked on 2.110 (didn't 
test 2.111).

#### Minimal repro (no external libs)

`minic.c`:

```c
struct S { long a; void *b; void *c; long d; void *e; long f; };
```

`mini.d`:

```d
import minic;

void main() { auto ti = typeid(S); }
```

Build the same way dub does — compile to an object, then link 
separately:
```shell
dmd -c mini.d -I. -of=mini.o
dmd mini.o -of=mini
```

undefined reference to object.RTInfoImpl!([48, 22]).RTInfoImpl
referenced from TypeInfo_S3__C1S.__init

#### What seems to be happening

dmd emits the C struct's `TypeInfo.__init` referencing 
`RTInfoImpl!([size, ptrBitmap])`, but the instance itself is 
**not emitted** in this case. From the object symbols, it only 
appears to be emitted as a side effect. So:

- A struct only reached via `typeid` / plain use (no AA/array 
template instantiated) → `RTInfoImpl` stays undefined → link 
error.
- A struct used as an AA key/value or array element → the 
AA/array template instantiation emits the instance → links fine.
- Pointerless structs use `rtinfoNoPointers` (no per-type 
instance) → never affected.

`nm` on the object confirms it — the instance is `U` (undefined):

U _D6object__T10RTInfoImplVAmA2i48i22ZQyyG2m

Structs whose `[size, bitmap]` layout happens to match one 
druntime already instantiates link by coincidence?; unusual 
layouts (like the `[48, 22]` above) don't.

#### Workaround (and its cost)

Putting the `.c` file on the command line (so the ImportC unit is 
compiled, not just imported) emits the `RTInfoImpl` and links 🥳. 
But full compilation then lowers the C headers' `static inline` 
bodies, which then reference compiler intrinsics ImportC doesn't 
implement. Several intrinsics such as `__builtin_clz` (GCC/Clang) 
and `_BitScanReverse` (MSVC), each of which now need to be 
maintained using hand-written stubs.

#### Questions

1. Is import-only `RTInfo` emission expected to work in 2.112, or 
is compiling the ImportC unit now required by design (fallout 
from the AA/array-hook templatization)?
2. Is this the same as fixed [Issue 
10442](https://bugzilla-archive.dlang.org/bugs/10442/) ("RTInfo 
generation can fail for structs defined in imported modules"), 
incompletely fixed?

**Environment:** DMD 2.112.0. The minimal repro fails to link on 
Linux (glibc 2.31, ld). On Windows (MSVC) the full project 
reproduces the same undefined `RTInfoImpl` errors, but this 
minimal repro links there. Possibly COMDAT/weak-symbol handling 
differs, or the `long`-sizing above; I haven't fully reduced the 
Windows case.


More information about the Digitalmars-d-learn mailing list