rafauler updated this revision to Diff 183657.
rafauler added a comment.

No problem, thanks for your suggestions!


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
===================================================================
--- /dev/null
+++ test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
@@ -0,0 +1,20 @@
+// Check that PR17480 is fixed: __attribute__((used)) ignored in templated
+// classes
+
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -O0 -o - %s \
+// RUN:  | FileCheck %s
+
+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;
+  }
+}
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
===================================================================
--- lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -2176,6 +2176,22 @@
     Owner->addDecl(Method);
   }
 
+  // PR17480: Honor the used attribute to instantiate member function
+  // definitions
+  if (Method->hasAttr<UsedAttr>()) {
+    if (auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
+      SourceLocation Loc;
+      if (MemberSpecializationInfo *MSInfo = A->getMemberSpecializationInfo()) 
{
+        Loc = MSInfo->getPointOfInstantiation();
+      } else if (ClassTemplateSpecializationDecl *Spec =
+                     dyn_cast<ClassTemplateSpecializationDecl>(A)) {
+        Loc = Spec->getPointOfInstantiation();
+      }
+
+      SemaRef.MarkFunctionReferenced(Loc, Method, /*MightBeOdrUse=*/true);
+    }
+  }
+
   return Method;
 }
 


Index: test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
===================================================================
--- /dev/null
+++ test/CodeGenCXX/attr-used-member-function-implicit-instantiation.cpp
@@ -0,0 +1,20 @@
+// Check that PR17480 is fixed: __attribute__((used)) ignored in templated
+// classes
+
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -O0 -o - %s \
+// RUN:  | FileCheck %s
+
+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;
+  }
+}
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
===================================================================
--- lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -2176,6 +2176,22 @@
     Owner->addDecl(Method);
   }
 
+  // PR17480: Honor the used attribute to instantiate member function
+  // definitions
+  if (Method->hasAttr<UsedAttr>()) {
+    if (auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
+      SourceLocation Loc;
+      if (MemberSpecializationInfo *MSInfo = A->getMemberSpecializationInfo()) {
+        Loc = MSInfo->getPointOfInstantiation();
+      } else if (ClassTemplateSpecializationDecl *Spec =
+                     dyn_cast<ClassTemplateSpecializationDecl>(A)) {
+        Loc = Spec->getPointOfInstantiation();
+      }
+
+      SemaRef.MarkFunctionReferenced(Loc, Method, /*MightBeOdrUse=*/true);
+    }
+  }
+
   return Method;
 }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to