D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 2840 - Missing line number for int %= complex (D1 only)
Summary: Missing line number for int %= complex (D1 only)
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 All
: P2 minor
Assignee: No Owner
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2009-04-16 03:45 UTC by Don
Modified: 2014-04-18 09:12 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Don 2009-04-16 03:45:58 UTC
void main(){
   int x;
   x %= 2+2i;
}
fog.d(3): Error: cannot perform modulo complex arithmetic
Error: long has no effect in expression (0)

---
I don't know where the 'long' comes from.
Both D1 and D2. This is one of the many op= bugs for erroneous complex operations, along with issue #718 and issue #2839.
Comment 1 Don 2009-06-09 16:38:34 UTC
Root cause: ErrorExp() should not generate more error messages (ErrorExp never has a line number).

PATCH: Solve it for all expression error messages.
expression.c, line 948

void Expression::error(const char *format, ...)
{
+   if (type==Type::terror) return;
    va_list ap;
    va_start(ap, format);
    ::verror(loc, format, ap);
    va_end( ap );
}
Comment 2 Frits van Bommel 2009-06-10 02:52:34 UTC
Don, you may want to look at mtype.c, line 224. "basic[Terror] = basic[Tint32]". That's right, Type::terror == Type::tint32. (This is why 'int' shows up in so many error messages) So your patch would disable errors for any expression that's legitimately of type int.
In order to fix it this way, you'd need to also introduce a separate error type. (Which I'm sure many people would appreciate if done properly, by the way)
Comment 3 Don 2009-06-10 17:21:46 UTC
Aargh! You're right. That's useless! That defeats the whole purpose of an error type.
It also makes ErrorExp() completely erroneous, because it's just an integer expression without line number! (there's no Loc in the constructor).

I think there's at least one other patch I've submitted which is invalid for the same reason.
There definitely needs to be an error type. It would take a lot of familiarity with the code to be able to make one, though.
Comment 4 Don 2010-06-14 04:33:01 UTC
Fixed DMD2.062.
Comment 5 Don 2010-06-14 04:33:26 UTC
Fixed DMD1.062.