re PR c++/40192 (Unable to use std::vector with typedef'd array types)

2009-05-18  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/40192
	* include/bits/stl_construct.h (struct _Destroy_aux): Add.
	(_Destroy(_ForwardIterator, _ForwardIterator)): Use the latter.
	* testsuite/23_containers/vector/40192.cc: New.

From-SVN: r147681
This commit is contained in:
Paolo Carlini 2009-05-18 23:16:48 +00:00 committed by Paolo Carlini
parent 9ea04561f2
commit 27e21e080c
3 changed files with 57 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2009-05-18 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/40192
* include/bits/stl_construct.h (struct _Destroy_aux): Add.
(_Destroy(_ForwardIterator, _ForwardIterator)): Use the latter.
* testsuite/23_containers/vector/40192.cc: New.
2009-05-13 Ben Elliston <bje@au.ibm.com>
Backport from mainline:

View File

@ -82,6 +82,26 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
template<bool>
struct _Destroy_aux
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator __first, _ForwardIterator __last)
{
for (; __first != __last; ++__first)
std::_Destroy(&*__first);
}
};
template<>
struct _Destroy_aux<true>
{
template<typename _ForwardIterator>
static void
__destroy(_ForwardIterator, _ForwardIterator) { }
};
/**
* Destroy a range of objects. If the value_type of the object has
* a trivial destructor, the compiler should optimize all of this
@ -93,9 +113,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{
typedef typename iterator_traits<_ForwardIterator>::value_type
_Value_type;
if (!__has_trivial_destructor(_Value_type))
for (; __first != __last; ++__first)
std::_Destroy(&*__first);
std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
__destroy(__first, __last);
}
/**

View File

@ -0,0 +1,28 @@
// Copyright (C) 2009 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
// libstdc++/40192
#include <vector>
void test01()
{
typedef float float4[4];
std::vector<float4> vals;
}