summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-08-22 17:48:11 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-08-22 17:48:11 +0000
commit966eea91ad94e38a3654f154d2d5ad28ea5deb9d (patch)
treeb04c116337c9f308c479d5186d3d8819940664c6 /clang/lib
parent1a28a06ebef290e0dafcd2d2f4ca1a817263d02b (diff)
downloadbcm5719-llvm-966eea91ad94e38a3654f154d2d5ad28ea5deb9d.tar.gz
bcm5719-llvm-966eea91ad94e38a3654f154d2d5ad28ea5deb9d.zip
Revert "[LifetimeAnalysis] Support more STL idioms (template forward declaration and DependentNameType)"
This reverts commit r369591, because it causes the formerly-reliable -Wreturn-stack-address warning to start issuing false positives. Testcase provided on the commit thread. llvm-svn: 369677
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaAttr.cpp11
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp16
-rw-r--r--clang/lib/Sema/SemaInit.cpp4
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp15
4 files changed, 15 insertions, 31 deletions
diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index 23cb47481f3..e2542edf6ed 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -88,11 +88,13 @@ void Sema::AddMsStructLayoutForRecord(RecordDecl *RD) {
template <typename Attribute>
static void addGslOwnerPointerAttributeIfNotExisting(ASTContext &Context,
CXXRecordDecl *Record) {
- if (Record->hasAttr<OwnerAttr>() || Record->hasAttr<PointerAttr>())
+ CXXRecordDecl *Canonical = Record->getCanonicalDecl();
+ if (Canonical->hasAttr<OwnerAttr>() || Canonical->hasAttr<PointerAttr>())
return;
- for (Decl *Redecl : Record->redecls())
- Redecl->addAttr(Attribute::CreateImplicit(Context, /*DerefType=*/nullptr));
+ Canonical->addAttr(::new (Context) Attribute(SourceRange{}, Context,
+ /*DerefType*/ nullptr,
+ /*Spelling=*/0));
}
void Sema::inferGslPointerAttribute(NamedDecl *ND,
@@ -187,7 +189,8 @@ void Sema::inferGslOwnerPointerAttribute(CXXRecordDecl *Record) {
// Handle classes that directly appear in std namespace.
if (Record->isInStdNamespace()) {
- if (Record->hasAttr<OwnerAttr>() || Record->hasAttr<PointerAttr>())
+ CXXRecordDecl *Canonical = Record->getCanonicalDecl();
+ if (Canonical->hasAttr<OwnerAttr>() || Canonical->hasAttr<PointerAttr>())
return;
if (StdOwners.count(Record->getName()))
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index b694c058a3a..2a72f7d5c61 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -4592,11 +4592,9 @@ static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
}
return;
}
- for (Decl *Redecl : D->redecls()) {
- Redecl->addAttr(::new (S.Context)
- OwnerAttr(AL.getRange(), S.Context, DerefTypeLoc,
- AL.getAttributeSpellingListIndex()));
- }
+ D->addAttr(::new (S.Context)
+ OwnerAttr(AL.getRange(), S.Context, DerefTypeLoc,
+ AL.getAttributeSpellingListIndex()));
} else {
if (checkAttrMutualExclusion<OwnerAttr>(S, D, AL))
return;
@@ -4611,11 +4609,9 @@ static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
}
return;
}
- for (Decl *Redecl : D->redecls()) {
- Redecl->addAttr(::new (S.Context)
- PointerAttr(AL.getRange(), S.Context, DerefTypeLoc,
- AL.getAttributeSpellingListIndex()));
- }
+ D->addAttr(::new (S.Context)
+ PointerAttr(AL.getRange(), S.Context, DerefTypeLoc,
+ AL.getAttributeSpellingListIndex()));
}
}
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index ee9963fca77..289a1403cd8 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -6561,7 +6561,7 @@ static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
template <typename T> static bool isRecordWithAttr(QualType Type) {
if (auto *RD = Type->getAsCXXRecordDecl())
- return RD->hasAttr<T>();
+ return RD->getCanonicalDecl()->hasAttr<T>();
return false;
}
@@ -6672,7 +6672,7 @@ static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,
if (auto *CCE = dyn_cast<CXXConstructExpr>(Call)) {
const auto *Ctor = CCE->getConstructor();
- const CXXRecordDecl *RD = Ctor->getParent();
+ const CXXRecordDecl *RD = Ctor->getParent()->getCanonicalDecl();
if (CCE->getNumArgs() > 0 && RD->hasAttr<PointerAttr>())
VisitPointerArg(Ctor->getParamDecl(0), CCE->getArgs()[0]);
}
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 2e76dc1a584..25d0db80398 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -552,18 +552,6 @@ void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
continue;
}
- if (auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
- if (!New->hasAttr<PointerAttr>())
- New->addAttr(A->clone(Context));
- continue;
- }
-
- if (auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
- if (!New->hasAttr<OwnerAttr>())
- New->addAttr(A->clone(Context));
- continue;
- }
-
assert(!TmplAttr->isPackExpansion());
if (TmplAttr->isLateParsed() && LateAttrs) {
// Late parsed attributes must be instantiated and attached after the
@@ -723,9 +711,6 @@ Decl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D,
SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef);
- if (D->getUnderlyingType()->getAs<DependentNameType>())
- SemaRef.inferGslPointerAttribute(Typedef);
-
Typedef->setAccess(D->getAccess());
return Typedef;
OpenPOWER on IntegriCloud