Thread overview
[Issue 11048] New: Default arguments not taken into account when being called by pure functions
Sep 15, 2013
Jonathan M Davis
Sep 16, 2013
Andrej Mitrovic
Sep 16, 2013
Jonathan M Davis
September 15, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11048

           Summary: Default arguments not taken into account when being
                    called by pure functions
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: jmdavisProg@gmx.com


--- Comment #0 from Jonathan M Davis <jmdavisProg@gmx.com> 2013-09-15 14:54:15 PDT ---
int x = 7;

void foo() pure
{
    // Does not detect use of mutable global and compiles when it shouldn't.
    bar();

    // Correctly detects the use of a mutable global and gives an error
    baz(x);
}

void bar(int a = x) pure {}

void baz(int a) pure {}

void main() {}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 16, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11048


Andrej Mitrovic <andrej.mitrovich@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrej.mitrovich@gmail.com


--- Comment #1 from Andrej Mitrovic <andrej.mitrovich@gmail.com> 2013-09-16 08:48:37 PDT ---
So should the declaration of such a function be denied if it's pure, or should only calls be denied where a global is used? E.g.:

// 1. ban this declaration?
void bar(int a = x) pure {}

// 2. or just this call?
bar();

// If #2, then this could be considered ok:
bar(1);

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 16, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11048



--- Comment #2 from Jonathan M Davis <jmdavisProg@gmx.com> 2013-09-16 09:35:22 PDT ---
The default argument is only a problem if the pure function is called from a pure function. It's perfectly fine if it's called from an impure one. The problem is not that the default argument references a global but that the caller does not detect that the default argument of the function it's calling is a global. So, the caller does not detect that the call violates purity.

The simplest solution is probably to ban the declaration, because then the caller doesn't have to worry about whether the pure function that it's calling has any default arguments which would violate the purity of the caller, but ideally, it's just the call which would be illegal, because the default argument is just fine so long as the caller isn't pure.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------