When checking for uninitialized values, do not confuse "std::move" with every

other function named "move".

llvm-svn: 222863
This commit is contained in:
Richard Trieu 2014-11-27 01:29:32 +00:00
parent e13d71c57c
commit c321b931c0
4 changed files with 50 additions and 3 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)) {}
};
}