gargvaibhav64 created this revision. gargvaibhav64 added reviewers: rsmith, v.g.vassilev. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This commit attaches teaches ASTDeclReader::attachPreviousDecl to successfully merge two Decl's when one contains an inheritable attribute like the MSInheritanceAttr. Usually, attributes that are needed to present along the redeclaration chain are attached during ASTReading from ASTDeclReader::attachPreviousDecl, but no such thing is done for inheritable attributes. Currently, only the logic for merging MSInheritanceAttr is provided. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D83174 Files: clang/lib/Serialization/ASTReaderDecl.cpp 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
Index: clang/test/Modules/inherit-attribute.cpp =================================================================== --- /dev/null +++ clang/test/Modules/inherit-attribute.cpp @@ -0,0 +1,10 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -ast-dump -I%S/Inputs/inherit-attribute -fmodules-cache-path=%t -fimplicit-module-maps -verify %s -fmodules-local-submodule-visibility + +#include "b.h" +#include "c.h" + +class Foo; + +Foo f; +// expected-no-diagnostics \ No newline at end of file Index: clang/test/Modules/Inputs/inherit-attribute/module.modulemap =================================================================== --- /dev/null +++ clang/test/Modules/Inputs/inherit-attribute/module.modulemap @@ -0,0 +1,3 @@ +module "b" { header "b.h" } + +module "c" { header "c.h" } \ No newline at end of file Index: clang/test/Modules/Inputs/inherit-attribute/c.h =================================================================== --- /dev/null +++ clang/test/Modules/Inputs/inherit-attribute/c.h @@ -0,0 +1,7 @@ +#include "a.h" + +class Foo; +class C { +public: + C(); +}; \ No newline at end of file Index: clang/test/Modules/Inputs/inherit-attribute/b.h =================================================================== --- /dev/null +++ clang/test/Modules/Inputs/inherit-attribute/b.h @@ -0,0 +1,12 @@ +#include "a.h" + +class Foo; + +void bar() { + &Foo::step; +} + +class B { +public: + B(); +}; \ No newline at end of file Index: clang/test/Modules/Inputs/inherit-attribute/a.h =================================================================== --- /dev/null +++ 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 \ No newline at end of file Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -281,6 +281,8 @@ static Decl *getMostRecentDeclImpl(...); static Decl *getMostRecentDecl(Decl *D); + static void mergeInheritableAttributes(Decl *D, Decl *Previous); + template <typename DeclT> static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D, Decl *Previous, @@ -3531,6 +3533,18 @@ return ASTDeclReader::getMostRecentDecl(D->getCanonicalDecl()); } +void ASTDeclReader::mergeInheritableAttributes(Decl *D, Decl *Previous) { + if (Previous->hasAttr<MSInheritanceAttr>() && + !D->hasAttr<MSInheritanceAttr>()) { + Attr *IA = Previous->getAttr<MSInheritanceAttr>(); + D->addAttr(IA); + } else if (!Previous->hasAttr<MSInheritanceAttr>() && + D->hasAttr<MSInheritanceAttr>()) { + Attr *IA = D->getAttr<MSInheritanceAttr>(); + Previous->addAttr(IA); + } +} + template<typename DeclT> void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D, @@ -3689,6 +3703,10 @@ 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. + mergeInheritableAttributes(D, Previous); } template<typename DeclT>
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits