Skip to content

[analyzer][NFC] Simplify PositiveAnalyzerOption handling #121910

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,18 @@ enum class CTUPhase1InliningKind { None, Small, All };

class PositiveAnalyzerOption {
public:
PositiveAnalyzerOption() = default;
PositiveAnalyzerOption(const PositiveAnalyzerOption &) = default;
PositiveAnalyzerOption &operator=(const PositiveAnalyzerOption &) = default;
constexpr PositiveAnalyzerOption() = default;
constexpr PositiveAnalyzerOption(unsigned Value) : Value(Value) {
assert(Value > 0 && "only positive values are accepted");
}
constexpr PositiveAnalyzerOption(const PositiveAnalyzerOption &) = default;
constexpr PositiveAnalyzerOption &
operator=(const PositiveAnalyzerOption &Other) {
Value = Other.Value;
return *this;
}

static std::optional<PositiveAnalyzerOption> create(unsigned Val) {
static constexpr std::optional<PositiveAnalyzerOption> create(unsigned Val) {
if (Val == 0)
return std::nullopt;
return PositiveAnalyzerOption{Val};
Expand All @@ -141,11 +148,9 @@ class PositiveAnalyzerOption {
return std::nullopt;
return PositiveAnalyzerOption::create(Parsed);
}
operator unsigned() const { return Value; }
constexpr operator unsigned() const { return Value; }

private:
explicit constexpr PositiveAnalyzerOption(unsigned Value) : Value(Value) {}

unsigned Value = 1;
};

Expand Down
4 changes: 1 addition & 3 deletions clang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1274,9 +1274,7 @@ static void initOption(AnalyzerOptions::ConfigTable &Config,
Diags->Report(diag::err_analyzer_config_invalid_input)
<< Name << "a positive";

auto Default = PositiveAnalyzerOption::create(DefaultVal);
assert(Default.has_value());
OptionField = Default.value();
OptionField = DefaultVal;
}

static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts,
Expand Down
11 changes: 1 addition & 10 deletions clang/unittests/StaticAnalyzer/Z3CrosscheckOracleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,13 @@ static constexpr std::optional<bool> UNDEF = std::nullopt;
static unsigned operator""_ms(unsigned long long ms) { return ms; }
static unsigned operator""_step(unsigned long long rlimit) { return rlimit; }

template <class Ret, class Arg> static Ret makeDefaultOption(Arg Value) {
return Value;
}
template <> PositiveAnalyzerOption makeDefaultOption(int Value) {
auto DefaultVal = PositiveAnalyzerOption::create(Value);
assert(DefaultVal.has_value());
return DefaultVal.value();
}

static const AnalyzerOptions DefaultOpts = [] {
AnalyzerOptions Config;
#define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC, \
SHALLOW_VAL, DEEP_VAL) \
ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEEP_VAL)
#define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL) \
Config.NAME = makeDefaultOption<TYPE>(DEFAULT_VAL);
Config.NAME = DEFAULT_VAL;
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"

// Remember to update the tests in this file when these values change.
Expand Down
Loading