Revert r336590 "[libclang] evalute compound statement cursors before trying to evaluate"

New memory leaks in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()

llvm-svn: 336716
This commit is contained in:
Evgeniy Stepanov 2018-07-10 19:49:07 +00:00
parent 9b8714961d
commit 6df47ceb24
2 changed files with 13 additions and 54 deletions

View File

@ -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;
}

View File

@ -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() {