[cfe-dev] Parse error for addrof overloaded function.

Enea Zaffanella zaffanella at cs.unipr.it
Thu Jul 25 01:49:34 PDT 2013


Hello Richard,

I am afraid there is still something unclear to me
(I may be missing something obvious ...):

On 07/23/2013 11:13 PM, Richard Smith wrote:
> On Tue, Jul 23, 2013 at 1:30 PM, Enea Zaffanella <zaffanella at cs.unipr.it
> <mailto:zaffanella at cs.unipr.it>> wrote:
>
>     Hello.
>
>     When parsing the following program:
>     ==============================__=====
>     $ cat addrof-overloaded.cc
>     struct S {
>        static void foo(int);
>        static void foo(double);
>     } s;
>
>     typedef void (*PF)(int);
>
>     void test() {
>        PF pf1 = s.foo;   // No error.
>        PF pf2 = &s.foo;  // Error(?)
>     }
>     ==============================__=====
>
>     the following parse error is obtained:
>     ==============================__=====
>     $ clang++ -fsyntax-only addrof-overloaded.cc
>     addrof-overloaded.cc:10:12: error: cannot create a non-constant
>     pointer to
>            member function
>        PF pf2 = &s.foo;  // Error(?)
>                 ^~~~~~
>     1 error generated.
>     ==============================__=====
>
>     Is this a known bug?
>
>
> It's not a bug. You can't do that.
> http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#61

Why isn't clang issuing a similar diagnostics for the first line:

 >        PF pf1 = s.foo;   // No error.

Reading 13.4 in the C++03 standard, there seems to be no distinction of 
whether or not the address-of operator is explicitly used (it is meant, 
for non-instance methods):

===================
A use of an overloaded function name without arguments is resolved in 
certain contexts to a function, a pointer to function or a pointer to 
member function for a specific function from the overload set.
[...]
The overloaded function name can be preceded by the & operator. An 
overloaded function name shall not be used without arguments in contexts 
other than those listed.
===================

Which is the bit of the standard saying that the thing is legal if the 
`&' is left implicit?

Thanks in advance for any clarification.

Enea.




More information about the cfe-dev mailing list