Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions src/ddmd/dtemplate.d
Original file line number Diff line number Diff line change
Expand Up @@ -3416,19 +3416,25 @@ 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)
{
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);
}
}
}
}
Expand Down
38 changes: 26 additions & 12 deletions src/ddmd/mtype.d
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions test/fail_compilation/fail8262.d
Original file line number Diff line number Diff line change
@@ -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;
}