[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