<div dir="ltr">The ASan bot is failing with a LeakSanitizer failure that appears related to one of your libclang changes: <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/6282/steps/check-clang%20asan/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/6282/steps/check-clang%20asan/logs/stdio</a><div><pre style="font-family:"Courier New",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout">Direct leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x52c638 in operator new(unsigned long) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:106
#1 0x7fd236783b89 in make_unique<ExprEvalResult> /b/sanitizer-x86_64-linux-bootstrap/build/llvm/include/llvm/ADT/STLExtras.h:1057:29
#2 0x7fd236783b89 in evaluateExpr /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3755
#3 0x7fd236783b89 in clang_Cursor_Evaluate /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3917
#4 0x54e743 in operator() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:487:39
#5 0x54e743 in LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::operator()(CXCursor, CXCursor, void*) const::'lambda'(CXCursor, CXCursor, void*)::__invoke(CXCursor, CXCursor, void*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:482
#6 0x7fd23677de00 in clang::cxcursor::CursorVisitor::RunVisitorWorkList(llvm::SmallVector<clang::cxcursor::VisitorJob, 10u>&) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3019:17
#7 0x7fd23675c3a8 in clang::cxcursor::CursorVisitor::Visit(clang::Stmt const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3164:17
#8 0x7fd236755d2f in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp
#9 0x7fd236754e5d in clang::cxcursor::CursorVisitor::Visit(CXCursor, bool) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:225:16
#10 0x7fd23676487c in clang::cxcursor::CursorVisitor::VisitFunctionDecl(clang::FunctionDecl*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:889:9
#11 0x7fd236759e24 in clang::declvisitor::Base<clang::declvisitor::make_ptr, clang::cxcursor::CursorVisitor, bool>::Visit(clang::Decl*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include/clang/AST/DeclVisitor.h
#12 0x7fd236755c17 in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:506:34
#13 0x7fd23678a558 in clang_visitChildren /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#14 0x54e024 in operator() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:480:11
#15 0x54e024 in LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::__invoke(CXCursor, CXCursor, void*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:476
#16 0x7fd236754d49 in clang::cxcursor::CursorVisitor::Visit(CXCursor, bool) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:217:11
#17 0x7fd23675cb87 in clang::cxcursor::CursorVisitor::handleDeclForVisitation(clang::Decl const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:674:7
#18 0x7fd23675cefe in clang::cxcursor::CursorVisitor::VisitDeclContext(clang::DeclContext*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:635:30
#19 0x7fd236756399 in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:540:20
#20 0x7fd23678a558 in clang_visitChildren /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#21 0x537fa1 in LibclangParseTest_EvaluateChildExpression_Test::TestBody() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:474:3
#22 0x5cae31 in testing::Test::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#23 0x5cd068 in testing::TestInfo::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2656:11
#24 0x5ce430 in testing::TestCase::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2774:28
#25 0x5ec1d4 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/</span><span class="inbox-inbox-stdout">src/gtest.cc:4649:43
</span><span class="inbox-inbox-stdout"> #26 0x5eb380 in testing::UnitTest::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#27 0x5b3983 in RUN_ALL_TESTS /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46
#28 0x5b3983 in main /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/UnitTestMain/TestMain.cpp:51
#29 0x7fd232efd2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
Indirect leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x52c808 in operator new[](unsigned long) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:109
#1 0x7fd2367844dd in evaluateExpr /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3825:34
#2 0x7fd2367844dd in clang_Cursor_Evaluate /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3917
#3 0x54e743 in operator() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:487:39
#4 0x54e743 in LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::operator()(CXCursor, CXCursor, void*) const::'lambda'(CXCursor, CXCursor, void*)::__invoke(CXCursor, CXCursor, void*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:482
#5 0x7fd23677de00 in clang::cxcursor::CursorVisitor::RunVisitorWorkList(llvm::SmallVector<clang::cxcursor::VisitorJob, 10u>&) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3019:17
#6 0x7fd23675c3a8 in clang::cxcursor::CursorVisitor::Visit(clang::Stmt const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3164:17
#7 0x7fd236755d2f in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp
#8 0x7fd236754e5d in clang::cxcursor::CursorVisitor::Visit(CXCursor, bool) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:225:16
#9 0x7fd23676487c in clang::cxcursor::CursorVisitor::VisitFunctionDecl(clang::FunctionDecl*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:889:9
#10 0x7fd236759e24 in clang::declvisitor::Base<clang::declvisitor::make_ptr, clang::cxcursor::CursorVisitor, bool>::Visit(clang::Decl*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include/clang/AST/DeclVisitor.h
#11 0x7fd236755c17 in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:506:34
#12 0x7fd23678a558 in clang_visitChildren /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#13 0x54e024 in operator() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:480:11
#14 0x54e024 in LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::__invoke(CXCursor, CXCursor, void*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:476
#15 0x7fd236754d49 in clang::cxcursor::CursorVisitor::Visit(CXCursor, bool) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:217:11
#16 0x7fd23675cb87 in clang::cxcursor::CursorVisitor::handleDeclForVisitation(clang::Decl const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:674:7
#17 0x7fd23675cefe in clang::cxcursor::CursorVisitor::VisitDeclContext(clang::DeclContext*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:635:30
#18 0x7fd236756399 in clang::cxcursor::CursorVisitor::VisitChildren(CXCursor) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:540:20
#19 0x7fd23678a558 in clang_visitChildren /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#20 0x537fa1 in LibclangParseTest_EvaluateChildExpression_Test::TestBody() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:474:3
#21 0x5cae31 in testing::Test::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#22 0x5cd068 in testing::TestInfo::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2656:11
#23 0x5ce430 in testing::TestCase::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2774:28
#24 0x5ec1d4 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:4649:43
#25 0x5eb380 in testing::UnitTest::Run() /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#26 0x5b3983 in RUN_ALL_TESTS /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46
#27 0x5b3983 in main /b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/UnitTestMain/TestMain.cpp:51
#28 0x7fd232efd2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
</span></pre><br class="inbox-inbox-Apple-interchange-newline"></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 9, 2018 at 12:46 PM Alex Lorenz via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: arphaman<br>
Date: Mon Jul 9 12:41:28 2018<br>
New Revision: 336590<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=336590&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=336590&view=rev</a><br>
Log:<br>
[libclang] evalute compound statement cursors before trying to evaluate<br>
the cursor like a declaration<br>
<br>
This change fixes a bug in libclang in which it tries to evaluate a statement<br>
cursor as a declaration cursor, because that statement still has a pointer to<br>
the declaration parent.<br>
<br>
rdar://38888477<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D49051" rel="noreferrer" target="_blank">https://reviews.llvm.org/D49051</a><br>
<br>
Modified:<br>
cfe/trunk/tools/libclang/CIndex.cpp<br>
cfe/trunk/unittests/libclang/LibclangTest.cpp<br>
<br>
Modified: cfe/trunk/tools/libclang/CIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=336590&r1=336589&r2=336590&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=336590&r1=336589&r2=336590&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/tools/libclang/CIndex.cpp (original)<br>
+++ cfe/trunk/tools/libclang/CIndex.cpp Mon Jul 9 12:41:28 2018<br>
@@ -3890,6 +3890,19 @@ static const ExprEvalResult* evaluateExp<br>
}<br>
<br>
CXEvalResult clang_Cursor_Evaluate(CXCursor C) {<br>
+ if (clang_getCursorKind(C) == CXCursor_CompoundStmt) {<br>
+ const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt(C));<br>
+ Expr *expr = nullptr;<br>
+ for (auto *bodyIterator : compoundStmt->body()) {<br>
+ if ((expr = dyn_cast<Expr>(bodyIterator))) {<br>
+ break;<br>
+ }<br>
+ }<br>
+ if (expr)<br>
+ return const_cast<CXEvalResult>(<br>
+ reinterpret_cast<const void *>(evaluateExpr(expr, C)));<br>
+ }<br>
+<br>
const Decl *D = getCursorDecl(C);<br>
if (D) {<br>
const Expr *expr = nullptr;<br>
@@ -3903,19 +3916,6 @@ CXEvalResult clang_Cursor_Evaluate(CXCur<br>
evaluateExpr(const_cast<Expr *>(expr), C)));<br>
return nullptr;<br>
}<br>
-<br>
- const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C));<br>
- if (compoundStmt) {<br>
- Expr *expr = nullptr;<br>
- for (auto *bodyIterator : compoundStmt->body()) {<br>
- if ((expr = dyn_cast<Expr>(bodyIterator))) {<br>
- break;<br>
- }<br>
- }<br>
- if (expr)<br>
- return const_cast<CXEvalResult>(<br>
- reinterpret_cast<const void *>(evaluateExpr(expr, C)));<br>
- }<br>
return nullptr;<br>
}<br>
<br>
<br>
Modified: cfe/trunk/unittests/libclang/LibclangTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/LibclangTest.cpp?rev=336590&r1=336589&r2=336590&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/LibclangTest.cpp?rev=336590&r1=336589&r2=336590&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/unittests/libclang/LibclangTest.cpp (original)<br>
+++ cfe/trunk/unittests/libclang/LibclangTest.cpp Mon Jul 9 12:41:28 2018<br>
@@ -461,6 +461,47 @@ TEST_F(LibclangParseTest, AllSkippedRang<br>
clang_disposeSourceRangeList(Ranges);<br>
}<br>
<br>
+TEST_F(LibclangParseTest, EvaluateChildExpression) {<br>
+ std::string Main = "main.m";<br>
+ WriteFile(Main, "#define kFOO @\"foo\"\n"<br>
+ "void foobar(void) {\n"<br>
+ " {kFOO;}\n"<br>
+ "}\n");<br>
+ ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, nullptr,<br>
+ 0, TUFlags);<br>
+<br>
+ CXCursor C = clang_getTranslationUnitCursor(ClangTU);<br>
+ clang_visitChildren(<br>
+ C,<br>
+ [](CXCursor cursor, CXCursor parent,<br>
+ CXClientData client_data) -> CXChildVisitResult {<br>
+ if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) {<br>
+ int numberedStmt = 0;<br>
+ clang_visitChildren(<br>
+ cursor,<br>
+ [](CXCursor cursor, CXCursor parent,<br>
+ CXClientData client_data) -> CXChildVisitResult {<br>
+ int &numberedStmt = *((int *)client_data);<br>
+ if (clang_getCursorKind(cursor) == CXCursor_CompoundStmt) {<br>
+ if (numberedStmt) {<br>
+ CXEvalResult RE = clang_Cursor_Evaluate(cursor);<br>
+ EXPECT_NE(RE, nullptr);<br>
+ EXPECT_EQ(clang_EvalResult_getKind(RE),<br>
+ CXEval_ObjCStrLiteral);<br>
+ return CXChildVisit_Break;<br>
+ }<br>
+ numberedStmt++;<br>
+ }<br>
+ return CXChildVisit_Recurse;<br>
+ },<br>
+ &numberedStmt);<br>
+ EXPECT_EQ(numberedStmt, 1);<br>
+ }<br>
+ return CXChildVisit_Continue;<br>
+ },<br>
+ nullptr);<br>
+}<br>
+<br>
class LibclangReparseTest : public LibclangParseTest {<br>
public:<br>
void DisplayDiagnostics() {<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div>