From a36be826643ed1f6a4639f79270276df621853ba Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Mon, 7 Mar 2011 05:35:01 +0000 Subject: [PATCH] Try fixing mingw build. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127153 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/PointerUnion.h | 42 ++++++++++++--------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/include/llvm/ADT/PointerUnion.h b/include/llvm/ADT/PointerUnion.h index 975ba8a5f52..13b98cef07a 100644 --- a/include/llvm/ADT/PointerUnion.h +++ b/include/llvm/ADT/PointerUnion.h @@ -19,29 +19,6 @@ namespace llvm { - /// \brief Statically get an integer for a type. For: - /// @code - /// PointerUnionTypeNum::template NumFor::Result - /// @endcode - /// Result will be 0 if T is PT1, 1 if it is PT2, and -1 otherwise. - template - struct PointerUnionTypeNum { - private: - struct IsNeither { char x; }; - struct IsPT1 { char x[2]; }; - struct IsPT2 { char x[3]; }; - - static IsPT1 determine(PT1 *P); - static IsPT2 determine(PT2 *P); - static IsNeither determine(...); - - public: - template - struct NumFor { - static const int Result = (int)sizeof(determine((T*)0)) - 2; - }; - }; - template struct PointerUnionTypeSelectorReturn { typedef T Return; @@ -105,6 +82,16 @@ namespace llvm { PointerUnionUIntTraits > ValTy; private: ValTy Val; + + struct IsPT1 { + static const int Num = 0; + }; + struct IsPT2 { + static const int Num = 1; + }; + template + struct UNION_DOESNT_CONTAIN_TYPE { }; + public: PointerUnion() {} @@ -127,10 +114,11 @@ namespace llvm { /// is() return true if the Union currently holds the type matching T. template int is() const { - static const int TyNo = - ::llvm::PointerUnionTypeNum::template NumFor::Result; - char TYPE_IS_NOT_IN_UNION[TyNo*2+1]; // statically check the type. - (void)TYPE_IS_NOT_IN_UNION; + typedef typename + ::llvm::PointerUnionTypeSelector > >::Return Ty; + int TyNo = Ty::Num; return static_cast(Val.getInt()) == TyNo; } -- 2.34.1