#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
+// 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),
+// 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() {}};
-
+ 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
+
+// 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 {};
+ class D : public virtual A, private B {};
D d;
B *bp = (B*)&d; // cast needed to break protection
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;
}
// Wrapper routines
void *my_alloc2 ( size_t sz ) {
void *p = std::malloc ( sz );
-// std::printf ( "Allocated %ld bytes at %lx\n", sz, (unsigned long) p );
+// std::printf ( "Allocated %ld bytes at %lx\n", sz, (unsigned long) p );
return p;
}
-
+
void my_dealloc2 ( void *p ) {
-// std::printf ( "Freeing %lx\n", (unsigned long) p );
- std::free ( p );
+// std::printf ( "Freeing %lx\n", (unsigned long) p );
+ std::free ( p );
}
void my_dealloc3 ( void *p, size_t ) {
-// std::printf ( "Freeing %lx (size %ld)\n", (unsigned long) p, sz );
- std::free ( p );
+// std::printf ( "Freeing %lx (size %ld)\n", (unsigned long) p, sz );
+ std::free ( p );
}
void my_construct ( void *) {
}
catch ( int i ) {}
- std::cerr << "should never get here" << std::endl;
+ std::cerr << "should never get here" << std::endl;
}