diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index d0f86506f..9fcba210f 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include @@ -1002,9 +1003,8 @@ void TypeChecker::endVisit(TryStatement const& _tryStatement) TryCatchClause const* panicClause = nullptr; TryCatchClause const* errorClause = nullptr; TryCatchClause const* lowLevelClause = nullptr; - for (auto const& clausePointer: _tryStatement.clauses() | ranges::views::drop_exactly(1)) + for (auto const& clause: _tryStatement.clauses() | ranges::views::drop_exactly(1) | views::dereferenceChecked) { - TryCatchClause const& clause = *clausePointer; if (clause.errorName() == "") { if (lowLevelClause) diff --git a/libsolutil/CMakeLists.txt b/libsolutil/CMakeLists.txt index 02cd9d18b..7c10cf8b5 100644 --- a/libsolutil/CMakeLists.txt +++ b/libsolutil/CMakeLists.txt @@ -34,6 +34,7 @@ set(sources UTF8.cpp UTF8.h vector_ref.h + Views.h Visitor.h Whiskers.cpp Whiskers.h diff --git a/libsolutil/Views.h b/libsolutil/Views.h new file mode 100644 index 000000000..7ab75047b --- /dev/null +++ b/libsolutil/Views.h @@ -0,0 +1,39 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +// SPDX-License-Identifier: GPL-3.0 + +#pragma once + +#include + +#include + + +namespace solidity::util::views +{ + +static constexpr auto dereference = ranges::views::transform([](auto&& x) -> decltype(auto) { return *x; }); + +static constexpr auto dereferenceChecked = ranges::views::transform( + [](auto&& x) -> decltype(auto) + { + solAssert(x, ""); + return *x; + } +); + +}