[PATCH] D56928: Support attribute used in member funcs of class templates
Rafael Auler via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 31 01:40:53 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rC352740: Support attribute used in member funcs of class templates (authored by rafauler, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D56928?vs=184467&id=184470#toc
Repository:
rC Clang
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56928/new/
https://reviews.llvm.org/D56928
Files:
lib/Sema/SemaTemplateInstantiateDecl.cpp
test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
Index: test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
===================================================================
--- test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
+++ test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
+
+// Check that PR17480 is fixed: __attribute__((used)) ignored in templated
+// classes
+namespace InstantiateUsedMemberDefinition {
+template <typename T>
+struct S {
+ int __attribute__((used)) f() {
+ return 0;
+ }
+};
+
+void test() {
+ // Check that InstantiateUsedMemberDefinition::S<int>::f() is defined
+ // as a result of the S class template implicit instantiation
+ // CHECK: define linkonce_odr i32 @_ZN31InstantiateUsedMemberDefinition1SIiE1fEv
+ S<int> inst;
+}
+} // namespace InstantiateUsedMemberDefinition
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
===================================================================
--- lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -2175,6 +2175,20 @@
Owner->addDecl(Method);
}
+ // PR17480: Honor the used attribute to instantiate member function
+ // definitions
+ if (Method->hasAttr<UsedAttr>()) {
+ if (const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
+ SourceLocation Loc;
+ if (const MemberSpecializationInfo *MSInfo =
+ A->getMemberSpecializationInfo())
+ Loc = MSInfo->getPointOfInstantiation();
+ else if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
+ Loc = Spec->getPointOfInstantiation();
+ SemaRef.MarkFunctionReferenced(Loc, Method);
+ }
+ }
+
return Method;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56928.184470.patch
Type: text/x-patch
Size: 1774 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190131/9e7a7e3a/attachment.bin>
More information about the cfe-commits
mailing list