From ee9a82d871679246ce50f35373428367ad86d9ed Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Tue, 27 Jun 2017 08:19:09 +0000 Subject: Make CastExpr::getSubExprAsWritten look through implicit temporary under CK_ConstructorConversion With struct S1 {}; struct S2 { operator S1(); }; S1 f(S2 s) { return static_cast(s); } the static_cast expr is CXXStaticCastExpr 0x... 'struct S1' static_cast `-CXXConstructExpr 0x... 'struct S1' 'void (struct S1 &&) noexcept' elidable `-MaterializeTemporaryExpr 0x... 'struct S1' xvalue `-ImplicitCastExpr 0x... 'struct S1' `-CXXMemberCallExpr 0x... 'struct S1' `-MemberExpr 0x... '' .operator S1 0x... `-DeclRefExpr 0x... 'struct S2' lvalue ParmVar 0x... 's' 'struct S2' getSubExprAsWritten used to return the MaterializeTemporaryExpr (of type S1) under the CXXConstructExpr, instead of unwinding further to the DeclRefExpr (of type S2) at the bottom. Differential Revision: https://reviews.llvm.org/D22128 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@306377 91177308-0d34-0410-b5e6-96231b3b80d8 --- unittests/Tooling/CMakeLists.txt | 1 + unittests/Tooling/CastExprTest.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 unittests/Tooling/CastExprTest.cpp (limited to 'unittests') diff --git a/unittests/Tooling/CMakeLists.txt b/unittests/Tooling/CMakeLists.txt index b5af99bdfd..8ed35480cb 100644 --- a/unittests/Tooling/CMakeLists.txt +++ b/unittests/Tooling/CMakeLists.txt @@ -11,6 +11,7 @@ if (MSVC) endif() add_clang_unittest(ToolingTests + CastExprTest.cpp CommentHandlerTest.cpp CompilationDatabaseTest.cpp FixItTest.cpp diff --git a/unittests/Tooling/CastExprTest.cpp b/unittests/Tooling/CastExprTest.cpp new file mode 100644 index 0000000000..5310c21254 --- /dev/null +++ b/unittests/Tooling/CastExprTest.cpp @@ -0,0 +1,38 @@ +//===- 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 { + std::function 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(Sub)) + << "Expected DeclRefExpr, but saw " << Sub->getStmtClassName(); + }; + Visitor.runOver("struct S1 {};\n" + "struct S2 { operator S1(); };\n" + "S1 f(S2 s) { return static_cast(s); }\n"); +} + +} -- cgit v1.2.3