D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 6854 - delegates does not work outside of object
Summary: delegates does not work outside of object
Status: RESOLVED INVALID
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: Other Linux
: P2 major
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-10-25 16:30 UTC by Timofei Bolshakov
Modified: 2011-10-25 20:11 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Timofei Bolshakov 2011-10-25 16:30:25 UTC
Dmd generate an error where it did not before (~2.032) and as far as I understand the language where it should not.

dmd version: 2.055
OS Linux 

Here is the piece of code:
________________________________________________________________
#!/usr/bin/rdmd

import  std.datetime;

alias bool delegate (  )                       predicate;

predicate wait_for_seconds( immutable uint seconds = 0 ){ 
    immutable long start = SysTime.stdTime; 
    return delegate (){ return seconds==0 ? true : ( (SysTime.stdTime - start) < seconds*10_000_000L ); }; 
}

void main( string [] args ){
}
______________________________________________________________
here is what compiler tells:
./tst.d(8): Error: 'this' is only defined in non-static member functions, not __dgliteral1
Comment 1 Jonathan M Davis 2011-10-25 16:51:29 UTC
That code is definitely wrong. stdTime is not a static function. It must be called on an object of type SysTime, not on the type itself. You probably want something more like this:

import  std.datetime;

alias bool delegate (  )                       predicate;

predicate wait_for_seconds( immutable uint seconds = 0 )
{ 
    auto start = Clock.currTime();

    return delegate ()
    {
        return seconds == 0 ? true
                            : Clock.currTime() - start < dur!"seconds"(seconds);
    };
}

void main( string [] args )
{
}

though whether that does exactly what you want, I don't know (e.g. I would have that that you'd want to use >, not < given the function name, but your code has <).

You might want to check out this article if you want know more about std.datetime beyond just reading the docs: http://d-programming-language.org/intro-to-datetime.html
Comment 2 Timofei Bolshakov 2011-10-25 20:11:42 UTC
Sorry - you are 100% right - filed a bug too fast. really sorry.