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:
parent
9b8714961d
commit
6df47ceb24
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue