www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 7838] New: Give some error messages for wrong ranges

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7838

           Summary: Give some error messages for wrong ranges
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: diagnostic
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc


--- Comment #0 from bearophile_hugs eml.cc 2012-04-05 17:55:22 PDT ---
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; }
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 05 2012
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7838


Matt Peterson <revcompgeek gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |revcompgeek gmail.com


--- Comment #1 from Matt Peterson <revcompgeek gmail.com> 2012-04-05 19:42:00
PDT ---
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?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 05 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7838



--- Comment #2 from bearophile_hugs eml.cc 2012-04-06 10:09:17 PDT ---
(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. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 06 2012
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7838



--- Comment #3 from Matt Peterson <revcompgeek gmail.com> 2012-04-06 10:47:21
PDT ---
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.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 06 2012
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7838



--- Comment #4 from bearophile_hugs eml.cc 2012-04-06 11:06:31 PDT ---
(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... -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 06 2012