summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-03-07 05:35:01 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-03-07 05:35:01 +0000
commita36be826643ed1f6a4639f79270276df621853ba (patch)
treeb6f6704ef57cfd4b10fbfba02c9c780ed842b503 /include
parent9c9320426ef9d3970ae52fc314a3dab1936dbb83 (diff)
downloadllvm-a36be826643ed1f6a4639f79270276df621853ba.tar.gz
llvm-a36be826643ed1f6a4639f79270276df621853ba.tar.bz2
llvm-a36be826643ed1f6a4639f79270276df621853ba.tar.xz
Try fixing mingw build.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127153 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/ADT/PointerUnion.h42
1 files changed, 15 insertions, 27 deletions
diff --git a/include/llvm/ADT/PointerUnion.h b/include/llvm/ADT/PointerUnion.h
index 975ba8a5f5..13b98cef07 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<PT1, PT2>::template NumFor<T>::Result
- /// @endcode
- /// Result will be 0 if T is PT1, 1 if it is PT2, and -1 otherwise.
- template <typename PT1, typename PT2>
- 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 <typename T>
- struct NumFor {
- static const int Result = (int)sizeof(determine((T*)0)) - 2;
- };
- };
-
template <typename T>
struct PointerUnionTypeSelectorReturn {
typedef T Return;
@@ -105,6 +82,16 @@ namespace llvm {
PointerUnionUIntTraits<PT1,PT2> > ValTy;
private:
ValTy Val;
+
+ struct IsPT1 {
+ static const int Num = 0;
+ };
+ struct IsPT2 {
+ static const int Num = 1;
+ };
+ template <typename T>
+ struct UNION_DOESNT_CONTAIN_TYPE { };
+
public:
PointerUnion() {}
@@ -127,10 +114,11 @@ namespace llvm {
/// is<T>() return true if the Union currently holds the type matching T.
template<typename T>
int is() const {
- static const int TyNo =
- ::llvm::PointerUnionTypeNum<PT1, PT2>::template NumFor<T>::Result;
- char TYPE_IS_NOT_IN_UNION[TyNo*2+1]; // statically check the type.
- (void)TYPE_IS_NOT_IN_UNION;
+ typedef typename
+ ::llvm::PointerUnionTypeSelector<PT1, T, IsPT1,
+ ::llvm::PointerUnionTypeSelector<PT2, T, IsPT2,
+ UNION_DOESNT_CONTAIN_TYPE<T> > >::Return Ty;
+ int TyNo = Ty::Num;
return static_cast<int>(Val.getInt()) == TyNo;
}