Closed haoyu234 closed 1 month ago
!nim c
type O = object
data: UncheckedArray[byte]
proc f() =
let n = offsetOf(O, data)
doAssert n != 0, $n
f()
@juancarlospaco (collaborator)devel :-1: FAIL
Output
Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim temp
/home/runner/work/Nim/Nim/temp.nim f
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim failedAssertImpl
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim raiseAssert
/home/runner/.choosenim/toolchains/nim-#devel/lib/system/fatal.nim sysFatal
Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(5, 3) `n != 0` 0 [AssertionDefect]
Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp'
2023-08-25T12:21:27
2023-08-25T12:21:28
1 minutes
93.84 Kb (96,096 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:21:29
2023-08-25T12:21:30
91.68 Kb (93,880 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:21:30
2023-08-25T12:21:31
91.68 Kb (93,880 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:21:34
2023-08-25T12:21:35
95.38 Kb (97,672 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:21:38
2023-08-25T12:21:39
91.77 Kb (93,968 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:21:56
2023-08-25T12:21:56
91.53 Kb (93,728 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:22:09
2023-08-25T12:22:10
86.54 Kb (88,616 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-25T12:22:19
2023-08-25T12:22:20
86.22 Kb (88,288 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 11.4.0
2.35
3.18.1
17.1
5.15.0
2023-08-25T12:20:40Z
1
nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
56 minutes
bisecting 8
commits at 0
commits per second. @haoyu234 Beware nim is not C-backend only.
Firstly, dummy
is to deal with the limit of C implementation. For example, it won't appear if using js backend [^1]
What's more, offsetof
in fact works in compilation-time, which means it shall not consider how Chunk
is implemented in backend language.
All in all, nim shall not be aware if a dummy
exists;
And, if seeing nim-code, everyone will tell data
is in the first i.e. 0-index.
Therefore, making offset 1
may not be a good idea
[^1]: just a non-practical example
there is no bug here. And the result of offsetOf
in this case is alway 0 in every version.
No, the bug is very real.
on gcc, clang, icc, zigcc: struct{} dummy; //zero bytes, but enough to shut up the 'named field' error on msvc: //cant use empty struct, but works without a dummy char. godbolt
either way, offsetOf and sizeOf are correct at 0,0
on gcc, clang, icc, zigcc: struct{} dummy; //zero bytes, but enough to shut up the 'named field' error on msvc: //cant use empty struct, but works without a dummy char.
It's undefined behavior
(C11, 6.7.2.1 Structure and union specifiers p8) "If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined."
but a GNU C extension:
ref https://stackoverflow.com/questions/24685399/c-empty-struct-what-does-this-mean-do
C/C++ returns different results for offsetOf and sizeOf
C: 0, 0 C++: 1, 1
Description
Here is my code example:
This is the C code generated by the NIM compiler:
From the above c code, you can see that the offset of the 'data' field should not be 0.
Nim Version
Nim Compiler Version 2.1.1 [Linux: amd64] Compiled at 2023-08-23 Copyright (c) 2006-2023 by Andreas Rumpf
git hash: 6b04d0395ab1d6d8efa7d287c73da2c7230800c9 active boot switches: -d:release
Current Output
Expected Output
Possible Solution
No response
Additional Information
I also ran into another issue, which I'll explain in a new issue.