diff options
author | John McCall <rjmccall@apple.com> | 2013-04-10 06:08:21 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2013-04-10 06:08:21 +0000 |
commit | 0baaabb7174c8e512ea52bc36687dc31ff68b09f (patch) | |
tree | 8cbe22cf6db245997c5510d36a4e88443a013b3d /lib/AST/ItaniumMangle.cpp | |
parent | 4841ca5f83bf970f910ac7d154cdd71d2a3cf481 (diff) |
Don't crash when mangling types defined in ObjC class extensions.
The original test case here was mangling a type name for TBAA,
but we can provoke this in C++11 easily enough.
rdar://13434937
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179153 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 21c499317f..0f4881e24e 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -1095,6 +1095,15 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, mangleSourceName(FD->getIdentifier()); break; } + + // Class extensions have no name as a category, and it's possible + // for them to be the semantic parent of certain declarations + // (primarily, tag decls defined within declarations). Such + // declarations will always have internal linkage, so the name + // doesn't really matter, but we shouldn't crash on them. For + // safety, just handle all ObjC containers here. + if (isa<ObjCContainerDecl>(ND)) + break; // We must have an anonymous struct. const TagDecl *TD = cast<TagDecl>(ND); |