svn commit: r204537 - in projects/clangbsd/contrib/libstdc++:
include/ext src
Andriy Gapon
avg at freebsd.org
Tue Mar 2 00:04:59 UTC 2010
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
More information about the svn-src-projects
mailing list