Date: Tue, 02 Mar 2010 01:45:13 +0200 From: Andriy Gapon <avg@freebsd.org> To: John Baldwin <jhb@freebsd.org>, Roman Divacky <rdivacky@freebsd.org> Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r204537 - in projects/clangbsd/contrib/libstdc++: include/ext src Message-ID: <4B8C5189.40102@freebsd.org> In-Reply-To: <201003011744.45410.jhb@freebsd.org> References: <201003012130.o21LUB0I022574@svn.freebsd.org> <201003011744.45410.jhb@freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
on 02/03/2010 00:44 John Baldwin said the following: > On Monday 01 March 2010 4:30:11 pm Roman Divacky wrote: >> Author: rdivacky >> Date: Mon Mar 1 21:30:11 2010 >> New Revision: 204537 >> URL: http://svn.freebsd.org/changeset/base/204537 >> >> Log: >> Make this a little more like C++. Clang++ can grok all libstdc++ >> now. >> >> Modified: >> projects/clangbsd/contrib/libstdc++/include/ext/ropeimpl.h >> projects/clangbsd/contrib/libstdc++/src/locale-inst.cc >> >> Modified: projects/clangbsd/contrib/libstdc++/include/ext/ropeimpl.h >> > ============================================================================== >> --- projects/clangbsd/contrib/libstdc++/include/ext/ropeimpl.h Mon Mar 1 > 21:04:10 2010 (r204536) >> +++ projects/clangbsd/contrib/libstdc++/include/ext/ropeimpl.h Mon Mar 1 > 21:30:11 2010 (r204537) >> @@ -382,7 +382,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) >> { >> _Rope_RopeLeaf<_CharT, _Alloc>* __l >> = (_Rope_RopeLeaf<_CharT, _Alloc>*)this; >> - __l->_Rope_RopeLeaf<_CharT, _Alloc>::~_Rope_RopeLeaf(); >> + __l->template _Rope_RopeLeaf<_CharT, _Alloc>::~_Rope_RopeLeaf(); >> _L_deallocate(__l, 1); >> break; >> } > > Hmm, this hurts my brain to have 'template ' in the middle of a dereference. Meet the beauty of modern C++. You can find a similar usage of 'typename' keyword too. > I also don't see why it should be needed. Hmm, I am not sure too, I think that the changed line could be simply written as follows without any ambiguity: __l->~_Rope_RopeLeaf(); but our base c++ complains about that construct, c++ 4.3, 4.4 and 4.5 from ports happily accept all three forms. clang++ from llvm-devel-2.7.r96348_1 didn't like any of the forms. I am not a C++ expert by any stretch, though. Here is some minimalistic test code: //************************************** template<typename T> struct B { B() {} ~B() {} }; template<typename T> struct S : public B<T> { S() {} ~S() {} }; template<typename T> struct C { void f() { S<T>* s = reinterpret_cast<S<T>*>(this); s->~S(); s->S<T>::~S(); s->template S<T>::~S(); } }; //************************************** >> Modified: projects/clangbsd/contrib/libstdc++/src/locale-inst.cc >> > ============================================================================== >> --- projects/clangbsd/contrib/libstdc++/src/locale-inst.cc Mon Mar 1 > 21:04:10 2010 (r204536) >> +++ projects/clangbsd/contrib/libstdc++/src/locale-inst.cc Mon Mar 1 > 21:30:11 2010 (r204537) >> @@ -180,11 +180,11 @@ _GLIBCXX_END_LDBL_NAMESPACE >> template class messages_byname<C>; >> >> // ctype >> - inline template class __ctype_abstract_base<C>; >> + template class __ctype_abstract_base<C>; >> template class ctype_byname<C>; >> >> // codecvt >> - inline template class __codecvt_abstract_base<C, char, mbstate_t>; >> + template class __codecvt_abstract_base<C, char, mbstate_t>; >> template class codecvt_byname<C, char, mbstate_t>; > > Perhaps try moving the 'template' before the 'inline'? Randomly dropping > 'inline' isn't really ideal I think. My C++ skills are a bit dusty but is there such a thing as 'inline class'? And that code (before the change) looks like an attempt at such thing via explicit template instantiation. -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4B8C5189.40102>