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.

Reply via email to