Douglas Gregor 
							
						 
					 
					
						
						
							
						
						df6e5fb77c 
					 
					
						
						
							
							Add missing #include  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181900  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2013-05-15 17:41:02 +00:00 
						 
				 
			
				
					
						
							
							
								David Blaikie 
							
						 
					 
					
						
						
							
						
						453f4f0130 
					 
					
						
						
							
							Use only explicit bool conversion operators  
						
						... 
						
						
						
						BitVector/SmallBitVector::reference::operator bool remain implicit since
they model more exactly a bool, rather than something else that can be
boolean tested.
The most common (non-buggy) case are where such objects are used as
return expressions in bool-returning functions or as boolean function
arguments. In those cases I've used (& added if necessary) a named
function to provide the equivalent (or sometimes negative, depending on
convenient wording) test.
One behavior change (YAMLParser) was made, though no test case is
included as I'm not sure how to reach that code path. Essentially any
comparison of llvm::yaml::document_iterators would be invalid if neither
iterator was at the end.
This helped uncover a couple of bugs in Clang - test cases provided for
those in a separate commit along with similar changes to `operator bool`
instances in Clang.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@181868  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2013-05-15 07:36:59 +00:00 
						 
				 
			
				
					
						
							
							
								Argyrios Kyrtzidis 
							
						 
					 
					
						
						
							
						
						acb8d9fbe3 
					 
					
						
						
							
							Eliminate redundant bitwise operations when using a llvm/ADT/PointerUnion.  
						
						... 
						
						
						
						For comparison, with this code sample:
