http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51449
--- Comment #1 from Markus Trippelsdorf markus at trippelsdorf dot de
2011-12-07 15:14:40 UTC ---
Here is a (somewhat) reduced testcase:
% cat test.ii
extern C
{
typedef long unsigned int size_t;
}
namespace std __attribute__ ((__visibility__ (default)))
{
template typename _Alloc class allocator;
template class _CharT struct char_traits;
template typename _CharT, typename _Traits =
char_traits _CharT , typename _Alloc =
allocator _CharT class basic_string;
typedef basic_string char string;
template typename _CharT, typename _Traits =
char_traits _CharT class basic_ostream;
typedef basic_ostream char ostream;
typedef struct {
}
__pthread_unwind_buf_t __attribute__ ((__aligned__));
}
namespace __gnu_cxx __attribute__ ((__visibility__ (default)))
{
template typename _Tp class new_allocator
{
public:
typedef size_t size_type;
typedef _Tp *pointer;
typedef _Tp reference;
};
}
namespace std __attribute__ ((__visibility__ (default)))
{
template typename _Tp class allocator:public __gnu_cxx::new_allocator
_Tp
{
public:
typedef size_t size_type;
template typename _Tp1 struct rebind {
typedef allocator _Tp1 other;
};
};
class ios_base
{
};
template typename _CharT, typename _Traits class basic_ios:public
ios_base
{
};
template typename _CharT, typename _Traits class basic_ostream:virtual
public basic_ios _CharT, _Traits
{
public:
typedef _CharT char_type;
typedef basic_ostream _CharT,
_Traits __ostream_type;
__ostream_type operator (long __n) {
return _M_insert (__n);
}
__ostream_type operator (bool __n) {
}
template typename _ValueT __ostream_type _M_insert (_ValueT __v);
};
extern template class basic_ostream char ;
}
namespace __gnu_cxx __attribute__ ((__visibility__ (default)))
{
template typename _Alloc struct __alloc_traits {
typedef typename _Alloc::pointer pointer;
typedef typename _Alloc::reference reference;
template typename _Tp struct rebind {
typedef typename _Alloc::template rebind _Tp ::other other;
};
};
}
class Inform
{
public:
typedef int ID_t;
std::ostream stream () {
}
};
namespace std
{
extern Inform endl (Inform );
}
template class T inline Inform
operator (Inform o, const T val)
{
o.stream () val;
}
namespace std __attribute__ ((__visibility__ (default)))
{
template typename _Tp, typename _Alloc struct _Vector_base {
typedef typename __gnu_cxx::__alloc_traits _Alloc ::template rebind
_Tp ::other _Tp_alloc_type;
typedef typename __gnu_cxx::__alloc_traits
_Tp_alloc_type ::pointer pointer;
struct _Vector_impl:public _Tp_alloc_type {
pointer _M_start;
pointer _M_finish;
};
public:
_Vector_impl _M_impl;
};
template typename _Tp, typename _Alloc = std::allocator
_Tp class vector:protected _Vector_base _Tp, _Alloc
{
typedef _Vector_base _Tp,
_Alloc _Base;
typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
typedef __gnu_cxx::__alloc_traits _Tp_alloc_type _Alloc_traits;
public:
typedef _Tp value_type;
typedef typename _Alloc_traits::reference reference;
typedef size_t size_type;
size_type size () const {
return size_type (this-_M_impl._M_finish - this-_M_impl._M_start);
}
reference operator[] (size_type __n) {
}
};
struct _Setw {
};
inline _Setw setw (int __n)
{
}
template typename _CharT,
typename _Traits inline basic_ostream _CharT,
_Traits operator (basic_ostream _CharT,
_Traits __os, _Setw __f)
{
}
class StatisticsData
{
public:
const std::string description () const {
}
long value () const {
}
};
class Statistics
{
private:
static long defaultFilter (long val);
void print (Inform , long (*filter) (long) = defaultFilter);
private:
std::vector StatisticsData * statList_m;
};
void Statistics::print (Inform o, long (*filter) (long))
{
int i,
j;
for (i = 0; i statList_m.size (); ++i) {
o std::setw (12) filter (statList_m[i]-
value ());
}
}
}
int main(){}
markus@x4 /tmp % g++ test.ii -O0 -fprofile-generate
markus@x4 /tmp % g++ test.ii -O1 -fprofile-generate
/tmp/ccvdpINQ.o:test.ii:function std::Statistics::print(Inform, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
/tmp/ccvdpINQ.o:test.ii:function std::Statistics::print(Inform, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
/tmp/ccvdpINQ.o:test.ii:function Inform operator long(Inform, long
const): error: undefined reference to '__gcov0__ZNSolsEl'
/tmp/ccvdpINQ.o:test.ii:function Inform operator long(Inform, long
const): error: undefined reference to '__gcov0__ZNSolsEl'
collect2: error: ld returned 1 exit status
markus@x4 /tmp % g++ test.ii -O2 -fprofile-generate