|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r83958 - in trunk: boost/config boost/config/compiler libs/config/doc libs/config/doc/html libs/config/doc/html/boost_config libs/config/test
From: john_at_[hidden]
Date: 2013-04-18 13:50:19
Author: johnmaddock
Date: 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
New Revision: 83958
URL: http://svn.boost.org/trac/boost/changeset/83958
Log:
Apply patch from #8408.
Fixes #8408.
Added:
trunk/libs/config/test/boost_fallthrough_test.cpp (contents, props changed)
Text files modified:
trunk/boost/config/compiler/clang.hpp | 10 ++++++++
trunk/boost/config/suffix.hpp | 10 ++++++++
trunk/libs/config/doc/html/boost_config/boost_macro_reference.html | 48 ++++++++++++++++++++++++++++++++++++++++
trunk/libs/config/doc/html/index.html | 2
trunk/libs/config/doc/macro_reference.qbk | 35 +++++++++++++++++++++++++++++
trunk/libs/config/test/Jamfile.v2 | 1
trunk/libs/config/test/config_info.cpp | 22 -----------------
7 files changed, 106 insertions(+), 22 deletions(-)
Modified: trunk/boost/config/compiler/clang.hpp
==============================================================================
--- trunk/boost/config/compiler/clang.hpp (original)
+++ trunk/boost/config/compiler/clang.hpp 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -38,6 +38,16 @@
# define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__("default")))
#endif
+//
+// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
+// between switch labels.
+//
+#if __cplusplus >= 201103L && defined(__has_warning)
+# if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
+# define BOOST_FALLTHROUGH [[clang::fallthrough]]
+# endif
+#endif
+
#if !__has_feature(cxx_auto_type)
# define BOOST_NO_CXX11_AUTO_DECLARATIONS
# define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS
Modified: trunk/boost/config/suffix.hpp
==============================================================================
--- trunk/boost/config/suffix.hpp (original)
+++ trunk/boost/config/suffix.hpp 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -883,6 +883,16 @@
# define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate))
# define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression))
#endif
+//
+// Helper macro BOOST_FALLTHROUGH
+// Fallback definition of BOOST_FALLTHROUGH macro used to mark intended
+// fall-through between case labels in a switch statement. We use a definition
+// that requires a semicolon after it to avoid at least one type of misuse even
+// on unsupported compilers.
+//
+#ifndef BOOST_FALLTHROUGH
+# define BOOST_FALLTHROUGH ((void)0)
+#endif
//
// constexpr workarounds
Modified: trunk/libs/config/doc/html/boost_config/boost_macro_reference.html
==============================================================================
--- trunk/libs/config/doc/html/boost_config/boost_macro_reference.html (original)
+++ trunk/libs/config/doc/html/boost_config/boost_macro_reference.html 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -3384,6 +3384,54 @@
<tr>
<td>
<p>
+ <code class="computeroutput"><span class="identifier">BOOST_FALLTHROUGH</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
+ between switch labels:
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="keyword">switch</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">{</span>
+<span class="keyword">case</span> <span class="number">40</span><span class="special">:</span>
+<span class="keyword">case</span> <span class="number">41</span><span class="special">:</span>
+ <span class="keyword">if</span> <span class="special">(</span><span class="identifier">truth_is_out_there</span><span class="special">)</span> <span class="special">{</span>
+ <span class="special">++</span><span class="identifier">x</span><span class="special">;</span>
+ <span class="identifier">BOOST_FALLTHROUGH</span><span class="special">;</span> <span class="comment">// Use instead of/along with annotations in </span>
+ <span class="comment">// comments. </span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">case</span> <span class="number">42</span><span class="special">:</span>
+ <span class="special">...</span>
+</pre>
+<p>
+ As shown in the example above, the BOOST_FALLTHROUGH macro should
+ be followed by a semicolon. It is designed to mimic control-flow
+ statements like 'break;', so it can be placed in most places where
+ 'break;' can, but only if there are no statements on the execution
+ path between it and the next switch label.
+ </p>
+ <p>
+ When compiled with Clang >3.2 in C++11 mode, the BOOST_FALLTHROUGH
+ macro is expanded to <code class="computeroutput"><span class="special">[[</span><span class="identifier">clang</span><span class="special">::</span><span class="identifier">fallthrough</span><span class="special">]]</span></code>
+ attribute, which is analysed when performing switch labels fall-through
+ diagnostic ('-Wimplicit-fallthrough'). See clang <a href="http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough" target="_top">documentation
+ on language extensions for details.</a>
+ </p>
+ <p>
+ When used with unsupported compilers, the BOOST_FALLTHROUGH macro
+ has no effect on diagnostics.
+ </p>
+ <p>
+ In either case this macro has no effect on runtime behavior and
+ performance of code.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
<code class="computeroutput"><span class="identifier">BOOST_EXPLICIT_TEMPLATE_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_EXPLICIT_TEMPLATE_NON_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">)</span></code> <code class="computeroutput"><span class="identifier">BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE</span><span class="special">(</span><span class="identifier">t</span><span class="special">,</span><span class="identifier">v</span><span class="special">)</span></code>
</p>
</td>
Modified: trunk/libs/config/doc/html/index.html
==============================================================================
--- trunk/libs/config/doc/html/index.html (original)
+++ trunk/libs/config/doc/html/index.html 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -951,7 +951,7 @@
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: February 19, 2013 at 16:25:18 GMT</small></p></td>
+<td align="left"><p><small>Last revised: April 18, 2013 at 17:44:14 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>
Modified: trunk/libs/config/doc/macro_reference.qbk
==============================================================================
--- trunk/libs/config/doc/macro_reference.qbk (original)
+++ trunk/libs/config/doc/macro_reference.qbk 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -862,6 +862,41 @@
Normally evaluates to nothing, but evaluates to return x; if the compiler
requires a return, even when it can never be reached.
]]
+[[`BOOST_FALLTHROUGH`][
+The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through
+between switch labels:
+``
+ switch (x) {
+ case 40:
+ case 41:
+ if (truth_is_out_there) {
+ ++x;
+ BOOST_FALLTHROUGH; // Use instead of/along with annotations in
+ // comments.
+ } else {
+ return x;
+ }
+ case 42:
+ ...
+``
+As shown in the example above, the BOOST_FALLTHROUGH macro should be
+followed by a semicolon. It is designed to mimic control-flow statements
+like 'break;', so it can be placed in most places where 'break;' can, but
+only if there are no statements on the execution path between it and the
+next switch label.
+
+When compiled with Clang >3.2 in C++11 mode, the BOOST_FALLTHROUGH macro is
+expanded to `[[clang::fallthrough]]` attribute, which is analysed when
+performing switch labels fall-through diagnostic ('-Wimplicit-fallthrough').
+See clang [@http://clang.llvm.org/docs/LanguageExtensions.html#clang__fallthrough
+documentation on language extensions for details.]
+
+When used with unsupported compilers, the BOOST_FALLTHROUGH macro has no
+effect on diagnostics.
+
+In either case this macro has no effect on runtime behavior and performance
+of code.
+]]
[[`BOOST_EXPLICIT_TEMPLATE_TYPE(t)`
`BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t,v)`
`BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)`
Modified: trunk/libs/config/test/Jamfile.v2
==============================================================================
--- trunk/libs/config/test/Jamfile.v2 (original)
+++ trunk/libs/config/test/Jamfile.v2 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -65,4 +65,5 @@
]
[ compile-fail threads/test_thread_fail1.cpp ]
[ compile-fail threads/test_thread_fail2.cpp ]
+ [ compile boost_fallthrough_test.cpp : <toolset>clang:<cxxflags>"-std=c++11 -Wimplicit-fallthrough" <warnings-as-errors>on <warnings>all ]
;
Added: trunk/libs/config/test/boost_fallthrough_test.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/config/test/boost_fallthrough_test.cpp 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -0,0 +1,20 @@
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/config.hpp>
+
+int test(int n)
+{
+ switch (n)
+ {
+ case 0:
+ n++;
+ BOOST_FALLTHROUGH;
+ case 1:
+ n++;
+ break;
+ }
+ return n;
+}
+
Modified: trunk/libs/config/test/config_info.cpp
==============================================================================
--- trunk/libs/config/test/config_info.cpp (original)
+++ trunk/libs/config/test/config_info.cpp 2013-04-18 13:50:17 EDT (Thu, 18 Apr 2013)
@@ -1100,27 +1100,6 @@
PRINT_MACRO(BOOST_NO_USING_TEMPLATE);
PRINT_MACRO(BOOST_NO_VOID_RETURNS);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
// END GENERATED BLOCK
PRINT_MACRO(BOOST_INTEL);
@@ -1132,6 +1111,7 @@
PRINT_MACRO(BOOST_STATIC_CONSTEXPR);
PRINT_MACRO(BOOST_NOEXCEPT);
PRINT_MACRO(BOOST_FORCEINLINE);
+ PRINT_MACRO(BOOST_FALLTHROUGH);
}
void print_separator()
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk