<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>