r371182 - Reland [LifetimeAnalysis] Support more STL idioms (template forward declaration and DependentNameType)
Matthias Gehre via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 6 12:14:00 PDT 2019
Yvan, sorry!
Should be fixed now.
Am Fr., 6. Sept. 2019 um 16:40 Uhr schrieb Yvan Roux <yvan.roux at linaro.org>:
> Hi Matthias,
>
> this commit broke AArch64 bots, logs are available here:
>
>
> http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/19917/steps/ninja%20check%201/logs/stdio
>
> Thanks,
> Yvan
>
> On Fri, 6 Sep 2019 at 10:54, Matthias Gehre via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
> >
> > Author: mgehre
> > Date: Fri Sep 6 01:56:30 2019
> > New Revision: 371182
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=371182&view=rev
> > Log:
> > Reland [LifetimeAnalysis] Support more STL idioms (template forward
> declaration and DependentNameType)
> >
> > Reland after https://reviews.llvm.org/D66806 fixed the false-positive
> diagnostics.
> >
> > Summary:
> > This fixes inference of gsl::Pointer on std::set::iterator with
> libstdc++ (the typedef for iterator
> > on the template is a DependentNameType - we can only put the
> gsl::Pointer attribute
> > on the underlaying record after instantiation)
> >
> > inference of gsl::Pointer on std::vector::iterator with libc++ (the
> class was forward-declared,
> > we added the gsl::Pointer on the canonical decl (the forward decl), and
> later when the
> > template was instantiated, there was no attribute on the definition so
> it was not instantiated).
> >
> > and a duplicate gsl::Pointer on some class with libstdc++ (we first
> added an attribute to
> > a incomplete instantiation, and then another was copied from the
> template definition
> > when the instantiation was completed).
> >
> > We now add the attributes to all redeclarations to fix thos issues and
> make their usage easier.
> >
> > Reviewers: gribozavr
> >
> > Subscribers: Szelethus, xazax.hun, cfe-commits
> >
> > Tags: #clang
> >
> > Differential Revision: https://reviews.llvm.org/D66179
> >
> > Added:
> > 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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaAttr.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaAttr.cpp Fri Sep 6 01:56:30 2019
> > @@ -88,13 +88,11 @@ void Sema::AddMsStructLayoutForRecord(Re
> > template <typename Attribute>
> > static void addGslOwnerPointerAttributeIfNotExisting(ASTContext
> &Context,
> > CXXRecordDecl
> *Record) {
> > - CXXRecordDecl *Canonical = Record->getCanonicalDecl();
> > - if (Canonical->hasAttr<OwnerAttr>() ||
> Canonical->hasAttr<PointerAttr>())
> > + if (Record->hasAttr<OwnerAttr>() || Record->hasAttr<PointerAttr>())
> > return;
> >
> > - Canonical->addAttr(::new (Context) Attribute(SourceRange{}, Context,
> > - /*DerefType*/ nullptr,
> > - /*Spelling=*/0));
> > + for (Decl *Redecl : Record->redecls())
> > + Redecl->addAttr(Attribute::CreateImplicit(Context,
> /*DerefType=*/nullptr));
> > }
> >
> > void Sema::inferGslPointerAttribute(NamedDecl *ND,
> > @@ -189,8 +187,7 @@ void Sema::inferGslOwnerPointerAttribute
> >
> > // Handle classes that directly appear in std namespace.
> > if (Record->isInStdNamespace()) {
> > - CXXRecordDecl *Canonical = Record->getCanonicalDecl();
> > - if (Canonical->hasAttr<OwnerAttr>() ||
> Canonical->hasAttr<PointerAttr>())
> > + if (Record->hasAttr<OwnerAttr>() || Record->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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Sep 6 01:56:30 2019
> > @@ -4592,9 +4592,11 @@ static void handleLifetimeCategoryAttr(S
> > }
> > return;
> > }
> > - D->addAttr(::new (S.Context)
> > - OwnerAttr(AL.getRange(), S.Context, DerefTypeLoc,
> > - AL.getAttributeSpellingListIndex()));
> > + for (Decl *Redecl : D->redecls()) {
> > + Redecl->addAttr(::new (S.Context)
> > + OwnerAttr(AL.getRange(), S.Context,
> DerefTypeLoc,
> > +
> AL.getAttributeSpellingListIndex()));
> > + }
> > } else {
> > if (checkAttrMutualExclusion<OwnerAttr>(S, D, AL))
> > return;
> > @@ -4609,9 +4611,11 @@ static void handleLifetimeCategoryAttr(S
> > }
> > return;
> > }
> > - D->addAttr(::new (S.Context)
> > - PointerAttr(AL.getRange(), S.Context, DerefTypeLoc,
> > - AL.getAttributeSpellingListIndex()));
> > + for (Decl *Redecl : D->redecls()) {
> > + Redecl->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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Sep 6 01:56:30 2019
> > @@ -6693,7 +6693,7 @@ static void visitLocalsRetainedByReferen
> >
> > template <typename T> static bool isRecordWithAttr(QualType Type) {
> > if (auto *RD = Type->getAsCXXRecordDecl())
> > - return RD->getCanonicalDecl()->hasAttr<T>();
> > + return RD->hasAttr<T>();
> > return false;
> > }
> >
> > @@ -6810,7 +6810,7 @@ static void handleGslAnnotatedTypes(Indi
> >
> > if (auto *CCE = dyn_cast<CXXConstructExpr>(Call)) {
> > const auto *Ctor = CCE->getConstructor();
> > - const CXXRecordDecl *RD = Ctor->getParent()->getCanonicalDecl();
> > + const CXXRecordDecl *RD = Ctor->getParent();
> > 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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Fri Sep 6
> 01:56:30 2019
> > @@ -550,6 +550,18 @@ 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
> > @@ -709,6 +721,9 @@ 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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp (original)
> > +++ cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer-std.cpp Fri Sep 6
> 01:56:30 2019
> > @@ -92,6 +92,59 @@ 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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp (original)
> > +++ cfe/trunk/test/SemaCXX/attr-gsl-owner-pointer.cpp Fri Sep 6
> 01:56:30 2019
> > @@ -105,3 +105,20 @@ 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=371182&r1=371181&r2=371182&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/unittests/Sema/CMakeLists.txt (original)
> > +++ cfe/trunk/unittests/Sema/CMakeLists.txt Fri Sep 6 01:56:30 2019
> > @@ -5,11 +5,13 @@ 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
> >
> > Added: cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp?rev=371182&view=auto
> >
> ==============================================================================
> > --- cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp (added)
> > +++ cfe/trunk/unittests/Sema/GslOwnerPointerInference.cpp Fri Sep 6
> 01:56:30 2019
> > @@ -0,0 +1,61 @@
> > +//== 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
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190906/78af93c4/attachment-0001.html>
More information about the cfe-commits
mailing list