[Bug 1829790] [NEW] internal compiler arror in fold_convert_loc
Dan Moodie
1829790 at bugs.launchpad.net
Mon May 20 19:09:35 UTC 2019
Public bug reported:
With the build of GCC available in ubuntu 18.04, I get the following
error when trying to compile this code:
// minimal example to break gcc 7 in the same way that the reflect code breaks it
#include <type_traits>
template<class T, class R, class ... ARGS>
struct MemberPointer
{
R (T::* ptr)(ARGS...);
};
template<class T, class R, class ... ARGS>
constexpr MemberPointer<T, R, ARGS...> makeMemberPointer(R(T::* ptr)(ARGS...))
{
return {ptr};
}
struct Foo
{
static constexpr auto getField(std::integral_constant<int, 0>)
{
// This line breaks gcc
return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo));
// This line does not break gcc
//return makeMemberPointer(&Foo::foo);
}
void foo(){}
};
template<class T>
struct Wrapper
{
template<int I>
static constexpr auto getField()
{
return T::getField(std::integral_constant<int, I>{});
}
};
int main()
{
// This line works fine either way
Foo::getField(std::integral_constant<int, 0>{});
// The offending line only breaks gcc when called through the Wrapper class
Wrapper<Foo>::getField<0>();
}
error:
internal compiler error: in fold_convert_loc, at fold-const.c:2530
return T::getField(std::integral_constant<int, I>{});
Interestingly enough this bug is not present when I put this code into godbolt (https://godbolt.org/) which would indicate that it might be a difference in how the compilers were built.
The different flags between godbolt and ubuntu's built of gcc are as follows:
godbolt:
Configured with: ../gcc-7.4.0/configure --prefix=/opt/compiler-explorer/gcc-build/staging --disable-bootstrap --enable-clocale=gnu --enable-languages=c,c++,fortran --enable-ld=yes --enable-gold=yes --enable-lto --enable-plugins --with-pkgversion=GCC-Explorer-Build
ubuntu:
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --disable-werror --with-arch-32=i686 --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
** Affects: gcc-7 (Ubuntu)
Importance: Undecided
Status: New
** Description changed:
With the build of GCC available in ubuntu 18.04, I get the following
error when trying to compile this code:
// minimal example to break gcc 7 in the same way that the reflect code breaks it
#include <type_traits>
template<class T, class R, class ... ARGS>
struct MemberPointer
{
- R (T::* ptr)(ARGS...);
+ R (T::* ptr)(ARGS...);
};
template<class T, class R, class ... ARGS>
constexpr MemberPointer<T, R, ARGS...> makeMemberPointer(R(T::* ptr)(ARGS...))
{
- return {ptr};
+ return {ptr};
}
struct Foo
{
- static constexpr auto getField(std::integral_constant<int, 0>)
- {
- return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo)); // This line breaks gcc
- //return makeMemberPointer(&Foo::foo); // This line does not break gcc
- }
+ static constexpr auto getField(std::integral_constant<int, 0>)
+ {
+ // This line breaks gcc
+ return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo));
- void foo(){}
+ // This line does not break gcc
+ //return makeMemberPointer(&Foo::foo);
+ }
+
+ void foo(){}
};
template<class T>
struct Wrapper
{
- template<int I>
- static constexpr auto getField()
- {
- return T::getField(std::integral_constant<int, I>{});
- }
+ template<int I>
+ static constexpr auto getField()
+ {
+ return T::getField(std::integral_constant<int, I>{});
+ }
};
int main()
{
- Foo::getField(std::integral_constant<int, 0>{}); // This line works fine either way
- Wrapper<Foo>::getField<0>(); // The offending line only breaks gcc when called through the Wrapper class
+ // This line works fine either way
+ Foo::getField(std::integral_constant<int, 0>{});
+ // The offending line only breaks gcc when called through the Wrapper class
+ Wrapper<Foo>::getField<0>();
}
+ error:
+ internal compiler error: in fold_convert_loc, at fold-const.c:2530
+ return T::getField(std::integral_constant<int, I>{});
- error:
- internal compiler error: in fold_convert_loc, at fold-const.c:2530
- return T::getField(std::integral_constant<int, I>{});
-
- Interestingly enough this bug is not present when I put this code into godbolt (https://godbolt.org/) which would indicate that it might be a difference in how the compilers were built.
+ Interestingly enough this bug is not present when I put this code into godbolt (https://godbolt.org/) which would indicate that it might be a difference in how the compilers were built.
The different flags between godbolt and ubuntu's built of gcc are as follows:
- godbolt:
+ godbolt:
Configured with: ../gcc-7.4.0/configure --prefix=/opt/compiler-explorer/gcc-build/staging --disable-bootstrap --enable-clocale=gnu --enable-languages=c,c++,fortran --enable-ld=yes --enable-gold=yes --enable-lto --enable-plugins --with-pkgversion=GCC-Explorer-Build
ubuntu:
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --disable-werror --with-arch-32=i686 --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
** Description changed:
With the build of GCC available in ubuntu 18.04, I get the following
error when trying to compile this code:
// minimal example to break gcc 7 in the same way that the reflect code breaks it
#include <type_traits>
template<class T, class R, class ... ARGS>
struct MemberPointer
{
R (T::* ptr)(ARGS...);
};
template<class T, class R, class ... ARGS>
constexpr MemberPointer<T, R, ARGS...> makeMemberPointer(R(T::* ptr)(ARGS...))
{
return {ptr};
}
struct Foo
{
static constexpr auto getField(std::integral_constant<int, 0>)
{
- // This line breaks gcc
- return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo));
+ // This line breaks gcc
+ return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo));
// This line does not break gcc
- //return makeMemberPointer(&Foo::foo);
- }
+ //return makeMemberPointer(&Foo::foo);
+ }
void foo(){}
};
template<class T>
struct Wrapper
{
template<int I>
static constexpr auto getField()
{
return T::getField(std::integral_constant<int, I>{});
}
};
int main()
{
- // This line works fine either way
- Foo::getField(std::integral_constant<int, 0>{});
- // The offending line only breaks gcc when called through the Wrapper class
- Wrapper<Foo>::getField<0>();
+ // This line works fine either way
+ Foo::getField(std::integral_constant<int, 0>{});
+ // The offending line only breaks gcc when called through the Wrapper class
+ Wrapper<Foo>::getField<0>();
}
error:
internal compiler error: in fold_convert_loc, at fold-const.c:2530
return T::getField(std::integral_constant<int, I>{});
Interestingly enough this bug is not present when I put this code into godbolt (https://godbolt.org/) which would indicate that it might be a difference in how the compilers were built.
The different flags between godbolt and ubuntu's built of gcc are as follows:
godbolt:
Configured with: ../gcc-7.4.0/configure --prefix=/opt/compiler-explorer/gcc-build/staging --disable-bootstrap --enable-clocale=gnu --enable-languages=c,c++,fortran --enable-ld=yes --enable-gold=yes --enable-lto --enable-plugins --with-pkgversion=GCC-Explorer-Build
ubuntu:
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --disable-werror --with-arch-32=i686 --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-7 in Ubuntu.
https://bugs.launchpad.net/bugs/1829790
Title:
internal compiler arror in fold_convert_loc
Status in gcc-7 package in Ubuntu:
New
Bug description:
With the build of GCC available in ubuntu 18.04, I get the following
error when trying to compile this code:
// minimal example to break gcc 7 in the same way that the reflect code breaks it
#include <type_traits>
template<class T, class R, class ... ARGS>
struct MemberPointer
{
R (T::* ptr)(ARGS...);
};
template<class T, class R, class ... ARGS>
constexpr MemberPointer<T, R, ARGS...> makeMemberPointer(R(T::* ptr)(ARGS...))
{
return {ptr};
}
struct Foo
{
static constexpr auto getField(std::integral_constant<int, 0>)
{
// This line breaks gcc
return makeMemberPointer(static_cast<void(Foo::*)()>(&Foo::foo));
// This line does not break gcc
//return makeMemberPointer(&Foo::foo);
}
void foo(){}
};
template<class T>
struct Wrapper
{
template<int I>
static constexpr auto getField()
{
return T::getField(std::integral_constant<int, I>{});
}
};
int main()
{
// This line works fine either way
Foo::getField(std::integral_constant<int, 0>{});
// The offending line only breaks gcc when called through the Wrapper class
Wrapper<Foo>::getField<0>();
}
error:
internal compiler error: in fold_convert_loc, at fold-const.c:2530
return T::getField(std::integral_constant<int, I>{});
Interestingly enough this bug is not present when I put this code into godbolt (https://godbolt.org/) which would indicate that it might be a difference in how the compilers were built.
The different flags between godbolt and ubuntu's built of gcc are as follows:
godbolt:
Configured with: ../gcc-7.4.0/configure --prefix=/opt/compiler-explorer/gcc-build/staging --disable-bootstrap --enable-clocale=gnu --enable-languages=c,c++,fortran --enable-ld=yes --enable-gold=yes --enable-lto --enable-plugins --with-pkgversion=GCC-Explorer-Build
ubuntu:
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.4.0-1ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --disable-werror --with-arch-32=i686 --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gcc-7/+bug/1829790/+subscriptions
More information about the foundations-bugs
mailing list