
Some template function instantiations don't have a body, even though
their templates did have a body.
Examples are: `std::move`, `std::forward`, `std::addressof` etc.
They had bodies before
72315d02c4
After that change, the sentiment was that these special functions should
be considered and treated as builtin functions.
Fixes #94193
CPP-5358
42 lines
1.2 KiB
C++
42 lines
1.2 KiB
C++
// RUN: %clang_analyze_cc1 %s -verify -analyzer-checker=core
|
|
|
|
#include "Inputs/system-header-simulator-cxx.h"
|
|
|
|
|
|
namespace GH94193 {
|
|
template<typename T> class optional {
|
|
union {
|
|
char x;
|
|
T uvalue;
|
|
};
|
|
bool holds_value = false;
|
|
public:
|
|
optional() = default;
|
|
optional(const optional&) = delete;
|
|
optional(optional&&) = delete;
|
|
template <typename U = T> explicit optional(U&& value) : holds_value(true) {
|
|
new (static_cast<void*>(std::addressof(uvalue))) T(std::forward<U>(value));
|
|
}
|
|
optional& operator=(const optional&) = delete;
|
|
optional& operator=(optional&&) = delete;
|
|
explicit operator bool() const {
|
|
return holds_value;
|
|
}
|
|
T& unwrap() & {
|
|
return uvalue; // no-warning: returns a valid value
|
|
}
|
|
};
|
|
|
|
int top1(int x) {
|
|
optional<int> opt{x}; // note: Ctor was inlined.
|
|
return opt.unwrap(); // no-warning: returns a valid value
|
|
}
|
|
|
|
std::string *top2() {
|
|
std::string a = "123";
|
|
// expected-warning@+2 {{address of stack memory associated with local variable 'a' returned}} diagnosed by -Wreturn-stack-address
|
|
// expected-warning@+1 {{Address of stack memory associated with local variable 'a' returned to caller [core.StackAddressEscape]}}
|
|
return std::addressof(a);
|
|
}
|
|
} // namespace GH94193
|