diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-10-22 04:14:18 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-10-22 04:14:18 +0000 |
commit | 588a51a471b4cb23613e8183e05d2d193d2ab813 (patch) | |
tree | 6694aba70d5968f2b4e245f4fa0b2bfd64f0c312 /test/CodeGenCXX/mangle-local-class-names.cpp | |
parent | 2cfbf0552f90c7ef42975ca1b9064888550ca2ee (diff) |
Sema: Do not allow template declarations inside local classes
Summary:
Enforce the rule in C++11 [temp.mem]p2 that local classes cannot have
member templates.
This fixes PR16947.
N.B. C++14 has slightly different wording to afford generic lambdas
declared inside of functions.
Fun fact: Some formulations of local classes with member templates
would cause clang to crash during Itanium mangling, such as the
following:
void outer_mem() {
struct Inner {
template <typename = void>
struct InnerTemplateClass {
static void itc_mem() {}
};
};
Inner::InnerTemplateClass<>::itc_mem();
}
Reviewers: eli.friedman, rsmith, doug.gregor, faisalv
Reviewed By: doug.gregor
CC: cfe-commits, ygao
Differential Revision: http://llvm-reviews.chandlerc.com/D1866
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193144 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/mangle-local-class-names.cpp')
-rw-r--r-- | test/CodeGenCXX/mangle-local-class-names.cpp | 10 |
1 files changed, 0 insertions, 10 deletions
diff --git a/test/CodeGenCXX/mangle-local-class-names.cpp b/test/CodeGenCXX/mangle-local-class-names.cpp index 186d76a225..8b950fcd17 100644 --- a/test/CodeGenCXX/mangle-local-class-names.cpp +++ b/test/CodeGenCXX/mangle-local-class-names.cpp @@ -75,16 +75,6 @@ inline void OmittingCode(float x) { } void CallOmittingCode() { OmittingCode(1); } -// CHECK: @_ZZ25LocalTemplateFunctionTestdEN5Local3fooIdEET_S1_ -int LocalTemplateFunctionTest(double d) { - struct Local { - template<class T> T foo(T t) { - return t; - } - }; - return Local().foo(d); -} - // CHECK: @_ZZ15LocalAnonStructvENUt0_1gEv inline void LocalAnonStruct() { if (0) { |