diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-07-01 15:12:53 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-07-01 15:12:53 +0000 |
commit | a3844922f685620002412df0a88d22393e5c1241 (patch) | |
tree | 29f676269e69dc9a85367aec4aa997e2805612ff /include/clang | |
parent | 7154a77e7c1f23418342d3b72836ab504aa7821e (diff) |
Two fixes to make Clang build on Visual C++ (again), from Alisdair Meredith.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74606 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang')
-rw-r--r-- | include/clang/Parse/Ownership.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/clang/Parse/Ownership.h b/include/clang/Parse/Ownership.h index 59517930de..987edfa96d 100644 --- a/include/clang/Parse/Ownership.h +++ b/include/clang/Parse/Ownership.h @@ -574,6 +574,19 @@ namespace clang { #if !defined(DISABLE_SMART_POINTERS) friend class moving::ASTMultiMover<Destroyer>; +#if defined(_MSC_VER) + // Last tested with Visual Studio 2008. + // Visual C++ appears to have a bug where it does not recognise + // the return value from ASTMultiMover<Destroyer>::opeator-> as + // being a pointer to ASTMultiPtr. However, the diagnostics + // suggest it has the right name, simply that the pointer type + // is not convertible to itself. + // Either way, a classic C-style hard cast resolves any issue. + static ASTMultiPtr* hack(moving::ASTMultiMover<Destroyer> & source) { + return (ASTMultiPtr*)source.operator->(); + } +#endif + ASTMultiPtr(ASTMultiPtr&); // DO NOT IMPLEMENT // Reference member prevents copy assignment. @@ -594,7 +607,13 @@ namespace clang { : Actions(actions), Nodes(nodes), Count(count) {} /// Move constructor ASTMultiPtr(moving::ASTMultiMover<Destroyer> mover) +#if defined(_MSC_VER) + // Apply the visual C++ hack supplied above. + // Last tested with Visual Studio 2008. + : Actions(hack(mover)->Actions), Nodes(hack(mover)->Nodes), Count(hack(mover)->Count) { +#else : Actions(mover->Actions), Nodes(mover->Nodes), Count(mover->Count) { +#endif mover.release(); } #else |