Constrain std::valarray functions and operators

PR libstdc++/69116
	* include/bits/valarray_before.h (__fun, __fun_with_valarray): Only
	define result_type for types which can be safely used with valarrays.
	* testsuite/26_numerics/valarray/69116.cc: New.

From-SVN: r232748
This commit is contained in:
Jonathan Wakely 2016-01-22 21:15:41 +00:00 committed by Jonathan Wakely
parent 130ee9a9fc
commit d1fb377c68
3 changed files with 70 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2016-01-22 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/69116
* include/bits/valarray_before.h (__fun, __fun_with_valarray): Only
define result_type for types which can be safely used with valarrays.
* testsuite/26_numerics/valarray/69116.cc: New.
PR libstdc++/69413
* config/os/gnu-linux/os_defines.h: Define
_GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC.

View File

@ -331,14 +331,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return pow(__x, __y); }
};
template<typename _Tp, bool _IsValidValarrayValue = !__is_abstract(_Tp)>
struct __fun_with_valarray
{
typedef _Tp result_type;
};
template<typename _Tp>
struct __fun_with_valarray<_Tp, false>
{
// No result type defined for invalid value types.
};
// We need these bits in order to recover the return type of
// some functions/operators now that we're no longer using
// function templates.
template<typename, typename _Tp>
struct __fun
struct __fun : __fun_with_valarray<_Tp>
{
typedef _Tp result_type;
};
// several specializations for relational operators.

View File

@ -0,0 +1,53 @@
// Copyright (C) 2016 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 }
// { dg-options "-std=gnu++98" }
// libstdc++/69116
#include <exception>
#include <valarray>
template<typename T>
void foo(const T&) { }
struct X : std::exception // makes namespace std an associated namespace
{
virtual void pure() = 0;
typedef void(*func_type)(const X&);
void operator+(func_type) const;
void operator-(func_type) const;
void operator*(func_type) const;
void operator/(func_type) const;
void operator%(func_type) const;
void operator<<(func_type) const;
void operator>>(func_type) const;
};
void foo(X& x)
{
x + foo;
x - foo;
x * foo;
x / foo;
x % foo;
x << foo;
x >> foo;
}