Abstract out everything having to do with member pointers into the ABI
class;  they should just be completely opaque throughout IR gen now,
although I haven't really audited that.

Fix a bug apparently inherited from gcc-4.2 where we failed to null-check
member data pointers when performing derived-to-base or base-to-derived
conversions on them.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111789 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGenCXX/member-function-pointers.cpp b/test/CodeGenCXX/member-function-pointers.cpp
index 3e95f39..78a571e 100644
--- a/test/CodeGenCXX/member-function-pointers.cpp
+++ b/test/CodeGenCXX/member-function-pointers.cpp
@@ -38,14 +38,14 @@
 
   // CHECK: [[TMP:%.*]] = load %0* @pa, align 8
   // CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
-  // CHECK: [[ADJ:%.*]] = add i64 [[TMPADJ]], 16
+  // CHECK: [[ADJ:%.*]] = add nsw i64 [[TMPADJ]], 16
   // CHECK: [[RES:%.*]] = insertvalue %0 [[TMP]], i64 [[ADJ]], 1
   // CHECK: store %0 [[RES]], %0* @pc, align 8
   pc = pa;
 
   // CHECK: [[TMP:%.*]] = load %0* @pc, align 8
   // CHECK: [[TMPADJ:%.*]] = extractvalue %0 [[TMP]], 1
-  // CHECK: [[ADJ:%.*]] = sub i64 [[TMPADJ]], 16
+  // CHECK: [[ADJ:%.*]] = sub nsw i64 [[TMPADJ]], 16
   // CHECK: [[RES:%.*]] = insertvalue %0 [[TMP]], i64 [[ADJ]], 1
   // CHECK: store %0 [[RES]], %0* @pa, align 8
   pa = static_cast<void (A::*)()>(pc);