diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 07bb4fec152..78d23a5a9fe 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2012-03-12 Paolo Carlini + + 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. + 2012-03-10 John David Anglin * config/abi/post/hppa-linux-gnu/baseline_symbols.txt: Remove TLS diff --git a/libstdc++-v3/libsupc++/tinfo.cc b/libstdc++-v3/libsupc++/tinfo.cc index eba74dbdada..d7affedfc27 100644 --- a/libstdc++-v3/libsupc++/tinfo.cc +++ b/libstdc++-v3/libsupc++/tinfo.cc @@ -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 @@ std::type_info:: // 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 (); diff --git a/libstdc++-v3/libsupc++/tinfo2.cc b/libstdc++-v3/libsupc++/tinfo2.cc index 0182c6cc0de..e4c36649f34 100644 --- a/libstdc++-v3/libsupc++/tinfo2.cc +++ b/libstdc++-v3/libsupc++/tinfo2.cc @@ -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 @@ using std::type_info; #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 (); diff --git a/libstdc++-v3/libsupc++/typeinfo b/libstdc++-v3/libsupc++/typeinfo index f0382d64f76..bf0935cfb59 100644 --- a/libstdc++-v3/libsupc++/typeinfo +++ b/libstdc++-v3/libsupc++/typeinfo @@ -98,15 +98,15 @@ namespace std /** 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 @@ namespace std // 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 @@ namespace std #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__ diff --git a/libstdc++-v3/testsuite/18_support/type_info/52562.cc b/libstdc++-v3/testsuite/18_support/type_info/52562.cc new file mode 100644 index 00000000000..6b2aaf7fe47 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/type_info/52562.cc @@ -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 +// . + +#include + +template T& lval() noexcept; + +// libstdc++/52562 +static_assert(noexcept(lval().name()), ""); +static_assert(noexcept(lval().before(lval())), +""); +static_assert(noexcept(lval() == lval()), ""); +static_assert(noexcept(lval() != lval()), "");