forked from OSchip/llvm-project
[Clang][AST] Fixed BindingDecl AST-dump for tuple like structures
The AST of a BindingDecl in case of tuple like structures wasn't properly printed. For these bidnings there is information stored in BindingDecl::getHoldingVar(), and this information was't printed in the AST-dump. Differential Revision: https://reviews.llvm.org/D126131
This commit is contained in:
parent
6226e46c5f
commit
caf2767c47
|
@ -467,6 +467,10 @@ public:
|
|||
void VisitBindingDecl(const BindingDecl *D) {
|
||||
if (Traversal == TK_IgnoreUnlessSpelledInSource)
|
||||
return;
|
||||
|
||||
if (const auto *V = D->getHoldingVar())
|
||||
Visit(V);
|
||||
|
||||
if (const auto *E = D->getBinding())
|
||||
Visit(E);
|
||||
}
|
||||
|
|
|
@ -1157,6 +1157,46 @@ void decomposition()
|
|||
f = 42;
|
||||
}
|
||||
|
||||
typedef __typeof(sizeof(int)) size_t;
|
||||
|
||||
struct Pair
|
||||
{
|
||||
int x, y;
|
||||
};
|
||||
|
||||
// Note: these utilities are required to force binding to tuple like structure
|
||||
namespace std
|
||||
{
|
||||
template <typename E>
|
||||
struct tuple_size
|
||||
{
|
||||
};
|
||||
|
||||
template <>
|
||||
struct tuple_size<Pair>
|
||||
{
|
||||
static constexpr size_t value = 2;
|
||||
};
|
||||
|
||||
template <size_t I, class T>
|
||||
struct tuple_element
|
||||
{
|
||||
using type = int;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
template <size_t I>
|
||||
int &&get(Pair &&p);
|
||||
|
||||
void decompTuple()
|
||||
{
|
||||
Pair p{1, 2};
|
||||
auto [a, b] = p;
|
||||
|
||||
a = 3;
|
||||
}
|
||||
|
||||
)cpp",
|
||||
{"-std=c++20"});
|
||||
|
||||
|
@ -1492,6 +1532,48 @@ DecompositionDecl ''
|
|||
|-BindingDecl 'f'
|
||||
|-BindingDecl 's'
|
||||
`-BindingDecl 't'
|
||||
)cpp");
|
||||
}
|
||||
|
||||
{
|
||||
auto FN = ast_matchers::match(
|
||||
functionDecl(hasName("decompTuple"),
|
||||
hasDescendant(decompositionDecl().bind("decomp"))),
|
||||
AST2->getASTContext());
|
||||
EXPECT_EQ(FN.size(), 1u);
|
||||
|
||||
EXPECT_EQ(
|
||||
dumpASTString(TK_AsIs, FN[0].getNodeAs<DecompositionDecl>("decomp")),
|
||||
R"cpp(
|
||||
DecompositionDecl ''
|
||||
|-CXXConstructExpr
|
||||
| `-ImplicitCastExpr
|
||||
| `-DeclRefExpr 'p'
|
||||
|-BindingDecl 'a'
|
||||
| |-VarDecl 'a'
|
||||
| | `-CallExpr
|
||||
| | |-ImplicitCastExpr
|
||||
| | | `-DeclRefExpr 'get'
|
||||
| | `-ImplicitCastExpr
|
||||
| | `-DeclRefExpr ''
|
||||
| `-DeclRefExpr 'a'
|
||||
`-BindingDecl 'b'
|
||||
|-VarDecl 'b'
|
||||
| `-CallExpr
|
||||
| |-ImplicitCastExpr
|
||||
| | `-DeclRefExpr 'get'
|
||||
| `-ImplicitCastExpr
|
||||
| `-DeclRefExpr ''
|
||||
`-DeclRefExpr 'b'
|
||||
)cpp");
|
||||
|
||||
EXPECT_EQ(dumpASTString(TK_IgnoreUnlessSpelledInSource,
|
||||
FN[0].getNodeAs<DecompositionDecl>("decomp")),
|
||||
R"cpp(
|
||||
DecompositionDecl ''
|
||||
|-DeclRefExpr 'p'
|
||||
|-BindingDecl 'a'
|
||||
`-BindingDecl 'b'
|
||||
)cpp");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue