Author: Vaibhav Garg Date: 2020-08-21T14:40:09-04:00 New Revision: aca191cce1c4dbab28a65cfe4caa6348e698a2b3
URL: https://github.com/llvm/llvm-project/commit/aca191cce1c4dbab28a65cfe4caa6348e698a2b3 DIFF: https://github.com/llvm/llvm-project/commit/aca191cce1c4dbab28a65cfe4caa6348e698a2b3.diff LOG: Re-land 7a527f17776be78ec44b88e82b39afb65fc148e4 with fixes. The original commit was reverted in 58c305f466d1f78adb10e7295b9bc9fc192a6e09 due to broken bots. This commit corrects the triple and command line paths. Added: clang/test/Modules/Inputs/inherit-attribute/a.h clang/test/Modules/Inputs/inherit-attribute/b.h clang/test/Modules/Inputs/inherit-attribute/c.h clang/test/Modules/Inputs/inherit-attribute/module.modulemap clang/test/Modules/inherit-attribute.cpp Modified: clang/lib/Serialization/ASTReaderDecl.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index d76182847e9d..c7a009d1e50d 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -281,6 +281,9 @@ namespace clang { static Decl *getMostRecentDeclImpl(...); static Decl *getMostRecentDecl(Decl *D); + static void mergeInheritableAttributes(ASTReader &Reader, Decl *D, + Decl *Previous); + template <typename DeclT> static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D, Decl *Previous, @@ -3511,6 +3514,19 @@ Decl *ASTReader::getMostRecentExistingDecl(Decl *D) { return ASTDeclReader::getMostRecentDecl(D->getCanonicalDecl()); } +void ASTDeclReader::mergeInheritableAttributes(ASTReader &Reader, Decl *D, + Decl *Previous) { + InheritableAttr *NewAttr = nullptr; + ASTContext &Context = Reader.getContext(); + const auto *IA = Previous->getAttr<MSInheritanceAttr>(); + + if (IA && !D->hasAttr<MSInheritanceAttr>()) { + NewAttr = cast<InheritableAttr>(IA->clone(Context)); + NewAttr->setInherited(true); + D->addAttr(NewAttr); + } +} + template<typename DeclT> void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D, @@ -3669,6 +3685,12 @@ void ASTDeclReader::attachPreviousDecl(ASTReader &Reader, Decl *D, if (auto *TD = dyn_cast<TemplateDecl>(D)) inheritDefaultTemplateArguments(Reader.getContext(), cast<TemplateDecl>(Previous), TD); + + // If any of the declaration in the chain contains an Inheritable attribute, + // it needs to be added to all the declarations in the redeclarable chain. + // FIXME: Only the logic of merging MSInheritableAttr is present, it should + // be extended for all inheritable attributes. + mergeInheritableAttributes(Reader, D, Previous); } template<typename DeclT> diff --git a/clang/test/Modules/Inputs/inherit-attribute/a.h b/clang/test/Modules/Inputs/inherit-attribute/a.h new file mode 100644 index 000000000000..04aabe9e8c61 --- /dev/null +++ b/clang/test/Modules/Inputs/inherit-attribute/a.h @@ -0,0 +1,10 @@ +#ifndef FOO +#define FOO + +class Foo { +public: + void step(int v); + Foo(); +}; + +#endif diff --git a/clang/test/Modules/Inputs/inherit-attribute/b.h b/clang/test/Modules/Inputs/inherit-attribute/b.h new file mode 100644 index 000000000000..9cd1f55b9d33 --- /dev/null +++ b/clang/test/Modules/Inputs/inherit-attribute/b.h @@ -0,0 +1,5 @@ +#include "a.h" + +void bar() { + &Foo::step; +} diff --git a/clang/test/Modules/Inputs/inherit-attribute/c.h b/clang/test/Modules/Inputs/inherit-attribute/c.h new file mode 100644 index 000000000000..2243de1baf9a --- /dev/null +++ b/clang/test/Modules/Inputs/inherit-attribute/c.h @@ -0,0 +1 @@ +#include "a.h" diff --git a/clang/test/Modules/Inputs/inherit-attribute/module.modulemap b/clang/test/Modules/Inputs/inherit-attribute/module.modulemap new file mode 100644 index 000000000000..16481e2745dd --- /dev/null +++ b/clang/test/Modules/Inputs/inherit-attribute/module.modulemap @@ -0,0 +1,3 @@ +module "b" { header "b.h" } + +module "c" { header "c.h" } diff --git a/clang/test/Modules/inherit-attribute.cpp b/clang/test/Modules/inherit-attribute.cpp new file mode 100644 index 000000000000..980b30ef4975 --- /dev/null +++ b/clang/test/Modules/inherit-attribute.cpp @@ -0,0 +1,20 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -triple x86_64-pc-windows-msvc -I%S/Inputs/inherit-attribute -fmodules-cache-path=%t \ +// RUN: -fimplicit-module-maps -fmodules-local-submodule-visibility %s -ast-dump-all \ +// RUN: | FileCheck %s + +#include "b.h" +#include "c.h" + +class Foo; + +Foo f; + +// CHECK: CXXRecordDecl {{.*}} imported in b {{.*}} Foo +// CHECK: MSInheritanceAttr {{[^()]*$}} + +// CHECK: CXXRecordDecl {{.*}} prev {{.*}} imported in c {{.*}} Foo +// CHECK: MSInheritanceAttr {{.*}} Inherited {{[^()]*$}} + +// CHECK: CXXRecordDecl {{.*}} <line:9:1, col:7> col:7 referenced class Foo +// CHECK: MSInheritanceAttr {{.*}} Inherited {{[^()]*$}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits