[Bug c++/59704] New: Wrong overload chosen, compiler errornously thinks non-constant zero expression is implicitly castable to null pointer
ambrus at math dot bme.hu
gcc-bugzilla@gcc.gnu.org
Mon Jan 6 21:08:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59704
Bug ID: 59704
Summary: Wrong overload chosen, compiler errornously thinks
non-constant zero expression is implicitly castable to
null pointer
Product: gcc
Version: 4.8.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ambrus at math dot bme.hu
Created attachment 31759
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31759&action=edit
preprocessed C++ source file
Gcc gives an error compiling the attached C++ file, despite that the code is
valid and should compile.
The error message claims that I am trying to call the first (non-vararg)
overload of the function covl, which is deleted. In reality, the code should
be calling the second (vararg) overload of the function. The second argument
in the call is an integral typed expression that is not a constant expression,
and so it cannot be implicitly converted to a pointer and cannot match the
parameter in the first overload of the function covl. Although the expression
(v - v) would always have a value of zero in this context, the expression
contains lvalue-to-rvalue conversion of a non-const variable, which makes this
expression not count as a constant expression according to tha language rules.
Thus, the call should fall back to use the second overload of the function
covl, which it does match.
I am using gcc 4.8.1 compiled from vanilla sources, on a linux-x86_64 system.
The command line is
g++ -v -c -std=c++11 -x c++-cpp-output zerocast.ii
The preprocessed C++ source file should be attached to this ticket. Below you
can see the full output of g++, including the configuration options.
$ cat zerocast.ii
# 1 "zerocast.cxx"
# 1 "<command-line>"
# 1 "zerocast.cxx"
void covl(int d, void *v) = delete;
void covl(int d, ...);
void bspr(unsigned v) {
covl(0, v - v);
}
$ g++ -v -c -std=c++11 -x c++-cpp-output zerocast.ii
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.8.1/configure --prefix=/usr/local/gcc481
-with-gmp=/usr/local -with-mpfr=/usr/local -with-mpc=/usr/local
--enable-languages=c,c++,fortran
Thread model: posix
gcc version 4.8.1 (GCC)
COLLECT_GCC_OPTIONS='-v' '-c' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=x86-64'
/usr/local/gcc481/libexec/gcc/x86_64-unknown-linux-gnu/4.8.1/cc1plus
-fpreprocessed zerocast.ii -quiet -dumpbase zerocast.ii -mtune=generic
-march=x86-64 -auxbase zerocast -std=c++11 -version -o /tmp/ccgVThJQ.s
GNU C++ (GCC) version 4.8.1 (x86_64-unknown-linux-gnu)
compiled by GNU C version 4.8.1, GMP version 5.0.1, MPFR version 3.0.0-p3,
MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=127409
GNU C++ (GCC) version 4.8.1 (x86_64-unknown-linux-gnu)
compiled by GNU C version 4.8.1, GMP version 5.0.1, MPFR version 3.0.0-p3,
MPC version 0.8.2
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=127409
Compiler executable checksum: 47191b782ec6877222820ebb50c2fe12
zerocast.cxx: In function ‘void bspr(unsigned int)’:
zerocast.cxx:5:15: error: use of deleted function ‘void covl(int, void*)’
covl(0, v - v);
^
zerocast.cxx:2:6: error: declared here
void covl(int d, void *v) = delete;
^
$
More information about the Gcc-bugs
mailing list