diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt index a55f01fd52789b..aae308210dea42 100644 --- a/be/CMakeLists.txt +++ b/be/CMakeLists.txt @@ -359,6 +359,7 @@ if (COMPILER_CLANG) endif() add_compile_options(-fcolor-diagnostics + -Wconsumed -Wpedantic -Wshadow -Wshadow-field diff --git a/be/src/agent/task_worker_pool.cpp b/be/src/agent/task_worker_pool.cpp index 97125ffe6a888f..cef74c44276d24 100644 --- a/be/src/agent/task_worker_pool.cpp +++ b/be/src/agent/task_worker_pool.cpp @@ -1687,7 +1687,7 @@ void cloud_submit_table_compaction_callback(CloudStorageEngine& engine, << ", error=" << tablet_res.error(); return; } - CloudTabletSPtr tablet = std::move(tablet_res).value(); + CloudTabletSPtr tablet = *std::move(tablet_res); if (tablet == nullptr) { LOG(WARNING) << "cloud tablet not found. tablet_id=" << compaction_req.tablet_id; return; @@ -1728,7 +1728,7 @@ void update_s3_resource(const TStorageResource& param, io::RemoteFileSystemSPtr if (!res.has_value()) { st = std::move(res).error(); } else { - fs = std::move(res).value(); + fs = *std::move(res); } } else { DCHECK_EQ(existed_fs->type(), io::FileSystemType::S3) << param.id << ' ' << param.name; @@ -1763,7 +1763,7 @@ void update_hdfs_resource(const TStorageResource& param, io::RemoteFileSystemSPt if (!res.has_value()) { st = std::move(res).error(); } else { - fs = std::move(res).value(); + fs = *std::move(res); } } else { @@ -2367,14 +2367,18 @@ void set_alter_version_before_enqueue(CloudStorageEngine& engine, const TAgentTa return; } auto new_tablet = engine.tablet_mgr().get_tablet(alter_req.new_tablet_id); - if (!new_tablet.has_value() || new_tablet.value()->tablet_state() == TABLET_RUNNING) { + if (!new_tablet.has_value()) { + return; + } + auto* new_tablet_ptr = new_tablet.value().get(); + if (new_tablet_ptr->tablet_state() == TABLET_RUNNING) { return; } auto base_tablet = engine.tablet_mgr().get_tablet(alter_req.base_tablet_id); if (!base_tablet.has_value()) { return; } - new_tablet.value()->set_alter_version(alter_req.alter_version); + new_tablet_ptr->set_alter_version(alter_req.alter_version); base_tablet.value()->set_alter_version(alter_req.alter_version); LOG(INFO) << "set alter_version=" << alter_req.alter_version << " before enqueue, base_tablet=" << alter_req.base_tablet_id diff --git a/be/src/common/expected.h b/be/src/common/expected.h index 2dc6b66299c8f6..58ebbf731e33b8 100644 --- a/be/src/common/expected.h +++ b/be/src/common/expected.h @@ -21,7 +21,6 @@ #error need cpp support #endif -#if __cplusplus <= 202002L #include "util/expected.hpp" namespace doris { using tl::expected; // NOLINT @@ -30,13 +29,3 @@ using tl::bad_expected_access; // NOLINT using tl::unexpect_t; // NOLINT using tl::unexpect; // NOLINT } // namespace doris -#else -#include -namespace doris { -using std::expected; // NOLINT -using std::unexpected; // NOLINT -using std::bad_expected_access; // NOLINT -using std::unexpect_t; // NOLINT -using std::unexpect; // NOLINT -} // namespace doris -#endif diff --git a/be/src/common/status.h b/be/src/common/status.h index baf2cf8caa4369..574c9c7fee4347 100644 --- a/be/src/common/status.h +++ b/be/src/common/status.h @@ -746,7 +746,7 @@ using ResultError = unexpected; if (!try_res.has_value()) [[unlikely]] { \ return std::forward(try_res).error(); \ } \ - std::forward(try_res).value(); \ + *std::forward(try_res); \ }); #define TEST_TRY(stmt) \ @@ -756,7 +756,7 @@ using ResultError = unexpected; if (!res.has_value()) [[unlikely]] { \ ASSERT_TRUE(res.has_value()) << "Expected success, but got error: " << res.error(); \ } \ - std::forward(res).value(); \ + *std::forward(res); \ }) #define TEST_RESULT_ERROR(stmt) \ diff --git a/be/src/exec/rowid_fetcher.cpp b/be/src/exec/rowid_fetcher.cpp index f97bce17a8c6a4..2be2ba4b115ec3 100644 --- a/be/src/exec/rowid_fetcher.cpp +++ b/be/src/exec/rowid_fetcher.cpp @@ -389,8 +389,10 @@ Status RowIdStorageReader::read_by_rowids(const PMultiGetRequest& request, BaseTabletSPtr tablet = scope_timer_run( [&]() { auto res = ExecEnv::get_tablet(row_loc.tablet_id(), nullptr, true); - return !res.has_value() ? nullptr - : std::dynamic_pointer_cast(res.value()); + if (!res.has_value()) { + return BaseTabletSPtr(nullptr); + } + return std::dynamic_pointer_cast(res.value()); }, &acquire_tablet_ms); RowsetId rowset_id; @@ -1015,8 +1017,10 @@ Status RowIdStorageReader::read_doris_format_row( tablet = scope_timer_run( [&]() { auto res = ExecEnv::get_tablet(tablet_id); - return !res.has_value() ? nullptr - : std::dynamic_pointer_cast(res.value()); + if (!res.has_value()) { + return BaseTabletSPtr(nullptr); + } + return std::dynamic_pointer_cast(res.value()); }, acquire_tablet_ms); if (!tablet) { diff --git a/be/src/io/cache/block_file_cache_downloader.cpp b/be/src/io/cache/block_file_cache_downloader.cpp index 1c4ca8577f64f7..218848d7f87938 100644 --- a/be/src/io/cache/block_file_cache_downloader.cpp +++ b/be/src/io/cache/block_file_cache_downloader.cpp @@ -211,7 +211,7 @@ void FileCacheBlockDownloader::download_file_cache_block( decrease_inflight_count(); return; } else { - tablet = std::move(res).value(); + tablet = *std::move(res); } if (!synced_tablets.contains(meta.tablet_id())) { auto st = tablet->sync_rowsets(); diff --git a/be/src/io/file_factory.cpp b/be/src/io/file_factory.cpp index 553cdc4460e15c..0cd12ce78c91a5 100644 --- a/be/src/io/file_factory.cpp +++ b/be/src/io/file_factory.cpp @@ -207,7 +207,7 @@ Result FileFactory::create_file_reader( if (!reader_res.has_value()) { return unexpected(std::move(reader_res).error()); } - return std::move(reader_res).value(); + return *std::move(reader_res); } Result FileFactory::_create_file_reader_internal( diff --git a/be/src/io/fs/hdfs_file_system.cpp b/be/src/io/fs/hdfs_file_system.cpp index a137a2934a05c0..16467c42753657 100644 --- a/be/src/io/fs/hdfs_file_system.cpp +++ b/be/src/io/fs/hdfs_file_system.cpp @@ -102,7 +102,7 @@ Status HdfsFileSystem::create_file_impl(const Path& file, FileWriterPtr* writer, const FileWriterOptions* opts) { auto res = io::HdfsFileWriter::create(file, _fs_handler, _fs_name, opts); if (res.has_value()) { - *writer = std::move(res).value(); + *writer = *std::move(res); return Status::OK(); } else { return std::move(res).error(); diff --git a/be/src/load/channel/load_stream.cpp b/be/src/load/channel/load_stream.cpp index 6cae3c7852eeea..a503abaae08b1f 100644 --- a/be/src/load/channel/load_stream.cpp +++ b/be/src/load/channel/load_stream.cpp @@ -152,8 +152,10 @@ Status TabletStream::append_data(const PStreamHeader& header, butil::IOBuf* data auto st = _load_stream_writer->append_data(new_segid, header.offset(), buf, file_type); if (!st.ok() && !config::is_cloud_mode()) { auto res = ExecEnv::get_tablet(_id); - TabletSharedPtr tablet = - res.has_value() ? std::dynamic_pointer_cast(res.value()) : nullptr; + TabletSharedPtr tablet = nullptr; + if (res.has_value()) { + tablet = std::dynamic_pointer_cast(res.value()); + } if (tablet) { tablet->report_error(st); } @@ -573,7 +575,7 @@ void LoadStream::_report_schema(StreamId stream, const PStreamHeader& hdr) { for (const auto& req : hdr.tablets()) { BaseTabletSPtr tablet; if (auto res = ExecEnv::get_tablet(req.tablet_id()); res.has_value()) { - tablet = std::move(res).value(); + tablet = *std::move(res); } else { st = std::move(res).error(); break; @@ -621,7 +623,7 @@ void LoadStream::_collect_tablet_load_info_from_tablets( for (auto tablet_id : tablet_ids) { BaseTabletSPtr tablet; if (auto res = ExecEnv::get_tablet(tablet_id); res.has_value()) { - tablet = std::move(res).value(); + tablet = *std::move(res); } else { continue; } diff --git a/be/src/service/internal_service.cpp b/be/src/service/internal_service.cpp index 8d560e538c8b8b..06a768da111f7d 100644 --- a/be/src/service/internal_service.cpp +++ b/be/src/service/internal_service.cpp @@ -428,7 +428,7 @@ void PInternalService::open_load_stream(google::protobuf::RpcController* control cntl->SetFailed(st.to_string()); return; } else { - tablet = std::move(res).value(); + tablet = *std::move(res); } auto resp = response->add_tablet_schemas(); resp->set_index_id(req.index_id()); @@ -755,14 +755,13 @@ void PInternalService::outfile_write_success(google::protobuf::RpcController* co .write_file_cache = false, .sync_file_data = false, }); - using T = std::decay_t; if (!res.has_value()) [[unlikely]] { - st = std::forward(res).error(); + st = res.error(); st.to_protobuf(result->mutable_status()); return; } - std::unique_ptr _file_writer_impl = std::forward(res).value(); + std::unique_ptr _file_writer_impl = *std::move(res); // must write somthing because s3 file writer can not writer empty file st = _file_writer_impl->append({"success"}); if (!st.ok()) { diff --git a/be/src/storage/index/inverted/query_v2/null_bitmap_fetcher.h b/be/src/storage/index/inverted/query_v2/null_bitmap_fetcher.h index f99a1c9e85d9df..df9fbb45d2b1f6 100644 --- a/be/src/storage/index/inverted/query_v2/null_bitmap_fetcher.h +++ b/be/src/storage/index/inverted/query_v2/null_bitmap_fetcher.h @@ -58,7 +58,10 @@ class FieldNullBitmapFetcher { } auto has_null = iterator->has_null(); - if (!has_null.has_value() || !has_null.value()) { + if (!has_null.has_value()) { + return nullptr; + } + if (!has_null.value()) { return nullptr; } diff --git a/be/src/storage/rowset/beta_rowset.cpp b/be/src/storage/rowset/beta_rowset.cpp index 70950dfe065634..d5563ecdab1b22 100644 --- a/be/src/storage/rowset/beta_rowset.cpp +++ b/be/src/storage/rowset/beta_rowset.cpp @@ -874,8 +874,7 @@ Status BetaRowset::show_nested_index_file(rapidjson::Value* rowset_value, LOG(INFO) << "IndexFileReader open error:" << ret.error(); return Status::InternalError("IndexFileReader open error"); } - using T = std::decay_t; - auto reader = std::forward(ret).value(); + auto reader = *std::move(ret); reader->list(&files); for (auto& file : files) { rapidjson::Value file_value(rapidjson::kObjectType); diff --git a/be/src/storage/schema_change/schema_change.cpp b/be/src/storage/schema_change/schema_change.cpp index f2583e3bcfc2d2..f3ba0cf6c782f2 100644 --- a/be/src/storage/schema_change/schema_change.cpp +++ b/be/src/storage/schema_change/schema_change.cpp @@ -710,7 +710,7 @@ Result VBaseSchemaChangeWithSorting::_internal_sorting( [[unlikely]] { return unexpected(std::move(result).error()); } else { - rowset_writer = std::move(result).value(); + rowset_writer = *std::move(result); } RETURN_IF_ERROR_RESULT(merger.merge(blocks, rowset_writer.get(), &merged_rows)); _add_merged_rows(merged_rows); @@ -739,7 +739,7 @@ Result VLocalSchemaChangeWithSorting::_internal_sorting( [[unlikely]] { return unexpected(std::move(result).error()); } else { - rowset_writer = std::move(result).value(); + rowset_writer = *std::move(result); } auto guard = _local_storage_engine.pending_local_rowsets().add(context.rowset_id); _pending_rs_guards.push_back(std::move(guard)); @@ -1300,7 +1300,7 @@ Status SchemaChangeJob::_convert_historical_rowsets(const SchemaChangeParams& sc result.error().to_string()); return process_alter_exit(); } - auto rowset_writer = std::move(result).value(); + auto rowset_writer = *std::move(result); auto pending_rs_guard = _local_storage_engine.add_pending_rowset(context); if (res = sc_procedure->process(rs_reader, rowset_writer.get(), _new_tablet, _base_tablet, diff --git a/be/src/storage/segment/segment.cpp b/be/src/storage/segment/segment.cpp index 103df3f482fd19..871efaa99a46ee 100644 --- a/be/src/storage/segment/segment.cpp +++ b/be/src/storage/segment/segment.cpp @@ -99,8 +99,10 @@ Status Segment::open(io::FileSystemSPtr fs, const std::string& path, int64_t tab if (!s.ok()) { if (!config::is_cloud_mode()) { auto res = ExecEnv::get_tablet(tablet_id); - TabletSharedPtr tablet = - res.has_value() ? std::dynamic_pointer_cast(res.value()) : nullptr; + TabletSharedPtr tablet = nullptr; + if (res.has_value()) { + tablet = std::dynamic_pointer_cast(res.value()); + } if (tablet) { tablet->report_error(s); } diff --git a/be/src/storage/tablet/tablet.cpp b/be/src/storage/tablet/tablet.cpp index 9f0ba06696a3b9..edf18736642cf8 100644 --- a/be/src/storage/tablet/tablet.cpp +++ b/be/src/storage/tablet/tablet.cpp @@ -2885,7 +2885,11 @@ std::string Tablet::get_segment_path(const RowsetMetaSharedPtr& rs_meta, int64_t if (rs_meta->is_local()) { segment_path = local_segment_path(_tablet_path, rs_meta->rowset_id().to_string(), seg_id); } else { - segment_path = rs_meta->remote_storage_resource().value()->remote_segment_path( + auto storage_resource = rs_meta->remote_storage_resource(); + if (!storage_resource.has_value()) [[unlikely]] { + throw Exception(storage_resource.error()); + } + segment_path = storage_resource.value()->remote_segment_path( rs_meta->tablet_id(), rs_meta->rowset_id().to_string(), seg_id); } return segment_path; diff --git a/be/src/util/expected.hpp b/be/src/util/expected.hpp index 16f28136c337c2..8dd451b0d3f0cf 100644 --- a/be/src/util/expected.hpp +++ b/be/src/util/expected.hpp @@ -81,6 +81,19 @@ #endif #endif +#if defined(__clang__) && __has_attribute(consumable) && __has_attribute(callable_when) && \ + __has_attribute(test_typestate) && __has_attribute(return_typestate) +#define TL_EXPECTED_CLANG_CONSUMABLE_UNKNOWN __attribute__((consumable(unknown))) +#define TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED __attribute__((callable_when("unconsumed"))) +#define TL_EXPECTED_CLANG_TEST_UNCONSUMED __attribute__((test_typestate(unconsumed))) +#define TL_EXPECTED_CLANG_RETURN_UNKNOWN __attribute__((return_typestate(unknown))) +#else +#define TL_EXPECTED_CLANG_CONSUMABLE_UNKNOWN +#define TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED +#define TL_EXPECTED_CLANG_TEST_UNCONSUMED +#define TL_EXPECTED_CLANG_RETURN_UNKNOWN +#endif + #if (defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ <= 9 && \ !defined(__clang__)) // GCC < 5 doesn't support overloading on const&& for member functions @@ -1249,10 +1262,11 @@ template class bad_expected_access : public std::exception { /// has been destroyed. The initialization state of the contained object is /// tracked by the expected object. template -class expected : private detail::expected_move_assign_base, - private detail::expected_delete_ctor_base, - private detail::expected_delete_assign_base, - private detail::expected_default_ctor_base { +class TL_EXPECTED_CLANG_CONSUMABLE_UNKNOWN + expected : private detail::expected_move_assign_base, + private detail::expected_delete_ctor_base, + private detail::expected_delete_assign_base, + private detail::expected_default_ctor_base { static_assert(!std::is_reference::value, "T must not be a reference"); static_assert(!std::is_same::type>::value, "T must not be in_place_t"); @@ -1529,9 +1543,9 @@ class expected : private detail::expected_move_assign_base, return or_else_impl(std::move(*this), std::forward(f)); } #endif - constexpr expected() = default; - constexpr expected(const expected &rhs) = default; - constexpr expected(expected &&rhs) = default; + constexpr expected() TL_EXPECTED_CLANG_RETURN_UNKNOWN = default; + constexpr expected(const expected &rhs) TL_EXPECTED_CLANG_RETURN_UNKNOWN = default; + constexpr expected(expected &&rhs) TL_EXPECTED_CLANG_RETURN_UNKNOWN = default; expected &operator=(const expected &rhs) = default; expected &operator=(expected &&rhs) = default; @@ -1983,33 +1997,41 @@ class expected : private detail::expected_move_assign_base, return std::move(val()); } - constexpr bool has_value() const noexcept { return this->m_has_val; } - constexpr explicit operator bool() const noexcept { return this->m_has_val; } + constexpr bool has_value() const noexcept TL_EXPECTED_CLANG_TEST_UNCONSUMED { + return this->m_has_val; + } + constexpr explicit operator bool() const noexcept TL_EXPECTED_CLANG_TEST_UNCONSUMED { + return this->m_has_val; + } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &value() const & { + TL_EXPECTED_11_CONSTEXPR const U &value() const & + TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &value() & { + TL_EXPECTED_11_CONSTEXPR U &value() & + TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &&value() const && { + TL_EXPECTED_11_CONSTEXPR const U &&value() const && + TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val()); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &&value() && { + TL_EXPECTED_11_CONSTEXPR U &&value() && + TL_EXPECTED_CLANG_CALLABLE_WHEN_UNCONSUMED { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val());