diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-07-10 19:49:07 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2018-07-10 19:49:07 +0000 |
commit | 6df47ceb2486655353ec48587e6a852294f1a614 (patch) | |
tree | c3a53add97e80534cb96c39d29b78c3da6cc08d5 /clang | |
parent | 9b8714961d42dcf9f34866bc71c064a3a07384b1 (diff) | |
download | llvm-6df47ceb2486655353ec48587e6a852294f1a614.zip llvm-6df47ceb2486655353ec48587e6a852294f1a614.tar.gz llvm-6df47ceb2486655353ec48587e6a852294f1a614.tar.bz2 |
Revert r336590 "[libclang] evalute compound statement cursors before trying to evaluate"
New memory leaks in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()
llvm-svn: 336716
Diffstat (limited to 'clang')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 26 | ||||
-rw-r--r-- | clang/unittests/libclang/LibclangTest.cpp | 41 |
2 files changed, 13 insertions, 54 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index a469883..b61dff3 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3890,19 +3890,6 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) { } CXEvalResult clang_Cursor_Evaluate(CXCursor C) { - if (clang_getCursorKind(C) == CXCursor_CompoundStmt) { - const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt(C)); - Expr *expr = nullptr; - for (auto *bodyIterator : compoundStmt->body()) { - if ((expr = dyn_cast<Expr>(bodyIterator))) { - break; - } - } - if (expr) - return const_cast<CXEvalResult>( - reinterpret_cast<const void *>(evaluateExpr(expr, C))); - } - const Decl *D = getCursorDecl(C); if (D) { const Expr *expr = nullptr; @@ -3916,6 +3903,19 @@ CXEvalResult clang_Cursor_Evaluate(CXCursor C) { evaluateExpr(const_cast<Expr *>(expr), C))); return nullptr; } + + const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C)); + if (compoundStmt) { + Expr *expr = nullptr; + for (auto *bodyIterator : compoundStmt->body()) { + if ((expr = dyn_cast<Expr>(bodyIterator))) { + break; + } + } + if (expr) + return const_cast<CXEvalResult>( + reinterpret_cast<const void *>(evaluateExpr(expr, C))); + } return nullptr; } diff --git a/clang/unittests/libclang/LibclangTest.cpp b/clang/unittests/libclang/LibclangTest.cpp index 9629b62..6fddcb2 100644 --- a/clang/unittests/libclang/LibclangTest.cpp +++ b/clang/unittests/libclang/LibclangTest.cpp @@ -461,47 +461,6 @@ TEST_F(LibclangParseTest, AllSkippedRanges) { clang_disposeSourceRangeList(Ranges); } -TEST_F(LibclangParseTest, EvaluateChildExpression) { - std::string Main = "main.m"; - WriteFile(Main, "#define kFOO @\"foo\"\n" - "void foobar(void) {\n" - " {kFOO;}\n" - "}\n"); - ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0, nullptr, - 0, TUFlags); - - CXCursor C = clang_getTranslationUnitCursor(ClangTU); - clang_visitChildren( - C, - [](CXCursor cursor, CXCursor parent, - CXClientData client_data) -> CXChildVisitResult { - if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) { - int numberedStmt = 0; - clang_visitChildren( - cursor, - [](CXCursor cursor, CXCursor parent, - CXClientData client_data) -> CXChildVisitResult { - int &numberedStmt = *((int *)client_data); - if (clang_getCursorKind(cursor) == CXCursor_CompoundStmt) { - if (numberedStmt) { - CXEvalResult RE = clang_Cursor_Evaluate(cursor); - EXPECT_NE(RE, nullptr); - EXPECT_EQ(clang_EvalResult_getKind(RE), - CXEval_ObjCStrLiteral); - return CXChildVisit_Break; - } - numberedStmt++; - } - return CXChildVisit_Recurse; - }, - &numberedStmt); - EXPECT_EQ(numberedStmt, 1); - } - return CXChildVisit_Continue; - }, - nullptr); -} - class LibclangReparseTest : public LibclangParseTest { public: void DisplayDiagnostics() { |