Add a StmtPrinter test for implicit and explicit conversion operator calls.

Put back a comment that I removed too aggressively.

llvm-svn: 202255
This commit is contained in:
Benjamin Kramer 2014-02-26 10:23:43 +00:00
parent bd25bebf75
commit 594802f744
2 changed files with 52 additions and 5 deletions

View File

@ -519,6 +519,7 @@ TEST(DeclPrinter, TestCXXConstructorDecl11) {
"};",
constructorDecl(ofClass(hasName("A"))).bind("id"),
"A<T...>(T &&ts...) : T(ts)..."));
// WRONG; Should be: "A(T&&... ts) : T(ts)..."
}
TEST(DeclPrinter, TestCXXDestructorDecl1) {

View File

@ -64,11 +64,10 @@ public:
}
};
::testing::AssertionResult PrintedStmtMatches(
StringRef Code,
const std::vector<std::string> &Args,
const DeclarationMatcher &NodeMatch,
StringRef ExpectedPrinted) {
template <typename T>
::testing::AssertionResult
PrintedStmtMatches(StringRef Code, const std::vector<std::string> &Args,
const T &NodeMatch, StringRef ExpectedPrinted) {
PrintMatch Printer;
MatchFinder Finder;
@ -96,6 +95,15 @@ public:
return ::testing::AssertionSuccess();
}
::testing::AssertionResult
PrintedStmtCXX98Matches(StringRef Code, const StatementMatcher &NodeMatch,
StringRef ExpectedPrinted) {
std::vector<std::string> Args;
Args.push_back("-std=c++98");
Args.push_back("-Wno-unused-value");
return PrintedStmtMatches(Code, Args, NodeMatch, ExpectedPrinted);
}
::testing::AssertionResult PrintedStmtCXX98Matches(
StringRef Code,
StringRef ContainingFunction,
@ -110,6 +118,15 @@ public:
ExpectedPrinted);
}
::testing::AssertionResult
PrintedStmtCXX11Matches(StringRef Code, const StatementMatcher &NodeMatch,
StringRef ExpectedPrinted) {
std::vector<std::string> Args;
Args.push_back("-std=c++11");
Args.push_back("-Wno-unused-value");
return PrintedStmtMatches(Code, Args, NodeMatch, ExpectedPrinted);
}
::testing::AssertionResult PrintedStmtMSMatches(
StringRef Code,
StringRef ContainingFunction,
@ -164,3 +181,32 @@ TEST(StmtPrinter, TestFloatingPointLiteral) {
"1.F , -1.F , 1. , -1. , 1.L , -1.L"));
// Should be: with semicolon
}
TEST(StmtPrinter, TestCXXConversionDeclImplicit) {
ASSERT_TRUE(PrintedStmtCXX98Matches(
"struct A {"
"operator void *();"
"A operator&(A);"
"};"
"void bar(void *);"
"void foo(A a, A b) {"
" bar(a & b);"
"}",
memberCallExpr(anything()).bind("id"),
"a & b"));
}
TEST(StmtPrinter, TestCXXConversionDeclExplicit) {
ASSERT_TRUE(PrintedStmtCXX11Matches(
"struct A {"
"operator void *();"
"A operator&(A);"
"};"
"void bar(void *);"
"void foo(A a, A b) {"
" auto x = (a & b).operator void *();"
"}",
memberCallExpr(anything()).bind("id"),
"(a & b)"));
// WRONG; Should be: (a & b).operator void *()
}