forked from OSchip/llvm-project
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. llvm-svn: 137428
This commit is contained in:
parent
a2dee81dec
commit
1ec8114eb8
|
@ -108,7 +108,11 @@ namespace llvm {
|
||||||
|
|
||||||
/// isNull - Return true if the pointer held in the union is null,
|
/// isNull - Return true if the pointer held in the union is null,
|
||||||
/// regardless of which type it is.
|
/// 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(); }
|
operator bool() const { return !isNull(); }
|
||||||
|
|
||||||
/// is<T>() return true if the Union currently holds the type matching T.
|
/// is<T>() return true if the Union currently holds the type matching T.
|
||||||
|
|
Loading…
Reference in New Issue