Page MenuHomePhabricator

D7989.diff
No OneTemporary

D7989.diff

diff --git a/arcanist/linter/CppVoidParameterLinter.php b/arcanist/linter/CppVoidParameterLinter.php
--- a/arcanist/linter/CppVoidParameterLinter.php
+++ b/arcanist/linter/CppVoidParameterLinter.php
@@ -6,6 +6,10 @@
*/
final class CppVoidParameterLinter extends ArcanistLinter {
+ const FALSE_POSITIVES = array(
+ "typeid(void)",
+ );
+
const VOID_PARAMETER_FOUND = 1;
public function getInfoName() {
@@ -36,6 +40,15 @@
);
}
+ private function isFalsePositive($line) {
+ foreach(self::FALSE_POSITIVES as $falsePositive) {
+ if (strpos($line, $falsePositive) !== false) {
+ return true;
+ }
+ }
+ return false;
+ }
+
public function lintPath($path) {
$absPath = Filesystem::resolvePath($path, $this->getProjectRoot());
$fileContent = Filesystem::readFile($absPath);
@@ -44,6 +57,11 @@
PREG_OFFSET_CAPTURE)) {
foreach ($voidParameters[0] as $voidParameter) {
list($function, $offset) = $voidParameter;
+
+ if ($this->isFalsePositive($function)) {
+ continue;
+ }
+
$this->raiseLintAtOffset(
$offset,
self::VOID_PARAMETER_FOUND,
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -150,6 +150,7 @@
raii_event_tests.cpp
random_tests.cpp
rcu_tests.cpp
+ ref_tests.cpp
reverselock_tests.cpp
rpc_tests.cpp
rpc_server_tests.cpp
diff --git a/src/test/ref_tests.cpp b/src/test/ref_tests.cpp
new file mode 100644
--- /dev/null
+++ b/src/test/ref_tests.cpp
@@ -0,0 +1,32 @@
+// Copyright (c) 2020 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <util/ref.h>
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(ref_tests)
+
+BOOST_AUTO_TEST_CASE(ref_test) {
+ util::Ref ref;
+ BOOST_CHECK(!ref.Has<int>());
+ BOOST_CHECK_THROW(ref.Get<int>(), NonFatalCheckError);
+ int value = 5;
+ ref.Set(value);
+ BOOST_CHECK(ref.Has<int>());
+ BOOST_CHECK_EQUAL(ref.Get<int>(), 5);
+ ++ref.Get<int>();
+ BOOST_CHECK_EQUAL(ref.Get<int>(), 6);
+ BOOST_CHECK_EQUAL(value, 6);
+ ++value;
+ BOOST_CHECK_EQUAL(value, 7);
+ BOOST_CHECK_EQUAL(ref.Get<int>(), 7);
+ BOOST_CHECK(!ref.Has<bool>());
+ BOOST_CHECK_THROW(ref.Get<bool>(), NonFatalCheckError);
+ ref.Clear();
+ BOOST_CHECK(!ref.Has<int>());
+ BOOST_CHECK_THROW(ref.Get<int>(), NonFatalCheckError);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/util/check.h b/src/util/check.h
--- a/src/util/check.h
+++ b/src/util/check.h
@@ -5,6 +5,10 @@
#ifndef BITCOIN_UTIL_CHECK_H
#define BITCOIN_UTIL_CHECK_H
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <tinyformat.h>
#include <stdexcept>
diff --git a/src/util/ref.h b/src/util/ref.h
new file mode 100644
--- /dev/null
+++ b/src/util/ref.h
@@ -0,0 +1,48 @@
+// Copyright (c) 2020 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_UTIL_REF_H
+#define BITCOIN_UTIL_REF_H
+
+#include <util/check.h>
+
+#include <typeindex>
+
+namespace util {
+
+/**
+ * Type-safe dynamic reference.
+ *
+ * This implements a small subset of the functionality in C++17's std::any
+ * class, and can be dropped when the project updates to C++17
+ * (https://github.com/bitcoin/bitcoin/issues/16684)
+ */
+class Ref {
+public:
+ Ref() = default;
+ template <typename T> Ref(T &value) { Set(value); }
+ template <typename T> T &Get() const {
+ CHECK_NONFATAL(Has<T>());
+ return *static_cast<T *>(m_value);
+ }
+ template <typename T> void Set(T &value) {
+ m_value = &value;
+ m_type = std::type_index(typeid(T));
+ }
+ template <typename T> bool Has() const {
+ return m_value && m_type == std::type_index(typeid(T));
+ }
+ void Clear() {
+ m_value = nullptr;
+ m_type = std::type_index(typeid(void));
+ }
+
+private:
+ void *m_value = nullptr;
+ std::type_index m_type = std::type_index(typeid(void));
+};
+
+} // namespace util
+
+#endif // BITCOIN_UTIL_REF_H

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 1, 11:03 (16 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187469
Default Alt Text
D7989.diff (4 KB)

Event Timeline