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
/tmp/ccW16Rwo.o:test.ii:function std::Statistics::print(Inform&, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
/tmp/ccW16Rwo.o:test.ii:function std::Statistics::print(Inform&, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
collect2: error: ld returned 1 exit status
markus@x4 /tmp % g++ test.ii -O3 -fprofile-generate
/tmp/ccgKTIgz.o:test.ii:function std::Statistics::print(Inform&, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
/tmp/ccgKTIgz.o:test.ii:function std::Statistics::print(Inform&, long
(*)(long)): error: undefined reference to '__gcov0__ZNSolsEl'
collect2: error: ld returned 1 exit status
markus@x4 /tmp % g++ test.ii -O3
markus@x4 /tmp %

Reply via email to