summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Glavnyy <31897320+vglavnyy@users.noreply.github.com>2019-01-29 01:16:12 +0700
committerWouter van Oortmerssen <aardappel@gmail.com>2019-01-28 10:16:12 -0800
commit7d3930a2fd71774fdec063160ebd168bbff6db8b (patch)
treec08a9ee999dd7b96fd1742b7cb871fd338be9cb4
parent347dba8501a6c4deacc63afd0554fbfe5048104f (diff)
downloadflatbuffers-7d3930a2fd71774fdec063160ebd168bbff6db8b.tar.gz
flatbuffers-7d3930a2fd71774fdec063160ebd168bbff6db8b.tar.bz2
flatbuffers-7d3930a2fd71774fdec063160ebd168bbff6db8b.zip
Repair `fallthrough` was broken by d4493165 (#5115) (#5139)
- GCC: fixed broken `fallthrough` (checked with 7.3 and 8.2) - Clang: added `fallthrough` support - Clang: added `-Wimplicit-fallthrough` checking
-rw-r--r--CMakeLists.txt4
-rw-r--r--grpc/src/compiler/java_generator.cc7
-rw-r--r--include/flatbuffers/base.h26
-rw-r--r--src/idl_gen_general.cpp6
-rw-r--r--src/idl_gen_rust.cpp1
-rw-r--r--src/idl_parser.cpp4
-rw-r--r--src/reflection.cpp4
7 files changed, 37 insertions, 15 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0bbf130e..3741d5b5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -152,6 +152,7 @@ set(FlatBuffers_GRPCTest_SRCS
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
# do not apply any global settings if the toolchain
# is being configured externally
+ message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.")
elseif(APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
@@ -185,6 +186,9 @@ elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra -Wno-unused-parameter")
set(FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wold-style-cast")
+ if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.8)
+ list(APPEND FLATBUFFERS_PRIVATE_CXX_FLAGS "-Wimplicit-fallthrough") # enable warning
+ endif()
if(FLATBUFFERS_LIBCXX_WITH_CLANG)
if(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
set(CMAKE_CXX_FLAGS
diff --git a/grpc/src/compiler/java_generator.cc b/grpc/src/compiler/java_generator.cc
index 4ca35963..661c9ee6 100644
--- a/grpc/src/compiler/java_generator.cc
+++ b/grpc/src/compiler/java_generator.cc
@@ -37,9 +37,6 @@
#define XSTR(s) STR(s)
#endif
-#ifndef FALLTHROUGH_INTENDED
-#define FALLTHROUGH_INTENDED
-#endif
typedef grpc_generator::Printer Printer;
typedef std::map<grpc::string, grpc::string> VARS;
@@ -479,7 +476,7 @@ static void PrintStub(Printer* p, VARS& vars, const ServiceDescriptor* service,
break;
case BLOCKING_CLIENT_INTERFACE:
interface = true;
- FALLTHROUGH_INTENDED; // fallthrough
+ FLATBUFFERS_FALLTHROUGH(); // fall thru
case BLOCKING_CLIENT_IMPL:
call_type = BLOCKING_CALL;
stub_name += "BlockingStub";
@@ -487,7 +484,7 @@ static void PrintStub(Printer* p, VARS& vars, const ServiceDescriptor* service,
break;
case FUTURE_CLIENT_INTERFACE:
interface = true;
- FALLTHROUGH_INTENDED; // fallthrough
+ FLATBUFFERS_FALLTHROUGH(); // fall thru
case FUTURE_CLIENT_IMPL:
call_type = FUTURE_CALL;
stub_name += "FutureStub";
diff --git a/include/flatbuffers/base.h b/include/flatbuffers/base.h
index ad474bb7..295c7f67 100644
--- a/include/flatbuffers/base.h
+++ b/include/flatbuffers/base.h
@@ -70,6 +70,18 @@
// Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility.
// The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch.
+#if defined(__GNUC__) && !defined(__clang__)
+ #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#else
+ #define FLATBUFFERS_GCC 0
+#endif
+
+#if defined(__clang__)
+ #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
+#else
+ #define FLATBUFFERS_CLANG 0
+#endif
+
/// @cond FLATBUFFERS_INTERNAL
#if __cplusplus <= 199711L && \
(!defined(_MSC_VER) || _MSC_VER < 1600) && \
@@ -236,12 +248,22 @@ template<typename T> FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) {
}
// Enable C++ attribute [[]] if std:c++17 or higher.
-#if (defined(__cplusplus) && (__cplusplus >= 201703L)) || \
- (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))
+#if ((__cplusplus >= 201703L) \
+ || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)))
// All attributes unknown to an implementation are ignored without causing an error.
#define FLATBUFFERS_ATTRIBUTE(attr) [[attr]]
+
+ #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]]
#else
#define FLATBUFFERS_ATTRIBUTE(attr)
+
+ #if FLATBUFFERS_CLANG >= 30800
+ #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]]
+ #elif FLATBUFFERS_GCC >= 70300
+ #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]]
+ #else
+ #define FLATBUFFERS_FALLTHROUGH()
+ #endif
#endif
/// @endcond
diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp
index 7c34ee28..0a23a0f1 100644
--- a/src/idl_gen_general.cpp
+++ b/src/idl_gen_general.cpp
@@ -306,7 +306,7 @@ class GeneralGenerator : public BaseGenerator {
case BASE_TYPE_UNION:
// Unions in C# use a generic Table-derived type for better type safety
if (lang_.language == IDLOptions::kCSharp) return "TTable";
- // fall through
+ FLATBUFFERS_FALLTHROUGH(); // else fall thru
default: return "Table";
}
}
@@ -327,7 +327,7 @@ class GeneralGenerator : public BaseGenerator {
case BASE_TYPE_UINT: return Type(BASE_TYPE_LONG);
case BASE_TYPE_VECTOR:
if (vectorelem) return DestinationType(type.VectorType(), vectorelem);
- // else fall thru
+ FLATBUFFERS_FALLTHROUGH(); // else fall thru
default: return type;
}
}
@@ -371,7 +371,7 @@ class GeneralGenerator : public BaseGenerator {
case BASE_TYPE_UINT: return " & 0xFFFFFFFFL";
case BASE_TYPE_VECTOR:
if (vectorelem) return DestinationMask(type.VectorType(), vectorelem);
- // else fall thru
+ FLATBUFFERS_FALLTHROUGH(); // else fall thru
default: return "";
}
}
diff --git a/src/idl_gen_rust.cpp b/src/idl_gen_rust.cpp
index 77b7bea8..861a2e9c 100644
--- a/src/idl_gen_rust.cpp
+++ b/src/idl_gen_rust.cpp
@@ -130,6 +130,7 @@ FullType GetFullType(const Type &type) {
case ftUnionKey:
case ftUnionValue: {
FLATBUFFERS_ASSERT(false && "vectors of unions are unsupported");
+ break;
}
default: {
FLATBUFFERS_ASSERT(false && "vector of vectors are unsupported");
diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp
index cda78651..a1d6cb06 100644
--- a/src/idl_parser.cpp
+++ b/src/idl_parser.cpp
@@ -411,10 +411,8 @@ CheckedError Parser::Next() {
}
cursor_ += 2;
break;
- } else {
- // fall thru
}
- FLATBUFFERS_ATTRIBUTE(fallthrough);
+ FLATBUFFERS_FALLTHROUGH(); // else fall thru
default:
const auto has_sign = (c == '+') || (c == '-');
// '-'/'+' and following identifier - can be a predefined constant like:
diff --git a/src/reflection.cpp b/src/reflection.cpp
index 1058f9d5..89ce7838 100644
--- a/src/reflection.cpp
+++ b/src/reflection.cpp
@@ -431,7 +431,7 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
break;
}
}
- // FALL-THRU
+ FLATBUFFERS_FALLTHROUGH(); // fall thru
default: { // Scalars and structs.
auto element_size = GetTypeSize(element_base_type);
if (elemobjectdef && elemobjectdef->is_struct())
@@ -466,7 +466,7 @@ Offset<const Table *> CopyTable(FlatBufferBuilder &fbb,
break;
}
}
- // ELSE FALL-THRU
+ FLATBUFFERS_FALLTHROUGH(); // fall thru
case reflection::Union:
case reflection::String:
case reflection::Vector: