Vendor import of clang 5.0.1 release r320880:
https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_501/final@320880
This commit is contained in:
parent
b5ea630dfd
commit
75c3240472
@ -36,7 +36,7 @@ std::string getClangRepositoryPath() {
|
||||
|
||||
// If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us
|
||||
// pick up a tag in an SVN export, for example.
|
||||
StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/branches/release_50/lib/Basic/Version.cpp $");
|
||||
StringRef SVNRepository("$URL: https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_501/final/lib/Basic/Version.cpp $");
|
||||
if (URL.empty()) {
|
||||
URL = SVNRepository.slice(SVNRepository.find(':'),
|
||||
SVNRepository.find("/lib/Basic"));
|
||||
|
@ -1603,7 +1603,24 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
|
||||
if (D->isInvalidDecl())
|
||||
return false;
|
||||
|
||||
if (D->isReferenced() || D->isUsed() || D->hasAttr<UnusedAttr>() ||
|
||||
bool Referenced = false;
|
||||
if (auto *DD = dyn_cast<DecompositionDecl>(D)) {
|
||||
// For a decomposition declaration, warn if none of the bindings are
|
||||
// referenced, instead of if the variable itself is referenced (which
|
||||
// it is, by the bindings' expressions).
|
||||
for (auto *BD : DD->bindings()) {
|
||||
if (BD->isReferenced()) {
|
||||
Referenced = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (!D->getDeclName()) {
|
||||
return false;
|
||||
} else if (D->isReferenced() || D->isUsed()) {
|
||||
Referenced = true;
|
||||
}
|
||||
|
||||
if (Referenced || D->hasAttr<UnusedAttr>() ||
|
||||
D->hasAttr<ObjCPreciseLifetimeAttr>())
|
||||
return false;
|
||||
|
||||
@ -1726,7 +1743,7 @@ void Sema::DiagnoseUnusedDecl(const NamedDecl *D) {
|
||||
else
|
||||
DiagID = diag::warn_unused_variable;
|
||||
|
||||
Diag(D->getLocation(), DiagID) << D->getDeclName() << Hint;
|
||||
Diag(D->getLocation(), DiagID) << D << Hint;
|
||||
}
|
||||
|
||||
static void CheckPoppedLabel(LabelDecl *L, Sema &S) {
|
||||
@ -1756,8 +1773,6 @@ void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
|
||||
assert(isa<NamedDecl>(TmpD) && "Decl isn't NamedDecl?");
|
||||
NamedDecl *D = cast<NamedDecl>(TmpD);
|
||||
|
||||
if (!D->getDeclName()) continue;
|
||||
|
||||
// Diagnose unused variables in this scope.
|
||||
if (!S->hasUnrecoverableErrorOccurred()) {
|
||||
DiagnoseUnusedDecl(D);
|
||||
@ -1765,6 +1780,8 @@ void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
|
||||
DiagnoseUnusedNestedTypedefs(RD);
|
||||
}
|
||||
|
||||
if (!D->getDeclName()) continue;
|
||||
|
||||
// If this was a forward reference to a label, verify it was defined.
|
||||
if (LabelDecl *LD = dyn_cast<LabelDecl>(D))
|
||||
CheckPoppedLabel(LD, *this);
|
||||
@ -6155,7 +6172,6 @@ NamedDecl *Sema::ActOnVariableDeclarator(
|
||||
IdentifierInfo *II = Name.getAsIdentifierInfo();
|
||||
|
||||
if (D.isDecompositionDeclarator()) {
|
||||
AddToScope = false;
|
||||
// Take the name of the first declarator as our name for diagnostic
|
||||
// purposes.
|
||||
auto &Decomp = D.getDecompositionDeclarator();
|
||||
|
@ -826,7 +826,10 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
|
||||
NamedDecl *New =
|
||||
ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
|
||||
MultiTemplateParamsArg(), AddToScope, Bindings);
|
||||
CurContext->addHiddenDecl(New);
|
||||
if (AddToScope) {
|
||||
S->AddDecl(New);
|
||||
CurContext->addHiddenDecl(New);
|
||||
}
|
||||
|
||||
if (isInOpenMPDeclareTargetContext())
|
||||
checkDeclIsAllowedInOpenMPTarget(nullptr, New);
|
||||
|
@ -677,6 +677,7 @@ TemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
|
||||
Decl *TemplateDeclInstantiator::VisitBindingDecl(BindingDecl *D) {
|
||||
auto *NewBD = BindingDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||
D->getIdentifier());
|
||||
NewBD->setReferenced(D->isReferenced());
|
||||
SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewBD);
|
||||
return NewBD;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wunused %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wunused %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 -Wunused %s
|
||||
|
||||
// PR4103 : Make sure we don't get a bogus unused expression warning
|
||||
namespace PR4103 {
|
||||
@ -8,7 +9,7 @@ namespace PR4103 {
|
||||
char foo;
|
||||
};
|
||||
class APSInt : public APInt {
|
||||
char bar;
|
||||
char bar; // expected-warning {{private field 'bar' is not used}}
|
||||
public:
|
||||
APSInt &operator=(const APSInt &RHS);
|
||||
};
|
||||
@ -69,3 +70,44 @@ namespace UnresolvedLookup {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201703L
|
||||
namespace PR33839 {
|
||||
void a() {
|
||||
struct X { int a, b; } x;
|
||||
auto [a, b] = x; // expected-warning {{unused variable '[a, b]'}}
|
||||
auto [c, d] = x;
|
||||
(void)d;
|
||||
}
|
||||
|
||||
template<typename T> void f() {
|
||||
struct A { int n; } a[1];
|
||||
for (auto [x] : a) {
|
||||
(void)x;
|
||||
}
|
||||
auto [y] = a[0]; // expected-warning {{unused}}
|
||||
}
|
||||
template<bool b> void g() {
|
||||
struct A { int n; } a[1];
|
||||
for (auto [x] : a) {
|
||||
if constexpr (b)
|
||||
(void)x;
|
||||
}
|
||||
|
||||
auto [y] = a[0];
|
||||
if constexpr (b)
|
||||
(void)y; // ok, even when b == false
|
||||
}
|
||||
template<typename T> void h() {
|
||||
struct A { int n; } a[1];
|
||||
for (auto [x] : a) { // expected-warning {{unused variable '[x]'}}
|
||||
}
|
||||
}
|
||||
void use() {
|
||||
f<int>(); // expected-note {{instantiation of}}
|
||||
g<true>();
|
||||
g<false>();
|
||||
h<int>(); // expected-note {{instantiation of}}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user