1 //===- unittest/Tooling/CastExprTest.cpp ----------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "TestVisitor.h" 11 12 using namespace clang; 13 14 namespace { 15 16 struct CastExprVisitor : TestVisitor<CastExprVisitor> { 17 std::function<void(ExplicitCastExpr *)> OnExplicitCast; 18 19 bool VisitExplicitCastExpr(ExplicitCastExpr *Expr) { 20 if (OnExplicitCast) 21 OnExplicitCast(Expr); 22 return true; 23 } 24 }; 25 26 TEST(CastExprTest, GetSubExprAsWrittenThroughMaterializedTemporary) { 27 CastExprVisitor Visitor; 28 Visitor.OnExplicitCast = [](ExplicitCastExpr *Expr) { 29 auto Sub = Expr->getSubExprAsWritten(); 30 EXPECT_TRUE(isa<DeclRefExpr>(Sub)) 31 << "Expected DeclRefExpr, but saw " << Sub->getStmtClassName(); 32 }; 33 Visitor.runOver("struct S1 {};\n" 34 "struct S2 { operator S1(); };\n" 35 "S1 f(S2 s) { return static_cast<S1>(s); }\n"); 36 } 37 38 } 39