mirror of https://github.com/microsoft/clang.git
[clang] Make sure attributes on member classes are applied properly
Summary: Attributes on member classes of class templates and member class templates of class templates are not currently instantiated. This was discovered by Richard Smith here: http://lists.llvm.org/pipermail/cfe-dev/2018-September/059291.html This commit makes sure that attributes are instantiated properly. This commit does not fix the broken behavior for member partial and explicit specializations of class templates. PR38913 Reviewers: rsmith Subscribers: dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D51997 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342238 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
446fa15e64
commit
9aa0baabef
|
@ -1258,6 +1258,9 @@ Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
|
|||
if (QualifierLoc)
|
||||
RecordInst->setQualifierInfo(QualifierLoc);
|
||||
|
||||
SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
|
||||
StartingScope);
|
||||
|
||||
ClassTemplateDecl *Inst
|
||||
= ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(),
|
||||
D->getIdentifier(), InstParams, RecordInst);
|
||||
|
@ -1491,6 +1494,9 @@ Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) {
|
|||
if (SubstQualifier(D, Record))
|
||||
return nullptr;
|
||||
|
||||
SemaRef.InstantiateAttrsForDecl(TemplateArgs, D, Record, LateAttrs,
|
||||
StartingScope);
|
||||
|
||||
Record->setImplicit(D->isImplicit());
|
||||
// FIXME: Check against AS_none is an ugly hack to work around the issue that
|
||||
// the tag decls introduced by friend class declarations don't have an access
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s
|
||||
|
||||
// PR38913
|
||||
// Check that we instantiate attributes on declarations for...
|
||||
|
||||
// ...a member class of a class template specialization
|
||||
template<class T> struct A { struct __attribute__((abi_tag("ATAG"))) X { }; };
|
||||
A<int>::X* a() { return 0; } // CHECK-DAG: @_Z1aB4ATAGv
|
||||
|
||||
// ...a member class template
|
||||
template<class T> struct B { template<class U> struct __attribute__((abi_tag("BTAG"))) X { }; };
|
||||
B<int>::X<int>* b() { return 0; } // CHECK-DAG: @_Z1bB4BTAGv
|
Loading…
Reference in New Issue