Bug 21978 – Error: CTFE internal error: painting `T*` / array of pointers in heap allocated struct not null initialized

Status
NEW
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2021-05-25T23:10:56Z
Last change time
2024-12-13T19:16:39Z
Keywords
CTFE, pull
Assigned to
No Owner
Creator
Witold Baryluk
Moved to GitHub: dmd#19935 →

Comments

Comment #0 by witold.baryluk+d — 2021-05-25T23:10:56Z
``` struct TrieNode { TrieNode*[256] childs; void insert() { if (childs[0] is null) {} } } TrieNode* build_trie() { TrieNode* t = new TrieNode(); t.insert(); return t; } pragma(msg, build_trie()); ``` does fail with: t1.d(9): Error: CTFE internal error: painting `TrieNode*` The pragma actually does display the TrieNode "returned", but it looks corrupted, and instead of about 1000 bytes of output (that I would expect here), it displays a deeply nested recursive TrieNode, with about 789kB of output. Additionally adding `child[0] = null;`, as first statement in the insert method, the Error goes away, but the pragma still looks to be producing incorrect result here. Adding `t.childs[] = null;`, after `TrieNode* t = new TrieNode();` in the `build_trie` function, does appear to resolve the issue. So all things considered it looks like the array of pointers is not properly null initialized as it should be according to spec. I discovered this issue with ldc2 1.24.0 (dmd fe v2.094.1) on Linux, amd64, Debian, but same happens with gdc 10.2.1-6, and with dmd tested on run.dlang.io: https://run.dlang.io/is/MJKc9N Up to 2.060 : Success with output: &TrieNode([null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]) 2.061 to 2.066.0: Success with output: &TrieNode([null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]) 2.067.1 to 2.078.1: Segfault with output: onlineapp.d(8): Error: CTFE internal error: painting TrieNode* Since 2.079.1: Segfault with output: onlineapp.d(8): Error: CTFE internal error: painting `TrieNode*` So, it does appear it is a regression, introduced first in 2.067.
Comment #1 by dlang-bot — 2021-06-08T11:57:34Z
@RazvanN7 created dlang/dmd pull request #12647 "Fix Issue 21978 - Error: CTFE internal error: painting / array of pointers in heap allocated struct not null initialized" fixing this issue: - Fix Issue 21978 - Error: CTFE internal error: painting / array of pointers in heap allocated struct not null initialized https://github.com/dlang/dmd/pull/12647
Comment #2 by robert.schadek — 2024-12-13T19:16:39Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19935 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB