[cfe-commits] [libcxxabi] r132545 - /libcxxabi/trunk/test/test_aux_runtime.cpp

Howard Hinnant hhinnant at apple.com
Fri Jun 3 07:28:37 PDT 2011


Thanks Marshall.

Howard

On Jun 3, 2011, at 9:54 AM, Marshall Clow wrote:

> Author: marshall
> Date: Fri Jun  3 08:54:37 2011
> New Revision: 132545
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=132545&view=rev
> Log:
> Tests for bad_typeid and bad_cast
> 
> Added:
>    libcxxabi/trunk/test/test_aux_runtime.cpp
> 
> Added: libcxxabi/trunk/test/test_aux_runtime.cpp
> URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_aux_runtime.cpp?rev=132545&view=auto
> ==============================================================================
> --- libcxxabi/trunk/test/test_aux_runtime.cpp (added)
> +++ libcxxabi/trunk/test/test_aux_runtime.cpp Fri Jun  3 08:54:37 2011
> @@ -0,0 +1,64 @@
> +//===-------------------------- test_aux_runtime.cpp ----------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is dual licensed under the MIT and the University of Illinois Open
> +// Source Licenses. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#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 { typeid(*bp) == typeid (A); }
> +    catch ( const std::bad_typeid &bc ) { 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); }
> +    catch ( const std::bad_cast &bc ) { return true; }
> +    return false;
> +    }
> +    
> +int main ( int argc, char *argv [] ) {
> +    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;
> +    }
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list