You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.7 KiB
92 lines
2.7 KiB
2016-02-10 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. |
|
|
|
--- libstdc++-v3/include/bits/valarray_before.h (revision 233264) |
|
+++ libstdc++-v3/include/bits/valarray_before.h (revision 233265) |
|
@@ -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. |
|
--- libstdc++-v3/testsuite/26_numerics/valarray/69116.cc (nonexistent) |
|
+++ libstdc++-v3/testsuite/26_numerics/valarray/69116.cc (revision 233265) |
|
@@ -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; |
|
+}
|
|
|