------- Comment #2 from rguenth at gcc dot gnu dot org 2009-10-03 11:41 ------- Ok, I have some new reduced testcases:
dvector.3.ii ------------ typedef double Real; class Vector { int dimen; Real* val; public: Vector& operator=(const Vector& vec); Vector(int p_dimen, Real *p_val) : dimen(p_dimen), val(p_val) { } int dim() const; }; class DVector : public Vector { public: void reDim(int newdim); explicit DVector(const Vector& old); DVector& operator=(const Vector& vec) { reDim(vec.dim()); Vector::operator=(vec); } }; Vector& Vector::operator=(const Vector& vec) { dimen = vec.dimen; val = vec.val; } int Vector::dim() const { return dimen; } DVector::DVector(const Vector& old) : Vector(0, 0) { *this = old; } void DVector::reDim(int newdim) {} int main() {} ------------ slufactor.3.ii --------------- typedef double Real; class Vector { int dimen; Real* val; public: Vector& operator=(const Vector& vec); Vector(int p_dimen, Real *p_val) : dimen(p_dimen), val(p_val) { } int dim() const; }; class DVector : public Vector { public: void reDim(int newdim); explicit DVector(const Vector& old); DVector& operator=(const Vector& vec) { reDim(vec.dim()); Vector::operator=(vec); } }; class SLUFactor { DVector vec; void solveRight (Vector& x, const Vector& b); }; void SLUFactor::solveRight (Vector& x, const Vector& b) { vec = b; } ----------- no more ODR violations and a testcase with link-time errors: > g++ -o t slufactor.3.ii dvector.3.ii -flto -O -fPIC /tmp/ccu9746J.lto.o: In function `_ZN7DVectorC1ERK6Vector': cccxaZqP.o:(.text+0xa1): undefined reference to `_ZN7DVectoraSERK6Vector' /tmp/ccu9746J.lto.o: In function `_ZN7DVectorC2ERK6Vector': cccxaZqP.o:(.text+0xd9): undefined reference to `_ZN7DVectoraSERK6Vector' collect2: ld returned 1 exit status > g++ -o t dvector.3.ii slufactor.3.ii -flto -O -fPIC works w/o -fPIC and w/o -flto. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41552