PointerUnion<int *, char *> Data;
PointerUnion<int *, char *> foo1() {
	Data = new int;
	return new int;
}
PointerUnion<int *, char *> foo2() {
	Data = new char;
	return new char;
}
Before this patch we would get:
define i64 @_Z4foo1v() uwtable ssp {
  %1 = tail call noalias i8* @_Znwm(i64 4)
  %2 = ptrtoint i8* %1 to i64
  %3 = load i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %4 = and i64 %3, 1
  %.masked.i = and i64 %2, -3
  %5 = or i64 %4, %.masked.i
  store i64 %5, i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %6 = tail call noalias i8* @_Znwm(i64 4)
  %7 = ptrtoint i8* %6 to i64
  %8 = and i64 %7, -3
  ret i64 %8
}
define i64 @_Z4foo2v() uwtable ssp {
  %1 = tail call noalias i8* @_Znwm(i64 1)
  %2 = ptrtoint i8* %1 to i64
  %3 = load i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %4 = and i64 %3, 1
  %5 = or i64 %2, %4
  %6 = or i64 %5, 2
  store i64 %6, i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %7 = tail call noalias i8* @_Znwm(i64 1)
  %8 = ptrtoint i8* %7 to i64
  %9 = or i64 %8, 2
  ret i64 %9
}
After the patch:
define i64 @_Z4foo1v() uwtable ssp {
  %1 = tail call noalias i8* @_Znwm(i64 4)
  %2 = ptrtoint i8* %1 to i64
  store i64 %2, i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %3 = tail call noalias i8* @_Znwm(i64 4)
  %4 = ptrtoint i8* %3 to i64
  ret i64 %4
}
declare noalias i8* @_Znwm(i64)
define i64 @_Z4foo2v() uwtable ssp {
  %1 = tail call noalias i8* @_Znwm(i64 1)
  %2 = ptrtoint i8* %1 to i64
  %3 = or i64 %2, 2
  store i64 %3, i64* getelementptr inbounds (%"class.llvm::PointerUnion"* @Data, i64 0, i32 0, i32 0), align 8
  %4 = tail call noalias i8* @_Znwm(i64 1)
  %5 = ptrtoint i8* %4 to i64
  %6 = or i64 %5, 2
  ret i64 %6
}
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169147  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2012-12-03 19:59:23 +00:00 
						 
				 
			
				
					
						
							
							
								Galina Kistanova 
							
						 
					 
					
						
						
							
						
						b76fb96cd6 
					 
					
						
						
							
							Fixed few warnings.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160192  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2012-07-13 21:06:54 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						87d8e60505 
					 
					
						
						
							
							Add a few missing 'template' keywords  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152525  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2012-03-11 02:22:41 +00:00 
						 
				 
			
				
					
						
							
							
								Argyrios Kyrtzidis 
							
						 
					 
					
						
						
							
						
						0db235a2b0 
					 
					
						
						
							
							PointerUnion::getAddrOf() does not need to be template since we can only  
						
						... 
						
						
						
						use the first pointer type for it. Rename it to getAddrOfPtr1().
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152106  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2012-03-06 07:14:54 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						823eb1ca11 
					 
					
						
						
							
							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 
						
						
					 
					
						2011-08-12 04:31:38 +00:00 
						 
				 
			
				
					
						
							
							
								Argyrios Kyrtzidis 
							
						 
					 
					
						
						
							
						
						a36be82664 
					 
					
						
						
							
							Try fixing mingw build.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127153  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2011-03-07 05:35:01 +00:00 
						 
				 
			
				
					
						
							
							
								Argyrios Kyrtzidis 
							
						 
					 
					
						
						
							
						
						128ccbb8e5 
					 
					
						
						
							
							Do a compiler check that we use one of the types from PointerUnion[N], instead of a runtime check.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127145  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2011-03-07 01:30:20 +00:00 
						 
				 
			
				
					
						
							
							
								Argyrios Kyrtzidis 
							
						 
					 
					
						
						
							
						
						38297f5f76 
					 
					
						
						
							
							Allow getting the address of the value in a PointerUnion or PointerIntPair if one is  
						
						... 
						
						
						
						confident enough that he knows what he is doing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126019  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2011-02-19 03:55:58 +00:00 
						 
				 
			
				
					
						
							
							
								Ted Kremenek 
							
						 
					 
					
						
						
							
						
						8260ea5c6c 
					 
					
						
						
							
							Change PointerUnionX::getFromOpaqueValue() to be declared 'static inline' instead of 'static'.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99892  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2010-03-30 16:20:03 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						6a66b38846 
					 
					
						
						
							
							Add a bunch of missing "template" keywords to disambiguate dependent template names. GCC eats this ill-formed code, Clang does not. I already filed PR5404 to improve recovery in this case  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86204  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-11-06 00:12:53 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						26ef510d5d 
					 
					
						
						
							
							Fix a typo, and all of its copies  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77489  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-07-29 18:27:22 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						e657ec6701 
					 
					
						
						
							
							Implement PointerUnion4.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77487  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-07-29 18:19:47 +00:00 
						 
				 
			
				
					
						
							
							
								Sebastian Redl 
							
						 
					 
					
						
						
							
						
						37c286c181 
					 
					
						
						
							
							Fix three MSVC 2008 warnings that completely clutter the build output.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74430  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-06-29 17:12:06 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						41222823db 
					 
					
						
						
							
							Allow the use of pointers to const within PointerUnion.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68159  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-31 23:19:54 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						da84b25b13 
					 
					
						
						
							
							Stop guessing, start thinking, and make PointerUnion3::is actually be correct.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68126  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-31 18:31:03 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						a7425d7fde 
					 
					
						
						
							
							Really, really fix PointerUnion3::is  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68079  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-31 00:34:31 +00:00 
						 
				 
			
				
					
						
							
							
								Douglas Gregor 
							
						 
					 
					
						
						
							
						
						2048cdb08e 
					 
					
						
						
							
							Make PointerUnion3::get work properly  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68067  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-30 21:44:13 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						f54229192c 
					 
					
						
						
							
							update comment.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68060  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-30 20:44:04 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						e8bc475668 
					 
					
						
						
							
							add a PointerUnion3 class and generalize PointerUnion to work with  
						
						... 
						
						
						
						anything pointer-like, which may or may not actually be a pointer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68056  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-30 20:29:27 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						3a9fe06bfe 
					 
					
						
						
							
							add some comments, add a dyn_cast method.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67992  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-29 07:03:30 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						ba315c1ee7 
					 
					
						
						
							
							add helper method.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67989  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-29 06:32:46 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						2491e4657d 
					 
					
						
						
							
							Add a simple type-safe bit-mangling pointer union class.  This allows  
						
						... 
						
						
						
						you to do things like:
  ///    PointerUnion<int*, float*> P;
  ///    P = (int*)0;
  ///    printf("%d %d", P.is<int*>(), P.is<float*>()); // prints "1 0"
  ///    X = P.get<int*>();     // ok.
  ///    Y = P.get<float*>();   // runtime assertion failure.
  ///    Z = P.get<double*>();  // does not compile.
  ///    P = (float*)0;
  ///    Y = P.get<float*>();   // ok.
  ///    X = P.get<int*>();     // runtime assertion failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67987  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2009-03-29 06:06:02 +00:00