From 823eb1ca11d684530048f1fe85a727aa1ef622d1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 12 Aug 2011 04:31:38 +0000 Subject: [PATCH] Fix an obscure bug in PointerUnion that would bite PointerUnion3/4. Basically, 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/llvm/ADT/PointerUnion.h b/include/llvm/ADT/PointerUnion.h index 13b98cef07a..487096a1710 100644 --- a/include/llvm/ADT/PointerUnion.h +++ b/include/llvm/ADT/PointerUnion.h @@ -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::getFromVoidPointer(Val.getPointer()); + } operator bool() const { return !isNull(); } /// is() return true if the Union currently holds the type matching T.