r369677 - Revert "[LifetimeAnalysis] Support more STL idioms (template forward declaration and DependentNameType)"
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 22 10:48:11 PDT 2019
Author: rsmith
Date: Thu Aug 22 10:48:11 2019
New Revision: 369677
URL: http://llvm.org/viewvc/llvm-project?rev=369677&view=rev
Log:
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.
Removed:
cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp
Modified:
cfe/trunk/lib/Sema/SemaAttr.cpp
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/lib/Sema/SemaInit.cpp
cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp
cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp
cfe/trunk/unittests/Sema/CMakeLists.txt
Modified: cfe/trunk/lib/Sema/SemaAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaAttr.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaAttr.cpp Thu Aug 22 10:48:11 2019
@@ -88,11 +88,13 @@ void Sema::AddMsStructLayoutForRecord(Re
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
// 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()))
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Thu Aug 22 10:48:11 2019
@@ -4592,11 +4592,9 @@ static void handleLifetimeCategoryAttr(S
}
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(S
}
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()));
}
}
Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Thu Aug 22 10:48:11 2019
@@ -6561,7 +6561,7 @@ static void visitLocalsRetainedByReferen
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(Indi
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]);
}
Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Thu Aug 22 10:48:11 2019
@@ -552,18 +552,6 @@ void Sema::InstantiateAttrs(const MultiL
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::Instanti
SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef);
- if (D->getUnderlyingType()->getAs<DependentNameType>())
- SemaRef.inferGslPointerAttribute(Typedef);
-
Typedef->setAccess(D->getAccess());
return Typedef;
Modified: cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp (original)
+++ cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp Thu Aug 22 10:48:11 2019
@@ -92,59 +92,6 @@ public:
static_assert(sizeof(unordered_map<int>::iterator), ""); // Force instantiation.
} // namespace inlinens
-// The iterator typedef is a DependentNameType.
-template <typename T>
-class __unordered_multimap_iterator {};
-// CHECK: ClassTemplateDecl {{.*}} __unordered_multimap_iterator
-// CHECK: ClassTemplateSpecializationDecl {{.*}} __unordered_multimap_iterator
-// CHECK: TemplateArgument type 'int'
-// CHECK: PointerAttr
-
-template <typename T>
-class __unordered_multimap_base {
-public:
- using iterator = __unordered_multimap_iterator<T>;
-};
-
-template <typename T>
-class unordered_multimap {
- // CHECK: ClassTemplateDecl {{.*}} unordered_multimap
- // CHECK: OwnerAttr {{.*}}
- // CHECK: ClassTemplateSpecializationDecl {{.*}} unordered_multimap
- // CHECK: OwnerAttr {{.*}}
-public:
- using _Mybase = __unordered_multimap_base<T>;
- using iterator = typename _Mybase::iterator;
-};
-static_assert(sizeof(unordered_multimap<int>::iterator), ""); // Force instantiation.
-
-// The canonical declaration of the iterator template is not its definition.
-template <typename T>
-class __unordered_multiset_iterator;
-// CHECK: ClassTemplateDecl {{.*}} __unordered_multiset_iterator
-// CHECK: PointerAttr
-// CHECK: ClassTemplateSpecializationDecl {{.*}} __unordered_multiset_iterator
-// CHECK: TemplateArgument type 'int'
-// CHECK: PointerAttr
-
-template <typename T>
-class __unordered_multiset_iterator {
- // CHECK: ClassTemplateDecl {{.*}} prev {{.*}} __unordered_multiset_iterator
- // CHECK: PointerAttr
-};
-
-template <typename T>
-class unordered_multiset {
- // CHECK: ClassTemplateDecl {{.*}} unordered_multiset
- // CHECK: OwnerAttr {{.*}}
- // CHECK: ClassTemplateSpecializationDecl {{.*}} unordered_multiset
- // CHECK: OwnerAttr {{.*}}
-public:
- using iterator = __unordered_multiset_iterator<T>;
-};
-
-static_assert(sizeof(unordered_multiset<int>::iterator), ""); // Force instantiation.
-
// std::list has an implicit gsl::Owner attribute,
// but explicit attributes take precedence.
template <typename T>
Modified: cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp (original)
+++ cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp Thu Aug 22 10:48:11 2019
@@ -105,20 +105,3 @@ class [[gsl::Owner(int)]] AddTheSameLate
class [[gsl::Owner(int)]] AddTheSameLater;
// CHECK: CXXRecordDecl {{.*}} prev {{.*}} AddTheSameLater
// CHECK: OwnerAttr {{.*}} int
-
-template <class T>
-class [[gsl::Owner]] ForwardDeclared;
-// CHECK: ClassTemplateDecl {{.*}} ForwardDeclared
-// CHECK: OwnerAttr {{.*}}
-// CHECK: ClassTemplateSpecializationDecl {{.*}} ForwardDeclared
-// CHECK: TemplateArgument type 'int'
-// CHECK: OwnerAttr {{.*}}
-
-template <class T>
-class [[gsl::Owner]] ForwardDeclared {
-// CHECK: ClassTemplateDecl {{.*}} ForwardDeclared
-// CHECK: CXXRecordDecl {{.*}} ForwardDeclared definition
-// CHECK: OwnerAttr {{.*}}
-};
-
-static_assert(sizeof(ForwardDeclared<int>), ""); // Force instantiation.
Modified: cfe/trunk/unittests/Sema/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Sema/CMakeLists.txt?rev=369677&r1=369676&r2=369677&view=diff
==============================================================================
--- cfe/trunk/unittests/Sema/CMakeLists.txt (original)
+++ cfe/trunk/unittests/Sema/CMakeLists.txt Thu Aug 22 10:48:11 2019
@@ -5,13 +5,11 @@ set(LLVM_LINK_COMPONENTS
add_clang_unittest(SemaTests
ExternalSemaSourceTest.cpp
CodeCompleteTest.cpp
- GslOwnerPointerInference.cpp
)
clang_target_link_libraries(SemaTests
PRIVATE
clangAST
- clangASTMatchers
clangBasic
clangFrontend
clangParse
Removed: cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp?rev=369676&view=auto
==============================================================================
--- cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp (original)
+++ cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp (removed)
@@ -1,61 +0,0 @@
-//== unittests/Sema/GslOwnerPointerInference.cpp - gsl::Owner/Pointer ========//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "../ASTMatchers/ASTMatchersTest.h"
-#include "clang/ASTMatchers/ASTMatchers.h"
-#include "gtest/gtest.h"
-
-namespace clang {
-using namespace ast_matchers;
-
-TEST(OwnerPointer, BothHaveAttributes) {
- EXPECT_TRUE(matches(
- R"cpp(
- template<class T>
- class [[gsl::Owner]] C;
-
- template<class T>
- class [[gsl::Owner]] C {};
-
- C<int> c;
- )cpp",
- classTemplateSpecializationDecl(hasName("C"), hasAttr(clang::attr::Owner))));
-}
-
-TEST(OwnerPointer, ForwardDeclOnly) {
- EXPECT_TRUE(matches(
- R"cpp(
- template<class T>
- class [[gsl::Owner]] C;
-
- template<class T>
- class C {};
-
- C<int> c;
- )cpp",
- classTemplateSpecializationDecl(hasName("C"), hasAttr(clang::attr::Owner))));
-}
-
-TEST(OwnerPointer, LateForwardDeclOnly) {
- EXPECT_TRUE(matches(
- R"cpp(
- template<class T>
- class C;
-
- template<class T>
- class C {};
-
- template<class T>
- class [[gsl::Owner]] C;
-
- C<int> c;
- )cpp",
- classTemplateSpecializationDecl(hasName("C"), hasAttr(clang::attr::Owner))));
-}
-
-} // namespace clang
More information about the cfe-commits
mailing list