[Issue 15310] New: [dmd-internal] TemplateDeclaration should be converted to TemplateExp always
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Mon Nov 9 18:47:11 PST 2015
https://issues.dlang.org/show_bug.cgi?id=15310
Issue ID: 15310
Summary: [dmd-internal] TemplateDeclaration should be converted
to TemplateExp always
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: k.hara.pg at gmail.com
In DsymbolExp.resolve, a TemplateDeclaration is converted to TemplateExp.
extern (C++) final class DsymbolExp : Expression
{
...
static Expression resolve(Loc loc, Scope *sc, Dsymbol s, bool hasOverloads)
{
...
if (TemplateDeclaration td = s.isTemplateDeclaration())
{
auto p = td.toParent2();
auto fdthis = hasThis(sc);
auto ad = p ? p.isAggregateDeclaration() : null;
if (...)
{
...
}
else
e = new TemplateExp(loc, td); // here
e = e.semantic(sc);
return e;
}
However in DotIdExp.semanticY, the found TemplateDeclaration is converted to
ScopeExp.
extern (C++) final class DotIdExp : UnaExp
{
...
Expression semanticY(Scope* sc, int flag)
{
...
if (eright.op == TOKimport)
{
Dsymbol s = ie.sds.search(loc, ident, ...);
if (s)
{
...
ScopeDsymbol sds = s.isScopeDsymbol();
if (sds)
{
// here, because TemplateDeclaration is derived from ScopeDsymbol
//printf("it's a ScopeDsymbol %s\n", ident->toChars());
e = new ScopeExp(loc, sds);
e = e.semantic(sc);
if (eleft)
e = new DotExp(loc, eleft, e);
return e;
}
By this, a TemplateDeclaration handling code should consider both TOKtemplate
(TemplateExp) and TOKimport (ScopeExp) in everywhere. It's problematic and
bug-prone.
--
More information about the Digitalmars-d-bugs
mailing list