diff mbox

[v3] libstdc++/52562

Message ID 4F5DFFE9.3050603@oracle.com
State New
Headers show

Commit Message

Paolo Carlini March 12, 2012, 1:53 p.m. UTC
Hi,

barring unexpected issues in mainline will go in 4.7.1 too.

Tested x86_64-linux.

Thanks,
Paolo.

///////////////////////////
2012-03-12  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/52562
	* libsupc++/typeinfo (type_info::name, before, operator==,
	operator!=): Mark noexcept in C++11 mode.
	* libsupc++/tinfo.cc (type_info::operator==): Adjust.
	* libsupc++/tinfo2.cc (type_info::before): Likewise.
	* testsuite/18_support/type_info/52562.cc: New.
diff mbox

Patch

Index: libsupc++/tinfo2.cc
===================================================================
--- libsupc++/tinfo2.cc	(revision 185225)
+++ libsupc++/tinfo2.cc	(working copy)
@@ -1,6 +1,7 @@ 
 // Methods for type_info for -*- C++ -*- Run Time Type Identification.
 
-// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2009
+// Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2009,
+// 2012
 // Free Software Foundation
 //
 // This file is part of GCC.
@@ -32,7 +33,7 @@ 
 #if !__GXX_TYPEINFO_EQUALITY_INLINE
 
 bool
-type_info::before (const type_info &arg) const
+type_info::before (const type_info &arg) const _GLIBCXX_NOEXCEPT
 {
 #if __GXX_MERGED_TYPEINFO_NAMES
   return name () < arg.name ();
Index: libsupc++/tinfo.cc
===================================================================
--- libsupc++/tinfo.cc	(revision 185225)
+++ libsupc++/tinfo.cc	(working copy)
@@ -1,6 +1,6 @@ 
 // Methods for type_info for -*- C++ -*- Run Time Type Identification.
 // Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-// 2003, 2004, 2005, 2006, 2007, 2009
+// 2003, 2004, 2005, 2006, 2007, 2009, 2012
 // Free Software Foundation
 //
 // This file is part of GCC.
@@ -36,7 +36,7 @@ 
 
 // We can't rely on common symbols being shared between shared objects.
 bool std::type_info::
-operator== (const std::type_info& arg) const
+operator== (const std::type_info& arg) const _GLIBCXX_NOEXCEPT
 {
 #if __GXX_MERGED_TYPEINFO_NAMES
   return name () == arg.name ();
Index: libsupc++/typeinfo
===================================================================
--- libsupc++/typeinfo	(revision 185225)
+++ libsupc++/typeinfo	(working copy)
@@ -98,15 +98,15 @@ 
 
     /** Returns an @e implementation-defined byte string; this is not
      *  portable between compilers!  */
-    const char* name() const
+    const char* name() const _GLIBCXX_NOEXCEPT
     { return __name[0] == '*' ? __name + 1 : __name; }
 
 #if !__GXX_TYPEINFO_EQUALITY_INLINE
     // In old abi, or when weak symbols are not supported, there can
     // be multiple instances of a type_info object for one
     // type. Uniqueness must use the _name value, not object address.
-    bool before(const type_info& __arg) const;
-    bool operator==(const type_info& __arg) const;
+    bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT;
+    bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT;
 #else
   #if !__GXX_MERGED_TYPEINFO_NAMES
     /** Returns true if @c *this precedes @c __arg in the implementation's
@@ -114,12 +114,12 @@ 
     // Even with the new abi, on systems that support dlopen
     // we can run into cases where type_info names aren't merged,
     // so we still need to do string comparison.
-    bool before(const type_info& __arg) const
+    bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT
     { return (__name[0] == '*' && __arg.__name[0] == '*')
 	? __name < __arg.__name
 	: __builtin_strcmp (__name, __arg.__name) < 0; }
 
-    bool operator==(const type_info& __arg) const
+    bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
     {
       return ((__name == __arg.__name)
 	      || (__name[0] != '*' &&
@@ -128,14 +128,14 @@ 
   #else
     // On some targets we can rely on type_info's NTBS being unique,
     // and therefore address comparisons are sufficient.
-    bool before(const type_info& __arg) const
+    bool before(const type_info& __arg) const _GLIBCXX_NOEXCEPT
     { return __name < __arg.__name; }
 
-    bool operator==(const type_info& __arg) const
+    bool operator==(const type_info& __arg) const _GLIBCXX_NOEXCEPT
     { return __name == __arg.__name; }
   #endif
 #endif
-    bool operator!=(const type_info& __arg) const
+    bool operator!=(const type_info& __arg) const _GLIBCXX_NOEXCEPT
     { return !operator==(__arg); }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
Index: testsuite/18_support/type_info/52562.cc
===================================================================
--- testsuite/18_support/type_info/52562.cc	(revision 0)
+++ testsuite/18_support/type_info/52562.cc	(revision 0)
@@ -0,0 +1,30 @@ 
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+
+// Copyright (C) 2012 Free Software Foundation
+//
+// 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 <typeinfo>
+
+template<class T> T& lval() noexcept;
+
+// libstdc++/52562
+static_assert(noexcept(lval<std::type_info>().name()), "");
+static_assert(noexcept(lval<std::type_info>().before(lval<std::type_info>())),
+"");
+static_assert(noexcept(lval<std::type_info>() == lval<std::type_info>()), "");
+static_assert(noexcept(lval<std::type_info>() != lval<std::type_info>()), "");