View mode: basic / threaded / horizontal-split · Log in · Help
July 22, 2012
[Issue 8408] New: Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408

          Summary: Purity calculation should be improved
          Product: D
          Version: D2
         Platform: All
       OS/Version: All
           Status: NEW
         Severity: normal
         Priority: P2
        Component: DMD
       AssignedTo: nobody@puremagic.com
       ReportedBy: k.hara.pg@gmail.com


--- Comment #0 from Kenji Hara <k.hara.pg@gmail.com> 2012-07-22 05:27:35 PDT ---
If the argument values that given to a function marked as pure doesn't appear
in its return value, then the function should become 'strong purity'.

An example:

int[] func(const(int)[] arr) pure;

The parameter 'arr' refers const integers through its slice, but func returns
int[], so func cannot return arr directly (without unsafe cast) and becomes
'strong purity' function.

The parameter 'arr' refers const integers through its slice, but func returns
int[]. const(int)[] is not implicitly convertible to int[], then func cannot
return arr directly (without unsafe cast like cast(int[]) arr) and becomes
'strong purity' function.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 09, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408


Kenji Hara <k.hara.pg@gmail.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
          Keywords|                            |pull


--- Comment #1 from Kenji Hara <k.hara.pg@gmail.com> 2012-09-09 06:21:21 PDT ---
https://github.com/D-Programming-Language/dmd/pull/1110

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 09, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408


bearophile_hugs@eml.cc changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
                CC|                            |bearophile_hugs@eml.cc


--- Comment #2 from bearophile_hugs@eml.cc 2012-09-09 07:03:15 PDT ---
This rule makes more functions (tagged as pure) become strongly pure, this is
positive.

On the other hand for the programmer it's increasingly harder to know if a
function is weak pure or strongly pure just looking at it.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 09, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #3 from Kenji Hara <k.hara.pg@gmail.com> 2012-09-09 07:24:46 PDT ---
(In reply to comment #2)
> This rule makes more functions (tagged as pure) become strongly pure, this is
> positive.

Thanks. But, I've been filed this as a part of issue 8409, so the pull request
doesn't cover all cases.

> On the other hand for the programmer it's increasingly harder to know if a
> function is weak pure or strongly pure just looking at it.

I think it is not so difficult if you summarize it.

- If the function can modify function argument through its parameters, it is
weakly pure.

- If the function arguments don't appear in the part of the returned value, or
the returned value is not a part of arguments, then it is strongly pure.

- Otherwise, it is constant pure.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 13, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #4 from bearophile_hugs@eml.cc 2012-11-12 20:23:55 PST ---
*** Issue 9011 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 04, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #5 from github-bugzilla@puremagic.com 2012-12-03 22:00:20 PST ---
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/41c52a324d0526a079039041c64afc1d3983eb58
fix Issue 8408 - Purity calculation should be improved

https://github.com/D-Programming-Language/dmd/commit/b6a809346a43c7fbf350bd4181d350dd9b2cd4e6
Merge pull request #1110 from 9rnsr/fix8408

Issue 8408 - Purity calculation should be improved

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 06, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #6 from bearophile_hugs@eml.cc 2012-12-05 17:36:09 PST ---
Is it correct that x1 refused and x2 accepted?


char[] foo1(int[] arr) pure {
   return new char[10];
}
immutable(char)[] foo2(int[] arr) pure {
   return new char[10];
}
void main(string[] args) {
   immutable x1 = foo1([1, 2]); // Error: cannot implicitly convert
   immutable x2 = foo2([1, 2]); // OK
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 07, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #7 from bearophile_hugs@eml.cc 2012-12-06 18:07:32 PST ---
(In reply to comment #6)
> Is it correct that x1 refused and x2 accepted?

I guess I have to wait or Issue 8409 to be fixed before looking for possible
troubles.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 07, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408



--- Comment #8 from Kenji Hara <k.hara.pg@gmail.com> 2012-12-06 19:33:50 PST ---
(In reply to comment #6)
> Is it correct that x1 refused and x2 accepted?
> 
> 
> char[] foo1(int[] arr) pure {
>     return new char[10];
> }
> immutable(char)[] foo2(int[] arr) pure {
>     return new char[10];
> }
> void main(string[] args) {
>     immutable x1 = foo1([1, 2]); // Error: cannot implicitly convert
>     immutable x2 = foo2([1, 2]); // OK
> }

I'm not sure that this should be allowed.
foo1 can rewrite the elements referred from arr, then it is deduced to weak
purity. In current principle, the returned value from weak purity function
cannot be converted to immutable implicitly (it is only allowed for strong
purity function).

If you change the signature of foo1 to:

 char[] foo1(const int[] arr) pure;

Then foo1 will be deduced to strong purity, and implicit conversion to
immutable for initializing x1 will be succeeded.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 11, 2012
[Issue 8408] Purity calculation should be improved
http://d.puremagic.com/issues/show_bug.cgi?id=8408


Walter Bright <bugzilla@digitalmars.com> changed:

          What    |Removed                     |Added
----------------------------------------------------------------------------
            Status|NEW                         |RESOLVED
                CC|                            |bugzilla@digitalmars.com
        Resolution|                            |FIXED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home