aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2009-03-11 01:51:59 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2009-03-11 01:51:59 +0000
commit23cdf8e8f6f1195788e81995bc9cf5997b5ce1fc (patch)
tree4c922c198e69b52071e20c908358a0f09da2b218
parentb1ab21e7f5ef455590b2be094997f976883c1e6e (diff)
downloadgcc-23cdf8e8f6f1195788e81995bc9cf5997b5ce1fc.zip
gcc-23cdf8e8f6f1195788e81995bc9cf5997b5ce1fc.tar.gz
gcc-23cdf8e8f6f1195788e81995bc9cf5997b5ce1fc.tar.bz2
complex (operator+(const complex<>&, const _Tp&), [...]): Do not assume real() returns a reference (against DR 387).
2009-03-10 Paolo Carlini <paolo.carlini@oracle.com> * include/std/complex (operator+(const complex<>&, const _Tp&), operator+(const _Tp&, const complex<>&), operator-(const complex<>&, const _Tp&), operator-(const _Tp&, const complex<>&)): Do not assume real() returns a reference (against DR 387). * testsuite/26_numerics/complex/dr387_2.cc: New. From-SVN: r144770
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/std/complex8
-rw-r--r--libstdc++-v3/testsuite/26_numerics/complex/dr387_2.cc31
3 files changed, 44 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7b9ca75..8d326b3 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2009-03-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/std/complex (operator+(const complex<>&, const _Tp&),
+ operator+(const _Tp&, const complex<>&),
+ operator-(const complex<>&, const _Tp&),
+ operator-(const _Tp&, const complex<>&)): Do not assume real()
+ returns a reference (against DR 387).
+ * testsuite/26_numerics/complex/dr387_2.cc: New.
+
2009-03-02 Benjamin Kosnik <bkoz@redhat.com>
* testsuite/thread/pthread4.cc: Move...
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index ebde1a0..e5c5835 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -333,7 +333,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
operator+(const complex<_Tp>& __x, const _Tp& __y)
{
complex<_Tp> __r = __x;
- __r.real() += __y;
+ __r += __y;
return __r;
}
@@ -342,7 +342,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
operator+(const _Tp& __x, const complex<_Tp>& __y)
{
complex<_Tp> __r = __y;
- __r.real() += __x;
+ __r += __x;
return __r;
}
//@}
@@ -363,7 +363,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
operator-(const complex<_Tp>& __x, const _Tp& __y)
{
complex<_Tp> __r = __x;
- __r.real() -= __y;
+ __r -= __y;
return __r;
}
@@ -372,7 +372,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
operator-(const _Tp& __x, const complex<_Tp>& __y)
{
complex<_Tp> __r(__x, -__y.imag());
- __r.real() -= __y.real();
+ __r -= __y.real();
return __r;
}
//@}
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/dr387_2.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr387_2.cc
new file mode 100644
index 0000000..33a502f
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/complex/dr387_2.cc
@@ -0,0 +1,31 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+//
+// 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 2, 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 COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+#include <complex>
+
+// DR 387. std::complex over-encapsulated.
+// http://gcc.gnu.org/ml/gcc/2009-03/msg00264.html
+typedef std::complex<double> C;
+
+C f1(C& c) { return c+1.0; }
+C f2(C& c) { return c-1.0; }
+C f3(C& c) { return 1.0+c; }
+C f4(C& c) { return 1.0-c; }