Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Issue 1064 - Tuples are not expanded in array initializers #690

Merged
merged 1 commit into from

2 participants

Daniel Murphy Hara Kenji
Daniel Murphy
Collaborator

Expand any tuples in place. expandTuples from expression.c cannot be used because this is an array of ExpInitializers, not Expressions.

http://d.puremagic.com/issues/show_bug.cgi?id=1064

Daniel Murphy yebblies Issue 1064 - Tuples are not expanded in array initializers
Expand any tuples in place. expandTuples from expression.c cannot be used because this is an array of ExpInitializers, not Expressions.
0e6f621
Hara Kenji 9rnsr merged commit 162cf30 into from
Hara Kenji
Collaborator

Merged.

Hara Kenji 9rnsr referenced this pull request from a commit in 9rnsr/dmd
Hara Kenji 9rnsr merge D2 pull #690 55bedf4
Brad Roberts braddr referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
Brad Roberts braddr referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
Brad Roberts braddr referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Apr 14, 2012
  1. Daniel Murphy

    Issue 1064 - Tuples are not expanded in array initializers

    yebblies authored
    Expand any tuples in place. expandTuples from expression.c cannot be used because this is an array of ExpInitializers, not Expressions.
This page is out of date. Refresh to see the latest.
Showing with 45 additions and 1 deletion.
  1. +32 −1 src/init.c
  2. +1 −0  src/init.h
  3. +12 −0 test/runnable/xtest46.d
33 src/init.c
View
@@ -496,8 +496,33 @@ Initializer *ArrayInitializer::semantic(Scope *sc, Type *t, int needInterpret)
}
Initializer *val = value[i];
+ ExpInitializer *ei = val->isExpInitializer();
+ if (ei && !idx)
+ ei->expandTuples = 1;
val = val->semantic(sc, t->nextOf(), needInterpret);
- value[i] = val;
+
+ ei = val->isExpInitializer();
+ // found a tuple, expand it
+ if (ei && ei->exp->op == TOKtuple)
+ {
+ TupleExp *te = (TupleExp *)ei->exp;
+ index.remove(i);
+ value.remove(i);
+
+ for (size_t j = 0; j < te->exps->dim; ++j)
+ {
+ Expression *e = (*te->exps)[j];
+ index.insert(i + j, (Expression *)NULL);
+ value.insert(i + j, new ExpInitializer(e->loc, e));
+ }
+ i--;
+ continue;
+ }
+ else
+ {
+ value[i] = val;
+ }
+
length++;
if (length == 0)
{ error(loc, "array dimension overflow");
@@ -743,6 +768,7 @@ ExpInitializer::ExpInitializer(Loc loc, Expression *exp)
: Initializer(loc)
{
this->exp = exp;
+ this->expandTuples = 0;
}
Initializer *ExpInitializer::syntaxCopy()
@@ -827,6 +853,11 @@ Initializer *ExpInitializer::semantic(Scope *sc, Type *t, int needInterpret)
Type *tb = t->toBasetype();
+ if (exp->op == TOKtuple &&
+ expandTuples &&
+ !exp->implicitConvTo(t))
+ return new ExpInitializer(loc, exp);
+
/* Look for case of initializing a static array with a too-short
* string literal, such as:
* char[5] foo = "abc";
1  src/init.h
View
@@ -114,6 +114,7 @@ struct ArrayInitializer : Initializer
struct ExpInitializer : Initializer
{
Expression *exp;
+ int expandTuples;
ExpInitializer(Loc loc, Expression *exp);
Initializer *syntaxCopy();
12 test/runnable/xtest46.d
View
@@ -4033,6 +4033,17 @@ void test4647()
}
/***************************************************/
+
+template T1064(E...) { alias E T1064; }
+
+int[] var1064 = [ T1064!(T1064!(T1064!(1, 2), T1064!(), T1064!(3)), T1064!(4, T1064!(T1064!(T1064!(T1064!(5)))), T1064!(T1064!(T1064!(T1064!())))),6) ];
+
+void test1064()
+{
+ assert(var1064 == [1,2,3,4,5,6]);
+}
+
+/***************************************************/
// 5696
template Seq5696(T...){ alias T Seq5696; }
@@ -5111,6 +5122,7 @@ int main()
test1891();
test129();
test130();
+ test1064();
test131();
test132();
test133();
Something went wrong with that request. Please try again.