diff options
author | Louis Dionne <ldionne@apple.com> | 2018-09-14 14:07:16 +0000 |
---|---|---|
committer | Louis Dionne <ldionne@apple.com> | 2018-09-14 14:07:16 +0000 |
commit | 3c011e1e3c45dc53d135ad2ffc0b2d7998bc8e2c (patch) | |
tree | ec00ef96b1560fbe75e0455031c80deabf0da788 | |
parent | b437238e95ee87075cfaad9b92082264ff00e2e2 (diff) | |
download | bcm5719-llvm-3c011e1e3c45dc53d135ad2ffc0b2d7998bc8e2c.tar.gz bcm5719-llvm-3c011e1e3c45dc53d135ad2ffc0b2d7998bc8e2c.zip |
[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
llvm-svn: 342238
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 6 | ||||
-rw-r--r-- | clang/test/SemaCXX/PR38913.cpp | 12 |
2 files changed, 18 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 09aa25ca0a2..340e0c67172 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -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 diff --git a/clang/test/SemaCXX/PR38913.cpp b/clang/test/SemaCXX/PR38913.cpp new file mode 100644 index 00000000000..698de8c8441 --- /dev/null +++ b/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 |