forked from OSchip/llvm-project
When checking for uninitialized values, do not confuse "std::move" with every
other function named "move". llvm-svn: 222863
This commit is contained in:
parent
e13d71c57c
commit
c321b931c0
|
@ -419,7 +419,8 @@ void ClassifyRefs::VisitCallExpr(CallExpr *CE) {
|
|||
// Classify arguments to std::move as used.
|
||||
if (CE->getNumArgs() == 1) {
|
||||
if (FunctionDecl *FD = CE->getDirectCallee()) {
|
||||
if (FD->getIdentifier() && FD->getIdentifier()->isStr("move")) {
|
||||
if (FD->isInStdNamespace() && FD->getIdentifier() &&
|
||||
FD->getIdentifier()->isStr("move")) {
|
||||
classify(CE->getArg(0), Use);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -8489,7 +8489,8 @@ namespace {
|
|||
// Treat std::move as a use.
|
||||
if (E->getNumArgs() == 1) {
|
||||
if (FunctionDecl *FD = E->getDirectCallee()) {
|
||||
if (FD->getIdentifier() && FD->getIdentifier()->isStr("move")) {
|
||||
if (FD->isInStdNamespace() && FD->getIdentifier() &&
|
||||
FD->getIdentifier()->isStr("move")) {
|
||||
HandleValue(E->getArg(0));
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -2511,7 +2511,8 @@ namespace {
|
|||
// Treat std::move as a use.
|
||||
if (E->getNumArgs() == 1) {
|
||||
if (FunctionDecl *FD = E->getDirectCallee()) {
|
||||
if (FD->getIdentifier() && FD->getIdentifier()->isStr("move")) {
|
||||
if (FD->isInStdNamespace() && FD->getIdentifier() &&
|
||||
FD->getIdentifier()->isStr("move")) {
|
||||
HandleValue(E->getArg(0), false /*AddressOf*/);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1341,3 +1341,47 @@ struct D : public C, public A {
|
|||
};
|
||||
|
||||
}
|
||||
|
||||
namespace value {
|
||||
template <class T> T move(T t);
|
||||
template <class T> T notmove(T t);
|
||||
}
|
||||
namespace lvalueref {
|
||||
template <class T> T move(T& t);
|
||||
template <class T> T notmove(T& t);
|
||||
}
|
||||
namespace rvalueref {
|
||||
template <class T> T move(T&& t);
|
||||
template <class T> T notmove(T&& t);
|
||||
}
|
||||
|
||||
namespace move_test {
|
||||
int a1 = std::move(a1); // expected-warning {{uninitialized}}
|
||||
int a2 = value::move(a2); // expected-warning {{uninitialized}}
|
||||
int a3 = value::notmove(a3); // expected-warning {{uninitialized}}
|
||||
int a4 = lvalueref::move(a4);
|
||||
int a5 = lvalueref::notmove(a5);
|
||||
int a6 = rvalueref::move(a6);
|
||||
int a7 = rvalueref::notmove(a7);
|
||||
|
||||
void test() {
|
||||
int a1 = std::move(a1); // expected-warning {{uninitialized}}
|
||||
int a2 = value::move(a2); // expected-warning {{uninitialized}}
|
||||
int a3 = value::notmove(a3); // expected-warning {{uninitialized}}
|
||||
int a4 = lvalueref::move(a4);
|
||||
int a5 = lvalueref::notmove(a5);
|
||||
int a6 = rvalueref::move(a6);
|
||||
int a7 = rvalueref::notmove(a7);
|
||||
}
|
||||
|
||||
class A {
|
||||
int a;
|
||||
A(int (*) [1]) : a(std::move(a)) {} // expected-warning {{uninitialized}}
|
||||
A(int (*) [2]) : a(value::move(a)) {} // expected-warning {{uninitialized}}
|
||||
A(int (*) [3]) : a(value::notmove(a)) {} // expected-warning {{uninitialized}}
|
||||
A(int (*) [4]) : a(lvalueref::move(a)) {}
|
||||
A(int (*) [5]) : a(lvalueref::notmove(a)) {}
|
||||
A(int (*) [6]) : a(rvalueref::move(a)) {}
|
||||
A(int (*) [7]) : a(rvalueref::notmove(a)) {}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue