From 3f01225910711e655faef56d694cf7c404d9ec35 Mon Sep 17 00:00:00 2001 From: paolo Date: Wed, 11 Mar 2009 01:51:59 +0000 Subject: [PATCH] 2009-03-10 Paolo Carlini * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144770 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 9 +++++++ libstdc++-v3/include/std/complex | 8 +++--- .../testsuite/26_numerics/complex/dr387_2.cc | 31 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 libstdc++-v3/testsuite/26_numerics/complex/dr387_2.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7b9ca756276..8d326b3b335 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2009-03-10 Paolo Carlini + + * 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 * testsuite/thread/pthread4.cc: Move... diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index ebde1a0a232..e5c583554c1 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 00000000000..33a502f0892 --- /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 + +// DR 387. std::complex over-encapsulated. +// http://gcc.gnu.org/ml/gcc/2009-03/msg00264.html +typedef std::complex 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; } -- 2.11.4.GIT