Skip to content

Commit

Permalink
[clang] Make sure attributes on member classes are applied properly
Browse files Browse the repository at this point in the history
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

llvm-svn: 342238
  • Loading branch information
ldionne committed Sep 14, 2018
1 parent b437238 commit 3c011e1
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
6 changes: 6 additions & 0 deletions clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions clang/test/SemaCXX/PR38913.cpp
@@ -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

0 comments on commit 3c011e1

Please sign in to comment.