[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:
isuckatcs 2022-05-26 18:59:22 +02:00
parent 6226e46c5f
commit caf2767c47
2 changed files with 86 additions and 0 deletions

View File

@ -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);
}

View File

@ -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");
}
}