diff options
author | dim <dim@FreeBSD.org> | 2013-04-08 18:45:10 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2013-04-08 18:45:10 +0000 |
commit | c72c57c9e9b69944e3e009cd5e209634839581d3 (patch) | |
tree | 4fc2f184c499d106f29a386c452b49e5197bf63d /test/CodeGenCXX/microsoft-abi-member-pointers.cpp | |
parent | 5b20025c30d23d521e12c1f33ec8fa6b821952cd (diff) | |
download | FreeBSD-src-c72c57c9e9b69944e3e009cd5e209634839581d3.zip FreeBSD-src-c72c57c9e9b69944e3e009cd5e209634839581d3.tar.gz |
Vendor import of clang trunk r178860:
http://llvm.org/svn/llvm-project/cfe/trunk@178860
Diffstat (limited to 'test/CodeGenCXX/microsoft-abi-member-pointers.cpp')
-rwxr-xr-x | test/CodeGenCXX/microsoft-abi-member-pointers.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/CodeGenCXX/microsoft-abi-member-pointers.cpp b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp new file mode 100755 index 0000000..997e007 --- /dev/null +++ b/test/CodeGenCXX/microsoft-abi-member-pointers.cpp @@ -0,0 +1,51 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s + +struct POD { + int a; + int b; +}; + +void podMemPtrs() { + int POD::*memptr; + memptr = &POD::a; + memptr = &POD::b; + if (memptr) + memptr = 0; +// Check that member pointers use the right offsets and that null is -1. +// CHECK: define void @"\01?podMemPtrs@@YAXXZ"() #0 { +// CHECK: %[[memptr:.*]] = alloca i32, align 4 +// CHECK-NEXT: store i32 0, i32* %[[memptr]], align 4 +// CHECK-NEXT: store i32 4, i32* %[[memptr]], align 4 +// CHECK-NEXT: %[[memptr_val:.*]] = load i32* %[[memptr]], align 4 +// CHECK-NEXT: %{{.*}} = icmp ne i32 %[[memptr_val]], -1 +// CHECK-NEXT: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: store i32 -1, i32* %[[memptr]], align 4 +// CHECK: ret void +// CHECK: } +} + +struct Polymorphic { + virtual void myVirtual(); + int a; + int b; +}; + +void polymorphicMemPtrs() { + int Polymorphic::*memptr; + memptr = &Polymorphic::a; + memptr = &Polymorphic::b; + if (memptr) + memptr = 0; +// Member pointers for polymorphic classes include the vtable slot in their +// offset and use 0 to represent null. +// CHECK: define void @"\01?polymorphicMemPtrs@@YAXXZ"() #0 { +// CHECK: %[[memptr:.*]] = alloca i32, align 4 +// CHECK-NEXT: store i32 4, i32* %[[memptr]], align 4 +// CHECK-NEXT: store i32 8, i32* %[[memptr]], align 4 +// CHECK-NEXT: %[[memptr_val:.*]] = load i32* %[[memptr]], align 4 +// CHECK-NEXT: %{{.*}} = icmp ne i32 %[[memptr_val]], 0 +// CHECK-NEXT: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} +// CHECK: store i32 0, i32* %[[memptr]], align 4 +// CHECK: ret void +// CHECK: } +} |