diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-01-26 19:30:26 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-01-26 19:30:26 +0000 |
commit | 929025d1a614bef2ef68a50898cccfb283d3abf3 (patch) | |
tree | 758e87b50d534c9056b623580b78ade5983335b6 /clang/lib/CodeGen/ModuleBuilder.cpp | |
parent | 59066a0803e7cc10ba004cf862baf19a4ad161ca (diff) | |
download | bcm5719-llvm-929025d1a614bef2ef68a50898cccfb283d3abf3.tar.gz bcm5719-llvm-929025d1a614bef2ef68a50898cccfb283d3abf3.zip |
[MS ABI] Allow a member pointers' converted type to change
Member pointers in the MS ABI are tricky for a variety of reasons.
The size of a member pointer is indeterminate until the program reaches
a point where the representation is required to be known. However,
*pointers* to member pointers may exist without knowing the pointee
type's representation. In these cases, we synthesize an opaque LLVM
type for the pointee type.
However, we can be in a situation where the underlying member pointer's
representation became known mid-way through the program. To account for
this, we attempted to manicure CodeGen's type-cache so that we can
replace the opaque member pointer type with the real deal while leaving
the pointer types unperturbed. This, unfortunately, is a problematic
approach to take as we will violate CodeGen's invariants.
These violations are mostly harmless but let's do the right thing
instead: invalidate the type-cache if a member pointer's LLVM
representation changes.
This fixes PR26313.
llvm-svn: 258839
Diffstat (limited to 'clang/lib/CodeGen/ModuleBuilder.cpp')
-rw-r--r-- | clang/lib/CodeGen/ModuleBuilder.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/ModuleBuilder.cpp b/clang/lib/CodeGen/ModuleBuilder.cpp index bce19ab2fdb..9428bdf1db3 100644 --- a/clang/lib/CodeGen/ModuleBuilder.cpp +++ b/clang/lib/CodeGen/ModuleBuilder.cpp @@ -210,6 +210,13 @@ namespace { Builder->Release(); } + void AssignInheritanceModel(CXXRecordDecl *RD) override { + if (Diags.hasErrorOccurred()) + return; + + Builder->RefreshTypeCacheForClass(RD); + } + void CompleteTentativeDefinition(VarDecl *D) override { if (Diags.hasErrorOccurred()) return; |