svn commit: r204537 - in projects/clangbsd/contrib/libstdc++: include/ext src

Andriy Gapon avg at freebsd.org
Tue Mar 2 14:13:08 UTC 2010


on 02/03/2010 01:45 Andriy Gapon said the following:
> 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.

Update: after upgrade to llvm-devel-2.7.r97497 only the old variant is rejected,
new variant and my proposed variant are accepted.

> 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();
>         }
> };
> 
> //**************************************
-- 
Andriy Gapon


More information about the svn-src-projects mailing list