This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/81547] New: Surrogate call function results in call to other conversion operator
- From: "hstong at ca dot ibm.com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 25 Jul 2017 03:32:17 +0000
- Subject: [Bug c++/81547] New: Surrogate call function results in call to other conversion operator
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81547
Bug ID: 81547
Summary: Surrogate call function results in call to other
conversion operator
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Keywords: accepts-invalid, rejects-valid, wrong-code
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: hstong at ca dot ibm.com
Target Milestone: ---
In the C++17 DIS subclause 16.3.1.1.2 [over.call.object] paragraph 3,
it is stated that the conversion function corresponding to the selected
surrogate call function is used to determine the function which is to be called
by the call syntax.
It appears that GCC instead chooses the function selected for the user-defined
conversion sequence formed for overload resolution.
### SOURCE (<stdin>):
using ff = int (*)(int);
constexpr int ffimpl0(int x) { return x; }
constexpr int ffimpl1(int x) { return x + 1; }
struct A {
template <typename T> constexpr operator T() const { return ffimpl0; }
constexpr operator ff() const volatile { return ffimpl1; }
};
char x[A()(42.f)];
extern char x[43]; // Clang accepts; GCC rejects
### COMPILER INVOCATION:
g++ -fsyntax-only -std=c++11 -x c++ -
### ACTUAL OUTPUT:
<stdin>:11:17: error: conflicting declaration 'char x [43]'
<stdin>:10:6: note: previous declaration as 'char x [42]'
### EXPECTED OUTPUT:
(clean compile)
### COMPILER VERSION INFO (g++ -v):
Using built-in specs.
COLLECT_GCC=/opt/wandbox/gcc-head/bin/g++
COLLECT_LTO_WRAPPER=/opt/wandbox/gcc-head/libexec/gcc/x86_64-pc-linux-gnu/8.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../source/configure --prefix=/opt/wandbox/gcc-head
--enable-languages=c,c++ --disable-multilib --without-ppl --without-cloog-ppl
--enable-checking=release --disable-nls --enable-lto
LDFLAGS=-Wl,-rpath,/opt/wandbox/gcc-head/lib,-rpath,/opt/wandbox/gcc-head/lib64,-rpath,/opt/wandbox/gcc-head/lib32
Thread model: posix
gcc version 8.0.0 20170724 (experimental) (GCC)