[PATCH] D139544: [clang][dataflow] Add support for structured bindings of tuple-like types.
Domján Dániel via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 8 00:56:56 PST 2022
isuckatcs added a comment.
> If CFG can be updated so that the
> synthesized variables occur in the block *before* the DeclStmt containing the
> DecompositionDecl, then we can drop the workaround that is included in this
> patch.
I'm not sure that this is possible.
If you look at the AST of the following example
std::pair<int, int> p{1, 2};
auto [a, b] = p;
you get
`-DecompositionDecl 0x55b0ac862428 'std::pair<int, int>':'std::pair<int, int>' cinit
|-CXXConstructExpr
| `-ImplicitCastExpr
| `-DeclRefExpr 'p'
|-BindingDecl a
| |-VarDecl a
| | `-CallExpr
| | |-ImplicitCastExpr
| | | `-DeclRefExpr 'get'
| | `-ImplicitCastExpr
| | `-DeclRefExpr Decomposition 0x55b0ac862428 ''
| `-DeclRefExpr 'a'
` ...
Basically `get<>()` is getting the element from the copy of the struct, that's being created when the `DecompositionDecl` happens.
The CFG reflects this accordingly.
7: p
8: [B1.7] (ImplicitCastExpr, NoOp, const pair<int, int>)
9: [B1.8] (CXXConstructExpr, [B1.10], std::pair<int, int>)
10: auto = p;
11: get<0UL>
12: [B1.11] (ImplicitCastExpr, FunctionToPointerDecay, typename tuple_element<0UL, pair<int, int> >::type &&(*)(pair<int, int> &&) noexcept)
13:
14: [B1.13] (ImplicitCastExpr, NoOp, std::pair<int, int>)
15: [B1.12]([B1.14])
16: std::tuple_element<0, std::pair<int, int>>::type a = get<0UL>();
Here `13` would be the `DecompositionDecl`. The variable declarations must appear after the `DecompositionDecl`,
otherwhise the tuple, from which the variables are initialized cannot be accessed.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139544/new/
https://reviews.llvm.org/D139544
More information about the cfe-commits
mailing list