support casts in initializers
rework of #710, reuses the existing type construction Co-authored-by: ryuukk <ryuukk.dev@gmail.com>
This commit is contained in:
parent
fe6ce04720
commit
dcffd378e1
|
@ -1133,9 +1133,10 @@ private:
|
||||||
auto lookup = l ? l : TypeLookupsAllocator.instance.make!TypeLookup(TypeLookupKind.varOrFunType);
|
auto lookup = l ? l : TypeLookupsAllocator.instance.make!TypeLookup(TypeLookupKind.varOrFunType);
|
||||||
|
|
||||||
lookup.breadcrumbs.insert(TYPEOF_SYMBOL_NAME);
|
lookup.breadcrumbs.insert(TYPEOF_SYMBOL_NAME);
|
||||||
scope (exit)
|
|
||||||
lookup.breadcrumbs.insert(TYPEOF_END_SYMBOL_NAME);
|
|
||||||
scope visitor = new InitializerVisitor(lookup, appendForeach, this);
|
scope visitor = new InitializerVisitor(lookup, appendForeach, this);
|
||||||
|
scope (exit)
|
||||||
|
if (!visitor.isCast)
|
||||||
|
lookup.breadcrumbs.insert(TYPEOF_END_SYMBOL_NAME);
|
||||||
|
|
||||||
if (l is null)
|
if (l is null)
|
||||||
lookups.insert(lookup);
|
lookups.insert(lookup);
|
||||||
|
@ -1586,6 +1587,25 @@ class InitializerVisitor : ASTVisitor
|
||||||
on = false;
|
on = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override void visit(const CastExpression expression)
|
||||||
|
{
|
||||||
|
if (expression.type)
|
||||||
|
{
|
||||||
|
if (lookup.breadcrumbs.empty || lookup.breadcrumbs.back != TYPEOF_SYMBOL_NAME)
|
||||||
|
return;
|
||||||
|
|
||||||
|
isCast = true;
|
||||||
|
lookup.breadcrumbs.popBack();
|
||||||
|
TypeLookups none;
|
||||||
|
fp.addTypeToLookups(none, expression.type, lookup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we don't care about non-type casts (e.g. `cast()` or `cast(const)`) yet
|
||||||
|
expression.accept(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override void dynamicDispatch(const ExpressionNode expression)
|
override void dynamicDispatch(const ExpressionNode expression)
|
||||||
{
|
{
|
||||||
on = true;
|
on = true;
|
||||||
|
@ -1599,6 +1619,7 @@ class InitializerVisitor : ASTVisitor
|
||||||
bool on = false;
|
bool on = false;
|
||||||
const bool appendForeach;
|
const bool appendForeach;
|
||||||
FirstPass fp;
|
FirstPass fp;
|
||||||
|
bool isCast;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ArgumentListVisitor : ASTVisitor
|
class ArgumentListVisitor : ASTVisitor
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
identifiers
|
||||||
|
alignof k
|
||||||
|
init k
|
||||||
|
inside_c v
|
||||||
|
mangleof k
|
||||||
|
sizeof k
|
||||||
|
stringof k
|
||||||
|
tupleof k
|
|
@ -0,0 +1,26 @@
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
struct B
|
||||||
|
{
|
||||||
|
struct C
|
||||||
|
{
|
||||||
|
int inside_c;
|
||||||
|
}
|
||||||
|
int inside_b;
|
||||||
|
}
|
||||||
|
int inside_a;
|
||||||
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
auto from_cast = cast(A.B.C) nonExist;
|
||||||
|
from_cast.
|
||||||
|
}
|
||||||
|
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
struct A {}
|
||||||
|
|
||||||
|
auto from_cast = cast(A.B.C) nonExist;
|
||||||
|
from_cast.
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
set -e
|
||||||
|
set -u
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file.d -c159 > actual1.txt
|
||||||
|
diff actual1.txt expected1.txt --strip-trailing-cr
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file.d -c239 > actual2.txt
|
||||||
|
diff actual2.txt expected2.txt --strip-trailing-cr
|
Loading…
Reference in New Issue