//===-------------------------- test_aux_runtime.cpp ----------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: libcxxabi-no-exceptions

#include <typeinfo>
#include <iostream>

//  Test taken from 5.2.8.2
//  When typeid is applied to a glvalue expression whose type is a polymorphic 
//  class type, (10.3), the result refers to a std::type_info object 
//  representing the type of the most derived object (1.8) (that is, the 
//  dynamic type) to which the glvalue refers. If the glvalue expression is 
//  obtained by applying the unary * operator to a pointer(68) and the pointer 
//  is a null pointer value (4.10), the typeid expression throws the 
//  std::bad_typeid exception (18.7.3).
//
//  68) If p is an expression of pointer type, then *p, (*p), *(p), 
//      ((*p)), *((p)), and so on all meet this requirement.
bool bad_typeid_test () {
    class A { virtual void f() {}}; 
    class B { virtual void g() {}}; 
    
    B *bp = NULL;
    try {bool b = typeid(*bp) == typeid (A); ((void)b); }
    catch ( const std::bad_typeid &) { return true; }
    return false;
    }
    

//  The value of a failed cast to pointer type is the null pointer value of 
//  the required result type. A failed cast to reference type throws 
//  std::bad_cast (18.7.2).
bool bad_cast_test () {
    class A { virtual void f() {}};
    class B { virtual void g() {}};
    class D : public virtual A, private B {};   

    D d;
    B *bp = (B*)&d;     // cast needed to break protection
    try { D &dr = dynamic_cast<D&> (*bp); ((void)dr); }
    catch ( const std::bad_cast & ) { return true; }
    return false;
    }
    
int main ( ) {
    int ret_val = 0;
    
    if ( !bad_typeid_test ()) {
        std::cerr << "TypeID test failed!" << std::endl;
        ret_val = 1;
    }
    
    if ( !bad_cast_test ()) {
        std::cerr << "Bad cast test failed!" << std::endl;
        ret_val = 1;
    }
    
    return ret_val;
    }
