Fix an obscure bug in PointerUnion that would bite PointerUnion3/4. Basically,
authorChris Lattner <sabre@nondot.org>
Fri, 12 Aug 2011 04:31:38 +0000 (04:31 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 12 Aug 2011 04:31:38 +0000 (04:31 +0000)
when checking isNull(), we'd pick off the sentinel bit for the outer
PointerUnion, but would not recursively convert the inner pointerunion to bool,
so if *its* sentinel bit is set, isNull() would incorrectly return false.

No testcase, because someone hit this when they were trying to refactor code
to use PointerUnion3, but they since found a better solution.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137428 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/PointerUnion.h

index 13b98cef07ab758a2bb9c1ec8e55455c807a3822..487096a171057cbb18cab518c87eee1fae7296ba 100644 (file)
@@ -108,7 +108,11 @@ namespace llvm {
     
     /// isNull - Return true if the pointer held in the union is null,
     /// regardless of which type it is.
-    bool isNull() const { return Val.getPointer() == 0; }
+    bool isNull() const {
+      // Convert from the void* to one of the pointer types, to make sure that
+      // we recursively strip off low bits if we have a nested PointerUnion.
+      return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
+    }
     operator bool() const { return !isNull(); }
 
     /// is<T>() return true if the Union currently holds the type matching T.