Bug 7838 – Give some error messages for wrong ranges

Status
RESOLVED
Resolution
LATER
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2012-04-05T17:55:22Z
Last change time
2021-03-16T10:42:09Z
Keywords
diagnostic
Assigned to
No Owner
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2012-04-05T17:55:22Z
I'd like DMD to give some error messages for wrong definitions of ranges, like in this case: struct Powers { int m; BigInt n; this(int m_) { this.m = m_; } const bool empty = false; BigInt front() { return n ^^ m; } void popFront() { n += 1; } } It looks correct, but it's wrong. ElementType!Powers is void. The correct code (a @property was missing): struct Powers { int m; BigInt n; this(int m_) { this.m = m_; } const bool empty = false; @property BigInt front() { return n ^^ m; } void popFront() { n += 1; } }
Comment #1 by ricochet1k — 2012-04-05T19:42:00Z
My understanding is that you would usually put a static assert with isInputRange, or a more specific template from std.range immediately after the struct. How is DMD supposed to know that that struct is suppose to be a range otherwise?
Comment #2 by bearophile_hugs — 2012-04-06T10:09:17Z
(In reply to comment #1) > My understanding is that you would usually put a static assert with > isInputRange, or a more specific template from std.range immediately after the > struct. This is an example program: import std.range, std.bigint; struct Powers { int m; BigInt n; this(int m_) { this.m = m_; } const bool empty = false; BigInt front() { return n ^^ m; } void popFront() { n += 1; } } static assert(isInputRange!Powers); void main() {} If I compile it with DMD 2.059beta: ...>dmd -property -run temp.d temp.d(10): Error: static assert (isInputRange!(Powers)) is false So it gives me no hint where the problem is. A built-in error message is supposed to be more precise. As alternative, maybe there is a way to add focused error messages inside a isInputRangeVerify template to be used to verify that an input range is correct, that uses pragma(msg) or better ctWriteln. > How is DMD supposed to know that that struct is suppose to be a range > otherwise? I see, it's a problem. So here we are talking more about a probabilistic compiler tip. If the class/struct contains a popFront and front and empty methods then the programmer probably meants it to be a range. Thank you for your answer.
Comment #3 by ricochet1k — 2012-04-06T10:47:21Z
Yeah, I think the best solution is to add verifyInputRange etc. templates to std.range, where each criteria is checked by a separate static assert. It's just a little ugly because there will end up being nearly duplicate templates for all the different range types.
Comment #4 by bearophile_hugs — 2012-04-06T11:06:31Z
(In reply to comment #3) > It's just a little ugly because there will end up being nearly > duplicate templates for all the different range types. I think putting such test code inside DMD itself doesn't reduce the overall complexity a lot...
Comment #5 by razvan.nitu1305 — 2021-03-16T10:42:09Z
The problem with this is that it might brake code that implements some of the range functions but doesn't care about the others. Also, I don't think identifying why an entity is not a range is that problematic. Since this issue is rather old and people have not been complaining about this, I will close as LATER. If this comes up again, please reopen.