https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61659
--- Comment #9 from Markus Trippelsdorf <trippels at gcc dot gnu.org> ---
Unfortunately llvm still fails to build:
FAILED: /var/tmp/gcc_test/usr/local/bin/g++ -DGTEST_HAS_RTTI=0
-DLLVMCodeGen_EXPORTS -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fPIC -fvisibility-inlines-hidden
-Wall -W -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers
-pedantic -Wno-long-long -Wno-maybe-uninitialized -Wnon-virtual-dtor
-Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O2 -DNDEBUG -pipe
-fPIC -Ilib/CodeGen -I/var/tmp/llvm-project/llvm/lib/CodeGen -Iinclude
-I/var/tmp/llvm-project/llvm/include -fno-exceptions -fno-rtti -MMD -MT
lib/CodeGen/CMakeFiles/LLVMCodeGen.dir/MachineFunctionAnalysis.cpp.o -MF
"lib/CodeGen/CMakeFiles/LLVMCodeGen.dir/MachineFunctionAnalysis.cpp.o.d" -o
lib/CodeGen/CMakeFiles/LLVMCodeGen.dir/MachineFunctionAnalysis.cpp.o -c
/var/tmp/llvm-project/llvm/lib/CodeGen/MachineFunctionAnalysis.cpp
In file included from
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/memory:81:0,
from
/var/tmp/llvm-project/llvm/include/llvm/ADT/SmallVector.h:28,
from
/var/tmp/llvm-project/llvm/include/llvm/Support/Allocator.h:24,
from
/var/tmp/llvm-project/llvm/include/llvm/ADT/StringMap.h:18,
from
/var/tmp/llvm-project/llvm/include/llvm/PassRegistry.h:23,
from /var/tmp/llvm-project/llvm/include/llvm/PassSupport.h:27,
from /var/tmp/llvm-project/llvm/include/llvm/Pass.h:377,
from
/var/tmp/llvm-project/llvm/include/llvm/CodeGen/MachineFunctionAnalysis.h:17,
from
/var/tmp/llvm-project/llvm/lib/CodeGen/MachineFunctionAnalysis.cpp:14:
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/unique_ptr.h: In
instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with
_Tp = llvm::GCStrategy]’:
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/unique_ptr.h:236:16:
required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp =
llvm::GCStrategy; _Dp = std::default_delete<llvm::GCStrategy>]’
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/stl_construct.h:93:7:
required from ‘void std::_Destroy(_Tp*) [with _Tp =
std::unique_ptr<llvm::GCStrategy>]’
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/stl_construct.h:103:46:
required from ‘static void std::_Destroy_aux<<anonymous>
>::__destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator =
std::unique_ptr<llvm::GCStrategy>*; bool <anonymous> = false]’
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/stl_construct.h:127:27:
required from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with
_ForwardIterator = std::unique_ptr<llvm::GCStrategy>*]’
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/stl_construct.h:151:31:
required from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator,
std::allocator<_T2>&) [with _ForwardIterator =
std::unique_ptr<llvm::GCStrategy>*; _Tp = std::unique_ptr<llvm::GCStrategy>]’
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/stl_vector.h:425:30:
required from ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp =
std::unique_ptr<llvm::GCStrategy>; _Alloc =
std::allocator<std::unique_ptr<llvm::GCStrategy> >]’
/var/tmp/llvm-project/llvm/include/llvm/CodeGen/GCMetadata.h:166:9: required
from here
/var/tmp/gcc_test/usr/local/include/c++/4.10.0/bits/unique_ptr.h:74:22: error:
invalid application of ‘sizeof’ to incomplete type ‘llvm::GCStrategy’
static_assert(sizeof(_Tp)>0,
^
markus@x4 llvm_build % cat MachineFunctionAnalysis.ii
[25/7733]
template <typename _Tp> _Tp *__addressof (_Tp &);
template <typename _Tp> struct integral_constant
{
static constexpr _Tp value = 0;
};
template <typename...> struct __and_;
template <typename _B1> struct __and_<_B1> : _B1
{
};
template <typename> struct G : integral_constant<int>
{
};
template <int> struct H
{
typedef int type;
};
template <typename... _Cond>
using _Require = typename H<__and_<_Cond...>::value>::type;
template <typename> class unique_ptr;
class new_allocator
{
};
template <typename> using __allocator_base = new_allocator;
template <typename> class allocator : __allocator_base<unique_ptr<int> >
{
};
class ModulePass
{
public:
virtual ~ModulePass ();
};
template <typename _Alloc> struct allocator_traits
{
static unique_ptr<int> *_S_pointer_helper (...);
typedef decltype(_S_pointer_helper ()) __pointer;
typedef __pointer pointer;
struct B
{
template <typename> static integral_constant<int> __test (...);
using type = decltype(__test<_Alloc>);
};
template <typename> using __has_destroy = typename B::type;
template <typename _Tp>
static _Require<G<__has_destroy<_Tp> > >
_S_destroy (allocator<unique_ptr<int> > &, _Tp *p2)
{
p2->~_Tp ();
}
template <class _Tp>
static void destroy (allocator<unique_ptr<int> > &p1, _Tp *p2)
{
_S_destroy (p1, p2);
}
};
template <typename>
struct __alloc_traits : allocator_traits<allocator<unique_ptr<int> > >
{
};
template <typename _ForwardIterator, typename _Allocator>
void _Destroy (_ForwardIterator p1, _ForwardIterator, _Allocator &p3)
{
__alloc_traits<_Allocator>::destroy (p3, __addressof (*p1));
}
template <typename> struct _Vector_base
{
typedef allocator<unique_ptr<int> > _Tp_alloc_type;
typedef __alloc_traits<_Tp_alloc_type>::pointer pointer;
struct D
{
pointer _M_start;
pointer _M_finish;
};
_Tp_alloc_type &_M_get_Tp_allocator ();
D _M_impl;
};
template <typename> class vector : _Vector_base<allocator<unique_ptr<int> > >
{
public:
~vector ()
{
std:
_Destroy (this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator ());
}
};
template <typename _Tp> struct F
{
void operator()(_Tp *) { sizeof(_Tp); }
};
class A;
template <typename> class unique_ptr
{
class C
{
template <typename> static A *__test (...);
typedef F<int> _Del;
public:
typedef decltype(__test<_Del>()) type;
};
public:
typename C::type pointer;
~unique_ptr () { get_deleter ()(0); }
F<A> &get_deleter ();
};
class I : ModulePass
{
vector<unique_ptr<int> > StrategyList;
};
markus@x4 llvm_build % g++ -c -std=c++11 -O2 MachineFunctionAnalysis.ii
MachineFunctionAnalysis.ii: In instantiation of ‘void F<_Tp>::operator()(_Tp*)
[with _Tp = A]’:
MachineFunctionAnalysis.ii:106:33: required from ‘unique_ptr<
<template-parameter-1-1> >::~unique_ptr() [with <template-parameter-1-1> =
int]’
MachineFunctionAnalysis.ii:47:5: required from ‘static _Require<G<typename
allocator_traits<_Alloc>::B::type> >
allocator_traits<_Alloc>::_S_destroy(allocator<unique_ptr<int> >&, _Tp*) [with
_Tp = unique_ptr<int>; _Alloc = allocator<unique_ptr<int> >;
_Require<G<typename allocator_traits<_Alloc>::B::type> > = int]’
MachineFunctionAnalysis.ii:52:23: required from ‘static void
allocator_traits<_Alloc>::destroy(allocator<unique_ptr<int> >&, _Tp*) [with _Tp
= unique_ptr<int>; _Alloc = allocator<unique_ptr<int> >]’
MachineFunctionAnalysis.ii:63:61: required from ‘void
_Destroy(_ForwardIterator, _ForwardIterator, _Allocator&) [with
_ForwardIterator = unique_ptr<int>*; _Allocator = allocator<unique_ptr<int> >]’
MachineFunctionAnalysis.ii:85:37: required from ‘vector<
<template-parameter-1-1> >::~vector() [with <template-parameter-1-1> =
unique_ptr<int>]’
MachineFunctionAnalysis.ii:110:7: required from here
MachineFunctionAnalysis.ii:90:34: error: invalid application of ‘sizeof’ to
incomplete type ‘A’
void operator()(_Tp *) { sizeof(_Tp); }