include/o3tl/unreachable.hxx     |   39 +++++++++++++++++++++++++++++++++++++++
 sw/source/core/fields/reffld.cxx |   17 +++++++----------
 2 files changed, 46 insertions(+), 10 deletions(-)

New commits:
commit 9935a83143c1d994986035ed89e7c94d1fcb2f4d
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Thu Jan 31 17:17:34 2019 +0100
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Fri Feb 1 11:58:47 2019 +0100

    Introduce O3TL_UNREACHABLE as a better alternative to assert(false)
    
    The code in sw/source/core/fields/reffld.cxx had turned into whack-a-mole:  
MSVC
    needed the unreachable default:assert(false); to fall through to init some 
vars
    to avoid C4701 ("potentially uninitialized local variable").  But Clang 
(with
    !NDEBUG, and an implementation of assert marked as noreturn) reported that 
as
    "fallthrough annotation in unreachable code", requiring the #ifdef NDEBUG 
guards
    to be added.  And now clang-cl (also with !NDEBUG, but with the MSVC
    implementation of assert apparently not marked as noreturn) complained about
    "unannotated fall-through between switch labels", which wold require the 
#ifdef
    NDEBUG guards to be removed again.
    
    O3TL_UNREACHABLE (inspired by LLVM's llvm_unreachable and underyling
    LLVM_BUILTIN_UNREACHABLE) hopefully improves on that for all compilers 
involved.
    For non-MSVC (i.e., Clang or GCC) it assumes that __builtin_unreachable is
    supported (which it is at least for GCC 7, which is our current baseline per
    README.md).
    
    Change-Id: I4474f95664d97c3d0e506bab90f80d5ab252ec6e
    Reviewed-on: https://gerrit.libreoffice.org/67232
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/include/o3tl/unreachable.hxx b/include/o3tl/unreachable.hxx
new file mode 100644
index 000000000000..bc33d34b534e
--- /dev/null
+++ b/include/o3tl/unreachable.hxx
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_O3TL_UNREACHABLE_HXX
+#define INCLUDED_O3TL_UNREACHABLE_HXX
+
+#include <sal/config.h>
+
+#include <cassert>
+
+// A better replacement for assert(false) to indicate a place in the code that 
should not be
+// reachable.  This should improve on the sometimes poor false-positive 
warnings emitted by
+// compilers when they cannot detect that some condition flagged by 
assert(false) cannot occur,
+// either because assert is reduced to a no-op by NDEBUG or because assert is 
not marked as noreturn
+// in the MSVC headers.  This is inspired by LLVM's LLVM_BUILTIN_UNREACHABLE
+// (llvm/include/llvm/Support/Compiler.h).
+
+#if defined _MSC_VER
+#define O3TL_UNREACHABLE_detail __assume(false)
+#else // assuming Clang or GCC with support for:
+#define O3TL_UNREACHABLE_detail __builtin_unreachable()
+#endif
+
+#define O3TL_UNREACHABLE                                                       
                    \
+    do                                                                         
                    \
+    {                                                                          
                    \
+        assert(false);                                                         
                    \
+        O3TL_UNREACHABLE_detail;                                               
                    \
+    } while (false)
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/sw/source/core/fields/reffld.cxx b/sw/source/core/fields/reffld.cxx
index 6c015e101783..222feb56728e 100644
--- a/sw/source/core/fields/reffld.cxx
+++ b/sw/source/core/fields/reffld.cxx
@@ -19,6 +19,7 @@
 
 #include <com/sun/star/text/ReferenceFieldPart.hpp>
 #include <com/sun/star/text/ReferenceFieldSource.hpp>
+#include <o3tl/unreachable.hxx>
 #include <unotools/localedatawrapper.hxx>
 #include <unotools/charclass.hxx>
 #include <editeng/unolingu.hxx>
@@ -557,16 +558,14 @@ void SwGetRefField::UpdateField( const SwTextField* 
pFieldTextAttr )
                     nEnd = std::min(nStart + 1, nLen);
                     break;
 
-                default:
-                    assert(false); // fall through to appease MSVC C4701
-#ifdef NDEBUG
-                    [[fallthrough]];
-#endif
                 // "Reference" (whole Text)
                 case REF_CONTENT:
                     nStart = 0;
                     nEnd = nLen;
                     break;
+
+                default:
+                    O3TL_UNREACHABLE;
                 }
                 break;
 
@@ -601,15 +600,13 @@ void SwGetRefField::UpdateField( const SwTextField* 
pFieldTextAttr )
                 }
                 return;
 
-            default:
-                assert(false); // fall through to appease MSVC C4701
-#ifdef NDEBUG
-                [[fallthrough]];
-#endif
             case REF_SETREFATTR:
                 nStart = nNumStart;
                 nEnd = nNumEnd;
                 break;
+
+            default:
+                O3TL_UNREACHABLE;
             }
 
             if( nStart != nEnd ) // a section?
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to