On 26/11/18 09:30 +0100, Christophe Lyon wrote:
On Thu, 22 Nov 2018 at 10:20, Jonathan Wakely <jwak...@redhat.com> wrote:
On 20/11/18 17:58 -0500, Ed Smith-Rowland wrote:
>On 11/19/18 6:13 AM, Jonathan Wakely wrote:
>>On 16/11/18 19:39 -0500, Ed Smith-Rowland wrote:
>>>@@ -322,67 +323,43 @@
>>> //@{
>>> /// Return new complex value @a x plus @a y.
>>> template<typename _Tp>
>>>- inline complex<_Tp>
>>>+ inline _GLIBCXX20_CONSTEXPR complex<_Tp>
>>> operator+(const complex<_Tp>& __x, const complex<_Tp>& __y)
>>>- {
>>>- complex<_Tp> __r = __x;
>>>- __r += __y;
>>>- return __r;
>>>- }
>>>+ { return complex<_Tp>(__x.real() + __y.real(), __x.imag() +
>>>__y.imag()); }
>>
>>Is this change (and all the similar ones) really needed?
>>
>>Doesn't the fact that all the constructors and member operators of
>>std::complex mean that the original definition is also valid in a
>>constexpr function?
>These changes are rolled back. Sorry.
>>>@@ -1163,50 +1143,43 @@
>>>#endif
>>>
>>> template<typename _Tp>
>>>- complex&
>>>+ _GLIBCXX20_CONSTEXPR complex&
>>> operator=(const complex<_Tp>& __z)
>>> {
>>>- __real__ _M_value = __z.real();
>>>- __imag__ _M_value = __z.imag();
>>>+ _M_value = __z.__rep();
>>
>>These changes look OK, but I wonder if we shouldn't ask the compiler
>>to make it possible to use __real__ and __imag__ in constexpr
>>functions instead.
>>
>>I assume it doesn't, and that's why you made this change. But if it
>>Just Worked, and the other changes I commented on above are also
>>unnecessary, then this patch would *mostly* just be adding
>>_GLIBCXX20_CONSTEXPR which is OK for stage 3 (as it doesn't affect any
>>dialects except C++2a).
>
>Yes, this is the issue. I agree that constexpr _real__, __imag__would
>be better.
>
>Do you have any idea where this change would be? I grepped around a
>little and couldn't figure it out. if you don't I'll look more.
No idea, sorry.
>Actually, looking at constexpr.c it looks like the old way ought to work...
>
>OK, plain assignment works but not the others. Interesting.
>
>>
>>>@@ -1872,7 +1831,7 @@
>>> { return _Tp(); }
>>>
>>> template<typename _Tp>
>>>- inline typename __gnu_cxx::__promote<_Tp>::__type
>>>+ _GLIBCXX_CONSTEXPR inline typename
>>>__gnu_cxx::__promote<_Tp>::__type
>>
>>This should be _GLIBCXX20_CONSTEXPR.
>Done.
>>>Index:
>>>testsuite/26_numerics/complex/comparison_operators/more_constexpr.cc
>>>===================================================================
>>>---
>>>testsuite/26_numerics/complex/comparison_operators/more_constexpr.cc
>>>(nonexistent)
>>>+++
>>>testsuite/26_numerics/complex/comparison_operators/more_constexpr.cc
>>>(working copy)
>>>@@ -0,0 +1,51 @@
>>>+// { dg-do compile { target c++2a } }
>>
>>All the tests with { target c++2a} should also have:
>>
>>// { dg-options "-std=gnu++2a" }
>>
>>Because otherwise they are skipped by default, and only get run when
>>RUNTESTFLAGS explicitly includes something like
>>--target_board=unix/-std=gnu++2a
>>
>>The dg-options needs to come first, or it doesn't apply before the
>>check for { target c++2a }.
>>
>Thank you, done.
OK for trunk, thanks.
>Updated patch attached. I'd like to understand why
>
> __real__ _M_value += __z.real();
>
>doesn't work though.
Yes, I agree it should. If you don't figure it out please file a bug
requesting that it works, so somebody else might look into it.
Hi,
I have noticed that
FAIL: 26_numerics/complex/requirements/more_constexpr.cc
on arm and aarch64
The error messages:
Excess errors:
/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc:168:
error: '__float128' was not declared in this scope
/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc:168:
error: no matching function for call to
'test_operator_members<<expression error>, __float128>()'
/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc:168:
error: template argument 1 is invalid
Should be fixed by this patch, committed to trunk.
commit 71f24d050e9e1e4632c62c2801691151e63292b3
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Mon Nov 26 11:09:10 2018 +0000
Only use __float128 in test if available
* testsuite/26_numerics/complex/requirements/more_constexpr.cc: Fix
failure on targets without __float128.
diff --git a/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc b/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc
index 902e7ce8e87..5e515a692db 100644
--- a/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc
+++ b/libstdc++-v3/testsuite/26_numerics/complex/requirements/more_constexpr.cc
@@ -164,8 +164,10 @@ int main()
__gnu_test::test_operator_members<long double, double>();
__gnu_test::test_operator_members<long double, long double>();
+#if defined(_GLIBCXX_USE_FLOAT128)
// Test primary template.
__gnu_test::test_operator_members<__float128, __float128>();
+#endif
return 0;
}