Why does clang handle exceptions for this trivial std::variant code?
Asked Answered
F

1

7

If we have code like this:

#include <variant>

int main(){
    using V = std::variant<int, double>;
    V a = 5;
    V b = 5.6;

    a.swap(b);
}

https://gcc.godbolt.org/z/oqGiHs

If you compile with clang, it emits code that handle exception during swap.

Why is that? Both variants are non empty and underlying types are exception safe.

Update:

Ironically this compiles without exception:

#include <variant>

template<class T>
void sw(T &a, T &b){
    auto c = a;
    a = b;
    b = c;
}

int main(){
    using V = std::variant<int, double>;

    V a = 5;
    V b = 5.6;

    sw(a, b);
}
Fritzsche answered 16/6, 2020 at 8:29 Comment(3)
GCC just emits code for implicit return 0; in my case.Ansate
You are correct. I will edit the question.Fritzsche
It's a bit weird since noexcept(a.swap(b)) is true with Clang, so it should be able to "know" that nothing in main can actually throw.Ansate
F
2

This turns out to be clang bug.

https://bugs.llvm.org/show_bug.cgi?id=46342

It appears to be fixed, but I can not find the version where is fixed.

Fritzsche answered 4/7, 2020 at 11:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.