]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/53080 (tuple interface to std::array doesn't check bounds)
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 23 Apr 2012 12:26:43 +0000 (12:26 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 23 Apr 2012 12:26:43 +0000 (12:26 +0000)
2012-04-23  Paolo Carlini  <paolo.carlini@oracle.com>

PR libstdc++/53080
* include/std/array (tuple_element, get): static_assert I < N.
* testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc:
New.
* testsuite/23_containers/array/tuple_interface/get_neg.cc: Likewise.
* testsuite/23_containers/array/tuple_interface/tuple_element.cc: Fix.

From-SVN: r186702

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/array
libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element.cc
libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc [new file with mode: 0644]

index cf791b440acbfc12e216864f1b6102d223143085..b47289ea75bcf61528296d0ba8e84b89356c07e7 100644 (file)
@@ -1,3 +1,12 @@
+2012-04-23  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR libstdc++/53080
+       * include/std/array (tuple_element, get): static_assert I < N.
+       * testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc:
+       New.
+       * testsuite/23_containers/array/tuple_interface/get_neg.cc: Likewise.
+       * testsuite/23_containers/array/tuple_interface/tuple_element.cc: Fix.
+
 2012-04-23  Chris Jefferson  <chris@bubblescope.net>
 
        PR testsuite/53046
index 3e17744408327b8ce20f210e2fbe0902d2e5b2a7..e895dd7fc67f26249fb2994dd177c6c30e67900f 100644 (file)
@@ -1,6 +1,7 @@
 // <array> -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012
+// 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
@@ -261,23 +262,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     class tuple_element;
 
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
-    struct tuple_element<_Int, array<_Tp, _Nm> >
-    { typedef _Tp type; };
+    struct tuple_element<_Int, array<_Tp, _Nm>>
+    {
+      static_assert(_Int < _Nm, "index is out of bounds");
+      typedef _Tp type;
+    };
 
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
     constexpr _Tp&
     get(array<_Tp, _Nm>& __arr) noexcept
-    { return __arr._M_instance[_Int]; }
+    {
+      static_assert(_Int < _Nm, "index is out of bounds");
+      return __arr._M_instance[_Int];
+    }
 
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
     constexpr _Tp&&
     get(array<_Tp, _Nm>&& __arr) noexcept
-    { return std::move(get<_Int>(__arr)); }
+    {
+      static_assert(_Int < _Nm, "index is out of bounds");
+      return std::move(get<_Int>(__arr));
+    }
 
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
     constexpr const _Tp&
     get(const array<_Tp, _Nm>& __arr) noexcept
-    { return __arr._M_instance[_Int]; }
+    {
+      static_assert(_Int < _Nm, "index is out of bounds");
+      return __arr._M_instance[_Int];
+    }
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
diff --git a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/get_neg.cc
new file mode 100644 (file)
index 0000000..ecc25bf
--- /dev/null
@@ -0,0 +1,32 @@
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// Copyright (C) 2012 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/>.
+
+#include <array>
+
+std::array<int, 1> a{};
+const std::array<int, 1> ca{};
+
+int n1 = std::get<1>(a);
+int n2 = std::get<1>(std::move(a));
+int n3 = std::get<1>(ca);
+
+// { dg-error "static assertion failed" "" { target *-*-* } 275 }
+// { dg-error "static assertion failed" "" { target *-*-* } 283 }
+// { dg-error "static assertion failed" "" { target *-*-* } 291 }
index fac21a1aca70739eef4d1e96fa706e5a8ba28554..9ab5d8b95c69f7631cbecd57bca9bd0e000c74b1 100644 (file)
@@ -1,6 +1,6 @@
 // { dg-options "-std=gnu++0x" }
 //
-// Copyright (C) 2011 Free Software Foundation, Inc.
+// Copyright (C) 2011, 2012 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
@@ -27,19 +27,11 @@ test01()
   bool test __attribute__((unused)) = true;
   using namespace std;
 
-  {
-    const size_t len = 3;
-    typedef array<int, len> array_type;
-    VERIFY( (is_same<tuple_element<0, array_type>::type, int>::value == true) );
-    VERIFY( (is_same<tuple_element<1, array_type>::type, int>::value == true) );
-    VERIFY( (is_same<tuple_element<2, array_type>::type, int>::value == true) );
-  }
-
-  {
-    const size_t len = 0;
-    typedef array<int, len> array_type;
-    VERIFY( (is_same<tuple_element<0, array_type>::type, int>::value == true) );
-  }
+  const size_t len = 3;
+  typedef array<int, len> array_type;
+  VERIFY( (is_same<tuple_element<0, array_type>::type, int>::value == true) );
+  VERIFY( (is_same<tuple_element<1, array_type>::type, int>::value == true) );
+  VERIFY( (is_same<tuple_element<2, array_type>::type, int>::value == true) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc b/libstdc++-v3/testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc
new file mode 100644 (file)
index 0000000..7263813
--- /dev/null
@@ -0,0 +1,25 @@
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// Copyright (C) 2012 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/>.
+
+#include <array>
+
+typedef std::tuple_element<1, std::array<int, 1>>::type type;
+
+// { dg-error "static assertion failed" "" { target *-*-* } 267 }