File indexing completed on 2024-05-05 05:41:40

0001 #include <QtCore/QObject>
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 struct A
0018 {
0019     virtual void foo() { }
0020 };
0021 
0022 struct B : public A
0023 {
0024 
0025 };
0026 
0027 void test()
0028 {
0029     A *a = new A();
0030     B *b = new B();
0031 
0032     dynamic_cast<A*>(b); // warning: Casting to base
0033     dynamic_cast<A*>(a); // warning: Casting to itself
0034     dynamic_cast<B*>(a); // OK
0035     dynamic_cast<B*>(b); // warning: Casting to itself
0036     static_cast<A*>(b); // warning: Casting to base
0037     static_cast<A*>(a); // warning: Casting to itself
0038     static_cast<B*>(a); // OK
0039     static_cast<B*>(b); // warning: Casting to itself
0040 }
0041 
0042 class MyObj : public QObject
0043 {
0044     Q_OBJECT
0045 public:
0046 };
0047 
0048 void testQObjectCast(QObject *o)
0049 {
0050     dynamic_cast<MyObj*>(o); // Warn
0051     qobject_cast<QObject*>(o); // Warn
0052     MyObj myobj;
0053     qobject_cast<QObject*>(&myobj); // Warn
0054     qobject_cast<MyObj*>(o); // OK
0055 }
0056 
0057 class FwdDeclared;
0058 
0059 class MyObj2 : public QObject
0060 {
0061 public:
0062     Q_DECLARE_PUBLIC(QObject) // OK, in macro
0063     MyObj2 *q_ptr;
0064 };
0065 
0066 struct Base2 {};
0067 class Base1 : public QObject {};
0068 
0069 class Derived : public Base1, public Base2
0070 {
0071 public:
0072     void test()
0073     {
0074         static_cast<Base1*>(this); // OK
0075         static_cast<Base2*>(this); // OK
0076     }
0077 };
0078 
0079 void test2()
0080 {
0081     static_cast<MyObj*>(nullptr); // OK
0082     static_cast<MyObj*>(0); // OK
0083 
0084     MyObj *o1;
0085     MyObj2 *o2;
0086     true ? static_cast<QObject*>(o1) : static_cast<QObject*>(o2); // Ok
0087     true ? static_cast<QObject*>(o1) : static_cast<QObject*>(o2); // Ok
0088 }
0089 class MyObj4 : public QObject
0090 {
0091     Q_OBJECT
0092 public:
0093     void test()
0094     {
0095         qobject_cast<MyObj4*>(sender()); // OK
0096     }
0097 };