// RUN: %check_clang_tidy -std=c++17-or-later %s bugprone-optional-value-conversion %t namespace std { template struct optional { constexpr optional() noexcept; constexpr optional(T &&) noexcept; constexpr optional(const T &) noexcept; template constexpr optional(U &&) noexcept; const T &operator*() const; T *operator->(); const T *operator->() const; T &operator*(); const T &value() const; T &value(); const T &get() const; T &get(); T value_or(T) const; }; template T &&move(T &x) { return static_cast(x); } template class default_delete {}; template > class unique_ptr {}; template class shared_ptr {}; template class initializer_list {}; template unique_ptr make_unique(Args &&...args); template shared_ptr make_shared(Args &&...args); template constexpr std::optional<__decay(T)> make_optional(T &&value); template constexpr std::optional make_optional(Args &&...args); template constexpr std::optional make_optional(std::initializer_list il, Args &&...args); } // namespace std struct A { explicit A (int); }; std::optional opt; void invalid() { std::make_unique>(opt.value()); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional' into 'int' and back into 'std::optional', remove potentially error-prone optional dereference [bugprone-optional-value-conversion] using A = std::optional; std::make_unique(opt.value()); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional' into 'int' and back into 'std::optional', remove potentially error-prone optional dereference [bugprone-optional-value-conversion] std::make_shared>(opt.value()); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional' into 'int' and back into 'std::optional', remove potentially error-prone optional dereference [bugprone-optional-value-conversion] std::make_optional(opt.value()); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: conversion from 'std::optional' into 'int' and back into 'std::optional', remove potentially error-prone optional dereference [bugprone-optional-value-conversion] } void valid() { std::make_unique(opt.value()); std::make_shared(opt.value()); std::make_optional(opt.value()); }