2010-11-02  Benjamin Kosnik  <bkoz@redhat.com>

	    * include/std/tuple (tuple): Make default constructors constexpr.
	    * testsuite/20_util/tuple/cons/constexpr.cc: Add.

	    * testsuite/18_support/initializer_list/requirements/
	    constexpr_functions.cc: Add.
	    * testsuite/18_support/initializer_list/constexpr.cc: Add.

Index: include/std/tuple
===================================================================
--- include/std/tuple	(revision 166298)
+++ include/std/tuple	(working copy)
@@ -64,7 +64,7 @@
     struct _Head_base<_Idx, _Head, true>
     : public _Head
     {
-      _Head_base()
+      constexpr _Head_base()
       : _Head() { }
 
       _Head_base(const _Head& __h)
@@ -83,7 +83,7 @@
   template<std::size_t _Idx, typename _Head>
     struct _Head_base<_Idx, _Head, false>
     {
-      _Head_base()
+      constexpr _Head_base()
       : _M_head_impl() { }
 
       _Head_base(const _Head& __h)
@@ -147,7 +147,7 @@
       _Inherited&       _M_tail()       { return *this; }
       const _Inherited& _M_tail() const { return *this; }
 
-      _Tuple_impl()
+      constexpr _Tuple_impl()
       : _Inherited(), _Base() { }
 
       explicit 
@@ -225,7 +225,7 @@
       typedef _Tuple_impl<0, _Elements...> _Inherited;
 
     public:
-      _GLIBCXX_CONSTEXPR tuple()
+      constexpr tuple()
       : _Inherited() { }
 
       explicit
@@ -310,7 +310,7 @@
       typedef _Tuple_impl<0, _T1, _T2> _Inherited;
 
     public:
-      tuple()
+      constexpr tuple()
       : _Inherited() { }
 
       explicit
@@ -408,7 +408,7 @@
       typedef _Tuple_impl<0, _T1> _Inherited;
 
     public:
-      tuple()
+      constexpr tuple()
       : _Inherited() { }
 
       explicit
Index: testsuite/18_support/initializer_list/requirements/constexpr_functions.cc
===================================================================
--- testsuite/18_support/initializer_list/requirements/constexpr_functions.cc	(revision 0)
+++ testsuite/18_support/initializer_list/requirements/constexpr_functions.cc	(revision 0)
@@ -0,0 +1,57 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2010 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 <initializer_list>
+#include <testsuite_common_types.h>
+
+namespace __gnu_test
+{
+  struct constexpr_member_functions
+  {
+    template<typename _Ttesttype>
+      void
+      operator()()
+      {
+	struct _Concept
+	{
+	  void __constraint()
+	  { 
+	    constexpr _Ttesttype obj;
+	    constexpr auto v4 __attribute__((unused))
+	      = obj.size();
+	    constexpr auto v5 __attribute__((unused))
+	      = obj.begin();
+	    constexpr auto v6 __attribute__((unused))
+	      = obj.end();
+	  }
+	};
+
+	_Concept c;
+	c.__constraint();
+      }
+  };
+}
+
+int main()
+{
+  __gnu_test::constexpr_member_functions test;
+  test.operator()<std::initializer_list<int>>();
+  return 0;
+}
Index: testsuite/18_support/initializer_list/constexpr.cc
===================================================================
--- testsuite/18_support/initializer_list/constexpr.cc	(revision 0)
+++ testsuite/18_support/initializer_list/constexpr.cc	(revision 0)
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2010 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 <initializer_list>
+#include <testsuite_common_types.h>
+
+int main()
+{
+  __gnu_test::constexpr_default_constructible test1;
+  test1.operator()<std::initializer_list<long>>();
+
+  return 0;
+}
Index: testsuite/20_util/tuple/cons/constexpr.cc
===================================================================
--- testsuite/20_util/tuple/cons/constexpr.cc	(revision 0)
+++ testsuite/20_util/tuple/cons/constexpr.cc	(revision 0)
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2010 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 <memory>
+#include <testsuite_common_types.h>
+
+int main()
+{
+  __gnu_test::constexpr_default_constructible test;
+  test.operator()<std::tuple<int, int>>();
+  return 0;
+}
