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())>
                                               ^~~~~

Reply via email to