https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92005
Bug ID: 92005
Summary: switch code generation regression
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: pdimov at gmail dot com
Target Milestone: ---
The following code:
```
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
struct T0 {};
struct T1 {};
struct T2 {};
struct T3 {};
struct T4 {};
struct variant
{
unsigned index_;
union
{
T0 t0_;
T1 t1_;
T2 t2_;
T3 t3_;
T4 t4_;
};
};
template<class F> int visit( F f, variant const& v )
{
switch( v.index_ )
{
case 0: return f( v.t0_ );
case 1: return f( v.t1_ );
case 2: return f( v.t2_ );
case 3: return f( v.t3_ );
case 4: return f( v.t4_ );
default: __builtin_unreachable();
}
}
int do_visit(variant const& v) {
return visit(overloaded{
[](T0 val) { return 3; },
[](T1 val) { return 5; },
[](T2 val) { return 8; },
[](T3 val) { return 9; },
[](T4 val) { return 10; }
}, v);
}
```
(https://godbolt.org/z/uxQ6KF)
generates
```
do_visit(variant const&):
mov eax, DWORD PTR [rdi]
jmp [QWORD PTR .L4[0+rax*8]]
.L4:
.quad .L8
.quad .L7
.quad .L9
.quad .L5
.quad .L3
.L9:
mov eax, 8
ret
.L7:
mov eax, 5
ret
.L8:
mov eax, 3
ret
.L5:
mov eax, 9
ret
.L3:
mov eax, 10
ret
```
with the current gcc trunk on godbolt.org (g++ (Compiler-Explorer-Build) 10.0.0
20191005 (experimental)) and
```
do_visit(variant const&):
mov eax, DWORD PTR [rdi]
mov eax, DWORD PTR CSWTCH.7[0+rax*4]
ret
CSWTCH.7:
.long 3
.long 5
.long 8
.long 9
.long 10
```
with gcc 9.2.