Bug 8654 – cannot take address of function which is 1)overloaded, 2) templated, and 3) member (static or not): Error: xxx is not an lvalue
Status
RESOLVED
Resolution
DUPLICATE
Severity
major
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-09-13T17:58:00Z
Last change time
2014-04-16T04:45:04Z
Keywords
accepts-invalid
Assigned to
nobody
Creator
thelastmammoth
Comments
Comment #0 by thelastmammoth — 2012-09-13T17:58:46Z
here's my other weird example, which I managed to simplify to as follows. Basically if:
1) the function is overloaded, and
2) it is a template, and
3) it is a member function (either static or nonstatic)
Then you get a CT error that looks like: Error: (A).fun!(2) is not an lvalue
That's a bug too right? (but different!)
I wish delegates were more 1st class citizens and behaved...
----
void run(Fun)(Fun fun){
}
class A {
void fun1(int T)() if(T==2) { }
void fun2(int T)() if(T==1) { }
void fun2(int T)() if(T==2) { }
void fun3(){}
void fun3(int x){}
void fun4(int T)() if(T==1) { }
void fun4(int T)(int x) if(T==2) { }
void fun5(T)() { }
void fun5(T)(int x) { }
static void fun6(int T)() if(T==1) { }
static void fun6(int T)() if(T==2) { }
}
void fun7(int T)() if(T==1) { }
void fun7(int T)() if(T==2) { }
void main(){
auto a=new A;
run(&a.fun1!2); //works
//run(&a.fun2!2); //CT Error: a.fun2!(2) is not an lvalue
run(&a.fun3); //works
//run(&a.fun4!2); //CT Error: a.fun4!(2) is not an lvalue
//run(&a.fun5!double); //CT Error: a.fun5!(double) is not an lvalue
//run(&A.fun6!2); //CT Error: (A).fun6!(2) is not an lvalue
run(&fun7!2); //works
}
----
Comment #1 by yebblies — 2013-11-24T08:03:18Z
All of these now work, except for run(&a.fun5!double); which ICEs after correctly being rejected.
Comment #2 by k.hara.pg — 2014-01-22T08:48:40Z
run(&a.fun3); should be ambiguous, because there's not enough context to determine overload resolution.
Comment #3 by yebblies — 2014-02-04T04:06:32Z
fun5 no longer ices, fun3's accepts-invalid is probably a duplicate.
Comment #4 by k.hara.pg — 2014-04-16T04:45:04Z
(In reply to Kenji Hara from comment #2)
> run(&a.fun3); should be ambiguous, because there's not enough context to
> determine overload resolution.
Current state with 2.066 git-head is:
void main()
{
auto a=new A;
run(&a.fun1!2); // correctly accepted
run(&a.fun2!2); // correctly accepted
run(&a.fun3); // wrongly accepted -> dup of issue 1983
run(&a.fun4!2); // correctly accepted
//run(&a.fun5!double); // correctly rejected
// Error "matches more than one template declaration", expected
run(&A.fun6!2); // correctly accepted
run(&fun7!2); // correctly accepted
}
*** This issue has been marked as a duplicate of issue 1983 ***