Thread overview
AssociativeArray.opIndex
Mar 03, 2012
H. S. Teoh
Mar 03, 2012
David Nadlinger
Mar 03, 2012
Daniel Murphy
Mar 03, 2012
Alix Pexton
Mar 03, 2012
Jonathan M Davis
Mar 04, 2012
Daniel Murphy
March 03, 2012
In attempting to fix issue 5030, I'm finding that defining AssociativeArray.opIndex gives an odd error when druntime is compiled:

dmd: mtype.c:4411: StructDeclaration* TypeAArray::getImpl(): Assertion `impl' failed.

This error only happens when opIndex is declared like this:

	Value opIndex(Key key, int file=__FILE__, int line=__LINE__)

It seems to be OK when declared without the extra parameters, but then if there's any error in the function body, such as a missing return value, another strange error happens:

	src/core/thread.d(2835): Error: undefined identifier module thread.keys

Even though the error has nothing to do with thread.d at all. Apparently there are some unstated assumptions about what's in struct AssociativeArray?


T

-- 
Chance favours the prepared mind. -- Louis Pasteur
March 03, 2012
On Saturday, 3 March 2012 at 05:42:19 UTC, H. S. Teoh wrote:
> dmd: mtype.c:4411: StructDeclaration* TypeAArray::getImpl(): Assertion `impl' failed.
> […]
> 	src/core/thread.d(2835): Error: undefined identifier module thread.keys

These two error messages indicate that the AssociativeArray template couldn't be instantiated (could be more explicit, I know, but DMD currently assumes it always works.

To see what's wrong, you can explicitly instantiate it as AssociativeArray!(Key, Value), so that you'll get to see the actual error messages.

David
March 03, 2012
"H. S. Teoh" <hsteoh@quickfur.ath.cx> wrote in message news:mailman.341.1330753339.24984.digitalmars-d@puremagic.com...
> Value opIndex(Key key, int file=__FILE__, int line=__LINE__)

The AssociateArray stuct has semantic run on it with errors gagged.  Spot the error in the line above!

If you're messing with dmd, try editing 'verror' to print error messages while gagged and it should show up.


March 03, 2012
On 03/03/2012 11:50, Daniel Murphy wrote:
> "H. S. Teoh"<hsteoh@quickfur.ath.cx>  wrote in message
> news:mailman.341.1330753339.24984.digitalmars-d@puremagic.com...
>> Value opIndex(Key key, int file=__FILE__, int line=__LINE__)
>
> The AssociateArray stuct has semantic run on it with errors gagged.  Spot
> the error in the line above!
>
> If you're messing with dmd, try editing 'verror' to print error messages
> while gagged and it should show up.
>
>

I checked the language reference, __FILE__ seems to be a little under documented ^^

A...
March 03, 2012
On Saturday, March 03, 2012 22:50:10 Daniel Murphy wrote:
> "H. S. Teoh" <hsteoh@quickfur.ath.cx> wrote in message news:mailman.341.1330753339.24984.digitalmars-d@puremagic.com...
> 
> > Value opIndex(Key key, int file=__FILE__, int line=__LINE__)
> 
> The AssociateArray stuct has semantic run on it with errors gagged.  Spot the error in the line above!

There are two of them, not one. file is supposed to be a string, and line should be a size_t - though in this particular case, using int for line probably won't result in a compilation error. It's still not correct though - especially when you end up in situations where someone actually gives an argument to line rather than letting it be the default.

- Jonathan M Davis
March 04, 2012
"Jonathan M Davis" <jmdavisProg@gmx.com> wrote in message news:mailman.354.1330804749.24984.digitalmars-d@puremagic.com...
> On Saturday, March 03, 2012 22:50:10 Daniel Murphy wrote:
>> "H. S. Teoh" <hsteoh@quickfur.ath.cx> wrote in message news:mailman.341.1330753339.24984.digitalmars-d@puremagic.com...
>>
>> > Value opIndex(Key key, int file=__FILE__, int line=__LINE__)
>>
>> The AssociateArray stuct has semantic run on it with errors gagged.  Spot the error in the line above!
>
> There are two of them, not one. file is supposed to be a string, and line
> should be a size_t - though in this particular case, using int for line
> probably won't result in a compilation error. It's still not correct
> though -
> especially when you end up in situations where someone actually gives an
> argument to line rather than letting it be the default.
>
> - Jonathan M Davis

Yeah well, there are several levels between something being wrong and something being correct.  Using int instead of string is definately wrong, while using int instead of size_t is only wrong on 64bit, or 32bit when you're using really really really long files.