Daniel Dunbar | d7d5f02 | 2009-03-24 02:24:46 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -fsyntax-only -verify %s |
Sebastian Redl | 64b45f7 | 2009-01-05 20:52:13 +0000 | [diff] [blame] | 2 | #define T(b) (b) ? 1 : -1 |
| 3 | #define F(b) (b) ? -1 : 1 |
| 4 | |
| 5 | struct NonPOD { NonPOD(int); }; |
| 6 | |
| 7 | // PODs |
| 8 | enum Enum { EV }; |
| 9 | struct POD { Enum e; int i; float f; NonPOD* p; }; |
| 10 | typedef int Int; |
| 11 | typedef Int IntAr[10]; |
| 12 | class Statics { static int priv; static NonPOD np; }; |
| 13 | |
| 14 | // Not PODs |
| 15 | struct Derives : POD {}; |
| 16 | struct HasCons { HasCons(int); }; |
| 17 | struct HasAssign { HasAssign operator =(const HasAssign&); }; |
| 18 | struct HasDest { ~HasDest(); }; |
| 19 | class HasPriv { int priv; }; |
| 20 | class HasProt { protected: int prot; }; |
| 21 | struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} }; |
| 22 | struct HasNonPOD { NonPOD np; }; |
| 23 | struct HasVirt { virtual void Virt() {}; }; |
| 24 | typedef Derives NonPODAr[10]; |
| 25 | |
| 26 | void is_pod() |
| 27 | { |
| 28 | int t01[T(__is_pod(int))]; |
| 29 | int t02[T(__is_pod(Enum))]; |
| 30 | int t03[T(__is_pod(POD))]; |
| 31 | int t04[T(__is_pod(Int))]; |
| 32 | int t05[T(__is_pod(IntAr))]; |
| 33 | int t06[T(__is_pod(Statics))]; |
| 34 | |
| 35 | int t21[F(__is_pod(Derives))]; |
| 36 | int t22[F(__is_pod(HasCons))]; |
| 37 | int t23[F(__is_pod(HasAssign))]; |
| 38 | int t24[F(__is_pod(HasDest))]; |
| 39 | int t25[F(__is_pod(HasPriv))]; |
| 40 | int t26[F(__is_pod(HasProt))]; |
| 41 | int t27[F(__is_pod(HasRef))]; |
| 42 | int t28[F(__is_pod(HasNonPOD))]; |
| 43 | int t29[F(__is_pod(HasVirt))]; |
| 44 | int t30[F(__is_pod(NonPODAr))]; |
| 45 | } |
| 46 | |
| 47 | union Union { int i; float f; }; |
| 48 | typedef Derives ClassType; |
| 49 | |
| 50 | void is_class() |
| 51 | { |
| 52 | int t01[T(__is_class(Derives))]; |
| 53 | int t02[T(__is_class(HasPriv))]; |
| 54 | int t03[T(__is_class(ClassType))]; |
| 55 | |
| 56 | int t11[F(__is_class(int))]; |
| 57 | int t12[F(__is_class(Enum))]; |
| 58 | int t13[F(__is_class(Int))]; |
| 59 | int t14[F(__is_class(IntAr))]; |
| 60 | int t15[F(__is_class(NonPODAr))]; |
| 61 | int t16[F(__is_class(Union))]; |
| 62 | } |
| 63 | |
| 64 | typedef Union UnionAr[10]; |
| 65 | typedef Union UnionType; |
| 66 | |
| 67 | void is_union() |
| 68 | { |
| 69 | int t01[T(__is_union(Union))]; |
| 70 | int t02[T(__is_union(UnionType))]; |
| 71 | |
| 72 | int t11[F(__is_union(int))]; |
| 73 | int t12[F(__is_union(Enum))]; |
| 74 | int t13[F(__is_union(Int))]; |
| 75 | int t14[F(__is_union(IntAr))]; |
| 76 | int t15[F(__is_union(UnionAr))]; |
| 77 | } |
| 78 | |
| 79 | typedef Enum EnumType; |
| 80 | |
| 81 | void is_enum() |
| 82 | { |
| 83 | int t01[T(__is_enum(Enum))]; |
| 84 | int t02[T(__is_enum(EnumType))]; |
| 85 | |
| 86 | int t11[F(__is_enum(int))]; |
| 87 | int t12[F(__is_enum(Union))]; |
| 88 | int t13[F(__is_enum(Int))]; |
| 89 | int t14[F(__is_enum(IntAr))]; |
| 90 | int t15[F(__is_enum(UnionAr))]; |
| 91 | int t16[F(__is_enum(Derives))]; |
| 92 | int t17[F(__is_enum(ClassType))]; |
| 93 | } |
| 94 | |
| 95 | struct Polymorph { virtual void f(); }; |
| 96 | struct InheritPolymorph : Polymorph {}; |
| 97 | |
| 98 | void is_polymorphic() |
| 99 | { |
| 100 | int t01[T(__is_polymorphic(Polymorph))]; |
| 101 | int t02[T(__is_polymorphic(InheritPolymorph))]; |
| 102 | |
| 103 | int t11[F(__is_polymorphic(int))]; |
| 104 | int t12[F(__is_polymorphic(Union))]; |
| 105 | int t13[F(__is_polymorphic(Int))]; |
| 106 | int t14[F(__is_polymorphic(IntAr))]; |
| 107 | int t15[F(__is_polymorphic(UnionAr))]; |
| 108 | int t16[F(__is_polymorphic(Derives))]; |
| 109 | int t17[F(__is_polymorphic(ClassType))]; |
| 110 | int t18[F(__is_polymorphic(Enum))]; |
| 111 | } |