mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 17:46:49 +00:00

Replaces some prior ad-hoc detection strategies and generally cleans up a little. No functional change intended.
119 lines
2.5 KiB
C++
119 lines
2.5 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -Wall -std=c++11 %s -Wno-unused-value
|
|
|
|
namespace std {
|
|
|
|
template <typename T>
|
|
void dummy(T &&) {}
|
|
template <typename T>
|
|
T &&move(T &&x) { return x; }
|
|
template <typename T, typename U>
|
|
void move(T &&, U &&) {}
|
|
|
|
inline namespace __1 {
|
|
template <typename T>
|
|
T &forward(T &x) { return x; }
|
|
} // namespace __1
|
|
|
|
struct foo {};
|
|
|
|
} // namespace std
|
|
|
|
namespace global {
|
|
|
|
using namespace std;
|
|
|
|
void f() {
|
|
int i = 0;
|
|
std::move(i);
|
|
move(i); // expected-warning{{unqualified call to 'std::move'}}
|
|
(move)(i); // expected-warning{{unqualified call to 'std::move'}}
|
|
std::dummy(1);
|
|
dummy(1);
|
|
std::move(1, 2);
|
|
move(1, 2);
|
|
forward<int>(i); // expected-warning{{unqualified call to 'std::forward'}}
|
|
std::forward<int>(i);
|
|
}
|
|
|
|
template <typename T>
|
|
void g(T &&foo) {
|
|
std::move(foo);
|
|
move(foo); // expected-warning{{unqualified call to 'std::move}}
|
|
|
|
std::forward<decltype(foo)>(foo);
|
|
forward<decltype(foo)>(foo); // expected-warning{{unqualified call to 'std::forward}}
|
|
move(1, 2);
|
|
dummy(foo);
|
|
}
|
|
|
|
void call() {
|
|
g(0); //expected-note {{here}}
|
|
}
|
|
|
|
} // namespace global
|
|
|
|
namespace named {
|
|
|
|
using std::forward;
|
|
using std::move;
|
|
|
|
void f() {
|
|
int i = 0;
|
|
move(i); // expected-warning{{unqualified call to 'std::move}}
|
|
move(1, 2);
|
|
forward<int>(i); // expected-warning{{unqualified call to 'std::forward}}
|
|
}
|
|
|
|
template <typename T>
|
|
void g(T &&foo) {
|
|
move(foo); // expected-warning{{unqualified call to 'std::move}}
|
|
forward<decltype(foo)>(foo); // expected-warning{{unqualified call to 'std::forward}}
|
|
(forward<decltype(foo)>)(foo); // expected-warning{{unqualified call to 'std::forward}}
|
|
move(1, 2);
|
|
}
|
|
|
|
void call() {
|
|
g(0); //expected-note {{here}}
|
|
}
|
|
|
|
} // namespace named
|
|
|
|
namespace overload {
|
|
using namespace std;
|
|
template <typename T>
|
|
int move(T &&);
|
|
void f() {
|
|
int i = 0;
|
|
move(i);
|
|
}
|
|
} // namespace overload
|
|
|
|
namespace adl {
|
|
void f() {
|
|
move(std::foo{}); // expected-warning{{unqualified call to 'std::move}}
|
|
}
|
|
|
|
} // namespace adl
|
|
|
|
namespace std {
|
|
|
|
void f() {
|
|
int i = 0;
|
|
move(i); // expected-warning{{unqualified call to 'std::move}}
|
|
forward<int>(i); // expected-warning{{unqualified call to 'std::forward}}
|
|
}
|
|
|
|
} // namespace std
|
|
|
|
namespace test_alias {
|
|
namespace alias = std;
|
|
using namespace alias;
|
|
void f() {
|
|
int i = 0;
|
|
move(i); // expected-warning{{unqualified call to 'std::move}}
|
|
move(1, 2);
|
|
forward<int>(i); // expected-warning{{unqualified call to 'std::forward}}
|
|
}
|
|
|
|
} // namespace test_alias
|