diff options
author | Chris Lattner <sabre@nondot.org> | 2011-07-20 06:29:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-07-20 06:29:00 +0000 |
commit | b13eab95e1a5bb1e78706179f15f8416e9fbcfbf (patch) | |
tree | bb75fa9f97b81634de518319d9c5e88f1caccf16 /include/clang/Basic/SourceManager.h | |
parent | 181eeee36b057a1a66227123fad0978d1d0f034a (diff) |
fix rdar://9780211 - Clang crashes with an assertion failure building WKView.mm from WebKit
This is something of a hack, the problem is as follows:
1. we instantiate both copied of RetainPtr with the two different argument types
(an id and protocol-qualified id).
2. We refer to the ctor of one of the instantiations when introducing global "x",
this causes us to emit an llvm::Function for a prototype whose "this" has type
"RetainPtr<id<bork> >*".
3. We refer to the ctor of the other instantiation when introducing global "y",
however, because it *mangles to the same name as the other ctor* we just use
a bitcasted version of the llvm::Function we previously emitted.
4. We emit deferred declarations, causing us to emit the body of the ctor, however
the body we emit is for RetainPtr<id>, which expects its 'this' to have an IR
type of "RetainPtr<id>*".
Because of the mangling collision, we don't have this case, and explode.
This is really some sort of weird AST invariant violation or something, but hey
a bitcast makes the pain go away.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135572 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang/Basic/SourceManager.h')
0 files changed, 0 insertions, 0 deletions