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
|
// 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.
|
// 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()) {
|
if (URL.empty()) {
|
||||||
URL = SVNRepository.slice(SVNRepository.find(':'),
|
URL = SVNRepository.slice(SVNRepository.find(':'),
|
||||||
SVNRepository.find("/lib/Basic"));
|
SVNRepository.find("/lib/Basic"));
|
||||||
|
@ -1603,7 +1603,24 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
|
|||||||
if (D->isInvalidDecl())
|
if (D->isInvalidDecl())
|
||||||
return false;
|
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>())
|
D->hasAttr<ObjCPreciseLifetimeAttr>())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1726,7 +1743,7 @@ void Sema::DiagnoseUnusedDecl(const NamedDecl *D) {
|
|||||||
else
|
else
|
||||||
DiagID = diag::warn_unused_variable;
|
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) {
|
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?");
|
assert(isa<NamedDecl>(TmpD) && "Decl isn't NamedDecl?");
|
||||||
NamedDecl *D = cast<NamedDecl>(TmpD);
|
NamedDecl *D = cast<NamedDecl>(TmpD);
|
||||||
|
|
||||||
if (!D->getDeclName()) continue;
|
|
||||||
|
|
||||||
// Diagnose unused variables in this scope.
|
// Diagnose unused variables in this scope.
|
||||||
if (!S->hasUnrecoverableErrorOccurred()) {
|
if (!S->hasUnrecoverableErrorOccurred()) {
|
||||||
DiagnoseUnusedDecl(D);
|
DiagnoseUnusedDecl(D);
|
||||||
@ -1765,6 +1780,8 @@ void Sema::ActOnPopScope(SourceLocation Loc, Scope *S) {
|
|||||||
DiagnoseUnusedNestedTypedefs(RD);
|
DiagnoseUnusedNestedTypedefs(RD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!D->getDeclName()) continue;
|
||||||
|
|
||||||
// If this was a forward reference to a label, verify it was defined.
|
// If this was a forward reference to a label, verify it was defined.
|
||||||
if (LabelDecl *LD = dyn_cast<LabelDecl>(D))
|
if (LabelDecl *LD = dyn_cast<LabelDecl>(D))
|
||||||
CheckPoppedLabel(LD, *this);
|
CheckPoppedLabel(LD, *this);
|
||||||
@ -6155,7 +6172,6 @@ NamedDecl *Sema::ActOnVariableDeclarator(
|
|||||||
IdentifierInfo *II = Name.getAsIdentifierInfo();
|
IdentifierInfo *II = Name.getAsIdentifierInfo();
|
||||||
|
|
||||||
if (D.isDecompositionDeclarator()) {
|
if (D.isDecompositionDeclarator()) {
|
||||||
AddToScope = false;
|
|
||||||
// Take the name of the first declarator as our name for diagnostic
|
// Take the name of the first declarator as our name for diagnostic
|
||||||
// purposes.
|
// purposes.
|
||||||
auto &Decomp = D.getDecompositionDeclarator();
|
auto &Decomp = D.getDecompositionDeclarator();
|
||||||
|
@ -826,7 +826,10 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
|
|||||||
NamedDecl *New =
|
NamedDecl *New =
|
||||||
ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
|
ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
|
||||||
MultiTemplateParamsArg(), AddToScope, Bindings);
|
MultiTemplateParamsArg(), AddToScope, Bindings);
|
||||||
CurContext->addHiddenDecl(New);
|
if (AddToScope) {
|
||||||
|
S->AddDecl(New);
|
||||||
|
CurContext->addHiddenDecl(New);
|
||||||
|
}
|
||||||
|
|
||||||
if (isInOpenMPDeclareTargetContext())
|
if (isInOpenMPDeclareTargetContext())
|
||||||
checkDeclIsAllowedInOpenMPTarget(nullptr, New);
|
checkDeclIsAllowedInOpenMPTarget(nullptr, New);
|
||||||
|
@ -677,6 +677,7 @@ TemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
|
|||||||
Decl *TemplateDeclInstantiator::VisitBindingDecl(BindingDecl *D) {
|
Decl *TemplateDeclInstantiator::VisitBindingDecl(BindingDecl *D) {
|
||||||
auto *NewBD = BindingDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
auto *NewBD = BindingDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||||
D->getIdentifier());
|
D->getIdentifier());
|
||||||
|
NewBD->setReferenced(D->isReferenced());
|
||||||
SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewBD);
|
SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewBD);
|
||||||
return NewBD;
|
return NewBD;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused %s
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 -Wunused %s
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %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
|
// PR4103 : Make sure we don't get a bogus unused expression warning
|
||||||
namespace PR4103 {
|
namespace PR4103 {
|
||||||
@ -8,7 +9,7 @@ namespace PR4103 {
|
|||||||
char foo;
|
char foo;
|
||||||
};
|
};
|
||||||
class APSInt : public APInt {
|
class APSInt : public APInt {
|
||||||
char bar;
|
char bar; // expected-warning {{private field 'bar' is not used}}
|
||||||
public:
|
public:
|
||||||
APSInt &operator=(const APSInt &RHS);
|
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