From 52d9d36adb77f8a239f0dde1615ee05ef88e7f71 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Sat, 17 Jun 2017 02:11:51 -0700 Subject: [PATCH] fix Issue 17489 - ICE in ddmd/argtypes.d --- src/ddmd/dstruct.d | 3 ++ test/fail_compilation/fail_circular.d | 64 ++++++++++++++++----------- test/fail_compilation/ice13225.d | 5 ++- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/ddmd/dstruct.d b/src/ddmd/dstruct.d index 2c6808d35830..8ce8e75dff07 100644 --- a/src/ddmd/dstruct.d +++ b/src/ddmd/dstruct.d @@ -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()) { diff --git a/test/fail_compilation/fail_circular.d b/test/fail_compilation/fail_circular.d index 3f4b2762d7a5..dd958af5acfa 100644 --- a/test/fail_compilation/fail_circular.d +++ b/test/fail_compilation/fail_circular.d @@ -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 diff --git a/test/fail_compilation/ice13225.d b/test/fail_compilation/ice13225.d index 612f54106d9b..b042431ed706 100644 --- a/test/fail_compilation/ice13225.d +++ b/test/fail_compilation/ice13225.d @@ -2,7 +2,7 @@ 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) {} @@ -10,5 +10,8 @@ mixin template M(T) {} struct S { mixin M!((typeof(this)) => 0); +} +struct T +{ mixin M!(() => undefined); }