Summary: So it turns out we need to translate even more cases. Pulse had a FP before that this fixes. Reviewed By: ezgicicek Differential Revision: D16073629 fbshipit-source-id: c03460b5amaster
parent
14ce445f81
commit
e803a30c2d
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
|
||||
namespace std_visit {
|
||||
struct A {
|
||||
int s_;
|
||||
~A() {}
|
||||
A() {}
|
||||
};
|
||||
|
||||
// See https://en.cppreference.com/w/cpp/utility/variant/visit for more details
|
||||
using var_t = std::variant<float, int, A>;
|
||||
|
||||
template <class... Ts>
|
||||
struct overloaded : Ts... {
|
||||
using Ts::operator()...;
|
||||
};
|
||||
template <class... Ts>
|
||||
overloaded(Ts...)->overloaded<Ts...>;
|
||||
|
||||
void visit_ok(var_t x) {
|
||||
std::visit(overloaded{
|
||||
[](float a) {},
|
||||
[](int i) {},
|
||||
[](const A& a) {},
|
||||
},
|
||||
x);
|
||||
}
|
||||
|
||||
void visit_all_ok(std::vector<var_t>& vec) {
|
||||
for (auto& x : vec) {
|
||||
// the overloaded { .. } construct appears as an InitListExpr in
|
||||
// the AST that the frontend needs to translate. Otherwise, since
|
||||
// children of that InitListExpr create C++ temporaries, pulse
|
||||
// will complain that they get destroyed because it never sees
|
||||
// them being created (this is only a problem in a loop where the
|
||||
// same temporary is re-used without having been re-initialized).
|
||||
std::visit(overloaded{
|
||||
[](float a) {},
|
||||
[](int i) {},
|
||||
[](const A& a) {},
|
||||
},
|
||||
x);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace std_visit
|
Loading…
Reference in new issue