Skip to content

Commit

Permalink
fix Issue 17489 - ICE in ddmd/argtypes.d
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Jun 20, 2017
1 parent 8dc55b3 commit 52d9d36
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 28 deletions.
3 changes: 3 additions & 0 deletions src/ddmd/dstruct.d
Expand Up @@ -368,7 +368,10 @@ extern (C++) class StructDeclaration : AggregateDeclaration
{
auto s = (*members)[i];
s.semantic(sc2);
this.errors |= s.errors;
}
if (this.errors)
type = Type.terror;

if (!determineFields())
{
Expand Down
64 changes: 37 additions & 27 deletions test/fail_compilation/fail_circular.d
Expand Up @@ -71,41 +71,51 @@ enum int e2b = .e2a; // CTFE error
/*
TEST_OUTPUT:
---
fail_compilation/fail_circular.d(84): Error: circular reference to variable 'fail_circular.S.a1'
fail_compilation/fail_circular.d(86): Error: circular reference to variable 'fail_circular.S.b1'
fail_compilation/fail_circular.d(88): Error: circular reference to variable 'fail_circular.S.c1'
fail_compilation/fail_circular.d(91): Error: circular reference to variable 'fail_circular.S.a1a'
fail_compilation/fail_circular.d(94): Error: circular reference to variable 'fail_circular.S.b1a'
fail_compilation/fail_circular.d(97): Error: circular reference to variable 'fail_circular.S.c1a'
fail_compilation/fail_circular.d(84): Error: circular reference to variable 'fail_circular.S1.a1'
fail_compilation/fail_circular.d(88): Error: circular reference to variable 'fail_circular.S2.b1'
fail_compilation/fail_circular.d(92): Error: circular reference to variable 'fail_circular.S3.c1'
fail_compilation/fail_circular.d(97): Error: circular reference to variable 'fail_circular.S4.a1a'
fail_compilation/fail_circular.d(102): Error: circular reference to variable 'fail_circular.S5.b1a'
fail_compilation/fail_circular.d(107): Error: circular reference to variable 'fail_circular.S6.c1a'
---
*/
struct S
struct S1
{
static a1 = S.a1; // semantic error

static const b1 = S.b1; // semantic error

enum c1 = S.c1; // semantic error

static a1a = S.a1b;
static a1b = S.a1a; // semantic error

static const b1a = S.b1b;
static const b1b = S.b1a; // semantic error

enum c1a = S.c1b;
enum c1b = S.c1a; // semantic error
static a1 = S1.a1; // semantic error
}
struct S2
{
static const b1 = S2.b1; // semantic error
}
struct S3
{
enum c1 = S3.c1; // semantic error
}
struct S4
{
static a1a = S4.a1b;
static a1b = S4.a1a; // semantic error
}
struct S5
{
static const b1a = S5.b1b;
static const b1b = S5.b1a; // semantic error
}
struct S6
{
enum c1a = S6.c1b;
enum c1b = S6.c1a; // semantic error
}

/*
TEST_OUTPUT:
---
fail_compilation/fail_circular.d(113): Error: circular reference to variable 'fail_circular.C.a1'
fail_compilation/fail_circular.d(115): Error: circular reference to variable 'fail_circular.C.b1'
fail_compilation/fail_circular.d(117): Error: circular reference to variable 'fail_circular.C.c1'
fail_compilation/fail_circular.d(120): Error: circular reference to variable 'fail_circular.C.a1a'
fail_compilation/fail_circular.d(123): Error: circular reference to variable 'fail_circular.C.b1a'
fail_compilation/fail_circular.d(126): Error: circular reference to variable 'fail_circular.C.c1a'
fail_compilation/fail_circular.d(123): Error: circular reference to variable 'fail_circular.C.a1'
fail_compilation/fail_circular.d(125): Error: circular reference to variable 'fail_circular.C.b1'
fail_compilation/fail_circular.d(127): Error: circular reference to variable 'fail_circular.C.c1'
fail_compilation/fail_circular.d(130): Error: circular reference to variable 'fail_circular.C.a1a'
fail_compilation/fail_circular.d(133): Error: circular reference to variable 'fail_circular.C.b1a'
fail_compilation/fail_circular.d(136): Error: circular reference to variable 'fail_circular.C.c1a'
---
*/
class C
Expand Down
5 changes: 4 additions & 1 deletion test/fail_compilation/ice13225.d
Expand Up @@ -2,13 +2,16 @@
TEST_OUTPUT:
---
fail_compilation/ice13225.d(12): Error: mixin ice13225.S.M!(function (S _param_0) => 0) does not match template declaration M(T)
fail_compilation/ice13225.d(13): Error: undefined identifier `undefined`
fail_compilation/ice13225.d(16): Error: undefined identifier `undefined`
---
*/
mixin template M(T) {}

struct S
{
mixin M!((typeof(this)) => 0);
}
struct T
{
mixin M!(() => undefined);
}

0 comments on commit 52d9d36

Please sign in to comment.