@@ -3878,36 +3878,35 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
38783878 return nullptr ;
38793879}
38803880
3881- CXEvalResult clang_Cursor_Evaluate (CXCursor C) {
3882- if (clang_getCursorKind (C) == CXCursor_CompoundStmt) {
3883- const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt (C));
3884- Expr *expr = nullptr ;
3885- for (auto *bodyIterator : compoundStmt->body ()) {
3886- if ((expr = dyn_cast<Expr>(bodyIterator))) {
3887- break ;
3888- }
3889- }
3890- if (expr)
3891- return const_cast <CXEvalResult>(
3892- reinterpret_cast <const void *>(evaluateExpr (expr, C)));
3893- }
3894-
3895- const Decl *D = getCursorDecl (C);
3896- if (D) {
3897- const Expr *expr = nullptr ;
3898- if (auto *Var = dyn_cast<VarDecl>(D)) {
3899- expr = Var->getInit ();
3900- } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
3901- expr = Field->getInClassInitializer ();
3902- }
3903- if (expr)
3904- return const_cast <CXEvalResult>(reinterpret_cast <const void *>(
3905- evaluateExpr (const_cast <Expr *>(expr), C)));
3881+ static const Expr *evaluateDeclExpr (const Decl *D) {
3882+ if (!D)
39063883 return nullptr ;
3884+ if (auto *Var = dyn_cast<VarDecl>(D))
3885+ return Var->getInit ();
3886+ else if (auto *Field = dyn_cast<FieldDecl>(D))
3887+ return Field->getInClassInitializer ();
3888+ return nullptr ;
3889+ }
3890+
3891+ static const Expr *evaluateCompoundStmtExpr (const CompoundStmt *CS) {
3892+ assert (CS && " invalid compound statement" );
3893+ for (auto *bodyIterator : CS->body ()) {
3894+ if (const auto *E = dyn_cast<Expr>(bodyIterator))
3895+ return E;
39073896 }
39083897 return nullptr ;
39093898}
39103899
3900+ CXEvalResult clang_Cursor_Evaluate (CXCursor C) {
3901+ if (const Expr *E =
3902+ clang_getCursorKind (C) == CXCursor_CompoundStmt
3903+ ? evaluateCompoundStmtExpr (cast<CompoundStmt>(getCursorStmt (C)))
3904+ : evaluateDeclExpr (getCursorDecl (C)))
3905+ return const_cast <CXEvalResult>(
3906+ reinterpret_cast <const void *>(evaluateExpr (const_cast <Expr *>(E), C)));
3907+ return nullptr ;
3908+ }
3909+
39113910unsigned clang_Cursor_hasAttrs (CXCursor C) {
39123911 const Decl *D = getCursorDecl (C);
39133912 if (!D) {
0 commit comments