Bug 54126 - ICE on constexpr move ctor with const ref type instead of error
Summary: ICE on constexpr move ctor with const ref type instead of error
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.2
: P3 minor
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: ice-on-invalid-code
Depends on:
Blocks: constexpr
  Show dependency treegraph
 
Reported: 2012-07-30 14:17 UTC by Ilya Mikhaltsou
Modified: 2014-08-29 13:27 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work: 4.8.0, 4.9.1, 5.0
Known to fail:
Last reconfirmed: 2012-07-30 00:00:00


Attachments
Preprocessed source (745 bytes, text/plain)
2012-07-30 14:33 UTC, Ilya Mikhaltsou
Details
simple fail case (102 bytes, text/plain)
2013-02-13 07:29 UTC, Freddie Chopin
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ilya Mikhaltsou 2012-07-30 14:17:35 UTC
Compiling attached source fails with ICE:
$ gcc -std=c++11 gcc-bug.cpp --save-temps
gcc-bug.cpp: In instantiation of 'constexpr ClassA<T1>::ClassA(U1&&) [with U1 =
int; T1 = const ClassB&]':
gcc-bug.cpp:34:3:   required from here
gcc-bug.cpp:22:12: internal compiler error: in build_data_member_initialization,
 at cp/semantics.c:5790

GCC version dump: $ gcc -v
Using built-in specs.
COLLECT_GCC=C:\MinGW\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/i686-w64-mingw32/4.7.2/lto-wrapp
er.exe
Target: i686-w64-mingw32
Configured with: ../..//mingw-src/gcc-4_7-branch/configure --host=i686-w64-mingw
32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw-gcc-4_7-br
anch-x32 --with-sysroot=/mingw-gcc-4_7-branch-x32 --enable-shared --enable-stati
c --enable-targets=all --enable-multilib --enable-languages=c,c++,fortran,lto --
enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-lto -
-enable-graphite --enable-cloog-backend=isl --enable-checking=release --enable-f
ully-dynamic-string --enable-version-specific-runtime-libs --enable-sjlj-excepti
ons --disable-ppl-version-check --disable-cloog-version-check --disable-libstdcx
x-pch --disable-libstdcxx-debug --disable-bootstrap --disable-rpath --disable-wi
n32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-ld --wi
th-tune=generic --with-host-libstdcxx='-static -lstdc++' --with-libiconv --with-
gmp=/mingw-gcc-4_7-branch-libs-x32 --with-mpfr=/mingw-gcc-4_7-branch-libs-x32 --
with-mpc=/mingw-gcc-4_7-branch-libs-x32 --with-ppl=/mingw-gcc-4_7-branch-libs-x3
2 --with-cloog=/mingw-gcc-4_7-branch-libs-x32 --with-pkgversion='MinGW-builds: h
ttp://sourceforge.net/projects/mingwbuilds/' --with-bugurl=http://sourceforge.ne
t/projects/mingwbuilds/ CFLAGS='-O2 -pipe -fomit-frame-pointer -momit-leaf-frame
-pointer -I/mingw-gcc-4_7-branch-libs-x32/include' CXXFLAGS='-O2 -pipe -fomit-fr
ame-pointer -momit-leaf-frame-pointer' CPPFLAGS= LDFLAGS='-pipe -s -L/mingw-gcc-
4_7-branch-libs-x32/lib -L/mingw-gcc-4_7-branch-x32/bin'
Thread model: posix
gcc version 4.7.2 20120727 (prerelease) (MinGW-builds: http://sourceforge.net/pr
ojects/mingwbuilds/)
Comment 1 Jonathan Wakely 2012-07-30 14:22:18 UTC
The attachment is missing
Comment 2 Ilya Mikhaltsou 2012-07-30 14:33:41 UTC
Created attachment 27896 [details]
Preprocessed source
Comment 3 Ilya Mikhaltsou 2012-07-30 14:56:31 UTC
Reduced source:

namespace std {
template<class _E> class initializer_list {
};
}
using namespace std;

class ClassB {
public:
   constexpr ClassB(int x) {}
};

template<class T1> struct ClassA {
   template<class U1> constexpr ClassA(U1 &&a)
      : a_(a) {}
   T1 a_;
};

void f(std::initializer_list<ClassA<const ClassB&>> l) {
   f({
      {1}
   });
}
Comment 4 Freddie Chopin 2013-02-13 07:29:23 UTC
Created attachment 29430 [details]
simple fail case

I think I have an even simplier test case, I guess it's the same problem (at least the ICE message matches). I also think that bug 51707 is actually the same problem.
Comment 5 Ilya Mikhaltsou 2013-02-13 12:20:21 UTC
(In reply to comment #4)
> Created attachment 29430 [details]
> simple fail case
> 
> I think I have an even simplier test case, I guess it's the same problem (at
> least the ICE message matches). I also think that bug 51707 is actually the
> same problem.

Yes, looks like both mine and yours testcase actually do the same - they attempt to move some constexpr to another, and gcc fails. That looks like not implemented or buggy check for error.

bug 51707 looks to be error on correct code and possibly fails on getting constant l-value reference.

If they are exactly the same, then the bug actually lies in contexpr reference mechanics, and gcc fails on getting constexpr reference of any kind, not on moving constexpr. I'll try to investigate if it is the case as soon as I have some free time.
Comment 6 Paolo Carlini 2014-08-29 13:27:38 UTC
Fixed long time ago. ICEs with improperly reduced testcases involving std::initializer_list (per Comment #3) are fixed in mainline (Dup of c++/60848,
c++/61723).