]> granicus.if.org Git - clang/commitdiff
Two fixes to make Clang build on Visual C++ (again), from Alisdair Meredith.
authorDouglas Gregor <dgregor@apple.com>
Wed, 1 Jul 2009 15:12:53 +0000 (15:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 1 Jul 2009 15:12:53 +0000 (15:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74606 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Parse/Ownership.h
lib/Basic/Targets.cpp

index 59517930de9572b6151e3bc6a81e72b55f7de90f..987edfa96dd1b9140636e18dc7d5cfe03908d47c 100644 (file)
@@ -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
index 88dd6f797bc270d68d16ed893243437b68499154..561dc57ef2418ce455c7ceb1950ec82e9cbe1c63 100644 (file)
@@ -62,17 +62,17 @@ static void DefineStd(std::vector<char> &Buf, const char *MacroName,
 // 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);
   }
 
 };