diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-06-20 21:44:39 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-06-20 21:44:39 +0000 |
| commit | 160000c64c6bf9e3e87626b18127cff9e4e32dde (patch) | |
| tree | a5d9540e8baed8c941714b28c3c6e2e93e4946af /clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp | |
| parent | 0a594f8cbd7d7123fd7d06abf26f6cd36930ab55 (diff) | |
| download | bcm5719-llvm-160000c64c6bf9e3e87626b18127cff9e4e32dde.tar.gz bcm5719-llvm-160000c64c6bf9e3e87626b18127cff9e4e32dde.zip | |
CodeGen: typeid/dynamic_cast tests don't need asserts
These tests relied on information that was only available for clang
builds that included asserts. Fix these tests to lift that restriction.
llvm-svn: 211408
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp')
| -rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp b/clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp index d51da7d21ef..8e87633dcc1 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-dynamic-cast.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -emit-llvm -O1 -o - -triple=i386-pc-win32 %s | FileCheck %s -// REQUIRES: asserts struct S { char a; }; struct V { virtual void f(); }; @@ -55,11 +54,9 @@ T* test4(V* x) { return dynamic_cast<T*>(x); } T* test5(A* x) { return dynamic_cast<T*>(x); } // CHECK-LABEL: define %struct.T* @"\01?test5@@YAPAUT@@PAUA@@@Z"(%struct.A* %x) -// CHECK-NEXT: [[ENTRY:.*]]: -// CHECK-NEXT: [[CHECK:%.*]] = icmp eq %struct.A* %x, null -// CHECK-NEXT: br i1 [[CHECK]], label %dynamic_cast.end, label %dynamic_cast.notnull -// CHECK-LABEL: dynamic_cast.notnull: -// CHECK-NEXT: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8* +// CHECK: [[CHECK:%.*]] = icmp eq %struct.A* %x, null +// CHECK-NEXT: br i1 [[CHECK]] +// CHECK: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8* // CHECK-NEXT: [[BITCAST:%.*]] = bitcast %struct.A* %x to i8** // CHECK-NEXT: [[VBTBL:%.*]] = load i8** [[BITCAST]], align 4 // CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i8* [[VBTBL]], i32 4 @@ -68,20 +65,17 @@ T* test5(A* x) { return dynamic_cast<T*>(x); } // CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 [[VBOFFS]] // CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[VBOFFS]], i8* bitcast (%"MSRTTITypeDescriptor\07"* @"\01??_R0?AUA@@@8" to i8*), i8* bitcast (%"MSRTTITypeDescriptor\07"* @"\01??_R0?AUT@@@8" to i8*), i32 0) // CHECK-NEXT: [[RES:%.*]] = bitcast i8* [[CALL]] to %struct.T* -// CHECK-NEXT: br label %dynamic_cast.end -// CHECK-LABEL: dynamic_cast.end: -// CHECK-NEXT: [[RET:%.*]] = phi %struct.T* [ [[RES]], %dynamic_cast.notnull ], [ null, %[[ENTRY]] ] +// CHECK-NEXT: br label +// CHECK: [[RET:%.*]] = phi %struct.T* // CHECK-NEXT: ret %struct.T* [[RET]] T* test6(B* x) { return dynamic_cast<T*>(x); } // CHECK-LABEL: define %struct.T* @"\01?test6@@YAPAUT@@PAUB@@@Z"(%struct.B* %x) -// CHECK-NEXT: [[ENTRY:.*]]: -// CHECK-NEXT: [[CHECK:%.*]] = icmp eq %struct.B* %x, null -// CHECK-NEXT: br i1 [[CHECK]], label %dynamic_cast.end, label %dynamic_cast.notnull -// CHECK-LABEL: dynamic_cast.notnull: -// CHECK-NEXT: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0 -// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* [[CAST]], i32 4 -// CHECK-NEXT: [[BITCAST]] = bitcast i8* [[VBPTR]] to i8** +// CHECK: [[CHECK:%.*]] = icmp eq %struct.B* %x, null +// CHECK-NEXT: br i1 [[CHECK]] +// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0 +// CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* %3, i32 4 +// CHECK-NEXT: [[BITCAST:%.*]] = bitcast i8* [[VBPTR]] to i8** // CHECK-NEXT: [[VBTBL:%.*]] = load i8** [[BITCAST]], align 4 // CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i8* [[VBTBL]], i32 4 // CHECK-NEXT: [[VBOFFPCAST:%.*]] = bitcast i8* [[VBOFFP]] to i32* @@ -90,9 +84,8 @@ T* test6(B* x) { return dynamic_cast<T*>(x); } // CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[CAST]], i32 [[DELTA]] // CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTDynamicCast(i8* [[ADJ]], i32 [[DELTA]], i8* bitcast (%"MSRTTITypeDescriptor\07"* @"\01??_R0?AUB@@@8" to i8*), i8* bitcast (%"MSRTTITypeDescriptor\07"* @"\01??_R0?AUT@@@8" to i8*), i32 0) // CHECK-NEXT: [[RES:%.*]] = bitcast i8* [[CALL]] to %struct.T* -// CHECK-NEXT: br label %dynamic_cast.end -// CHECK-LABEL: dynamic_cast.end: -// CHECK-NEXT: [[RET:%.*]] = phi %struct.T* [ [[RES]], %dynamic_cast.notnull ], [ null, %[[ENTRY]] ] +// CHECK-NEXT: br label +// CHECK: [[RET:%.*]] = phi %struct.T* // CHECK-NEXT: ret %struct.T* [[RET]] void* test7(V* x) { return dynamic_cast<void*>(x); } @@ -103,30 +96,25 @@ void* test7(V* x) { return dynamic_cast<void*>(x); } void* test8(A* x) { return dynamic_cast<void*>(x); } // CHECK-LABEL: define i8* @"\01?test8@@YAPAXPAUA@@@Z"(%struct.A* %x) -// CHECK-NEXT: [[ENTRY:.*]]: -// CHECK-NEXT: [[CHECK:%.*]] = icmp eq %struct.A* %x, null -// CHECK-NEXT: br i1 [[CHECK]], label %dynamic_cast.end, label %dynamic_cast.notnull -// CHECK-LABEL: dynamic_cast.notnull: -// CHECK-NEXT: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8* -// CHECK-NEXT: [[BITCAST]] = bitcast %struct.A* %x to i8** +// CHECK: [[CHECK:%.*]] = icmp eq %struct.A* %x, null +// CHECK-NEXT: br i1 [[CHECK]] +// CHECK: [[VOIDP:%.*]] = bitcast %struct.A* %x to i8* +// CHECK-NEXT: [[BITCAST:%.*]] = bitcast %struct.A* %x to i8** // CHECK-NEXT: [[VBTBL:%.*]] = load i8** [[BITCAST]], align 4 // CHECK-NEXT: [[VBOFFP:%.*]] = getelementptr inbounds i8* [[VBTBL]], i32 4 // CHECK-NEXT: [[VBOFFPCAST:%.*]] = bitcast i8* [[VBOFFP]] to i32* // CHECK-NEXT: [[VBOFFS:%.*]] = load i32* [[VBOFFPCAST:%.*]], align 4 // CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[VOIDP]], i32 [[VBOFFS]] // CHECK-NEXT: [[RES:%.*]] = tail call i8* @__RTCastToVoid(i8* [[ADJ]]) -// CHECK-NEXT: br label %dynamic_cast.end -// CHECK-LABEL: dynamic_cast.end: -// CHECK-NEXT: [[RET:%.*]] = phi i8* [ [[RES]], %dynamic_cast.notnull ], [ null, %[[ENTRY]] ] +// CHECK-NEXT: br label +// CHECK: [[RET:%.*]] = phi i8* // CHECK-NEXT: ret i8* [[RET]] void* test9(B* x) { return dynamic_cast<void*>(x); } // CHECK-LABEL: define i8* @"\01?test9@@YAPAXPAUB@@@Z"(%struct.B* %x) -// CHECK-NEXT: [[ENTRY:.*]]: -// CHECK-NEXT: [[CHECK:%.*]] = icmp eq %struct.B* %x, null -// CHECK-NEXT: br i1 [[CHECK]], label %dynamic_cast.end, label %dynamic_cast.notnull -// CHECK-LABEL: dynamic_cast.notnull: -// CHECK-NEXT: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0 +// CHECK: [[CHECK:%.*]] = icmp eq %struct.B* %x, null +// CHECK-NEXT: br i1 [[CHECK]] +// CHECK: [[CAST:%.*]] = getelementptr inbounds %struct.B* %x, i32 0, i32 0, i32 0 // CHECK-NEXT: [[VBPTR:%.*]] = getelementptr inbounds i8* [[CAST]], i32 4 // CHECK-NEXT: [[BITCAST:%.*]] = bitcast i8* [[VBPTR]] to i8** // CHECK-NEXT: [[VBTBL:%.*]] = load i8** [[BITCAST]], align 4 @@ -136,8 +124,7 @@ void* test9(B* x) { return dynamic_cast<void*>(x); } // CHECK-NEXT: [[DELTA:%.*]] = add nsw i32 [[VBOFFS]], 4 // CHECK-NEXT: [[ADJ:%.*]] = getelementptr inbounds i8* [[CAST]], i32 [[DELTA]] // CHECK-NEXT: [[CALL:%.*]] = tail call i8* @__RTCastToVoid(i8* [[ADJ]]) -// CHECK-NEXT: br label %dynamic_cast.end -// CHECK-LABEL: dynamic_cast.end: -// CHECK-NEXT: [[RET:%.*]] = phi i8* [ [[CALL]], %dynamic_cast.notnull ], [ null, %[[ENTRY]] ] +// CHECK-NEXT: br label +// CHECK: [[RET:%.*]] = phi i8* // CHECK-NEXT: ret i8* [[RET]] |

