On Tue, 1 Jul 2014, Markus Trippelsdorf wrote:
This patch cause yet another LLVM build error:
[...]
Reduced:
markus@x4 llvm_build % cat CompilerInvocation.ii
template <typename T> class A
{
T Obj;
public:
T element_type;
A (T *);
template <class X> A (A<X> &&p1) { p1.Obj; }
template <class X> A (A<X> &);
};
class B
{
public:
B (A<int>);
};
A<int> fn1 ()
{
A<B> a (new B (0));
return a;
}
markus@x4 llvm_build % /var/tmp/gcc_test/usr/local/bin/g++ -c -std=c++11
CompilerInvocation.ii
CompilerInvocation.ii: In instantiation of ‘A<T>::A(A<X>&&) [with X = B; T =
int]’:
CompilerInvocation.ii:20:10: required from here
CompilerInvocation.ii:3:5: error: ‘B A<B>::Obj’ is private
T Obj;
^
CompilerInvocation.ii:8:38: error: within this context
template <class X> A (A<X> &&p1) { p1.Obj; }
^
This looks invalid. As the core issue says, the return statement looks up
a as an rvalue, so it uses that constructor for A<int>, and that uses a
private member of a different specialization of A, which is illegal.
--
Marc Glisse