blob: 2173f8caebca8e2eecb0c30b0bc91cfcf8cdf102 [file] [log] [blame]
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler -c cxx_rtti %s -o %t.o
// RUN: linker %t.o -o %t%exeext
// RUN: runtool %t%exeext | grep "Test passed"
#include <stdio.h>
// Direct inheritance
struct A1 { virtual ~A1() {} };
struct B1 : A1 { };
A1 A1_obj;
B1 B1_obj;
struct A2 { virtual ~A2() {} };
struct B2 : A2 { };
struct C2 : A2 { };
A2 A2_obj;
B2 B2_obj;
C2 C2_obj;
// Virtual inheritance
struct A3 { virtual ~A3() {} };
struct B3 : virtual A3 { };
A3 A3_obj;
B3 B3_obj;
struct A4 { virtual ~A4() {} };
struct B4 : virtual A4 { };
struct C4 : A4 { };
A4 A4_obj;
B4 B4_obj;
C4 C4_obj;
struct A5 { virtual ~A5() {} };
struct B5 : A5 { };
struct C5 : virtual A5 { };
A5 A5_obj;
B5 B5_obj;
C5 C5_obj;
struct A6 { virtual ~A6() {} };
struct B6 : virtual A6 { };
struct C6 : virtual A6 { };
A6 A6_obj;
B6 B6_obj;
C6 C6_obj;
struct A7 { virtual ~A7() {} };
struct B7_1 : A7 { };
struct B7_2 : A7 { };
struct C7 : B7_1, B7_2 { };
A7 A7_obj;
B7_1 B7_1_obj;
B7_2 B7_2_obj;
C7 C7_obj;
int failed_tests = 0;
void base_to_derived_cast() {
A1 *A1_ptr = &B1_obj;
B1 *B1_ptr = dynamic_cast<B1 *>(A1_ptr);
if(!B1_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
A2 *A2_ptr1 = &B2_obj, *A2_ptr2 = &C2_obj;
B2 *B2_ptr = dynamic_cast<B2 *>(A2_ptr1);
C2 *C2_ptr = dynamic_cast<C2 *>(A2_ptr2);
if(!B2_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!C2_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
A3 *A3_ptr = &B3_obj;
B3 *B3_ptr = dynamic_cast<B3 *>(A3_ptr);
if(!B3_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
A4 *A4_ptr1 = &B4_obj, *A4_ptr2 = &C4_obj;
B4 *B4_ptr = dynamic_cast<B4 *>(A4_ptr1);
C4 *C4_ptr = dynamic_cast<C4 *>(A4_ptr2);
if(!B4_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!C4_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
A5 *A5_ptr1 = &B5_obj, *A5_ptr2 = &C5_obj;
B5 *B5_ptr = dynamic_cast<B5 *>(A5_ptr1);
C5 *C5_ptr = dynamic_cast<C5 *>(A5_ptr2);
if(!B5_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!C5_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
A6 *A6_ptr1 = &B6_obj, *A6_ptr2 = &C6_obj;
B6 *B6_ptr = dynamic_cast<B6 *>(A6_ptr1);
C6 *C6_ptr = dynamic_cast<C6 *>(A6_ptr2);
if(!B6_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!C6_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
}
void cross_cast() {
C7* C7_ptr = &C7_obj;
B7_1 *B7_1_ptr = dynamic_cast<B7_1 *>(C7_ptr);
B7_2 *B7_2_ptr = dynamic_cast<B7_2 *>(C7_ptr);
if(!B7_1_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!B7_2_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
B7_1 *cc1 = dynamic_cast<B7_1 *>(B7_2_ptr);
B7_2 *cc2 = dynamic_cast<B7_2 *>(B7_1_ptr);
if(!cc1) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!cc2) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
}
void void_ptr_cast() {
C7* C7_ptr = &C7_obj;
B7_1 *B7_1_ptr = dynamic_cast<B7_1 *>(C7_ptr);
B7_2 *B7_2_ptr = dynamic_cast<B7_2 *>(C7_ptr);
if(!B7_1_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!B7_2_ptr) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
if(!(dynamic_cast<void *>(B7_1_ptr) == dynamic_cast<void *>(B7_2_ptr))) { printf("Test failed %s:%d\n", __FILE__, __LINE__); failed_tests++; }
}
int main(int argc, char *argv[]) {
base_to_derived_cast();
cross_cast();
void_ptr_cast();
if(failed_tests > 0) {
printf("Test failed\n");
} else {
printf("Test passed\n");
}
printf("\x1a");
return 0;
}