aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-07-10 19:49:07 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2018-07-10 19:49:07 +0000
commit6df47ceb2486655353ec48587e6a852294f1a614 (patch)
treec3a53add97e80534cb96c39d29b78c3da6cc08d5 /clang
parent9b8714961d42dcf9f34866bc71c064a3a07384b1 (diff)
downloadllvm-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.cpp26
-rw-r--r--clang/unittests/libclang/LibclangTest.cpp41
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() {