[Libreoffice-commits] core.git: compilerplugins/clang

Stephan Bergmann sbergman at redhat.com
Tue Nov 7 11:48:14 UTC 2017


 compilerplugins/clang/flatten.cxx |   27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

New commits:
commit 2446d2b2fb8b091eaae015fd5bb26bd8e0f596f7
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue Nov 7 12:47:02 2017 +0100

    Avoid expensive calls to containsPreprocessingConditionalInclusion
    
    Change-Id: I42981a23f75298591b2c3b073aea66426220f3e2

diff --git a/compilerplugins/clang/flatten.cxx b/compilerplugins/clang/flatten.cxx
index 08abf603568e..f7f6d8a76066 100644
--- a/compilerplugins/clang/flatten.cxx
+++ b/compilerplugins/clang/flatten.cxx
@@ -110,16 +110,21 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
     if (!ifStmt->getElse())
         return true;
 
+    auto const thenThrowExpr = containsSingleThrowExpr(ifStmt->getThen());
+    auto const elseThrowExpr = containsSingleThrowExpr(ifStmt->getElse());
+    // If neither contains a throw, nothing to do; if both contain throws, no
+    // improvement:
+    if ((thenThrowExpr == nullptr) == (elseThrowExpr == nullptr)) {
+        return true;
+    }
+
     if (containsPreprocessingConditionalInclusion(ifStmt->getSourceRange())) {
         return true;
     }
 
-    auto throwExpr = containsSingleThrowExpr(ifStmt->getElse());
-    if (throwExpr)
+    if (elseThrowExpr)
     {
         // if both the "if" and the "else" contain throws, no improvement
-        if (containsSingleThrowExpr(ifStmt->getThen()))
-            return true;
         // if the "if" statement is not the last statement in its block, and it contains
         // var decls in its then block, we cannot de-indent the then block without
         // extending the lifetime of some variables, which may be problematic
@@ -131,8 +136,8 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
             report(
                 DiagnosticsEngine::Warning,
                 "unconditional throw in else branch, rather invert the condition, throw early, and flatten the normal case",
-                throwExpr->getLocStart())
-                << throwExpr->getSourceRange();
+                elseThrowExpr->getLocStart())
+                << elseThrowExpr->getSourceRange();
             report(
                 DiagnosticsEngine::Note,
                 "if condition here",
@@ -140,12 +145,8 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
                 << ifStmt->getSourceRange();
         }
     }
-    throwExpr = containsSingleThrowExpr(ifStmt->getThen());
-    if (throwExpr)
+    if (thenThrowExpr)
     {
-        // if both the "if" and the "else" contain throws, no improvement
-        if (containsSingleThrowExpr(ifStmt->getElse()))
-            return true;
         // if the "if" statement is not the last statement in it's block, and it contains
         // var decls in it's else block, we cannot de-indent the else block without
         // extending the lifetime of some variables, which may be problematic
@@ -157,8 +158,8 @@ bool Flatten::VisitIfStmt(IfStmt const * ifStmt)
             report(
                 DiagnosticsEngine::Warning,
                 "unconditional throw in then branch, just flatten the else",
-                throwExpr->getLocStart())
-                << throwExpr->getSourceRange();
+                thenThrowExpr->getLocStart())
+                << thenThrowExpr->getSourceRange();
         }
     }
     return true;


More information about the Libreoffice-commits mailing list