From 2f27c59732481880545ca65a4641806087cc23e7 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Sat, 9 Dec 2017 11:00:19 +0100 Subject: [PATCH 1/2] fix issue 8262 - ICE(mtype.c) alias this to alias of an expression tuple check return of aliasthisOf --- src/ddmd/dtemplate.d | 18 ++++++++++----- src/ddmd/mtype.d | 38 ++++++++++++++++++++++---------- test/fail_compilation/fail8262.d | 33 +++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 test/fail_compilation/fail8262.d diff --git a/src/ddmd/dtemplate.d b/src/ddmd/dtemplate.d index 49a046fce235..060aa90c5b8b 100644 --- a/src/ddmd/dtemplate.d +++ b/src/ddmd/dtemplate.d @@ -3416,9 +3416,12 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param TypeClass tc = cast(TypeClass)t; if (tc.sym.aliasthis && !(tc.att & RECtracingDT)) { - tc.att = cast(AliasThisRec)(tc.att | RECtracingDT); - m = deduceType(t.aliasthisOf(), sc, tparam, parameters, dedtypes, wm); - tc.att = cast(AliasThisRec)(tc.att & ~RECtracingDT); + if (auto ato = t.aliasthisOf()) + { + tc.att = cast(AliasThisRec)(tc.att | RECtracingDT); + m = deduceType(ato, sc, tparam, parameters, dedtypes, wm); + tc.att = cast(AliasThisRec)(tc.att & ~RECtracingDT); + } } } else if (t.ty == Tstruct) @@ -3426,9 +3429,12 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param TypeStruct ts = cast(TypeStruct)t; if (ts.sym.aliasthis && !(ts.att & RECtracingDT)) { - ts.att = cast(AliasThisRec)(ts.att | RECtracingDT); - m = deduceType(t.aliasthisOf(), sc, tparam, parameters, dedtypes, wm); - ts.att = cast(AliasThisRec)(ts.att & ~RECtracingDT); + if (auto ato = t.aliasthisOf()) + { + ts.att = cast(AliasThisRec)(ts.att | RECtracingDT); + m = deduceType(ato, sc, tparam, parameters, dedtypes, wm); + ts.att = cast(AliasThisRec)(ts.att & ~RECtracingDT); + } } } } diff --git a/src/ddmd/mtype.d b/src/ddmd/mtype.d index 6f22328f7223..d2442056d245 100644 --- a/src/ddmd/mtype.d +++ b/src/ddmd/mtype.d @@ -7661,9 +7661,14 @@ extern (C++) final class TypeStruct : Type } else if (sym.aliasthis && !(att & RECtracing)) { - att = cast(AliasThisRec)(att | RECtracing); - m = aliasthisOf().implicitConvTo(to); - att = cast(AliasThisRec)(att & ~RECtracing); + if (auto ato = aliasthisOf()) + { + att = cast(AliasThisRec)(att | RECtracing); + m = ato.implicitConvTo(to); + att = cast(AliasThisRec)(att & ~RECtracing); + } + else + m = MATCH.nomatch; // no match } else m = MATCH.nomatch; // no match @@ -7688,9 +7693,12 @@ extern (C++) final class TypeStruct : Type if (t.hasWild() && sym.aliasthis && !(att & RECtracing)) { - att = cast(AliasThisRec)(att | RECtracing); - wm = aliasthisOf().deduceWild(t, isRef); - att = cast(AliasThisRec)(att & ~RECtracing); + if (auto ato = aliasthisOf()) + { + att = cast(AliasThisRec)(att | RECtracing); + wm = ato.deduceWild(t, isRef); + att = cast(AliasThisRec)(att & ~RECtracing); + } } return wm; @@ -8465,9 +8473,12 @@ extern (C++) final class TypeClass : Type m = MATCH.nomatch; if (sym.aliasthis && !(att & RECtracing)) { - att = cast(AliasThisRec)(att | RECtracing); - m = aliasthisOf().implicitConvTo(to); - att = cast(AliasThisRec)(att & ~RECtracing); + if (auto ato = aliasthisOf()) + { + att = cast(AliasThisRec)(att | RECtracing); + m = ato.implicitConvTo(to); + att = cast(AliasThisRec)(att & ~RECtracing); + } } return m; @@ -8505,9 +8516,12 @@ extern (C++) final class TypeClass : Type if (t.hasWild() && sym.aliasthis && !(att & RECtracing)) { - att = cast(AliasThisRec)(att | RECtracing); - wm = aliasthisOf().deduceWild(t, isRef); - att = cast(AliasThisRec)(att & ~RECtracing); + if (auto ato = aliasthisOf()) + { + att = cast(AliasThisRec)(att | RECtracing); + wm = ato.deduceWild(t, isRef); + att = cast(AliasThisRec)(att & ~RECtracing); + } } return wm; diff --git a/test/fail_compilation/fail8262.d b/test/fail_compilation/fail8262.d new file mode 100644 index 000000000000..c2c0303ad946 --- /dev/null +++ b/test/fail_compilation/fail8262.d @@ -0,0 +1,33 @@ +/* TEST_OUTPUT: +--- +fail_compilation\fail8262.d(32): Error: cannot interpret Tuple8262!1 at compile time +fail_compilation\fail8262.d(27): Error: template instance fail8262.T8262!(Tuple8262!1) error instantiating +fail_compilation\fail8262.d(19): Error: cannot implicitly convert expression `S(0)` of type `S` to `int` +--- + * https://issues.dlang.org/show_bug.cgi?id=8262 + */ + +template Seq(T...) { alias T Seq; } + +struct S +{ + int s; + alias Seq!s _; + alias _ this; +} + +int si = S.init; + +struct Tuple8262(T...) +{ + alias T expand; + alias expand this; +} + +auto data = T8262!(Tuple8262!1); +//pragma(msg, data); + +template T8262(T) +{ + immutable(int) T8262 = T; +} From dc2aa503b3485f9ccfd57cd35021fb1d639ceb19 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Tue, 12 Dec 2017 22:47:12 +0100 Subject: [PATCH 2/2] fix test --- test/fail_compilation/fail8262.d | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/fail_compilation/fail8262.d b/test/fail_compilation/fail8262.d index c2c0303ad946..41a72ca2dfc4 100644 --- a/test/fail_compilation/fail8262.d +++ b/test/fail_compilation/fail8262.d @@ -1,8 +1,8 @@ /* TEST_OUTPUT: --- -fail_compilation\fail8262.d(32): Error: cannot interpret Tuple8262!1 at compile time -fail_compilation\fail8262.d(27): Error: template instance fail8262.T8262!(Tuple8262!1) error instantiating -fail_compilation\fail8262.d(19): Error: cannot implicitly convert expression `S(0)` of type `S` to `int` +fail_compilation/fail8262.d(32): Error: cannot interpret Tuple8262!1 at compile time +fail_compilation/fail8262.d(27): Error: template instance fail8262.T8262!(Tuple8262!1) error instantiating +fail_compilation/fail8262.d(19): Error: cannot implicitly convert expression `S(0)` of type `S` to `int` --- * https://issues.dlang.org/show_bug.cgi?id=8262 */