www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 13929] New: nothrow nogc gcd with signed integers


          Issue ID: 13929
           Summary: nothrow  nogc gcd with signed integers
           Product: D
           Version: D2
          Hardware: x86
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: Phobos
          Assignee: nobody puremagic.com
          Reporter: bearophile_hugs eml.cc

void main() nothrow  nogc {
    import std.numeric: gcd;
    auto z = gcd(10, 20);

dmd 2.067alpha gives:

test.d(3,17): Error:  nogc function 'D main' cannot call non- nogc function
test.d(3,17): Error: 'std.numeric.gcd!int.gcd' is not nothrow
test.d(1,6): Error: function 'D main' is nothrow yet may throw

Perhaps it's better to replace the enforce() with an assert in a pre-condition.

Currently gcd is implemented like this:

T gcd(T)(T a, T b)
    static if (is(T == const) || is(T == immutable))
        return gcd!(Unqual!T)(a, b);
        static if (T.min < 0)
            enforce(a >= 0 && b >=0);
        while (b)
            auto t = b;
            b = a % b;
            a = t;
        return a;

Jan 03 2015