On 2014.06.26 at 14:06 +0100, Jonathan Wakely wrote:
> DR1579 relaxes [class.copy]/32 so that expressions in return
> statements can be looked up as rvalues even when they aren't the same
> type as the function return type.
> 
> Implementing that seems as simple as removing the restriction on the
> types. Tested x86_64-linux, no regressions.

This patch cause yet another LLVM build error:

FAILED: /var/tmp/gcc_test/usr/local/bin/g++   -DCLANG_ENABLE_ARCMT 
-DCLANG_ENABLE_REWRITER -DCLANG_ENABLE_STATIC_ANALYZER -DGTEST_HAS_RTTI=0 
-D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS 
-D__STDC_LIMIT_MACROS -DclangFrontend_EXPORTS -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 -fno-common 
-Woverloaded-virtual -Wcast-qual -fno-strict-aliasing -O2  -DNDEBUG -pipe -fPIC 
-Itools/clang/lib/Frontend 
-I/var/tmp/llvm-project/llvm/tools/clang/lib/Frontend 
-I/var/tmp/llvm-project/llvm/tools/clang/include -Itools/clang/include 
-Iinclude -I/var/tmp/llvm-project/llvm/include    -fno-exceptions -fno-rtti 
-MMD -MT 
tools/clang/lib/Frontend/CMakeFiles/clangFrontend.dir/CompilerInvocation.cpp.o 
-MF 
"tools/clang/lib/Frontend/CMakeFiles/clangFrontend.dir/CompilerInvocation.cpp.o.d"
 -o 
tools/clang/lib/Frontend/CMakeFiles/clangFrontend.dir/CompilerInvocation.cpp.o 
-c /var/tmp/llvm-project/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp
In file included from 
/var/tmp/llvm-project/llvm/tools/clang/include/clang/Basic/DiagnosticOptions.h:14:0,
                 from 
/var/tmp/llvm-project/llvm/tools/clang/include/clang/Frontend/CompilerInvocation.h:13,
                 from 
/var/tmp/llvm-project/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp:10:
/var/tmp/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h: In 
instantiation of 
‘llvm::IntrusiveRefCntPtr<T>::IntrusiveRefCntPtr(llvm::IntrusiveRefCntPtr<X>&&) 
[with X = clang::vfs::OverlayFileSystem; T = clang::vfs::FileSystem]’:
/var/tmp/llvm-project/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp:2047:10:
   required from here
/var/tmp/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:137:8: error: 
‘clang::vfs::OverlayFileSystem* 
llvm::IntrusiveRefCntPtr<clang::vfs::OverlayFileSystem>::Obj’ is private
     T* Obj;
        ^
/var/tmp/llvm-project/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:158:13: error: 
within this context
       S.Obj = 0;
             ^


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; }
                                      ^

-- 
Markus
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;
}

Reply via email to