This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] c++/58051 Implement Core 1579
- From: Jonathan Wakely <jwakely at redhat dot com>
- To: Markus Trippelsdorf <markus at trippelsdorf dot de>
- Cc: gcc-patches at gcc dot gnu dot org, jason at redhat dot com
- Date: Tue, 1 Jul 2014 15:14:16 +0100
- Subject: Re: [patch] c++/58051 Implement Core 1579
- Authentication-results: sourceware.org; auth=none
- References: <20140626130621 dot GJ2711 at redhat dot com> <20140701130619 dot GA295 at x4>
On 01/07/14 15:06 +0200, Markus Trippelsdorf wrote:
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; }
The error looks correct, A<T> cannot access private members of A<X>.
My patch only affects return statements and you get exactly the same
error if you change the code so there's no return statement:
void fn2 ()
{
A<B> a (new B (0));
A<int> aa( static_cast<A<B>&&>(a) );
}