https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94414
Bug ID: 94414
Summary: only `--` gives constexpr
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: dmusiienko at gmail dot com
Target Milestone: ---
x86-64 gcc (trunk)
-std=c++20 -O3
`++` - is not constexpr
`--` - is constexpr
==========================================
#include <ranges>
#include <array>
namespace rv = std::views;
int main()
{
constexpr std::array arr{5, 6, 7, 8};
auto contfilt = arr | rv::filter([](auto x){return x>5;})
| rv::transform([](auto x){return x*x;});
return *(++contfilt.begin());
}
===========================================
main:
movdqa xmm0, XMMWORD PTR .LC0[rip]
lea rax, [rsp-16]
movaps XMMWORD PTR [rsp-24], xmm0
jmp .L3
.L6:
add rax, 4
lea rdx, [rsp-8]
cmp rax, rdx
je .L2
.L3:
cmp DWORD PTR [rax], 5
jle .L6
.L2:
mov eax, DWORD PTR [rax]
imul eax, eax
ret
.LC0:
.long 5
.long 6
.long 7
.long 8
=========================================
Okay, but ...
========================================
#include <ranges>
#include <array>
namespace rv = std::views;
int main()
{
constexpr std::array arr{5, 6, 7, 8};
auto contfilt = arr | rv::filter([](auto x){return x>5;})
| rv::transform([](auto x){return x*x;});
return *(----contfilt.end());
}
========================================
main:
mov eax, 49
ret
========================================
Okay, but.....
========================================
#include <ranges>
#include <array>
namespace rv = std::views;
int main()
{
constexpr std::array arr{5, 6, 7, 8};
auto contfilt = arr | rv::filter([](auto x){return x>5;})
| rv::transform([](auto x){return x*x;});
return *(++(------contfilt.end()));
}
========================================
main:
mov eax, 49
ret