| //===- unittest/Tooling/CastExprTest.cpp ----------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "TestVisitor.h" |
| |
| using namespace clang; |
| |
| namespace { |
| |
| struct CastExprVisitor : TestVisitor<CastExprVisitor> { |
| std::function<void(ExplicitCastExpr *)> OnExplicitCast; |
| |
| bool VisitExplicitCastExpr(ExplicitCastExpr *Expr) { |
| if (OnExplicitCast) |
| OnExplicitCast(Expr); |
| return true; |
| } |
| }; |
| |
| TEST(CastExprTest, GetSubExprAsWrittenThroughMaterializedTemporary) { |
| CastExprVisitor Visitor; |
| Visitor.OnExplicitCast = [](ExplicitCastExpr *Expr) { |
| auto Sub = Expr->getSubExprAsWritten(); |
| EXPECT_TRUE(isa<DeclRefExpr>(Sub)) |
| << "Expected DeclRefExpr, but saw " << Sub->getStmtClassName(); |
| }; |
| Visitor.runOver("struct S1 {};\n" |
| "struct S2 { operator S1(); };\n" |
| "S1 f(S2 s) { return static_cast<S1>(s); }\n"); |
| } |
| |
| } |