https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70528
Bug ID: 70528 Summary: [5/6 Regression] bogus error: constructor required before non-static data member Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: trippels at gcc dot gnu.org Target Milestone: --- Since r225189 LLVM trunk (since commit be4ea76eaa0 ) doesn't build anymore: In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/bits/move.h:57:0, from /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/bits/stl_pair.h:59, from /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/utility:70, from /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/algorithm:60, from /home/markus/llvm/include/llvm/ADT/StringRef.h:14, from /home/markus/llvm/include/llvm/ADT/StringMap.h:17, from /home/markus/llvm/include/llvm/Support/Host.h:17, from /home/markus/llvm/include/llvm/ADT/Hashing.h:49, from /home/markus/llvm/include/llvm/ADT/ArrayRef.h:13, from /home/markus/llvm/include/llvm/ADT/DenseMapInfo.h:17, from /home/markus/llvm/include/llvm/ADT/DenseMap.h:17, from /home/markus/llvm/lib/Bitcode/Writer/ValueEnumerator.h:17, from /home/markus/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp:14: /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits: In substitution of ‘template<class _Tp, class> static std::true_type std::__do_is_default_constructible_impl::__test(int) [with _Tp = llvm::ValueEnumerator::MDRange; <template-parameter-1-2> = <missing>]’: /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:879:35: required from ‘struct std::__is_default_constructible_impl<llvm::ValueEnumerator::MDRange>’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:143:12: required from ‘struct std::__and_<std::__not_<std::is_void<llvm::ValueEnumerator::MDRange> >, std::__is_default_constructible_impl<llvm::ValueEnumerator::MDRange> >’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:883:12: required from ‘struct std::__is_default_constructible_atom<llvm::ValueEnumerator::MDRange>’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:904:12: required from ‘struct std::__is_default_constructible_safe<llvm::ValueEnumerator::MDRange, false>’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:910:12: required from ‘struct std::is_default_constructible<llvm::ValueEnumerator::MDRange>’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:143:12: [ skipping 6 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ] /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:715:12: required from ‘struct std::is_abstract<llvm::detail::AlignerImpl<llvm::detail::DenseMapPair<unsigned int, llvm::ValueEnumerator::MDRange> [1], llvm::SmallDenseMap<unsigned int, llvm::ValueEnumerator::MDRange, 1u>::LargeRep, char, char, char, char, char, char, char, char> >’ /home/markus/llvm/include/llvm/Support/AlignOf.h:79:13: required from ‘constexpr const unsigned int llvm::AlignOf<llvm::detail::AlignerImpl<llvm::detail::DenseMapPair<unsigned int, llvm::ValueEnumerator::MDRange> [1], llvm::SmallDenseMap<unsigned int, llvm::ValueEnumerator::MDRange, 1u>::LargeRep, char, char, char, char, char, char, char, char> >::Alignment’ /home/markus/llvm/include/llvm/Support/AlignOf.h:86:52: required from ‘struct llvm::AlignOf<llvm::detail::AlignerImpl<llvm::detail::DenseMapPair<unsigned int, llvm::ValueEnumerator::MDRange> [1], llvm::SmallDenseMap<unsigned int, llvm::ValueEnumerator::MDRange, 1u>::LargeRep, char, char, char, char, char, char, char, char> >’ /home/markus/llvm/include/llvm/Support/AlignOf.h:251:8: required from ‘struct llvm::AlignedCharArrayUnion<llvm::detail::DenseMapPair<unsigned int, llvm::ValueEnumerator::MDRange> [1], llvm::SmallDenseMap<unsigned int, llvm::ValueEnumerator::MDRange, 1u>::LargeRep, char, char, char, char, char, char, char, char>’ /home/markus/llvm/include/llvm/ADT/DenseMap.h:759:59: required from ‘class llvm::SmallDenseMap<unsigned int, llvm::ValueEnumerator::MDRange, 1u>’ /home/markus/llvm/lib/Bitcode/Writer/ValueEnumerator.h:100:39: required from here /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:868:48: error: constructor required before non-static data member for ‘llvm::ValueEnumerator::MDRange::First’ has been parsed template<typename _Tp, typename = decltype(_Tp())> ^~~~~ /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:868:48: error: constructor required before non-static data member for ‘llvm::ValueEnumerator::MDRange::Last’ has been parsed /usr/lib/gcc/x86_64-pc-linux-gnu/6.0.0/include/g++-v6/type_traits:868:48: error: constructor required before non-static data member for ‘llvm::ValueEnumerator::MDRange::NumStrings’ has been parsed markus@x4 llvm_build % cat BitcodeWriter.ii template <typename _Tp> struct integral_constant { static constexpr _Tp value = 0; }; template <bool, typename> struct conditional; template <typename...> struct A; template <typename _B1, typename _B2> struct A<_B1, _B2> : conditional<_B1::value, _B2>::type {}; struct B : integral_constant<bool> {}; struct C { template <typename _Tp, typename = decltype(_Tp())> static integral_constant<bool> __test(int); }; template <typename _Tp> struct L : C { typedef decltype(__test<_Tp>(0)) type; }; template <typename _Tp> struct M : A<B, L<_Tp>> {}; template <typename _Tp> struct N : M<_Tp>::type {}; struct D { static integral_constant<bool> __test(); }; template <typename> struct __is_implicitly_default_constructible_impl : D { typedef decltype(__test()) type; }; template <typename> struct F : __is_implicitly_default_constructible_impl<int>::type {}; template <typename _Tp> struct O : A<N<_Tp>, F<_Tp>> {}; template <bool> struct G; template <bool, typename _Iftrue> struct conditional { typedef _Iftrue type; }; template <typename _T2> struct H { template <typename _U1 = int, typename _U2 = _T2, typename G<A<O<_U1>, O<_U2>>::value>::type = true> H(); }; template <typename ValueT, typename BucketT = H<ValueT>> struct I { BucketT storage; }; struct J { struct K { int First = 0; }; I<K> FunctionMDInfo; }; markus@x4 llvm_build % clang++ -std=c++11 -c BitcodeWriter.ii markus@x4 llvm_build % icpc -wd3802 -std=c++11 -c BitcodeWriter.ii markus@x4 llvm_build % g++ -std=c++11 -c BitcodeWriter.ii BitcodeWriter.ii: In substitution of ‘template<class _Tp, class> static integral_constant<bool> C::__test(int) [with _Tp = J::K; <template-parameter-1-2> = <missing>]’: BitcodeWriter.ii:13:68: required from ‘struct L<J::K>’ BitcodeWriter.ii:7:8: required from ‘struct A<B, L<J::K> >’ BitcodeWriter.ii:14:32: required from ‘struct M<J::K>’ BitcodeWriter.ii:15:32: required from ‘struct N<J::K>’ BitcodeWriter.ii:7:8: required from ‘struct A<N<J::K>, F<J::K> >’ BitcodeWriter.ii:24:32: required from ‘struct O<J::K>’ BitcodeWriter.ii:7:8: required from ‘struct A<O<int>, O<J::K> >’ BitcodeWriter.ii:29:58: required by substitution of ‘template<class _U1, class _U2, typename G<A<O<_U1>, O<_U2> >::value>::type <anonymous> > H<_T2>::H() [with _U1 = int; _U2 = J::K; typename G<A<O<_U1>, O<_U2> >::value>::type <anonymous> = <missing>]’ BitcodeWriter.ii:32:65: required from ‘struct I<J::K>’ BitcodeWriter.ii:39:8: required from here BitcodeWriter.ii:10:47: error: constructor required before non-static data member for ‘J::K::First’ has been parsed template <typename _Tp, typename = decltype(_Tp())> ^~~~~