1 typedef enum { 2 BadFirst, 3 BadSecond, 4 BadThird 5 } BadEnum; 6 7 typedef enum { 8 NestedFirst, 9 NestedSecond 10 } NestedBadEnum; 11 12 typedef enum { 13 GoodFirst, 14 GoodSecond, 15 GoodLast 16 } GoodEnum; 17 18 enum RawEnum { 19 RawFirst, 20 RawLast 21 }; 22 23 enum class ClassEnum { 24 ClassFirst, 25 ClassLast 26 }; 27 28 template <class P> struct ParamTraits; 29 30 // Simplified EnumSerializer etc. from IPCMessageUtils.h 31 template <typename E, typename EnumValidator> 32 struct EnumSerializer { 33 typedef E paramType; 34 }; 35 36 template <typename E, 37 E MinLegal, 38 E HighBound> 39 class ContiguousEnumValidator 40 {}; 41 42 template <typename E, 43 E MinLegal, 44 E HighBound> 45 struct ContiguousEnumSerializer 46 : EnumSerializer<E, 47 ContiguousEnumValidator<E, MinLegal, HighBound>> 48 {}; 49 50 // Typical ParamTraits implementation that should be avoided 51 template<> 52 struct ParamTraits<ClassEnum> // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} 53 { 54 typedef ClassEnum paramType; 55 }; 56 57 template<> 58 struct ParamTraits<enum RawEnum> // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} 59 { 60 typedef enum RawEnum paramType; 61 }; 62 63 template<> 64 struct ParamTraits<BadEnum> // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} 65 { 66 typedef BadEnum paramType; 67 }; 68 69 // Make sure the analysis catches nested typedefs 70 typedef NestedBadEnum NestedDefLevel1; 71 typedef NestedDefLevel1 NestedDefLevel2; 72 73 template<> 74 struct ParamTraits<NestedDefLevel2> // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} 75 { 76 typedef NestedDefLevel2 paramType; 77 }; 78 79 // Make sure a non enum typedef is not accidentally flagged 80 typedef int IntTypedef; 81 82 template<> 83 struct ParamTraits<IntTypedef> 84 { 85 typedef IntTypedef paramType; 86 }; 87 88 // Make sure ParamTraits using helper classes are not flagged 89 template<> 90 struct ParamTraits<GoodEnum> 91 : public ContiguousEnumSerializer<GoodEnum, 92 GoodEnum::GoodFirst, 93 GoodEnum::GoodLast> 94 {}; 95