D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 8938 - static struct initializer allows to not explicitly initialize members with disabled constructor
Summary: static struct initializer allows to not explicitly initialize members with di...
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: No Owner
URL:
Keywords: accepts-invalid
Depends on:
Blocks:
 
Reported: 2012-11-02 07:46 UTC by Denis Shelomovskii
Modified: 2022-08-16 11:51 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Denis Shelomovskii 2012-11-02 07:46:46 UTC
Current behavior:
---
struct S0 { @disable this(); }
struct S  { int i; S0 s0; }

static assert(!__traits(compiles, { S0 s; }));
static assert(!__traits(compiles, { S0 s = S0(); }));
static assert( __traits(compiles, { S0 s = S0.init; }));
static assert(!__traits(compiles, {
    struct S1 { S0 s0; this(int) { } }
}));

static assert(!__traits(compiles, { S s; }));
static assert( __traits(compiles, { S s = S(5, S0.init); }));
static assert(!__traits(compiles, { S s = S(); }));     // assert failure
static assert(!__traits(compiles, { S s = S(5); }));    // assert failure
static assert(!__traits(compiles, { S x = { }; }));     // assert failure
static assert(!__traits(compiles, { S x = { i:1 }; })); // assert failure
---


It looks inconsistent because this is disabled:
---
struct S1 {
    int i;
    S0 s0;

    // Error: constructor main.S1.this field s0 must be initialized in constructor
    this(int i) { this.i = i; }
}
---
Comment 1 RazvanN 2022-08-16 11:51:34 UTC
The code now compiles successfully with git head. Closing as fixed.