From: Paolo Carlini Date: Wed, 11 Mar 2009 01:51:59 +0000 (+0000) Subject: complex (operator+(const complex<>&, const _Tp&), [...]): Do not assume real() return... X-Git-Tag: releases/gcc-4.4.0~310 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=23cdf8e8f6f1195788e81995bc9cf5997b5ce1fc;p=thirdparty%2Fgcc.git complex (operator+(const complex<>&, const _Tp&), [...]): Do not assume real() returns a reference (against DR 387). 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. From-SVN: r144770 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7b9ca756276d..8d326b3b3353 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 ebde1a0a2320..e5c583554c17 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 000000000000..33a502f08923 --- /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; }