https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91212
Bug ID: 91212
Summary: const ignored for ctor arguments within return
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
Created attachment 46613
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46613&action=edit
preprocessed from -save-temps
g++ 9.1.0, gmp-6.1.1, mpfr-3.1.4, mpc-1.0.3, isl-0.18, cloog-0.18.4
having two ctors:
struct X{
template <unsigned long N> X(const char (&src)[N]) {}
template <unsigned long N> X(char (&src)[N]) {}
};
X f() {
char buf[1];
return buf;
}
the second ctor with non-const buffer should be used.
with g++ 9.1.0 the first ctor with const buffer is used.
build-option: --prefix=/opt/local/gcc-9.1.0 --enable-languages=c,c++
--disable-multilib
make-target: profiledbootstrap
$ gcc --version
gcc (GCC) 9.1.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ uname -a
Linux refle15sp1 4.12.14-195-default #1 SMP Tue May 7 10:55:11 UTC 2019
(8fba516) x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="SLES"
VERSION="15-SP1"
VERSION_ID="15.1"
PRETTY_NAME="SUSE Linux Enterprise Server 15 SP1"
ID="sles"
ID_LIKE="suse"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:15:sp1"
$ /opt/local/gcc-9.1.0/bin/g++ -v -save-temps -o ctor ctor.C
Using built-in specs.
COLLECT_GCC=/opt/local/gcc-9.1.0/bin/g++
COLLECT_LTO_WRAPPER=/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-9.1.0/configure --prefix=/opt/local/gcc-9.1.0
--enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 9.1.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'ctor' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/cc1plus -E -quiet
-v -D_GNU_SOURCE ctor.C -mtune=generic -march=x86-64 -fpch-preprocess -o
ctor.ii
ignoring nonexistent directory
"/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/x86_64-pc-linux-gnu
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/backward
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/include
/usr/local/include
/opt/local/gcc-9.1.0/include
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/include-fixed
/usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'ctor' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/cc1plus
-fpreprocessed ctor.ii -quiet -dumpbase ctor.C -mtune=generic -march=x86-64
-auxbase ctor -version -o ctor.s
GNU C++14 (GCC) version 9.1.0 (x86_64-pc-linux-gnu)
compiled by GNU C version 9.1.0, GMP version 6.1.1, MPFR version 3.1.4,
MPC version 1.0.3, isl version isl-0.18-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C++14 (GCC) version 9.1.0 (x86_64-pc-linux-gnu)
compiled by GNU C version 9.1.0, GMP version 6.1.1, MPFR version 3.1.4,
MPC version 1.0.3, isl version isl-0.18-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c5c2c4d89679134a97ef259dab7ccdbf
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'ctor' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
as -v --64 -o ctor.o ctor.s
GNU assembler version 2.31.1 (x86_64-suse-linux) using BFD version (GNU
Binutils; SUSE Linux Enterprise 15) 2.31.1.20180828-5
COMPILER_PATH=/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/:/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/:/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/:/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/
LIBRARY_PATH=/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/:/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'ctor' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/collect2 -plugin
/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/liblto_plugin.so
-plugin-opt=/opt/local/gcc-9.1.0/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/lto-wrapper
-plugin-opt=-fresolution=ctor.res -plugin-opt=-pass-through=-lgcc_s
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc
-plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc
--eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o
ctor /usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/crtbegin.o
-L/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0
-L/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../lib64
-L/lib/../lib64 -L/usr/lib/../lib64
-L/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../.. ctor.o
-lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/opt/local/gcc-9.1.0/lib/gcc/x86_64-pc-linux-gnu/9.1.0/crtend.o
/usr/lib/../lib64/crtn.o
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 'ctor' '-shared-libgcc'
'-mtune=generic' '-march=x86-64'
$ ./ctor
X(char (&src)[N])
X(const char (&src)[N])
X(const char (&src)[N])
X(char (&src)[N])
$ cat ctor.C
extern "C" {
long write( int fd, const void *buf, unsigned long count );
}
struct X {
template <unsigned long N> X(const char (&src)[N]) {
write( 2, "X(const char (&src)[N])\n", 24 );
}
template <unsigned long N> X(char (&src)[N]) {
write( 2, "X(char (&src)[N])\n", 18 );
}
};
X
func1()
{
char buf[2048];
return buf;
}
X
func2()
{
char buf[4096];
return X(buf);
}
int
main()
{
char buf[1024];
X a( buf );
X b( "x" );
X c = func1();
X d = func2();
}