Bug 15664 – [REG2.064] incorrect initialisation of member of an immutable struct

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2016-02-09T15:13:00Z
Last change time
2016-03-11T01:57:20Z
Keywords
pull, wrong-code
Assigned to
nobody
Creator
abulmo

Comments

Comment #0 by abulmo — 2016-02-09T15:13:47Z
[code] import std.stdio; struct Data { int a[2]; int b[2][2]; int c; }; immutable Data d = {[ 1, 2], [[ 3, 4], [5, 6]], 7}; unittest { assert(d.c == 7); } void main() { writeln(d); } [/code] Compiled with dmd x86_64 (version 2.62.2 & 2.70.0) on linux (fedora), it gives the incorrect following output: immutable(Data)([1, 2], [[3, 4], [5, 6]], 3) the expected output is: immutable(Data)([1, 2], [[3, 4], [5, 6]], 7) Optimization compilation flags does not have any impact on the output. The -unittest flag triggers the assert.
Comment #1 by k.hara.pg — 2016-02-11T07:01:47Z
This is a codegen regression from 2.094, introduced in: https://github.com/D-Programming-Language/dmd/pull/2659
Comment #2 by k.hara.pg — 2016-02-11T07:25:36Z
Comment #3 by github-bugzilla — 2016-02-23T14:16:53Z
Commits pushed to stable at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/c396fd9941f873c6ed9fd5ac281621dd911d6f7a fix Issue 15664 - incorrect initialisation of member of an immutable struct When a struct literal appears in dataseg or TLS variable initialization, its elements `StructLiteralExp.elements[i]` are also painted to the qualifier of constructed struct type. But in `toDtElem`, type identity comparison was used to calculate array dimension, so the qualifier difference had caused wrong code. https://github.com/D-Programming-Language/dmd/commit/cf670840a444413bc99ce721f19260c35450a766 Merge pull request #5440 from 9rnsr/fix15664 [REG2.064] Issue 15664 - incorrect initialisation of member of an immutable struct
Comment #4 by github-bugzilla — 2016-02-24T02:55:33Z