Need size of rightmost array, not type...

Ary Manzana ary at esperanto.org.ar
Thu Feb 22 02:57:16 PST 2007


Max Samukha escribió:
> On Wed, 21 Feb 2007 23:59:21 -0300, Ary Manzana <ary at esperanto.org.ar>
> wrote:
> 
>> This compiles fine:
>>
>> ----------------------------------------
>> template Foo() {
>> 	const int Foo = 3;
>> }
>>
>> void one() {
>> 	int x = Foo!();
>> 	char[] buf = new char[x];
>> }
>> ----------------------------------------
>>
>> However this:
>>
>> ----------------------------------------
>> template Foo() {
>> 	const int Foo = 3;
>> }
>>
>> void two() {
>> 	char[] buf = new char[Foo!()];
>> }
>> ----------------------------------------
>>
>> main.d(6): need size of rightmost array, not type Foo!()
>>
>> Why?
> 
> Seems to be a bug. If your array is not big, you might consider using
> a static array as the size is known at compile time.
> 
> char[Foo!()] buf; works

Thanks Max.

Walter:

I don't know why this error appear. I was expecting it not to appear. I 
think the problem is the following functions:

parser.c
#############################################################
Expression *Parser::parseNewExp(Expression *thisexp)
{
     // ...

     #if LTORARRAYDECL
     t = parseBasicType();
     t = parseBasicType2(t);
     if (t->ty == Taarray)
     {
	Type *index = ((TypeAArray *)t)->index;

	Expression *e = index->toExpression();
	if (e)
	{   arguments = new Expressions();
	    arguments->push(e);
	    t = new TypeDArray(t->next);
	}
	else
	{
	    error("need size of rightmost array, not type %s", index->toChars());
	    return new NullExp(loc);
	}
     }
}
#######################################################

It seems e is null. However for the source code I gave, I think index is 
an instance of TypeIdentifier, so it is converted to a DotIdExp:

mtype.c
#######################################################
Expression *TypeIdentifier::toExpression()
{
     Expression *e = new IdentifierExp(loc, ident);
     for (int i = 0; i < idents.dim; i++)
     {
	Identifier *id = (Identifier *)idents.data[i];
	e = new DotIdExp(loc, e, id);
     }

     return e;
}
#######################################################

So:

1. I don't understand why e is null. Maybe index is not an instance of 
TypeIdentifier, but I think it is.
2. I think that function TypeIdentifier::toExpression() is incorrect. It 
is turning a type like "Foo!(a, b)" into an expression "Foo.a.b"... or 
am I misunderstanding something?


More information about the Digitalmars-d-bugs mailing list