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) {
|
void VisitBindingDecl(const BindingDecl *D) {
|
||||||
if (Traversal == TK_IgnoreUnlessSpelledInSource)
|
if (Traversal == TK_IgnoreUnlessSpelledInSource)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (const auto *V = D->getHoldingVar())
|
||||||
|
Visit(V);
|
||||||
|
|
||||||
if (const auto *E = D->getBinding())
|
if (const auto *E = D->getBinding())
|
||||||
Visit(E);
|
Visit(E);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1157,6 +1157,46 @@ void decomposition()
|
||||||
f = 42;
|
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",
|
)cpp",
|
||||||
{"-std=c++20"});
|
{"-std=c++20"});
|
||||||
|
|
||||||
|
@ -1492,6 +1532,48 @@ DecompositionDecl ''
|
||||||
|-BindingDecl 'f'
|
|-BindingDecl 'f'
|
||||||
|-BindingDecl 's'
|
|-BindingDecl 's'
|
||||||
`-BindingDecl 't'
|
`-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");
|
)cpp");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue