This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/60095] Dubious diagnostics for attempted surrogate call function
- From: "egallager at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 21 Aug 2017 16:00:06 +0000
- Subject: [Bug c++/60095] Dubious diagnostics for attempted surrogate call function
- Auto-submitted: auto-generated
- References: <bug-60095-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60095
Eric Gallager <egallager at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |WAITING
Last reconfirmed| |2017-08-21
CC| |egallager at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #3 from Eric Gallager <egallager at gcc dot gnu.org> ---
(In reply to lucdanton from comment #0)
> Using ‘gcc version 4.9.0 20140123 (experimental) (GCC)’ with the following
> snippet:
>
> //--------
>
> struct foo {
> typedef void(*ptr)(int&);
> operator ptr() const;
> };
>
> int main()
> {
> foo f;
> void* p = 0;
> f(p);
> }
>
> //--------
>
> $ g++-trunk -std=c++03 main.cpp
> main.cpp: In function 'int main()':
> main.cpp:10:8: error: no match for call to '(foo) (void*&)'
> f(p);
> ^
> main.cpp:1:8: note: candidate is:
> struct foo {
> ^
> main.cpp:10:8: note: foo::ptr {aka void (*)(int&)} <conversion>
> f(p);
> ^
> main.cpp:10:8: note: candidate expects 2 arguments, 2 provided
>
> Same output for all -std=c++{03,11,1y} modes. If e.g. foo has a call
> operator instead, then the appropriate ‘no known conversion for argument 1
> from 'void*' to 'int&'’ is produced.
Message is now:
$ /usr/local/bin/g++ -c -std=c++03 -Wall -Wextra -pedantic 60095.cc
60095.cc: In function ‘int main()’:
60095.cc:10:8: error: no match for call to ‘(foo) (void*&)’
f(p);
^
60095.cc:10:8: note: candidate: ‘foo::ptr {aka void (*)(int&)}’ <conversion>
60095.cc:10:8: note: conversion of argument 2 would be ill-formed:
60095.cc:10:8: error: invalid conversion from ‘void*’ to ‘int’ [-fpermissive]
60095.cc:10:8: error: cannot bind rvalue ‘(int)p’ to ‘int&’
$
Is that better enough for you? I think it's still kinda confusing, but at least
there's no longer the bogus "expects 2 arguments, 2 provided" note anymore.