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
diff --git a/include/clang/Parse/Ownership.h b/include/clang/Parse/Ownership.h
index 5951793..987edfa 100644
--- a/include/clang/Parse/Ownership.h
+++ b/include/clang/Parse/Ownership.h
@@ -574,6 +574,19 @@
#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 @@
: 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
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 88dd6f7..561dc57 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -62,17 +62,17 @@
// Defines specific to certain operating systems.
//===----------------------------------------------------------------------===//
namespace {
-template<typename TargetInfo>
-class OSTargetInfo : public TargetInfo {
+template<typename TgtInfo>
+class OSTargetInfo : public TgtInfo {
protected:
virtual void getOSDefines(const LangOptions &Opts, const char *Triple,
std::vector<char> &Defines) const=0;
public:
- OSTargetInfo(const std::string& triple) : TargetInfo(triple) {}
+ OSTargetInfo(const std::string& triple) : TgtInfo(triple) {}
virtual void getTargetDefines(const LangOptions &Opts,
std::vector<char> &Defines) const {
- TargetInfo::getTargetDefines(Opts, Defines);
- getOSDefines(Opts, TargetInfo::getTargetTriple(), Defines);
+ TgtInfo::getTargetDefines(Opts, Defines);
+ getOSDefines(Opts, TgtInfo::getTargetTriple(), Defines);
}
};