This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] fix libstdc++/40691


Use of operator ! with a slice of a valarray fails with a complaint
from the compiler about an invalid conversion.  The return value of
that operator function is wrong, possibly because code was copied from
other unary operators that return the type of the operand rather than
valarray<bool>.

Tested on powerpc64-linux by bootstrapping c,c++ and running the
testsuite (including the libraries, of course) with no regressions.
OK for trunk?

2009-07-08  Janis Johnson  <janis187@us.ibm.com>

	PR libstdc++/40691
	* include/bugs/valarray-after.h (_Expr::operator!): Fix return type.
	* testsuite/26_numerics/valarray/40691.cc: New test.

Index: libstdc++-v3/include/bits/valarray_after.h
===================================================================
--- libstdc++-v3/include/bits/valarray_after.h	(revision 149287)
+++ libstdc++-v3/include/bits/valarray_after.h	(working copy)
@@ -315,7 +315,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     _Expr<_Dom, _Tp>::operator!() const
     {
       typedef _UnClos<__logical_not, std::_Expr, _Dom> _Closure;
-      return _Expr<_Closure, _Tp>(_Closure(this->_M_closure));
+      return _Expr<_Closure, bool>(_Closure(this->_M_closure));
     }
 
 #define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name)                           \
Index: libstdc++-v3/testsuite/26_numerics/valarray/40691.cc
===================================================================
--- libstdc++-v3/testsuite/26_numerics/valarray/40691.cc	(revision 0)
+++ libstdc++-v3/testsuite/26_numerics/valarray/40691.cc	(revision 0)
@@ -0,0 +1,39 @@
+// Copyright (C) 2009 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 }
+
+#include <valarray>
+
+// PR libstdc++/40691
+void test01()
+{
+  const std::valarray<int> vi(12);
+  std::valarray<bool> vb1(12);
+  std::valarray<bool> vb2(3);
+  std::slice s(0,3,4);
+
+  vb1 = !vi;
+  vb2 = !(std::valarray<int>)vi[s];
+  vb2 = !vi[s];
+}
+
+int main()
+{
+  test01();
+  return 0;
+}



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]