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.